diff --git a/.github/workflows/apt-deps.txt b/.github/workflows/apt-deps.txt index 51e9574f86..dba3511bf4 100644 --- a/.github/workflows/apt-deps.txt +++ b/.github/workflows/apt-deps.txt @@ -1 +1 @@ -libusb-dev libusb-1.0-0-dev libsdl2-dev libsdl2-net-dev libpng-dev libglew-dev nlohmann-json3-dev libtinyxml2-dev libspdlog-dev ninja-build +libusb-dev libusb-1.0-0-dev libsdl2-dev libsdl2-net-dev libpng-dev libglew-dev nlohmann-json3-dev libtinyxml2-dev libspdlog-dev ninja-build libogg-dev libopus-dev opus-tools libopusfile-dev libvorbis-dev libespeak-ng-dev \ No newline at end of file diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml new file mode 100644 index 0000000000..604a3dd703 --- /dev/null +++ b/.github/workflows/clang-format.yml @@ -0,0 +1,21 @@ +name: clang-format +on: [pull_request] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + clang-format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 2 + - name: Install clang-format + run: | + sudo apt-get update + sudo apt-get install -y clang-format-14 + - name: Run clang-format + run: | + ./run-clang-format.sh + git diff --exit-code diff --git a/.github/workflows/generate-builds.yml b/.github/workflows/generate-builds.yml index 64c908a37a..d68092d998 100644 --- a/.github/workflows/generate-builds.yml +++ b/.github/workflows/generate-builds.yml @@ -6,42 +6,44 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: + generate-soh-otr: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - name: Git Checkout + uses: actions/checkout@v4 with: submodules: true - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2.14 + - name: Configure ccache + uses: hendrikmuhs/ccache-action@v1.2 with: + save: ${{ github.ref_name == github.event.repository.default_branch }} key: ${{ runner.os }}-otr-ccache-${{ github.ref }}-${{ github.sha }} restore-keys: | ${{ runner.os }}-otr-ccache-${{ github.ref }} - ${{ runner.os }}-otr-ccache- + ${{ runner.os }}-otr-ccache - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y $(cat .github/workflows/apt-deps.txt) libzip-dev zipcmp zipmerge ziptool - - name: Cache build folders - uses: actions/cache@v4 + - name: Restore Cached deps folder + uses: actions/cache/restore@v4 with: - key: ${{ runner.os }}-otr-build-${{ github.ref }}-${{ github.sha }} + key: ${{ runner.os }}-deps-${{ github.ref }}-${{ github.sha }} restore-keys: | - ${{ runner.os }}-otr-build-${{ github.ref }} - ${{ runner.os }}-otr-build- - path: | - build-cmake - SDL2-2.30.3 - tinyxml2-10.0.0 + ${{ runner.os }}-deps-${{ github.ref }}- + ${{ runner.os }}-deps- + path: deps + - name: Create deps folder + run: mkdir -p deps - name: Install latest SDL run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "SDL2-2.30.3" ]; then - wget https://www.libsdl.org/release/SDL2-2.30.3.tar.gz - tar -xzf SDL2-2.30.3.tar.gz + if [ ! -d "deps/SDL2-2.30.3" ]; then + wget https://github.com/libsdl-org/SDL/releases/download/release-2.30.3/SDL2-2.30.3.tar.gz + tar -xzf SDL2-2.30.3.tar.gz -C deps fi - cd SDL2-2.30.3 + cd deps/SDL2-2.30.3 ./configure --enable-hidapi-libusb make -j 10 sudo make install @@ -50,77 +52,86 @@ jobs: run: | sudo apt-get remove libtinyxml2-dev export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "tinyxml2-10.0.0" ]; then + if [ ! -d "deps/tinyxml2-10.0.0" ]; then wget https://github.com/leethomason/tinyxml2/archive/refs/tags/10.0.0.tar.gz - tar -xzf 10.0.0.tar.gz + tar -xzf 10.0.0.tar.gz -C deps fi - cd tinyxml2-10.0.0 + cd deps/tinyxml2-10.0.0 mkdir -p build cd build cmake .. make sudo make install - - name: Generate soh.otr + - name: Generate soh.o2r run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release - cmake --build build-cmake --config Release --target GenerateSohOtr - - uses: actions/upload-artifact@v4 + cmake --build build-cmake --config Release --target GenerateSohOtr -j3 + - name: Upload soh.o2r + uses: actions/upload-artifact@v4 with: - name: soh.otr - path: soh.otr - retention-days: 1 + name: soh.o2r + path: soh.o2r + retention-days: 3 + build-macos: needs: generate-soh-otr runs-on: macos-14 steps: - - uses: actions/checkout@v4 + - name: Git Checkout + uses: actions/checkout@v4 with: submodules: true - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2.14 + - name: Configure ccache + uses: hendrikmuhs/ccache-action@v1.2 with: create-symlink: true + save: ${{ github.ref_name == github.event.repository.default_branch }} key: ${{ runner.os }}-14-ccache-${{ github.ref }}-${{ github.sha }} restore-keys: | ${{ runner.os }}-14-ccache-${{ github.ref }} - ${{ runner.os }}-14-ccache- + ${{ runner.os }}-14-ccache + # Needed to apply sudo for macports cache restore - name: Install gtar wrapper run: | sudo mv /opt/homebrew/bin/gtar /opt/homebrew/bin/gtar.orig - sudo cp .github/workflows//gtar /opt/homebrew/bin/gtar + sudo cp .github/workflows/gtar /opt/homebrew/bin/gtar sudo chmod +x /opt/homebrew/bin/gtar - - name: Cache MacPorts - id: cache-macports - uses: actions/cache@v4 + - name: Restore Cached MacPorts + id: restore-cache-macports + uses: actions/cache/restore@v4 with: - path: /opt/local/ - key: ${{ runner.os }}-14-macports-${{ hashFiles('.github/workflows/macports-deps.txt') }} + key: ${{ runner.os }}-14-macports-${{ hashFiles('.github/workflows/macports-deps.txt') }}-${{ github.sha }} restore-keys: | + ${{ runner.os }}-14-macports-${{ hashFiles('.github/workflows/macports-deps.txt') }}- ${{ runner.os }}-14-macports- + path: /opt/local/ + # Updated PATH applies to the next step and onwards - name: Install MacPorts (if necessary) run: | - if [ -d /opt/local/ ]; then + if command -v /opt/local/bin/port 2>&1 >/dev/null; then echo "MacPorts already installed" else + echo "Installing MacPorts" wget https://github.com/macports/macports-base/releases/download/v2.9.3/MacPorts-2.9.3-14-Sonoma.pkg sudo installer -pkg ./MacPorts-2.9.3-14-Sonoma.pkg -target / fi - echo "/opt/local/bin:/opt/local/sbin" >> $GITHUB_PATH + echo "/opt/local/bin:/opt/local/sbin" >> "$GITHUB_PATH" - name: Install dependencies run: | brew uninstall --ignore-dependencies libpng sudo port install $(cat .github/workflows/macports-deps.txt) brew install ninja - - name: Download soh.otr + - name: Download soh.o2r uses: actions/download-artifact@v4 with: - name: soh.otr + name: soh.o2r + path: build-cmake/soh - name: Build SoH run: | + export PATH="/usr/lib/ccache:/opt/homebrew/opt/ccache/libexec:/usr/local/opt/ccache/libexec:$PATH" cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DBUILD_REMOTE_CONTROL=1 cmake --build build-cmake --config Release --parallel 10 - mv soh.otr build-cmake/soh (cd build-cmake && cpack) mv _packages/*.dmg SoH.dmg @@ -132,44 +143,52 @@ jobs: path: | SoH.dmg readme.txt + - name: Save Cache MacPorts + if: ${{ github.ref_name == github.event.repository.default_branch }} + uses: actions/cache/save@v4 + with: + key: ${{ steps.restore-cache-macports.outputs.cache-primary-key }} + path: /opt/local/ + build-linux: needs: generate-soh-otr runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - name: Git Checkout + uses: actions/checkout@v4 with: submodules: true - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y $(cat .github/workflows/apt-deps.txt) - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2.14 + - name: Configure ccache + uses: hendrikmuhs/ccache-action@v1.2 with: - key: linux-ccache-${{ github.ref }}-${{ github.sha }} + save: ${{ github.ref_name == github.event.repository.default_branch }} + key: ${{ runner.os }}-ccache-${{ github.ref }}-${{ github.sha }} restore-keys: | - linux-ccache-${{ github.ref }} - linux-ccache- - - name: Cache build folders - uses: actions/cache@v4 + ${{ runner.os }}-ccache-${{ github.ref }} + ${{ runner.os }}-ccache + - name: Restore Cached deps folder + id: restore-cache-deps + uses: actions/cache/restore@v4 with: - key: linux-build-${{ github.ref }}-${{ github.sha }} + key: ${{ runner.os }}-deps-${{ github.ref }}-${{ github.sha }} restore-keys: | - linux-build-${{ github.ref }} - linux-build- - path: | - SDL2-2.30.3 - SDL2_net-2.2.0 - tinyxml2-10.0.0 - libzip-1.10.1 + ${{ runner.os }}-deps-${{ github.ref }}- + ${{ runner.os }}-deps- + path: deps + - name: Create deps folder + run: mkdir -p deps - name: Install latest SDL run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "SDL2-2.30.3" ]; then - wget https://www.libsdl.org/release/SDL2-2.30.3.tar.gz - tar -xzf SDL2-2.30.3.tar.gz + if [ ! -d "deps/SDL2-2.30.3" ]; then + wget https://github.com/libsdl-org/SDL/releases/download/release-2.30.3/SDL2-2.30.3.tar.gz + tar -xzf SDL2-2.30.3.tar.gz -C deps fi - cd SDL2-2.30.3 + cd deps/SDL2-2.30.3 ./configure --enable-hidapi-libusb make -j 10 sudo make install @@ -177,11 +196,11 @@ jobs: - name: Install latest SDL_net run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "SDL2_net-2.2.0" ]; then + if [ ! -d "deps/SDL2_net-2.2.0" ]; then wget https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.2.0.tar.gz - tar -xzf SDL2_net-2.2.0.tar.gz + tar -xzf SDL2_net-2.2.0.tar.gz -C deps fi - cd SDL2_net-2.2.0 + cd deps/SDL2_net-2.2.0 ./configure make -j 10 sudo make install @@ -190,11 +209,11 @@ jobs: run: | sudo apt-get remove libtinyxml2-dev export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "tinyxml2-10.0.0" ]; then + if [ ! -d "deps/tinyxml2-10.0.0" ]; then wget https://github.com/leethomason/tinyxml2/archive/refs/tags/10.0.0.tar.gz - tar -xzf 10.0.0.tar.gz + tar -xzf 10.0.0.tar.gz -C deps fi - cd tinyxml2-10.0.0 + cd deps/tinyxml2-10.0.0 mkdir -p build cd build cmake .. @@ -203,21 +222,22 @@ jobs: - name: Install libzip without crypto run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "libzip-1.10.1" ]; then + if [ ! -d "deps/libzip-1.10.1" ]; then wget https://github.com/nih-at/libzip/releases/download/v1.10.1/libzip-1.10.1.tar.gz - tar -xzf libzip-1.10.1.tar.gz + tar -xzf libzip-1.10.1.tar.gz -C deps fi - cd libzip-1.10.1 + cd deps/libzip-1.10.1 mkdir -p build cd build cmake .. -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF make sudo make install sudo cp -av /usr/local/lib/libzip* /lib/x86_64-linux-gnu/ - - name: Download soh.otr + - name: Download soh.o2r uses: actions/download-artifact@v4 with: - name: soh.otr + name: soh.o2r + path: build-cmake/soh - name: Build SoH run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" @@ -237,63 +257,73 @@ jobs: path: | soh.appimage readme.txt + - name: Save Cache deps folder + if: ${{ github.ref_name == github.event.repository.default_branch }} + uses: actions/cache/save@v4 + with: + key: ${{ steps.restore-cache-deps.outputs.cache-primary-key }} + path: deps + build-windows: needs: generate-soh-otr - runs-on: ${{ (vars.WINDOWS_RUNNER && fromJSON(vars.WINDOWS_RUNNER)) || 'windows-latest' }} + runs-on: windows-latest steps: - name: Install dependencies - if: ${{ !vars.WINDOWS_RUNNER }} run: | - choco install ninja + choco install ninja -y Remove-Item -Path "C:\ProgramData\Chocolatey\bin\ccache.exe" -Force -ErrorAction SilentlyContinue - - uses: actions/checkout@v4 + - name: Git Checkout + uses: actions/checkout@v4 with: submodules: true - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2.14 + - name: Configure sccache + uses: hendrikmuhs/ccache-action@v1.2 with: variant: sccache - max-size: "1G" + max-size: "2G" + evict-old-files: job + save: ${{ github.ref_name == github.event.repository.default_branch }} key: ${{ runner.os }}-ccache-${{ github.ref }}-${{ github.sha }} restore-keys: | ${{ runner.os }}-ccache-${{ github.ref }} - ${{ runner.os }}-ccache- - - name: Cache build folder - uses: actions/cache@v4 + ${{ runner.os }}-ccache + - name: Restore Cached VCPKG folder + id: restore-cache-vcpkg + uses: actions/cache/restore@v4 with: - key: ${{ runner.os }}-build-${{ github.ref }}-${{ github.sha }} + key: ${{ runner.os }}-vcpkg-${{ github.ref }}-${{ github.sha }} restore-keys: | - ${{ runner.os }}-build-${{ github.ref }} - ${{ runner.os }}-build- - path: | - build-windows - vcpkg + ${{ runner.os }}-vcpkg-${{ github.ref }}- + ${{ runner.os }}-vcpkg- + path: vcpkg - name: Configure Developer Command Prompt uses: ilammy/msvc-dev-cmd@v1 + - name: Download soh.o2r + uses: actions/download-artifact@v4 + with: + name: soh.o2r + path: build-windows/soh - name: Build SoH - env: + env: VCPKG_ROOT: ${{github.workspace}}/vcpkg run: | set $env:PATH="$env:USERPROFILE/.cargo/bin;$env:PATH" cmake -S . -B build-windows -G Ninja -DCMAKE_MAKE_PROGRAM=ninja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache -DBUILD_REMOTE_CONTROL=1 cmake --build build-windows --config Release --parallel 10 - mkdir soh-windows - mv ./x64/Release/soh.exe ./soh-windows/soh.exe - mkdir soh-windows/debug - mkdir soh-windows/mods - New-Item soh-windows/mods/custom_otr_files_go_here.txt -type file - mv ./x64/Release/soh.pdb ./soh-windows/debug/soh.pdb - mv ./README.md ./soh-windows/readme.txt - mv ./build-windows/gamecontrollerdb.txt ./soh-windows/gamecontrollerdb.txt - mv ./x64/Release/assets ./soh-windows - - name: Download soh.otr - uses: actions/download-artifact@v4 - with: - name: soh.otr - path: soh-windows + (cd build-windows && cpack) + cd .. + mv _packages/*.zip _packages/soh-windows.zip + - name: Unzip package + run: Expand-Archive -Path _packages/soh-windows.zip -DestinationPath soh-windows - name: Upload build uses: actions/upload-artifact@v4 with: name: soh-windows path: soh-windows + - name: Save Cache VCPKG folder + if: ${{ github.ref_name == github.event.repository.default_branch }} + uses: actions/cache/save@v4 + with: + key: ${{ steps.restore-cache-vcpkg.outputs.cache-primary-key }} + path: vcpkg diff --git a/.github/workflows/macports-deps.txt b/.github/workflows/macports-deps.txt index d150390781..fd97d0c306 100644 --- a/.github/workflows/macports-deps.txt +++ b/.github/workflows/macports-deps.txt @@ -1 +1 @@ -libsdl2 +universal libsdl2_net +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal \ No newline at end of file +libsdl2 +universal libsdl2_net +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal libogg +universal libopus +universal opusfile +universal libvorbis +universal \ No newline at end of file diff --git a/.github/workflows/pr-artifacts.yml b/.github/workflows/pr-artifacts.yml index 85db7de598..5b20030af0 100644 --- a/.github/workflows/pr-artifacts.yml +++ b/.github/workflows/pr-artifacts.yml @@ -48,7 +48,7 @@ jobs: }); return allArtifacts.data.artifacts.reduce((acc, item) => { - if (item.name === "soh.otr") return acc; + if (item.name === "soh.o2r") return acc; acc += ` - [${item.name}.zip](https://nightly.link/${context.repo.owner}/${context.repo.repo}/actions/artifacts/${item.id}.zip)`; return acc; diff --git a/.github/workflows/test-builds-on-distros.yml b/.github/workflows/test-builds-on-distros.yml index 476bdf2f33..8b6ded6d62 100644 --- a/.github/workflows/test-builds-on-distros.yml +++ b/.github/workflows/test-builds-on-distros.yml @@ -23,24 +23,24 @@ jobs: if: ${{ matrix.image == 'archlinux:base' }} run: | echo arch - echo pacman -S ${{ matrix.cc }} git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net boost + echo pacman -S ${{ matrix.cc }} git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net pacman -Syu --noconfirm - pacman -S --noconfirm ${{ matrix.cc }} git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net boost + pacman -S --noconfirm ${{ matrix.cc }} git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net - name: Install dependencies (dnf) if: ${{ matrix.image == 'fedora:39' }} run: | echo fedora - echo dnf install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'gcc-c++') || '' }} wget git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools tinyxml2-devel spdlog-devel boost-devel + echo dnf install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'gcc-c++') || '' }} wget git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools tinyxml2-devel spdlog-devel dnf -y upgrade - dnf -y install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'gcc-c++') || '' }} wget git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools tinyxml2-devel spdlog-devel boost-devel + dnf -y install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'gcc-c++') || '' }} wget git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools tinyxml2-devel spdlog-devel - name: Install dependencies (apt) if: ${{ matrix.image == 'ubuntu:mantic' || matrix.image == 'debian:bookworm' }} run: | echo debian based - echo apt-get install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'g++') || '' }} git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libboost-dev libopengl-dev + echo apt-get install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'g++') || '' }} git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libopengl-dev apt-get update apt-get -y full-upgrade - apt-get -y install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'g++') || '' }} git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libboost-dev libopengl-dev + apt-get -y install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'g++') || '' }} git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libopengl-dev - name: Install dependencies (zypper) if: ${{ matrix.image == 'opensuse/tumbleweed:latest' }} run: | diff --git a/.gitignore b/.gitignore index ec5401c385..3aa34d9c51 100644 --- a/.gitignore +++ b/.gitignore @@ -412,6 +412,7 @@ ReleaseObj/* .tags tags *.otr +*.o2r *.sav shipofharkinian.ini shipofharkinian.json @@ -452,3 +453,7 @@ _packages soh/src/boot/build.c soh/properties.h + +# Tools +/clang-format +/clang-format.exe diff --git a/CMake/FindOgg.cmake b/CMake/FindOgg.cmake new file mode 100644 index 0000000000..9cf5ce4309 --- /dev/null +++ b/CMake/FindOgg.cmake @@ -0,0 +1,61 @@ +# - Find ogg +# Find the native ogg includes and libraries +# +# OGG_INCLUDE_DIRS - where to find ogg.h, etc. +# OGG_LIBRARIES - List of libraries when using ogg. +# OGG_FOUND - True if ogg found. + +if (OGG_INCLUDE_DIR) + # Already in cache, be silent + set(OGG_FIND_QUIETLY TRUE) +endif () + +find_package (PkgConfig QUIET) +pkg_check_modules (PC_OGG QUIET ogg>=1.3.0) + +set (OGG_VERSION ${PC_OGG_VERSION}) + +find_path (OGG_INCLUDE_DIR ogg/ogg.h + HINTS + ${PC_OGG_INCLUDEDIR} + ${PC_OGG_INCLUDE_DIRS} + ${OGG_ROOT} + ) +# MSVC built ogg may be named ogg_static. +# The provided project files name the library with the lib prefix. +find_library (OGG_LIBRARY + NAMES + ogg + ogg_static + libogg + libogg_static + HINTS + ${PC_OGG_LIBDIR} + ${PC_OGG_LIBRARY_DIRS} + ${OGG_ROOT} + ) +# Handle the QUIETLY and REQUIRED arguments and set OGG_FOUND +# to TRUE if all listed variables are TRUE. +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (Ogg + REQUIRED_VARS + OGG_LIBRARY + OGG_INCLUDE_DIR + VERSION_VAR + OGG_VERSION + ) + +if (OGG_FOUND) + set (OGG_LIBRARIES ${OGG_LIBRARY}) + set (OGG_INCLUDE_DIRS ${OGG_INCLUDE_DIR}) + + if(NOT TARGET Ogg::ogg) + add_library(Ogg::ogg UNKNOWN IMPORTED) + set_target_properties(Ogg::ogg PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OGG_INCLUDE_DIRS}" + IMPORTED_LOCATION "${OGG_LIBRARIES}" + ) + endif () +endif () + +mark_as_advanced (OGG_INCLUDE_DIR OGG_LIBRARY) diff --git a/CMake/FindOpus.cmake b/CMake/FindOpus.cmake new file mode 100644 index 0000000000..1e6e30d680 --- /dev/null +++ b/CMake/FindOpus.cmake @@ -0,0 +1,44 @@ +# - FindOpus.cmake +# Find the native opus includes and libraries +# +# OPUS_INCLUDE_DIRS - where to find opus/opus.h, etc. +# OPUS_LIBRARIES - List of libraries when using libopus(file). +# OPUS_FOUND - True if libopus found. + +if(OPUS_INCLUDE_DIR AND OPUS_LIBRARY AND OPUSFILE_LIBRARY) + # Already in cache, be silent + set(OPUS_FIND_QUIETLY TRUE) +endif(OPUS_INCLUDE_DIR AND OPUS_LIBRARY AND OPUSFILE_LIBRARY) + +find_path(OPUS_INCLUDE_DIR + NAMES opusfile.h + PATH_SUFFIXES opus +) + +# MSVC built opus may be named opus_static +# The provided project files name the library with the lib prefix. +find_library(OPUS_LIBRARY + NAMES opus opus_static libopus libopus_static +) +#find_library(OPUSFILE_LIBRARY +# NAMES opusfile opusfile_static libopusfile libopusfile_static +#) + +# Handle the QUIETLY and REQUIRED arguments and set OPUS_FOUND +# to TRUE if all listed variables are TRUE. +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Opus DEFAULT_MSG + OPUS_LIBRARY OPUS_INCLUDE_DIR +) + +if(OPUS_FOUND) + set(OPUS_LIBRARIES ${OPUS_LIBRARY}) + set(OPUS_INCLUDE_DIRS ${OPUS_INCLUDE_DIR}) + if(NOT TARGET Opus::opus) + add_library(Opus::opus UNKNOWN IMPORTED) + set_target_properties(Opus::opus PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OPUS_INCLUDE_DIRS}" + IMPORTED_LOCATION "${OPUS_LIBRARIES}" + ) + endif() +endif(OPUS_FOUND) diff --git a/CMake/FindOpusFile.cmake b/CMake/FindOpusFile.cmake new file mode 100644 index 0000000000..ed3b4b7ba3 --- /dev/null +++ b/CMake/FindOpusFile.cmake @@ -0,0 +1,55 @@ +# FindOpusFile.cmake +# Locate the libopusfile library and its dependencies (libopus and libogg). +# Defines the following variables on success: +# OPUSFILE_FOUND - Indicates if opusfile was found +# OPUSFILE_INCLUDE_DIR - Directory containing opusfile.h +# OPUSFILE_LIBRARY - Path to the opusfile library +# OPUSFILE_LIBRARIES - Full list of libraries to link (opusfile, opus, ogg) + +# Search for the OpusFile header +find_path(OPUSFILE_INCLUDE_DIR + NAMES opusfile.h + PATHS /usr/include/opus /usr/local/include/opus /opt/local/include/opus /opt/homebrew/include/opus + DOC "Directory where opusfile.h is located" +) + +# Search for the OpusFile library +find_library(OPUSFILE_LIBRARY + NAMES opusfile + DOC "Path to the libopusfile library" +) + +# Search for the Opus library (dependency of OpusFile) +find_library(OPUS_LIBRARY + NAMES opus + DOC "Path to the libopus library (dependency of libopusfile)" +) + +# Search for the Ogg library (dependency of OpusFile) +find_library(OGG_LIBRARY + NAMES ogg + DOC "Path to the libogg library (dependency of libopusfile)" +) + +# Check if all required components are found +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpusFile + REQUIRED_VARS OPUSFILE_LIBRARY OPUSFILE_INCLUDE_DIR OPUS_LIBRARY OGG_LIBRARY + VERSION_VAR OPUSFILE_VERSION +) + +# Define an imported target if everything is found +if (OPUSFILE_FOUND) + add_library(Opusfile::Opusfile INTERFACE IMPORTED) + + set_target_properties(Opusfile::Opusfile PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OPUSFILE_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${OPUSFILE_LIBRARY};${OPUS_LIBRARY};${OGG_LIBRARY}" + ) + + # Optionally expose the include and libraries separately + set(OPUSFILE_LIBRARIES ${OPUSFILE_LIBRARY} ${OPUS_LIBRARY} ${OGG_LIBRARY}) + set(OPUSFILE_INCLUDE_DIRS ${OPUSFILE_INCLUDE_DIR}) +else() + set(OPUSFILE_FOUND FALSE) +endif() diff --git a/CMake/FindVorbis.cmake b/CMake/FindVorbis.cmake new file mode 100644 index 0000000000..57e60557f7 --- /dev/null +++ b/CMake/FindVorbis.cmake @@ -0,0 +1,210 @@ +#[=======================================================================[.rst: +FindVorbis +---------- + +Finds the native vorbis, vorbisenc amd vorbisfile includes and libraries. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module provides the following imported targets, if found: + +``Vorbis::vorbis`` + The Vorbis library +``Vorbis::vorbisenc`` + The VorbisEnc library +``Vorbis::vorbisfile`` + The VorbisFile library + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``Vorbis_Vorbis_INCLUDE_DIRS`` + List of include directories when using vorbis. +``Vorbis_Enc_INCLUDE_DIRS`` + List of include directories when using vorbisenc. +``Vorbis_File_INCLUDE_DIRS`` + List of include directories when using vorbisfile. +``Vorbis_Vorbis_LIBRARIES`` + List of libraries when using vorbis. +``Vorbis_Enc_LIBRARIES`` + List of libraries when using vorbisenc. +``Vorbis_File_LIBRARIES`` + List of libraries when using vorbisfile. +``Vorbis_FOUND`` + True if vorbis and requested components found. +``Vorbis_Vorbis_FOUND`` + True if vorbis found. +``Vorbis_Enc_FOUND`` + True if vorbisenc found. +``Vorbis_Enc_FOUND`` + True if vorbisfile found. + +Cache variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``Vorbis_Vorbis_INCLUDE_DIR`` + The directory containing ``vorbis/vorbis.h``. +``Vorbis_Enc_INCLUDE_DIR`` + The directory containing ``vorbis/vorbisenc.h``. +``Vorbis_File_INCLUDE_DIR`` + The directory containing ``vorbis/vorbisenc.h``. +``Vorbis_Vorbis_LIBRARY`` + The path to the vorbis library. +``Vorbis_Enc_LIBRARY`` + The path to the vorbisenc library. +``Vorbis_File_LIBRARY`` + The path to the vorbisfile library. + +Hints +^^^^^ + +A user may set ``Vorbis_ROOT`` to a vorbis installation root to tell this module where to look. + +#]=======================================================================] + +if (Vorbis_Vorbis_INCLUDE_DIR) + # Already in cache, be silent + set (Vorbis_FIND_QUIETLY TRUE) +endif () + +set (Vorbis_Vorbis_FIND_QUIETLY TRUE) +set (Vorbis_Enc_FIND_QUIETLY TRUE) +set (Vorbis_File_FIND_QUIETLY TRUE) + +find_package (Ogg QUIET) + +find_package (PkgConfig QUIET) +pkg_check_modules (PC_Vorbis_Vorbis QUIET vorbis) +pkg_check_modules (PC_Vorbis_Enc QUIET vorbisenc) +pkg_check_modules (PC_Vorbis_File QUIET vorbisfile) + +set (Vorbis_VERSION ${PC_Vorbis_Vorbis_VERSION}) + +find_path (Vorbis_Vorbis_INCLUDE_DIR vorbis/codec.h + HINTS + ${PC_Vorbis_Vorbis_INCLUDEDIR} + ${PC_Vorbis_Vorbis_INCLUDE_DIRS} + ${Vorbis_ROOT} + ) + +find_path (Vorbis_Enc_INCLUDE_DIR vorbis/vorbisenc.h + HINTS + ${PC_Vorbis_Enc_INCLUDEDIR} + ${PC_Vorbis_Enc_INCLUDE_DIRS} + ${Vorbis_ROOT} + ) + +find_path (Vorbis_File_INCLUDE_DIR vorbis/vorbisfile.h + HINTS + ${PC_Vorbis_File_INCLUDEDIR} + ${PC_Vorbis_File_INCLUDE_DIRS} + ${Vorbis_ROOT} + ) + +find_library (Vorbis_Vorbis_LIBRARY + NAMES + vorbis + vorbis_static + libvorbis + libvorbis_static + HINTS + ${PC_Vorbis_Vorbis_LIBDIR} + ${PC_Vorbis_Vorbis_LIBRARY_DIRS} + ${Vorbis_ROOT} + ) + +find_library (Vorbis_Enc_LIBRARY + NAMES + vorbisenc + vorbisenc_static + libvorbisenc + libvorbisenc_static + HINTS + ${PC_Vorbis_Enc_LIBDIR} + ${PC_Vorbis_Enc_LIBRARY_DIRS} + ${Vorbis_ROOT} + ) + +find_library (Vorbis_File_LIBRARY + NAMES + vorbisfile + vorbisfile_static + libvorbisfile + libvorbisfile_static + HINTS + ${PC_Vorbis_File_LIBDIR} + ${PC_Vorbis_File_LIBRARY_DIRS} + ${Vorbis_ROOT} + ) + +include (FindPackageHandleStandardArgs) + +if (Vorbis_Vorbis_LIBRARY AND Vorbis_Vorbis_INCLUDE_DIR AND Ogg_FOUND) + set (Vorbis_Vorbis_FOUND TRUE) +endif () + +if (Vorbis_Enc_LIBRARY AND Vorbis_Enc_INCLUDE_DIR AND Vorbis_Vorbis_FOUND) + set (Vorbis_Enc_FOUND TRUE) +endif () + +if (Vorbis_Vorbis_FOUND AND Vorbis_File_LIBRARY AND Vorbis_File_INCLUDE_DIR) + set (Vorbis_File_FOUND TRUE) +endif () + +find_package_handle_standard_args (Vorbis + REQUIRED_VARS + Vorbis_Vorbis_LIBRARY + Vorbis_Vorbis_INCLUDE_DIR + Ogg_FOUND + HANDLE_COMPONENTS + VERSION_VAR Vorbis_VERSION) + + +if (Vorbis_Vorbis_FOUND) + set (Vorbis_Vorbis_INCLUDE_DIRS ${VORBIS_INCLUDE_DIR}) + set (Vorbis_Vorbis_LIBRARIES ${VORBIS_LIBRARY} ${OGG_LIBRARIES}) + if (NOT TARGET Vorbis::vorbis) + add_library (Vorbis::vorbis UNKNOWN IMPORTED) + set_target_properties (Vorbis::vorbis PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vorbis_Vorbis_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vorbis_Vorbis_LIBRARY}" + INTERFACE_LINK_LIBRARIES Ogg::ogg + ) + endif () + + if (Vorbis_Enc_FOUND) + set (Vorbis_Enc_INCLUDE_DIRS ${Vorbis_Enc_INCLUDE_DIR}) + set (Vorbis_Enc_LIBRARIES ${Vorbis_Enc_LIBRARY} ${Vorbis_Enc_LIBRARIES}) + if (NOT TARGET Vorbis::vorbisenc) + add_library (Vorbis::vorbisenc UNKNOWN IMPORTED) + set_target_properties (Vorbis::vorbisenc PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vorbis_Enc_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vorbis_Enc_LIBRARY}" + INTERFACE_LINK_LIBRARIES Vorbis::vorbis + ) + endif () + endif () + + if (Vorbis_File_FOUND) + set (Vorbis_File_INCLUDE_DIRS ${Vorbis_File_INCLUDE_DIR}) + set (Vorbis_File_LIBRARIES ${Vorbis_File_LIBRARY} ${Vorbis_File_LIBRARIES}) + if (NOT TARGET Vorbis::vorbisfile) + add_library (Vorbis::vorbisfile UNKNOWN IMPORTED) + set_target_properties (Vorbis::vorbisfile PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vorbis_File_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vorbis_File_LIBRARY}" + INTERFACE_LINK_LIBRARIES Vorbis::vorbis + ) + endif () + endif () + +endif () + +mark_as_advanced (Vorbis_Vorbis_INCLUDE_DIR Vorbis_Vorbis_LIBRARY) +mark_as_advanced (Vorbis_Enc_INCLUDE_DIR Vorbis_Enc_LIBRARY) +mark_as_advanced (Vorbis_File_INCLUDE_DIR Vorbis_File_LIBRARY) diff --git a/CMake/Packaging-2.cmake b/CMake/Packaging-2.cmake index a29635eacc..dc5da1b7ee 100644 --- a/CMake/Packaging-2.cmake +++ b/CMake/Packaging-2.cmake @@ -1,9 +1,9 @@ set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY 0) -set(CPACK_COMPONENTS_ALL "ship" "extractor" "appimage") +set(CPACK_COMPONENTS_ALL "ship") -if (NOT CPACK_GENERATOR STREQUAL "External") - list(REMOVE_ITEM CPACK_COMPONENTS_ALL "appimage") +if (CPACK_GENERATOR STREQUAL "External") + list(APPEND CPACK_COMPONENTS_ALL "extractor" "appimage") endif() if (CPACK_GENERATOR MATCHES "DEB|RPM") diff --git a/CMake/lus-cvars.cmake b/CMake/lus-cvars.cmake index f6a036479c..c64782e75e 100644 --- a/CMake/lus-cvars.cmake +++ b/CMake/lus-cvars.cmake @@ -1,7 +1,5 @@ set(CVAR_VSYNC_ENABLED "${CVAR_PREFIX_SETTING}.VsyncEnabled" CACHE STRING "") set(CVAR_Z_FIGHTING_MODE "${CVAR_PREFIX_SETTING}.ZFightingMode" CACHE STRING "") -set(CVAR_NEW_FILE_DROPPED "${CVAR_PREFIX_GENERAL}.NewFileDropped" CACHE STRING "") -set(CVAR_DROPPED_FILE "${CVAR_PREFIX_GENERAL}.DroppedFile" CACHE STRING "") set(CVAR_INTERNAL_RESOLUTION "${CVAR_PREFIX_SETTING}.InternalResolution" CACHE STRING "") set(CVAR_MSAA_VALUE "${CVAR_PREFIX_SETTING}.MSAAValue" CACHE STRING "") set(CVAR_SDL_WINDOWED_FULLSCREEN "${CVAR_PREFIX_SETTING}.SdlWindowedFullscreen" CACHE STRING "") diff --git a/CMake/soh-cvars.cmake b/CMake/soh-cvars.cmake index e5ff8a3841..227cfb2bb5 100644 --- a/CMake/soh-cvars.cmake +++ b/CMake/soh-cvars.cmake @@ -10,6 +10,8 @@ set(CVAR_PREFIX_TRACKER "gTrackers") set(CVAR_PREFIX_DEVELOPER_TOOLS "gDeveloperTools") set(CVAR_PREFIX_GENERAL "gGeneral") set(CVAR_PREFIX_REMOTE "gRemote") +set(CVAR_PREFIX_GAMEPLAY_STATS "gGameplayStats") +set(CVAR_PREFIX_TIME_DISPLAY "gTimeDisplay") add_compile_definitions( CVAR_PREFIX_RANDOMIZER_ENHANCEMENT="${CVAR_PREFIX_RANDOMIZER_ENHANCEMENT}" CVAR_PREFIX_RANDOMIZER_SETTING="${CVAR_PREFIX_RANDOMIZER_SETTING}" @@ -23,4 +25,6 @@ add_compile_definitions( CVAR_PREFIX_DEVELOPER_TOOLS="${CVAR_PREFIX_DEVELOPER_TOOLS}" CVAR_PREFIX_GENERAL="${CVAR_PREFIX_GENERAL}" CVAR_PREFIX_REMOTE="${CVAR_PREFIX_REMOTE}" + CVAR_PREFIX_GAMEPLAY_STATS="${CVAR_PREFIX_GAMEPLAY_STATS}" + CVAR_PREFIX_TIME_DISPLAY="${CVAR_PREFIX_TIME_DISPLAY}" ) \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 3437ef3fd5..7333da8d81 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,10 +2,11 @@ cmake_minimum_required(VERSION 3.26.0 FATAL_ERROR) set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE) set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") +set(CMAKE_C_STANDARD 23 CACHE STRING "The C standard to use") set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") -project(Ship VERSION 8.0.6 LANGUAGES C CXX) +project(Ship VERSION 9.0.2 LANGUAGES C CXX) include(CMake/soh-cvars.cmake) include(CMake/lus-cvars.cmake) @@ -34,7 +35,7 @@ math(EXPR PATCH_INDEX "${PROJECT_VERSION_PATCH}") # Use the patch number to select the correct word list(GET NATO_PHONETIC_ALPHABET ${PATCH_INDEX} PROJECT_PATCH_WORD) -set(PROJECT_BUILD_NAME "MacReady ${PROJECT_PATCH_WORD}" CACHE STRING "" FORCE) +set(PROJECT_BUILD_NAME "Blair ${PROJECT_PATCH_WORD}" CACHE STRING "" FORCE) set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "" FORCE) execute_process( @@ -53,7 +54,10 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -set(CMAKE_PROJECT_GIT_COMMIT_HASH "${GIT_COMMIT_HASH}" CACHE STRING "Git commit hash" FORCE) +# Get only the first 7 characters of the hash +string(SUBSTRING "${GIT_COMMIT_HASH}" 0 7 SHORT_COMMIT_HASH) + +set(CMAKE_PROJECT_GIT_COMMIT_HASH "${SHORT_COMMIT_HASH}" CACHE STRING "Git commit hash" FORCE) execute_process( COMMAND git describe --tags --abbrev=0 --exact-match HEAD @@ -79,8 +83,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows") set(VCPKG_TARGET_TRIPLET x64-windows-static) vcpkg_bootstrap() - vcpkg_install_packages(zlib bzip2 libzip libpng sdl2 sdl2-net glew glfw3 nlohmann-json tinyxml2 spdlog) - + vcpkg_install_packages(zlib bzip2 libzip libpng sdl2 sdl2-net glew glfw3 nlohmann-json tinyxml2 spdlog libogg libvorbis opus opusfile) if (CMAKE_C_COMPILER_LAUNCHER MATCHES "ccache|sccache") set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded) endif() @@ -150,6 +153,7 @@ set(GFX_DEBUG_DISASSEMBLER ON) # Tell LUS we're using F3DEX_GBI_2 (in a way that doesn't break libgfxd) set(GBI_UCODE F3DEX_GBI_2) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake") ################################################################################ # Set CONTROLLERBUTTONS_T @@ -170,24 +174,15 @@ set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE "${CMAKE_SOURCE_DIR}/scri set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon.png") if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") -install(PROGRAMS "${CMAKE_BINARY_DIR}/linux/soh.sh" DESTINATION . COMPONENT appimage) -install(FILES "${CMAKE_SOURCE_DIR}/soh.otr" DESTINATION . COMPONENT ship) +install(FILES "${CMAKE_BINARY_DIR}/soh/soh.o2r" DESTINATION . COMPONENT ship) install(TARGETS ZAPD DESTINATION ./assets/extractor COMPONENT extractor) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/extractor COMPONENT extractor) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/extractor/xmls COMPONENT extractor) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/filelists/" DESTINATION ./assets/extractor/filelists COMPONENT extractor) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ActorList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT extractor) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ObjectList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT extractor) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/SymbolMap_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT extractor) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets COMPONENT extractor) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/xml COMPONENT extractor) endif() if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/extractor COMPONENT ship) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/extractor/xmls COMPONENT ship) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/filelists/" DESTINATION ./assets/extractor/filelists COMPONENT ship) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ActorList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT ship) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ObjectList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT ship) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/SymbolMap_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT ship) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/ COMPONENT ship) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/xml COMPONENT ship) endif() find_package(Python3 COMPONENTS Interpreter) @@ -195,32 +190,42 @@ find_package(Python3 COMPONENTS Interpreter) # Target to generate OTRs add_custom_target( ExtractAssets - COMMAND ${CMAKE_COMMAND} -E rm -f oot.otr oot-mq.otr soh.otr - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root ../soh/assets/xml --custom-otr-file soh.otr "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" + COMMAND ${CMAKE_COMMAND} -E rm -f oot.o2r oot-mq.o2r soh.o2r + + # copy LUS default shaders into assets/custom + COMMAND ${CMAKE_COMMAND} -E rm -r -f ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/graphic/Fast3D/shaders/ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ + + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root assets/xml --custom-otr-file soh.o2r "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/soh COMMENT "Running asset extraction..." DEPENDS ZAPD - BYPRODUCTS oot.otr ${CMAKE_SOURCE_DIR}/oot.otr oot-mq.otr ${CMAKE_SOURCE_DIR}/oot-mq.otr ${CMAKE_SOURCE_DIR}/soh.otr + BYPRODUCTS oot.o2r ${CMAKE_SOURCE_DIR}/oot.o2r oot-mq.o2r ${CMAKE_SOURCE_DIR}/oot-mq.o2r ${CMAKE_SOURCE_DIR}/soh.o2r ) # Target to generate headers add_custom_target( ExtractAssetHeaders - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root ../soh/assets/xml --gen-headers - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root assets/xml --gen-headers + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/soh COMMENT "Generating asset headers..." DEPENDS ZAPD ) -# Target to generate only soh.otr +# Target to generate only soh.o2r add_custom_target( GenerateSohOtr - COMMAND ${CMAKE_COMMAND} -E rm -f soh.otr - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --norom --custom-otr-file soh.otr "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" + COMMAND ${CMAKE_COMMAND} -E rm -f soh.o2r + + # copy LUS default shaders into assets/custom + COMMAND ${CMAKE_COMMAND} -E rm -r -f ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/graphic/Fast3D/shaders/ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ + + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --norom --custom-otr-file soh.o2r "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -DONLYSOHOTR=On -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter - COMMENT "Generating soh.otr..." + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/soh + COMMENT "Generating soh.o2r..." DEPENDS ZAPD ) @@ -228,7 +233,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux") find_package(ImageMagick COMPONENTS convert) if (ImageMagick_FOUND) execute_process ( - COMMAND ${ImageMagick_convert_EXECUTABLE} soh/macosx/sohIcon.png -resize 512x512 ${CMAKE_BINARY_DIR}/sohIcon.png + COMMAND ${ImageMagick_convert_EXECUTABLE} ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png -resize 512x512 ${CMAKE_BINARY_DIR}/sohIcon.png OUTPUT_VARIABLE outVar ) endif() @@ -237,38 +242,28 @@ endif() if(CMAKE_SYSTEM_NAME MATCHES "Darwin") add_custom_target(CreateOSXIcons COMMAND mkdir -p ${CMAKE_BINARY_DIR}/macosx/soh.iconset - COMMAND sips -z 16 16 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16.png - COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16@2x.png - COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32.png - COMMAND sips -z 64 64 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32@2x.png - COMMAND sips -z 128 128 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128.png - COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128@2x.png - COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256.png - COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256@2x.png - COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512.png - COMMAND cp soh/macosx/sohIcon.png ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512@2x.png + COMMAND sips -z 16 16 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16.png + COMMAND sips -z 32 32 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16@2x.png + COMMAND sips -z 32 32 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32.png + COMMAND sips -z 64 64 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32@2x.png + COMMAND sips -z 128 128 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128.png + COMMAND sips -z 256 256 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128@2x.png + COMMAND sips -z 256 256 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256.png + COMMAND sips -z 512 512 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256@2x.png + COMMAND sips -z 512 512 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512.png + COMMAND cp ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512@2x.png COMMAND iconutil -c icns -o ${CMAKE_BINARY_DIR}/macosx/soh.icns ${CMAKE_BINARY_DIR}/macosx/soh.iconset WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Creating OSX icons ..." ) add_dependencies(soh CreateOSXIcons) -install(TARGETS ZAPD DESTINATION ${CMAKE_BINARY_DIR}/assets/extractor) +install(TARGETS ZAPD DESTINATION ${CMAKE_BINARY_DIR}/assets) set(PROGRAM_PERMISSIONS_EXECUTE OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/extractor) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/extractor/xmls) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/filelists/" DESTINATION ./assets/extractor/filelists) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ActorList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ObjectList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/SymbolMap_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols) - -install(DIRECTORY ${CMAKE_BINARY_DIR}/assets - DESTINATION . - PATTERN ZAPD.out - PERMISSIONS ${PROGRAM_PERMISSIONS_EXECUTE} - ) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/xml) # Rename the installed soh binary to drop the macos suffix INSTALL(CODE "FILE(RENAME \${CMAKE_INSTALL_PREFIX}/../MacOS/soh-macos \${CMAKE_INSTALL_PREFIX}/../MacOS/soh)") diff --git a/OTRExporter b/OTRExporter index 8f71672901..461ab19a36 160000 --- a/OTRExporter +++ b/OTRExporter @@ -1 +1 @@ -Subproject commit 8f71672901987bc3dbf6256e64e228db36a686f5 +Subproject commit 461ab19a36cde807591543397e136cae19aa6e7c diff --git a/README.md b/README.md index e7f929bad5..ea1ad76a23 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,8 @@ Congratulations, you are now sailing with the Ship of Harkinian! Have fun! ### Other shortcuts | Keys | Action | | - | - | -| F1 | Toggle menubar | +| ESC | Toggle menu | +| F2 | Toggle capture mouse input | | F5 | Save state | | F6 | Change state | | F7 | Load state | diff --git a/ZAPDTR b/ZAPDTR index 04d42249d2..684f21a475 160000 --- a/ZAPDTR +++ b/ZAPDTR @@ -1 +1 @@ -Subproject commit 04d42249d2c15c3b442a0282a90bc8b7bda25b03 +Subproject commit 684f21a475dcfeee89938ae1f4afc42768a3e7ef diff --git a/copy-existing-otrs.cmake b/copy-existing-otrs.cmake index f5226510c7..d5a5f89957 100644 --- a/copy-existing-otrs.cmake +++ b/copy-existing-otrs.cmake @@ -1,37 +1,37 @@ message(STATUS "Copying otr files...") -if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/OTRExporter/oot.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${SOURCE_DIR}) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${BINARY_DIR}/soh/) - message(STATUS "Copied oot.otr") +if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/soh/oot.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.o2r ${SOURCE_DIR}) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.o2r ${BINARY_DIR}/soh/) + message(STATUS "Copied oot.o2r") endif() -if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/OTRExporter/oot-mq.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.otr ${SOURCE_DIR}) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.otr ${BINARY_DIR}/soh/) - message(STATUS "Copied oot-mq.otr") +if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/soh/oot-mq.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.o2r ${SOURCE_DIR}) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.o2r ${BINARY_DIR}/soh/) + message(STATUS "Copied oot-mq.o2r") endif() -if(EXISTS ${SOURCE_DIR}/OTRExporter/soh.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.otr ${SOURCE_DIR}) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.otr ${BINARY_DIR}/soh/) - message(STATUS "Copied soh.otr") +if(EXISTS ${SOURCE_DIR}/soh/soh.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.o2r ${SOURCE_DIR}) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.o2r ${BINARY_DIR}/soh/) + message(STATUS "Copied soh.o2r") endif() # Additionally for Windows, copy the otrs to the target dir, side by side with soh.exe if(SYSTEM_NAME MATCHES "Windows") - if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/OTRExporter/oot.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${TARGET_DIR}) + if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/soh/oot.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.o2r ${TARGET_DIR}) endif() - if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/OTRExporter/oot-mq.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.otr ${TARGET_DIR}) + if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/soh/oot-mq.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.o2r ${TARGET_DIR}) endif() - if(EXISTS ${SOURCE_DIR}/OTRExporter/soh.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.otr ${TARGET_DIR}) + if(EXISTS ${SOURCE_DIR}/soh/soh.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.o2r ${TARGET_DIR}) endif() endif() -if(NOT ONLYSOHOTR AND (NOT EXISTS ${SOURCE_DIR}/oot.otr AND NOT EXISTS ${SOURCE_DIR}/oot-mq.otr)) +if(NOT ONLYSOHOTR AND (NOT EXISTS ${SOURCE_DIR}/oot.o2r AND NOT EXISTS ${SOURCE_DIR}/oot-mq.o2r)) message(FATAL_ERROR "Failed to copy. No OTR files found.") endif() -if(NOT EXISTS ${SOURCE_DIR}/soh.otr) +if(NOT EXISTS ${SOURCE_DIR}/soh.o2r) message(FATAL_ERROR "Failed to copy. No soh OTR found.") endif() diff --git a/docs/BUILDING.md b/docs/BUILDING.md index 4e37a27e91..f8347b9b6a 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -90,26 +90,26 @@ C:\Program Files\CMake\bin\cmake.exe --build build-cmake --target ExtractAssetHe #### Debian/Ubuntu ```sh # using gcc -apt-get install gcc g++ git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libboost-dev libopengl-dev +apt-get install gcc g++ git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libopengl-dev # or using clang -apt-get install clang git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libboost-dev libopengl-dev +apt-get install clang git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libopengl-dev ``` #### Arch ```sh # using gcc -pacman -S gcc git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net boost +pacman -S gcc git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net # or using clang -pacman -S clang git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net boost +pacman -S clang git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net ``` #### Fedora ```sh # using gcc -dnf install gcc gcc-c++ git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools nlohmann-json-devel tinyxml2-devel spdlog-devel boost-devel +dnf install gcc gcc-c++ git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools nlohmann-json-devel tinyxml2-devel spdlog-devel # or using clang -dnf install clang git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools nlohmann-json-devel tinyxml2-devel spdlog-devel boost-devel +dnf install clang git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools nlohmann-json-devel tinyxml2-devel spdlog-devel ``` #### openSUSE ```sh diff --git a/docs/MODDING.md b/docs/MODDING.md index 1f4f4b6074..d410a0d064 100644 --- a/docs/MODDING.md +++ b/docs/MODDING.md @@ -41,15 +41,28 @@ You can name your branch whatever you want, but it's recommended to name it some The limit is your imagination. You can add new features, fix bugs, add new mods, or even change the way the game works. We will demonstrate this by creating a mod that changes the speed of the day/night cycle. -Let's being by finding where the time is updated. Thankfully in the save editor we have a slider already hooked up to the time of day so we can check there for reference. The save editor file is at `soh/soh/Enhancements/debugger/debugSaveEditor.cpp`, if we do a quick search within that file for time we will find the following at line 400: +Let's begin by finding where the time is updated. Thankfully in the save editor we have a slider already hooked up to the time of day so we can check there for reference. The save editor file is at `soh/soh/Enhancements/debugger/debugSaveEditor.cpp`, if we do a quick search within that file for time we will find the following at around line 217: ```cpp -const uint16_t dayTimeMin = 0; -const uint16_t dayTimeMax = 0xFFFF; -ImGui::SliderScalar("Time", ImGuiDataType_U16, &gSaveContext.dayTime, &dayTimeMin, &dayTimeMax); + SliderInt("Time", (int32_t*)&gSaveContext.dayTime, intSliderOptionsBase.Min(0).Max(0xFFFF).Tooltip("Time of day")); + if (Button("Dawn", buttonOptionsBase)) { + gSaveContext.dayTime = 0x4000; + } + ImGui::SameLine(); + if (Button("Noon", buttonOptionsBase)) { + gSaveContext.dayTime = 0x8000; + } + ImGui::SameLine(); + if (Button("Sunset", buttonOptionsBase)) { + gSaveContext.dayTime = 0xC001; + } + ImGui::SameLine(); + if (Button("Midnight", buttonOptionsBase)) { + gSaveContext.dayTime = 0; + } ``` -So this tells us that `gSaveContext.dayTime` is what we're looking for. Let's now do a global search for this to see if we can find where it is updated. We find the following in `soh/src/code/z_kankyo.c` line 925: +So this tells us that `gSaveContext.dayTime` is what we're looking for. Let's now do a global search for this to see if we can find where it is updated. We find the following in `soh/src/code/z_kankyo.c` around line 925: ```cpp if (IS_DAY || gTimeIncrement >= 0x190) { @@ -71,16 +84,19 @@ if (IS_DAY || gTimeIncrement >= 0x190) { } ``` -Rebuild the game and launch it, then load a save file. You should see that the time of day is now moving much faster. Terrific! While we could wrap this up and call it a day, we could make this user configurable by making a few more changes. I think a slider would be good for this, there's a slider in the cheat menu that we can use as a reference. Let's find it in `soh/soh/SohMenuBar.cpp` around line 1120: +Rebuild the game and launch it, then load a save file. You should see that the time of day is now moving much faster. Terrific! While we could wrap this up and call it a day, we could make this user configurable by making a few more changes. I think a slider would be good for this, there's a slider in the cheat menu that we can use as a reference. Let's find it in `soh/soh/SohGui/SohMenuEnhancements.cpp` around line 1565: ```cpp -UIWidgets::EnhancementSliderFloat("Hookshot Reach Multiplier: %.1fx", "##gCheatHookshotReachMultiplier", "gCheatHookshotReachMultiplier", 1.0f, 5.0f, "", 1.0f, false); + AddWidget(path, "Hookshot Reach Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_CHEAT("HookshotReachMultiplier")) + .Options(FloatSliderOptions().Format("%.2f").Min(1.0f).Max(5.0f)); ``` - -The float values being passed in here are `minimum`, `maximum`, and `default` respectively. We'll make our minimum 0.2 to allow it to move slower, and our maximum 5.0 to allow it to move up to 5x faster. We'll also set the default to 1.0 so that it doesn't change the behavior by default. Copy this line and paste it below, then make the relevant changes: +This adds a `Widget` which sets a CVar, which then sets the options of the slider. We'll make our minimum 0.2 to allow it to move slower, and our maximum 5.0 to allow it to move up to 5x faster. We'll also set the default to 1.0 so that it doesn't change the behavior by default. Copy this line and paste it below, then make the relevant changes: ```cpp -UIWidgets::EnhancementSliderFloat("Time Multiplier: %.1fx", "##gCheatTimeMultiplier", "gCheatTimeMultiplier", 0.2f, 5.0f, "", 1.0f, false); + AddWidget(path, "Time Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_CHEAT("TimeOfDayMultiplier")) + .Options(FloatSliderOptions().Format("%.2f").Min(0.2f).Max(5.0f).DefaultValue(1.0f)); ``` Now we need to replace our hard coded values with the new variable. We can do this by replacing the `10` with a cvar call @@ -88,10 +104,10 @@ Now we need to replace our hard coded values with the new variable. We can do th ```diff if (IS_DAY || gTimeIncrement >= 0x190) { - gSaveContext.dayTime += gTimeIncrement * 10; -+ gSaveContext.dayTime += gTimeIncrement * CVarGetFloat("gCheatTimeMultiplier", 1.0f); ++ gSaveContext.dayTime += gTimeIncrement * CVarGetFloat(CVAR_CHEAT("TimeOfDayMultiplier"),1.0f); } else { - gSaveContext.dayTime += gTimeIncrement * 2 * 10; -+ gSaveContext.dayTime += gTimeIncrement * 2 * CVarGetFloat("gCheatTimeMultiplier", 1.0f); ++ gSaveContext.dayTime += gTimeIncrement * 2 * CVarGetFloat(CVAR_CHEAT("TimeOfDayMultiplier"),1.0f); } ``` diff --git a/docs/supportedHashes.json b/docs/supportedHashes.json index 587a64a55d..c5b3d5b2fe 100644 --- a/docs/supportedHashes.json +++ b/docs/supportedHashes.json @@ -30,5 +30,49 @@ { "name": "PAL MQ (Debug)", "sha1": "cfecfdc58d650e71a200c81f033de4e6d617a9f6" + }, + { + "name": "NTSC 1.0 (US)", + "sha1": "ad69c91157f6705e8ab06c79fe08aad47bb57ba7" + }, + { + "name": "NTSC 1.1 (US)", + "sha1": "d3ecb253776cd847a5aa63d859d8c89a2f37b364" + }, + { + "name": "NTSC 1.2 (US)", + "sha1": "41b3bdc48d98c48529219919015a1af22f5057c2" + }, + { + "name": "NTSC 1.0 (JP)", + "sha1": "c892bbda3993e66bd0d56a10ecd30b1ee612210f" + }, + { + "name": "NTSC 1.1 (JP)", + "sha1": "dbfc81f655187dc6fefd93fa6798face770d579d" + }, + { + "name": "NTSC 1.2 (JP)", + "sha1": "fa5f5942b27480d60243c2d52c0e93e26b9e6b86" + }, + { + "name": "NTSC GC (US)", + "sha1": "b82710ba2bd3b4c6ee8aa1a7e9acf787dfc72e9b" + }, + { + "name": "NTSC MQ (US)", + "sha1": "8b5d13aac69bfbf989861cfdc50b1d840945fc1d" + }, + { + "name": "NTSC GC (JP)", + "sha1": "0769c84615422d60f16925cd859593cdfa597f84" + }, + { + "name": "NTSC GC (JP) (Collector's Edition)", + "sha1": "2ce2d1a9f0534c9cd9fa04ea5317b80da21e5e73" + }, + { + "name": "NTSC MQ (JP)", + "sha1": "dd14e143c4275861fe93ea79d0c02e36ae8c6c2f" } ] diff --git a/libultraship b/libultraship index 02bb77ef25..6a3f6cd327 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 02bb77ef253e2de0969fd2cb36ad2e870677d18d +Subproject commit 6a3f6cd327b99f617b623e5b9a3afeae460aac2b diff --git a/run-clang-format.ps1 b/run-clang-format.ps1 new file mode 100644 index 0000000000..063cec7af3 --- /dev/null +++ b/run-clang-format.ps1 @@ -0,0 +1,49 @@ +Using Namespace System +$url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/LLVM-14.0.6-win64.exe" +$llvmInstallerPath = ".\LLVM-14.0.6-win64.exe" +$clangFormatFilePath = ".\clang-format.exe" +$requiredVersion = "clang-format version 14.0.6" +$currentVersion = "" + +function Test-7ZipInstalled { + $sevenZipPath = "C:\Program Files\7-Zip\7z.exe" + return Test-Path $sevenZipPath -PathType Leaf +} + +if (Test-Path $clangFormatFilePath) { + $currentVersion = & $clangFormatFilePath --version + if (-not ($currentVersion -eq $requiredVersion)) { + # Delete the existing file if the version is incorrect + Remove-Item $clangFormatFilePath -Force + } +} + +if (-not (Test-Path $clangFormatFilePath) -or ($currentVersion -ne $requiredVersion)) { + if (-not (Test-7ZipInstalled)) { + Write-Host "7-Zip is not installed. Please install 7-Zip and run the script again." + exit + } + + $wc = New-Object net.webclient + $wc.Downloadfile($url, $llvmInstallerPath) + + $sevenZipPath = "C:\Program Files\7-Zip\7z.exe" + $specificFileInArchive = "bin\clang-format.exe" + & "$sevenZipPath" e $llvmInstallerPath $specificFileInArchive + + Remove-Item $llvmInstallerPath -Force +} + +$basePath = (Resolve-Path .).Path +$files = Get-ChildItem -Path $basePath\soh -Recurse -File ` + | Where-Object { ($_.Extension -eq '.c' -or $_.Extension -eq '.cpp' -or ` + (($_.Extension -eq '.h' -or $_.Extension -eq '.hpp') -and ` + (-not ($_.FullName -like "*\soh\src\*" -or $_.FullName -like "*\soh\include\*")))) -and ` + (-not ($_.FullName -like "*\soh\assets\*" -or $_.FullName -like "*\soh\build\*")) } + +for ($i = 0; $i -lt $files.Length; $i++) { + $file = $files[$i] + $relativePath = $file.FullName.Substring($basePath.Length + 1) + Write-Host "Formatting [$($i+1)/$($files.Length)] $relativePath" + .\clang-format.exe -i $file.FullName +} diff --git a/run-clang-format.sh b/run-clang-format.sh new file mode 100755 index 0000000000..20129e63d2 --- /dev/null +++ b/run-clang-format.sh @@ -0,0 +1,29 @@ +# this line does quite a bit, so let's break it down +# +# find soh +# use "find" to look in the "soh" directory +# this ensures we don't try to format stuff in the submodules +# +# -type f +# only look for files +# +# -name "*.c" -o -name "*.cpp" +# find all .c and .cpp files +# +# ( -name "*.h" -o -name "*.hpp" ) ! -path "soh/src/**.h" ! -path "soh/include/**.h" +# find all .h and .hpp files that aren't in soh/src or soh/include +# this is because zret decomp only runs clang-format on c files +# https://github.com/zeldaret/mm/blob/b7e5468ca16315a7e322055eff3d97fe980bbc25/format.py#L182 +# +# ! -path "soh/assets/*" +# asset headers are autogenerated, don't fight them +# +# -print0 +# separate paths with NUL bytes, avoiding issues with spaces in paths +# +# | xargs -0 clang-format-14 -i -verbose +# use xargs to take each path we've found +# and pass it as an argument to clang-format +# verbose to print files being formatted and X out of Y status + +find soh -type f \( -name "*.c" -o -name "*.cpp" -o \( \( -name "*.h" -o -name "*.hpp" \) ! -path "soh/src/*" ! -path "soh/include/*" \) \) ! -path "soh/assets/*" -print0 | xargs -0 clang-format-14 -i --verbose diff --git a/scripts/linux/appimage/soh.desktop b/scripts/linux/appimage/soh.desktop index 93e4bbdce8..5e517c597a 100644 --- a/scripts/linux/appimage/soh.desktop +++ b/scripts/linux/appimage/soh.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Version=1.0 Name=SOH -Exec=soh.sh +Exec=soh.elf Terminal=false Icon=sohIcon Type=Application diff --git a/scripts/linux/appimage/soh.sh.in b/scripts/linux/appimage/soh.sh.in deleted file mode 100644 index 71121a5fff..0000000000 --- a/scripts/linux/appimage/soh.sh.in +++ /dev/null @@ -1,208 +0,0 @@ -#!/bin/bash -HERE="$(dirname "$(readlink -f "${0}")")"/../.. - -export PATH="$HERE"/bin:"$HERE"/usr/bin:"$PATH" -export LD_LIBRARY_PATH="$HERE"/usr/lib:"$LD_LIBRARY_PATH" -export ZENITY=$(command -v zenity) - -if [ -z ${SHIP_HOME+x} ]; then -export SHIP_HOME=$PWD -fi - -if [ -z ${SHIP_BIN_DIR+x} ]; then -export SHIP_BIN_DIR="$HERE/usr/bin" -fi - -if [[ ! -e "$SHIP_HOME"/mods ]]; then - mkdir -p "$SHIP_HOME"/mods - touch "$SHIP_HOME"/mods/custom_otr_files_go_here.txt -fi - -while [[ (! -e "$SHIP_HOME"/oot.otr) || (! -e "$SHIP_HOME"/oot-mq.otr) ]]; do - for romfile in "$SHIP_HOME"/*.*64 - do - if [[ -e "$romfile" ]] || [[ -L "$romfile" ]]; then - export ASSETDIR="$(mktemp -d /tmp/assets-XXXXX)" - ln -s "$SHIP_BIN_DIR"/{assets,soh.elf,ZAPD} "$ASSETDIR" - export OLDPWD="$PWD" - mkdir -p "$ASSETDIR"/tmp - if [[ -e "$romfile" ]]; then - ln -s "$romfile" "$ASSETDIR"/tmp/rom.z64 - else - ORIG_ROM_PATH=$(readlink "$romfile") - ln -s "$ORIG_ROM_PATH" "$ASSETDIR"/tmp/rom.z64 - fi - cd "$ASSETDIR" - ROMHASH=$(sha1sum -b "$ASSETDIR"/tmp/rom.z64 | awk '{ print $1 }') - - # Remap v64 and n64 hashes to their z64 hash equivalent - # ZAPD will handle converting the data into z64 format - case "$ROMHASH" in - a9059b56e761c9034fbe02fe4c24985aaa835dac) # v64 - ROMHASH=cee6bc3c2a634b41728f2af8da54d9bf8cc14099 - ;; - 24708102dc504d3f375a37f4ae4e149c167dc515) # n64 - ROMHASH=cee6bc3c2a634b41728f2af8da54d9bf8cc14099 - ;; - 580dd0bd1b6d2c51cc20a764eece84dba558964c) # v64 - ROMHASH=0227d7c0074f2d0ac935631990da8ec5914597b4 - ;; - d6342c59007e57c1194661ec6880b2f078403f4e) # n64 - ROMHASH=0227d7c0074f2d0ac935631990da8ec5914597b4 - ;; - d0bdc2eb320668b4ba6893b9aefe4040a73123ff) # v64 - ROMHASH=328a1f1beba30ce5e178f031662019eb32c5f3b5 - ;; - 4946ab250f6ac9b32d76b21f309ebb8ebc8103d2) # n64 - ROMHASH=328a1f1beba30ce5e178f031662019eb32c5f3b5 - ;; - 663c34f1b2c05a09e5beffe4d0dcd440f7d49dc7) # v64 - ROMHASH=cfbb98d392e4a9d39da8285d10cbef3974c2f012 - ;; - 24c73d378b0620a380ce5ef9f2b186c6c157a68b) # n64 - ROMHASH=cfbb98d392e4a9d39da8285d10cbef3974c2f012 - ;; - 8ebf2e29313f44f2d49e5b4191971d09919e8e48) # v64 - ROMHASH=f46239439f59a2a594ef83cf68ef65043b1bffe2 - ;; - 4264bf7b875737b8fae77d52322a5099d051fc11) # n64 - ROMHASH=f46239439f59a2a594ef83cf68ef65043b1bffe2 - ;; - 973bc6fe56010a8d646166a1182a81b4f13b8cf9) # v64 - ROMHASH=50bebedad9e0f10746a52b07239e47fa6c284d03 - ;; - d327752c46edc70ff3668b9514083dbbee08927c) # v64 - ROMHASH=50bebedad9e0f10746a52b07239e47fa6c284d03 - ;; - ecdeb1747560834e079c22243febea7f6f26ba3b) # v64 - ROMHASH=079b855b943d6ad8bd1eb026c0ed169ecbdac7da - ;; - f19f8662ec7abee29484a272a6fda53e39efe0f1) # n64 - ROMHASH=079b855b943d6ad8bd1eb026c0ed169ecbdac7da - ;; - ab519ce04a33818ce2c39b3c514a751d807a494a) # v64 - ROMHASH=cfecfdc58d650e71a200c81f033de4e6d617a9f6 - ;; - c19a34f7646305e1755249fca2071e178bd7cd00) # n64 - ROMHASH=cfecfdc58d650e71a200c81f033de4e6d617a9f6 - ;; - 25e8ae79ea0839ca5c984473f7460d8040c36f9c) # v64 - ROMHASH=517bd9714c73cb96c21e7c2ef640d7b55186102f - ;; - 166c02770d67fcc3954c443eb400a6a3573d3fc0) # n64 - ROMHASH=517bd9714c73cb96c21e7c2ef640d7b55186102f - ;; - esac - - case "$ROMHASH" in - cee6bc3c2a634b41728f2af8da54d9bf8cc14099) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=GC_NMQ_D - OTRNAME="oot.otr" - fi - ;; - 0227d7c0074f2d0ac935631990da8ec5914597b4) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=GC_NMQ_PAL_F - OTRNAME="oot.otr" - else - continue - fi - ;; - 328a1f1beba30ce5e178f031662019eb32c5f3b5) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=N64_PAL_10 - OTRNAME="oot.otr" - else - continue - fi - ;; - cfbb98d392e4a9d39da8285d10cbef3974c2f012) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=N64_PAL_11 - OTRNAME="oot.otr" - else - continue - fi - ;; - f46239439f59a2a594ef83cf68ef65043b1bffe2) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_PAL_F - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - 50bebedad9e0f10746a52b07239e47fa6c284d03) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_D - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - 079b855b943d6ad8bd1eb026c0ed169ecbdac7da) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_D - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - cfecfdc58d650e71a200c81f033de4e6d617a9f6) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_D - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - 517bd9714c73cb96c21e7c2ef640d7b55186102f) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_D - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - *) - echo -e "\n$romfile - $ROMHASH rom hash does not match\n" - continue;; - esac - if [[ ! -e "$SHIP_HOME"/"$OTRNAME" ]]; then - if [ -n "$ZENITY" ]; then - (echo "# 25%"; echo "25"; sleep 2; echo "# 50%"; echo "50"; sleep 3; echo "# 75%"; echo "75"; sleep 2; echo "# 100%"; echo "100"; sleep 3) | - zenity --progress --title="OTR Generating..." --timeout=10 --percentage=0 --icon-name=soh --window-icon=soh.png --height=80 --width=400 & - else - echo "Processing..." - fi - assets/extractor/ZAPD.out ed -eh -i assets/extractor/xmls/"${ROM}" -b tmp/rom.z64 -fl assets/extractor/filelists -o placeholder -osf placeholder -gsf 1 -rconf assets/extractor/Config_"${ROM}".xml -se OTR --otrfile "${OTRNAME}" --portVer "@CMAKE_PROJECT_VERSION@" > /dev/null 2>&1 - cp "$ASSETDIR"/"$OTRNAME" "$SHIP_HOME" - fi - else - if [[ (! -e "$SHIP_HOME"/oot.otr) && (! -e "$SHIP_HOME"/oot-mq.otr) ]]; then - if [ -n "$ZENITY" ]; then - zenity --error --timeout=5 --text="Place ROM in $SHIP_HOME" --title="Missing ROM file" --width=500 --width=200 - else - echo -e "\nPlace ROM in this folder\n" - fi - exit - fi - fi - done - if [[ (! -e "$SHIP_HOME"/oot.otr) && (! -e "$SHIP_HOME"/oot-mq.otr) ]]; then - if [ -n "$ZENITY" ]; then - zenity --error --timeout=10 --text="No valid ROMs were provided, No OTR was generated." --title="Incorrect ROM file" --width=500 --width=200 - else - echo "No valid roms provided, no OTR was generated." - fi - rm -r "$ASSETDIR" - exit - else - (cd "$SHIP_BIN_DIR"; ./soh.elf) - exit - fi - rm -r "$ASSETDIR" -done - (cd "$SHIP_BIN_DIR"; ./soh.elf) -exit diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index b4ee6ed7f3..e74c14f4c1 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -4,6 +4,7 @@ set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE) project(soh LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") +set(CMAKE_C_STANDARD 23 CACHE STRING "The C standard to use") if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") enable_language(OBJCXX) @@ -137,20 +138,27 @@ endforeach() if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set_source_files_properties(soh/OTRGlobals.cpp PROPERTIES COMPILE_FLAGS "/utf-8") set_source_files_properties(soh/Enhancements/tts/tts.cpp PROPERTIES COMPILE_FLAGS "/utf-8") + set_source_files_properties(soh/Enhancements/custom-message/CustomMessageManager.cpp PROPERTIES COMPILE_FLAGS "/utf-8") + set_source_files_properties(soh/Enhancements/custom-message/CustomMessageManager.h PROPERTIES COMPILE_FLAGS "/utf-8") endif() # handle Network removals if (!BUILD_REMOTE_CONTROL) - list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/crowd-control/*") + list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/crowd-control/") endif() # handle speechsynthesizer removals if (CMAKE_SYSTEM_NAME STREQUAL "Windows") - list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/Darwin*") + list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/Darwin") elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin") - list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/SAPI*") + list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/SAPI") else() - list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/(Darwin|SAPI).*") + list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/(Darwin|SAPI)") +endif() + +find_library(ESPEAK espeak-ng) +if (NOT ESPEAK) + list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/ESpeak") endif() # soh/Extractor {{{ @@ -176,12 +184,12 @@ file(GLOB_RECURSE src__ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.c" "src/*.h" set_source_files_properties(${src__} PROPERTIES COMPILE_OPTIONS "${WARNING_OVERRIDE}") list(APPEND src__ ${CMAKE_CURRENT_SOURCE_DIR}/Resource.rc) -list(FILTER src__ EXCLUDE REGEX "src/dmadata/*") -list(FILTER src__ EXCLUDE REGEX "src/elf_message/*") -list(FILTER src__ EXCLUDE REGEX "src/libultra/io/*") -list(FILTER src__ EXCLUDE REGEX "src/libultra/libc/*") -list(FILTER src__ EXCLUDE REGEX "src/libultra/os/*") -list(FILTER src__ EXCLUDE REGEX "src/libultra/rmon/*") +list(FILTER src__ EXCLUDE REGEX "src/dmadata/") +list(FILTER src__ EXCLUDE REGEX "src/elf_message/") +list(FILTER src__ EXCLUDE REGEX "src/libultra/io/") +list(FILTER src__ EXCLUDE REGEX "src/libultra/libc/") +list(FILTER src__ EXCLUDE REGEX "src/libultra/os/") +list(FILTER src__ EXCLUDE REGEX "src/libultra/rmon/") list(APPEND src__ "src/libultra/libc/sprintf.c") list(REMOVE_ITEM src__ "src/libultra/gu/cosf.c") list(REMOVE_ITEM src__ "src/libultra/gu/lookat.c") @@ -275,34 +283,17 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows") set_target_properties(${PROJECT_NAME} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR}) endif() ################################################################################ -# Find/download Boost +# Find/download Dr Libs (For custom audio) ################################################################################ include(FetchContent) + FetchContent_Declare( - Boost - URL https://archives.boost.io/release/1.81.0/source/boost_1_81_0.tar.gz - URL_HASH SHA256=205666dea9f6a7cfed87c7a6dfbeb52a2c1b9de55712c9c1a87735d7181452b6 - SOURCE_SUBDIR "null" # Set to a nonexistent directory so boost is not built (we don't need to build it) - DOWNLOAD_EXTRACT_TIMESTAMP false # supress timestamp warning, not needed since the url wont change + dr_libs + GIT_REPOSITORY https://github.com/mackron/dr_libs.git + GIT_TAG da35f9d6c7374a95353fd1df1d394d44ab66cf01 ) +FetchContent_MakeAvailable(dr_libs) -set(Boost_NO_BOOST_CMAKE false) -set(BOOST_INCLUDEDIR ${FETCHCONTENT_BASE_DIR}/boost-src) # Location where FetchContent stores the source -message("Searching for Boost installation") -find_package(Boost) - -if (NOT ${Boost_FOUND}) - message("Boost not found. Downloading now...") - FetchContent_MakeAvailable(Boost) - message("Boost downloaded to " ${FETCHCONTENT_BASE_DIR}/boost-src) - set(BOOST-INCLUDE ${FETCHCONTENT_BASE_DIR}/boost-src) -else() - message("Boost found in " ${Boost_INCLUDE_DIRS}) - set(BOOST-INCLUDE ${Boost_INCLUDE_DIRS}) -endif() -################################################################################ -# Compile definitions -################################################################################ find_package(SDL2) set(SDL2-INCLUDE ${SDL2_INCLUDE_DIRS}) @@ -317,6 +308,14 @@ if (BUILD_REMOTE_CONTROL) endif() endif() +if (ESPEAK) + add_compile_definitions(ESPEAK=1) +endif() + +################################################################################ +# Compile definitions +################################################################################ + target_include_directories(${PROJECT_NAME} PRIVATE assets ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${CMAKE_CURRENT_SOURCE_DIR}/src/ @@ -348,8 +347,8 @@ target_include_directories(${PROJECT_NAME} PRIVATE assets ${CMAKE_CURRENT_SOURCE_DIR}/../ZAPDTR/ZAPD/resource/type ${SDL2-INCLUDE} ${SDL2-NET-INCLUDE} - ${BOOST-INCLUDE} ${CMAKE_CURRENT_SOURCE_DIR}/assets/ + ${dr_libs_SOURCE_DIR} . ) @@ -440,6 +439,7 @@ if(MSVC) /Gy; /W3 > + /bigobj; /sdl-; /permissive-; /MP; @@ -510,10 +510,10 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") -Wno-parentheses -Wno-narrowing -Wno-missing-braces - -Wno-int-conversion $<$: -Werror-implicit-function-declaration -Wno-incompatible-pointer-types + -Wno-int-conversion > $<$:-fpermissive> $<$: @@ -586,11 +586,11 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") -Wno-parentheses -Wno-narrowing -Wno-missing-braces - -Wno-int-conversion - -Wno-implicit-int $<$: -Werror-implicit-function-declaration + -Wno-implicit-int -Wno-incompatible-pointer-types + -Wno-int-conversion > $<$:-fpermissive> $<$:-Wno-deprecated-enum-enum-conversion> @@ -600,6 +600,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") target_link_options(${PROJECT_NAME} PRIVATE -pthread + #-fsanitize=address -Wl,-export-dynamic ) endif() @@ -608,21 +609,22 @@ endif() # Pre build events ################################################################################ if (CMAKE_GENERATOR MATCHES "Visual Studio") - set(VS_COPY_ASSETS_CMD ${CMAKE_COMMAND} -E copy_directory_if_different $/assets ${CMAKE_BINARY_DIR}/soh/assets) + add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/extractor ${CMAKE_BINARY_DIR}/soh/assets + COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/xml ${CMAKE_BINARY_DIR}/soh/assets/xml + ) endif() if(NOT CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch|CafeOS") add_custom_command( TARGET ${PROJECT_NAME} POST_BUILD COMMENT "Copying asset xmls..." - COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/extractor $/assets/extractor - COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/xml $/assets/extractor/xmls - COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/filelists $/assets/extractor/filelists - COMMAND ${CMAKE_COMMAND} -E make_directory $/assets/extractor/symbols - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ActorList_OoTMqDbg.txt $/assets/extractor/symbols - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ObjectList_OoTMqDbg.txt $/assets/extractor/symbols - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/SymbolMap_OoTMqDbg.txt $/assets/extractor/symbols - COMMAND ${VS_COPY_ASSETS_CMD} + COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/extractor $/assets + COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/xml $/assets/xml + COMMAND ${CMAKE_COMMAND} -E make_directory $/assets/symbols + # COMMAND ${VS_COPY_ASSETS_CMD} ) endif() ################################################################################ @@ -639,6 +641,15 @@ endif() if (CMAKE_SYSTEM_NAME STREQUAL "Windows") find_package(glfw3 REQUIRED) + find_package(Ogg CONFIG REQUIRED) + link_libraries(Ogg::ogg) + + find_package(Vorbis CONFIG REQUIRED) + link_libraries(Vorbis::vorbisfile) + find_package(Opus CONFIG REQUIRED) + link_libraries(Opus::opus) + find_package(OpusFile CONFIG REQUIRED) + link_libraries(OpusFile::opusfile CONFIG REQUIRED) if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") set(ADDITIONAL_LIBRARY_DEPENDENCIES "libultraship;" @@ -652,6 +663,12 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows") "imm32;" "version;" "setupapi" + "Ogg::ogg" + "Opus::opus" + "Vorbis::vorbis" + "Vorbis::vorbisenc" + "Vorbis::vorbisfile" + "OpusFile::opusfile" ) elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32") set(ADDITIONAL_LIBRARY_DEPENDENCIES @@ -692,10 +709,21 @@ else() find_package(SDL2) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) + find_package(Threads REQUIRED) + find_package(Ogg REQUIRED) + find_package(Vorbis REQUIRED) + find_package(Opus REQUIRED) + find_package(OpusFile REQUIRED) set(ADDITIONAL_LIBRARY_DEPENDENCIES "libultraship;" "ZAPDLib;" SDL2::SDL2 + "Ogg::ogg" + "Vorbis::vorbis" + "Vorbis::vorbisenc" + "Vorbis::vorbisfile" + "Opus::opus" + "Opusfile::Opusfile" "$<$:SDL2_net::SDL2_net>" ${CMAKE_DL_LIBS} Threads::Threads @@ -708,11 +736,7 @@ endif() if (CMAKE_SYSTEM_NAME STREQUAL "Windows") INSTALL(FILES $ DESTINATION ./debug COMPONENT ship) -INSTALL(FILES ${CMAKE_BINARY_DIR}/soh/soh.otr DESTINATION . COMPONENT ship) -endif() - -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") -configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/linux/appimage/soh.sh.in ${CMAKE_BINARY_DIR}/linux/soh.sh @ONLY) +INSTALL(FILES ${CMAKE_BINARY_DIR}/soh/soh.o2r DESTINATION . COMPONENT ship) endif() find_program(CURL NAMES curl DOC "Path to the curl program. Used to download files.") @@ -722,7 +746,7 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/macosx/Info.plist.in ${CMAKE_BINARY_DIR}/macosx/Info.plist @ONLY) INSTALL(TARGETS soh DESTINATION ../MacOS COMPONENT ship) INSTALL(FILES ${CMAKE_BINARY_DIR}/gamecontrollerdb.txt DESTINATION ../MacOS COMPONENT ship) -INSTALL(FILES ${CMAKE_BINARY_DIR}/soh/soh.otr DESTINATION ../Resources COMPONENT ship) +INSTALL(FILES ${CMAKE_BINARY_DIR}/soh/soh.o2r DESTINATION ../Resources COMPONENT ship) elseif(NOT "${CMAKE_SYSTEM_NAME}" MATCHES "NintendoSwitch|CafeOS") INSTALL(FILES ${CMAKE_BINARY_DIR}/gamecontrollerdb.txt DESTINATION . COMPONENT ship) endif() diff --git a/soh/assets/.gitignore b/soh/assets/.gitignore index d75078bf1c..7a844a7273 100644 --- a/soh/assets/.gitignore +++ b/soh/assets/.gitignore @@ -5,3 +5,4 @@ *.vtx.inc *.dlist.inc !*.png +custom/shaders diff --git a/soh/assets/custom/fonts/Inconsolata-Regular.ttf b/soh/assets/custom/fonts/Inconsolata-Regular.ttf new file mode 100644 index 0000000000..d1241516bc Binary files /dev/null and b/soh/assets/custom/fonts/Inconsolata-Regular.ttf differ diff --git a/soh/assets/custom/fonts/Montserrat-Regular.ttf b/soh/assets/custom/fonts/Montserrat-Regular.ttf new file mode 100644 index 0000000000..f4a266dd37 Binary files /dev/null and b/soh/assets/custom/fonts/Montserrat-Regular.ttf differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16 new file mode 100644 index 0000000000..99a0fd4bde Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/LeafTex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/LeafTex.rgba16 new file mode 100644 index 0000000000..1d4f2db39e Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/LeafTex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16 new file mode 100644 index 0000000000..54bdc9fa78 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16 new file mode 100644 index 0000000000..9d561d1ae1 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16 new file mode 100644 index 0000000000..b9d1f74e36 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_gold_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_gold_tex.rgba16 new file mode 100644 index 0000000000..8ec68d3aa1 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_gold_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_heart_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_heart_tex.rgba16 new file mode 100644 index 0000000000..2822f18fda Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_heart_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16 new file mode 100644 index 0000000000..bf90c64fcc Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16 new file mode 100644 index 0000000000..52f4848b37 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_silver_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_silver_tex.rgba16 new file mode 100644 index 0000000000..9d14059c05 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_silver_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16 new file mode 100644 index 0000000000..436b870714 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL new file mode 100644 index 0000000000..c0a32b3b03 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 new file mode 100644 index 0000000000..bdb256c872 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 new file mode 100644 index 0000000000..eab49e30d0 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 new file mode 100644 index 0000000000..2fea2e4dba --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 new file mode 100644 index 0000000000..ff0b01fdf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 new file mode 100644 index 0000000000..af2f51461f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 new file mode 100644 index 0000000000..5f25570283 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull new file mode 100644 index 0000000000..9c003b4012 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL new file mode 100644 index 0000000000..70e8240a44 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 new file mode 100644 index 0000000000..926fed8797 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 new file mode 100644 index 0000000000..74ccefada0 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 new file mode 100644 index 0000000000..08fdc08b97 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 new file mode 100644 index 0000000000..ff0b01fdf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 new file mode 100644 index 0000000000..af2f51461f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 new file mode 100644 index 0000000000..5f25570283 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull new file mode 100644 index 0000000000..9c003b4012 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL new file mode 100644 index 0000000000..046e04d332 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 new file mode 100644 index 0000000000..dcc1da33a6 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 new file mode 100644 index 0000000000..8475ba0071 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 new file mode 100644 index 0000000000..c20f0dc4d2 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 new file mode 100644 index 0000000000..ff0b01fdf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 new file mode 100644 index 0000000000..af2f51461f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 new file mode 100644 index 0000000000..5f25570283 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull new file mode 100644 index 0000000000..9c003b4012 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL new file mode 100644 index 0000000000..a27f05f477 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 new file mode 100644 index 0000000000..be06a23a7a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 new file mode 100644 index 0000000000..ff0b01fdf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull new file mode 100644 index 0000000000..9c003b4012 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL new file mode 100644 index 0000000000..af43aa60cd --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 new file mode 100644 index 0000000000..dd226cbc5b --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 new file mode 100644 index 0000000000..e00033c0fa --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 new file mode 100644 index 0000000000..95c382ca0a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 new file mode 100644 index 0000000000..ff0b01fdf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 new file mode 100644 index 0000000000..af2f51461f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 new file mode 100644 index 0000000000..5f25570283 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull new file mode 100644 index 0000000000..9c003b4012 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL new file mode 100644 index 0000000000..b9e25ae70f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 new file mode 100644 index 0000000000..874e7ffb83 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 new file mode 100644 index 0000000000..90b3902185 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 new file mode 100644 index 0000000000..b2c011f941 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 new file mode 100644 index 0000000000..ff0b01fdf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 new file mode 100644 index 0000000000..af2f51461f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 new file mode 100644 index 0000000000..5f25570283 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull new file mode 100644 index 0000000000..9c003b4012 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL new file mode 100644 index 0000000000..35d99afcdd --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 new file mode 100644 index 0000000000..6f519fbc8d --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 new file mode 100644 index 0000000000..6d7a07c984 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 new file mode 100644 index 0000000000..f85ac723f1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 new file mode 100644 index 0000000000..ff0b01fdf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 new file mode 100644 index 0000000000..af2f51461f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 new file mode 100644 index 0000000000..5f25570283 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull new file mode 100644 index 0000000000..9c003b4012 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL new file mode 100644 index 0000000000..c04d7156e9 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 new file mode 100644 index 0000000000..cb19e7c48f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 new file mode 100644 index 0000000000..8cf916c225 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 new file mode 100644 index 0000000000..cb5550f613 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 new file mode 100644 index 0000000000..ff0b01fdf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 new file mode 100644 index 0000000000..af2f51461f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 new file mode 100644 index 0000000000..5f25570283 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull new file mode 100644 index 0000000000..9c003b4012 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL new file mode 100644 index 0000000000..29371b448c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 new file mode 100644 index 0000000000..a25ca5b55b --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 new file mode 100644 index 0000000000..cb9c707a8d --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 new file mode 100644 index 0000000000..96023e0eb3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 new file mode 100644 index 0000000000..ff0b01fdf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 new file mode 100644 index 0000000000..af2f51461f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 new file mode 100644 index 0000000000..5f25570283 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull new file mode 100644 index 0000000000..9c003b4012 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL new file mode 100644 index 0000000000..c8a98c94eb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 new file mode 100644 index 0000000000..e60691715a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 new file mode 100644 index 0000000000..d20545643d --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 new file mode 100644 index 0000000000..72993605d1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 new file mode 100644 index 0000000000..ff0b01fdf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 new file mode 100644 index 0000000000..af2f51461f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 new file mode 100644 index 0000000000..5f25570283 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull new file mode 100644 index 0000000000..9c003b4012 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey new file mode 100644 index 0000000000..0cad964b8f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf new file mode 100644 index 0000000000..72bfec180e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery new file mode 100644 index 0000000000..0fdd83a9ee --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy new file mode 100644 index 0000000000..740ca2da35 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf new file mode 100644 index 0000000000..72bfec180e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery new file mode 100644 index 0000000000..0fdd83a9ee --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart new file mode 100644 index 0000000000..e074ff2790 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf new file mode 100644 index 0000000000..72bfec180e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery new file mode 100644 index 0000000000..0fdd83a9ee --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery new file mode 100644 index 0000000000..0fdd83a9ee --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold new file mode 100644 index 0000000000..42f481571f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf new file mode 100644 index 0000000000..72bfec180e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery new file mode 100644 index 0000000000..0fdd83a9ee --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask new file mode 100644 index 0000000000..f19b26e563 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf new file mode 100644 index 0000000000..72bfec180e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery new file mode 100644 index 0000000000..0fdd83a9ee --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze new file mode 100644 index 0000000000..de5aecac6d --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf new file mode 100644 index 0000000000..72bfec180e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery new file mode 100644 index 0000000000..0fdd83a9ee --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random new file mode 100644 index 0000000000..36895a84bd --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf new file mode 100644 index 0000000000..72bfec180e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery new file mode 100644 index 0000000000..0fdd83a9ee --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver new file mode 100644 index 0000000000..2272949117 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf new file mode 100644 index 0000000000..72bfec180e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery new file mode 100644 index 0000000000..0fdd83a9ee --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token new file mode 100644 index 0000000000..6725b33e6a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf new file mode 100644 index 0000000000..72bfec180e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery new file mode 100644 index 0000000000..0fdd83a9ee --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/model.xml b/soh/assets/custom/objects/gameplay_field_keep/model.xml new file mode 100644 index 0000000000..9c003b4012 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/model.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16 new file mode 100644 index 0000000000..1d4f2db39e Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/StemTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/StemTex.rgba16 new file mode 100644 index 0000000000..fa00a5606f Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/StemTex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16 new file mode 100644 index 0000000000..54bdc9fa78 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16 new file mode 100644 index 0000000000..9d561d1ae1 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16 new file mode 100644 index 0000000000..b9d1f74e36 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/flower_gold_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_gold_tex.rgba16 new file mode 100644 index 0000000000..8ec68d3aa1 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_gold_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/flower_heart_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_heart_tex.rgba16 new file mode 100644 index 0000000000..2822f18fda Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_heart_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16 new file mode 100644 index 0000000000..bf90c64fcc Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16 new file mode 100644 index 0000000000..52f4848b37 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/flower_silver_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_silver_tex.rgba16 new file mode 100644 index 0000000000..9d14059c05 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_silver_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16 new file mode 100644 index 0000000000..436b870714 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16 new file mode 100644 index 0000000000..c59757c1d4 Binary files /dev/null and b/soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16 differ diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL new file mode 100644 index 0000000000..4c7b1ab356 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 new file mode 100644 index 0000000000..061362cd69 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 new file mode 100644 index 0000000000..16c026e42b --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 new file mode 100644 index 0000000000..0d0968586f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 new file mode 100644 index 0000000000..d8fcf1fe13 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 new file mode 100644 index 0000000000..7f094d39f1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 new file mode 100644 index 0000000000..18d3d3c64c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 new file mode 100644 index 0000000000..205b9a0057 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 new file mode 100644 index 0000000000..56e99d5ede --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull new file mode 100644 index 0000000000..2f795b083e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL new file mode 100644 index 0000000000..875f809dd8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 new file mode 100644 index 0000000000..951dd58bbb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 new file mode 100644 index 0000000000..97fe8599cf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 new file mode 100644 index 0000000000..0d7b67f3c3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 new file mode 100644 index 0000000000..22c8ba3d84 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 new file mode 100644 index 0000000000..7f094d39f1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 new file mode 100644 index 0000000000..18d3d3c64c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 new file mode 100644 index 0000000000..205b9a0057 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 new file mode 100644 index 0000000000..56e99d5ede --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull new file mode 100644 index 0000000000..2f795b083e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL new file mode 100644 index 0000000000..235dfdcf3e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 new file mode 100644 index 0000000000..273e96ed43 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 new file mode 100644 index 0000000000..1b8a08eec7 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 new file mode 100644 index 0000000000..8899886115 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 new file mode 100644 index 0000000000..45a3b48e13 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 new file mode 100644 index 0000000000..7f094d39f1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 new file mode 100644 index 0000000000..18d3d3c64c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 new file mode 100644 index 0000000000..205b9a0057 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 new file mode 100644 index 0000000000..56e99d5ede --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull new file mode 100644 index 0000000000..2f795b083e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL new file mode 100644 index 0000000000..d4ab27bdb8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 new file mode 100644 index 0000000000..bcf6f69e62 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 new file mode 100644 index 0000000000..7f094d39f1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull new file mode 100644 index 0000000000..6444457b7a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL new file mode 100644 index 0000000000..7ded8214ff --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 new file mode 100644 index 0000000000..f8278cc0c3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 new file mode 100644 index 0000000000..64c020a987 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 new file mode 100644 index 0000000000..13938b6d9f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 new file mode 100644 index 0000000000..da60e69d22 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 new file mode 100644 index 0000000000..7f094d39f1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 new file mode 100644 index 0000000000..18d3d3c64c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 new file mode 100644 index 0000000000..205b9a0057 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 new file mode 100644 index 0000000000..56e99d5ede --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull new file mode 100644 index 0000000000..2f795b083e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL new file mode 100644 index 0000000000..94c93e4531 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 new file mode 100644 index 0000000000..d981594a9c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 new file mode 100644 index 0000000000..ee5852695e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 new file mode 100644 index 0000000000..1ed45fdcbe --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 new file mode 100644 index 0000000000..94910ceb32 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 new file mode 100644 index 0000000000..7f094d39f1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 new file mode 100644 index 0000000000..18d3d3c64c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 new file mode 100644 index 0000000000..205b9a0057 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 new file mode 100644 index 0000000000..56e99d5ede --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull new file mode 100644 index 0000000000..2f795b083e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL new file mode 100644 index 0000000000..e0ae6e48a8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 new file mode 100644 index 0000000000..7a5d4e3de2 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 new file mode 100644 index 0000000000..a24c28fa45 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 new file mode 100644 index 0000000000..5ef0b99cb5 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 new file mode 100644 index 0000000000..d49e9b1867 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 new file mode 100644 index 0000000000..7f094d39f1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 new file mode 100644 index 0000000000..18d3d3c64c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 new file mode 100644 index 0000000000..205b9a0057 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 new file mode 100644 index 0000000000..56e99d5ede --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull new file mode 100644 index 0000000000..2f795b083e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL new file mode 100644 index 0000000000..7ec87e807a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 new file mode 100644 index 0000000000..94ccbe795e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 new file mode 100644 index 0000000000..96e84046ec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 new file mode 100644 index 0000000000..db7142847f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 new file mode 100644 index 0000000000..b1b8cb8c13 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 new file mode 100644 index 0000000000..7f094d39f1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 new file mode 100644 index 0000000000..18d3d3c64c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 new file mode 100644 index 0000000000..205b9a0057 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 new file mode 100644 index 0000000000..56e99d5ede --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull new file mode 100644 index 0000000000..2f795b083e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL new file mode 100644 index 0000000000..f22094ebac --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 new file mode 100644 index 0000000000..2235b57ae3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 new file mode 100644 index 0000000000..93b101a860 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 new file mode 100644 index 0000000000..2cf0ed524a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 new file mode 100644 index 0000000000..653b2b7cbc --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 new file mode 100644 index 0000000000..7f094d39f1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 new file mode 100644 index 0000000000..18d3d3c64c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 new file mode 100644 index 0000000000..205b9a0057 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 new file mode 100644 index 0000000000..56e99d5ede --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull new file mode 100644 index 0000000000..2f795b083e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL new file mode 100644 index 0000000000..d1dff70953 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 new file mode 100644 index 0000000000..dc2309657b --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 new file mode 100644 index 0000000000..f784441881 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 new file mode 100644 index 0000000000..7de2d79430 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 new file mode 100644 index 0000000000..e5c1fbd152 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 new file mode 100644 index 0000000000..7f094d39f1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 new file mode 100644 index 0000000000..18d3d3c64c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 new file mode 100644 index 0000000000..205b9a0057 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 new file mode 100644 index 0000000000..56e99d5ede --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull new file mode 100644 index 0000000000..2f795b083e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass new file mode 100644 index 0000000000..34034f0594 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey new file mode 100644 index 0000000000..ee25715ae0 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf new file mode 100644 index 0000000000..574f63139c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material new file mode 100644 index 0000000000..04270bbaec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass new file mode 100644 index 0000000000..34034f0594 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy new file mode 100644 index 0000000000..d3c0c44ecc --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf new file mode 100644 index 0000000000..574f63139c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material new file mode 100644 index 0000000000..04270bbaec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass new file mode 100644 index 0000000000..34034f0594 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart new file mode 100644 index 0000000000..2864988e38 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf new file mode 100644 index 0000000000..574f63139c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material new file mode 100644 index 0000000000..04270bbaec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass new file mode 100644 index 0000000000..34034f0594 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass new file mode 100644 index 0000000000..34034f0594 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold new file mode 100644 index 0000000000..6f451d12ad --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf new file mode 100644 index 0000000000..574f63139c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material new file mode 100644 index 0000000000..04270bbaec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass new file mode 100644 index 0000000000..34034f0594 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask new file mode 100644 index 0000000000..a5bb3b8a4a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf new file mode 100644 index 0000000000..574f63139c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material new file mode 100644 index 0000000000..04270bbaec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass new file mode 100644 index 0000000000..34034f0594 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze new file mode 100644 index 0000000000..0102b9a5e4 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf new file mode 100644 index 0000000000..574f63139c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material new file mode 100644 index 0000000000..04270bbaec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass new file mode 100644 index 0000000000..34034f0594 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random new file mode 100644 index 0000000000..f23e81a036 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf new file mode 100644 index 0000000000..574f63139c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material new file mode 100644 index 0000000000..04270bbaec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass new file mode 100644 index 0000000000..34034f0594 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver new file mode 100644 index 0000000000..98dcfacb11 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf new file mode 100644 index 0000000000..574f63139c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material new file mode 100644 index 0000000000..04270bbaec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass new file mode 100644 index 0000000000..34034f0594 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token new file mode 100644 index 0000000000..63a739c305 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf new file mode 100644 index 0000000000..574f63139c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material new file mode 100644 index 0000000000..04270bbaec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/model.xml b/soh/assets/custom/objects/gameplay_keep/model.xml new file mode 100644 index 0000000000..6444457b7a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/model.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/Hilite_new.rgba16 b/soh/assets/custom/objects/object_keyring/Hilite_new.rgba16 new file mode 100644 index 0000000000..5438695fae Binary files /dev/null and b/soh/assets/custom/objects/object_keyring/Hilite_new.rgba16 differ diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL index 3552eef1b7..7cb17d8891 100644 --- a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL @@ -1,11 +1,10 @@ + + + + - - - - - diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_tri_0 index 791defa81a..c7b29e9c7c 100644 --- a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_tri_0 +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_tri_0 @@ -1,213 +1,110 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_0 index 1dd0cbb61e..5ab0f76ecc 100644 --- a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_0 +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_0 @@ -1,233 +1,210 @@ - + - - - - - - - + + + + + + + - + - + - - - + - - - + + + - - - + + + - - - + - - - + + + + + - - - - + + + + - - - + - - - + - - - + + + - - + + - - - - + + - - - - - - + + + + + + + + - - - + + + + - - - - - - - + + + + + - - - - + + + + - - - + + + - - - + - + - - - + + + + + - + + - - - - + + - - - - + + + - - - - - - - + + + + - + - + - - - + + + - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - - + + + - - - + - + - + + - - - - - - + + + + - - - - + + + + + - - - - - - - - - - + + - + - + - + - + - + + + - + - + - + - - + + - + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_cull b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_cull new file mode 100644 index 0000000000..6ef0139b8c --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress index b5755b4a82..f926de784a 100644 --- a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress @@ -1,21 +1,15 @@ + - - - + - - - - - + + - - diff --git a/soh/assets/custom/objects/object_keyring/model.xml b/soh/assets/custom/objects/object_keyring/model.xml new file mode 100644 index 0000000000..6ef0139b8c --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/model.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/bosskey_crate_top b/soh/assets/custom/objects/object_kibako/bosskey_crate_top new file mode 100644 index 0000000000..4b055671e4 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/bosskey_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL new file mode 100644 index 0000000000..c42484ebe6 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 new file mode 100644 index 0000000000..96b7903de9 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 new file mode 100644 index 0000000000..1a288d2131 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull new file mode 100644 index 0000000000..9b63c4a72d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL new file mode 100644 index 0000000000..1fd3a1f8b7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 new file mode 100644 index 0000000000..bbcb5c4c97 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 new file mode 100644 index 0000000000..1a288d2131 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull new file mode 100644 index 0000000000..9b63c4a72d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL new file mode 100644 index 0000000000..e0d09ffa48 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 new file mode 100644 index 0000000000..a0af63d7fb --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 new file mode 100644 index 0000000000..1a288d2131 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull new file mode 100644 index 0000000000..9b63c4a72d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL new file mode 100644 index 0000000000..9999462e6f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 new file mode 100644 index 0000000000..6eea14d8ca --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 new file mode 100644 index 0000000000..1a288d2131 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull new file mode 100644 index 0000000000..9b63c4a72d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL new file mode 100644 index 0000000000..8237aa0e73 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 new file mode 100644 index 0000000000..c1c8d6cfc8 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 new file mode 100644 index 0000000000..1a288d2131 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull new file mode 100644 index 0000000000..9b63c4a72d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL new file mode 100644 index 0000000000..17467a73bc --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 new file mode 100644 index 0000000000..6df8755b2f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 new file mode 100644 index 0000000000..1a288d2131 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull new file mode 100644 index 0000000000..9b63c4a72d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL new file mode 100644 index 0000000000..e3cc0ebe1d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 new file mode 100644 index 0000000000..692fd7ec32 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 new file mode 100644 index 0000000000..1a288d2131 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull new file mode 100644 index 0000000000..9b63c4a72d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL new file mode 100644 index 0000000000..dc73b60898 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 new file mode 100644 index 0000000000..88a23f0e7f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 new file mode 100644 index 0000000000..1a288d2131 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull new file mode 100644 index 0000000000..9b63c4a72d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/heart_crate_top b/soh/assets/custom/objects/object_kibako/heart_crate_top new file mode 100644 index 0000000000..f5b47bd092 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/heart_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako/junk_crate_top b/soh/assets/custom/objects/object_kibako/junk_crate_top new file mode 100644 index 0000000000..ef303867cc Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/junk_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako/major_crate_top b/soh/assets/custom/objects/object_kibako/major_crate_top new file mode 100644 index 0000000000..874104cf60 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/major_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey b/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey new file mode 100644 index 0000000000..4996f10548 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart b/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart new file mode 100644 index 0000000000..f1df8a15cd --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk b/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk new file mode 100644 index 0000000000..85a1aef61a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major b/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major new file mode 100644 index 0000000000..ea7b5edf0b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor b/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor new file mode 100644 index 0000000000..7a6580630e --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando b/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando new file mode 100644 index 0000000000..e8ff9db185 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey b/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey new file mode 100644 index 0000000000..593bf9e548 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token b/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token new file mode 100644 index 0000000000..f58840a2bc --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/minor_crate_top b/soh/assets/custom/objects/object_kibako/minor_crate_top new file mode 100644 index 0000000000..830d8ff65b Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/minor_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako/rando_crate_top b/soh/assets/custom/objects/object_kibako/rando_crate_top new file mode 100644 index 0000000000..2d211d6125 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/rando_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako/smallkey_crate_top b/soh/assets/custom/objects/object_kibako/smallkey_crate_top new file mode 100644 index 0000000000..542dfb837d Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/smallkey_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako/token_crate_top b/soh/assets/custom/objects/object_kibako/token_crate_top new file mode 100644 index 0000000000..d4d5442860 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako/token_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako2/bosskey_crate_side b/soh/assets/custom/objects/object_kibako2/bosskey_crate_side new file mode 100644 index 0000000000..d5ec9241ab Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/bosskey_crate_side differ diff --git a/soh/assets/custom/objects/object_kibako2/bosskey_crate_top b/soh/assets/custom/objects/object_kibako2/bosskey_crate_top new file mode 100644 index 0000000000..4b055671e4 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/bosskey_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL new file mode 100644 index 0000000000..c596748844 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 new file mode 100644 index 0000000000..f43cacd886 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 new file mode 100644 index 0000000000..d877460d44 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 new file mode 100644 index 0000000000..e769465866 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 new file mode 100644 index 0000000000..1c6430bd42 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull new file mode 100644 index 0000000000..42422b027a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL new file mode 100644 index 0000000000..ce8bcb69fc --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 new file mode 100644 index 0000000000..64c96a3a34 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 new file mode 100644 index 0000000000..ee780d50d5 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 new file mode 100644 index 0000000000..e769465866 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 new file mode 100644 index 0000000000..1c6430bd42 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull new file mode 100644 index 0000000000..42422b027a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL new file mode 100644 index 0000000000..2d9c5974c1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 new file mode 100644 index 0000000000..a3a46e621f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 new file mode 100644 index 0000000000..041d794d9f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 new file mode 100644 index 0000000000..e769465866 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 new file mode 100644 index 0000000000..1c6430bd42 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull new file mode 100644 index 0000000000..42422b027a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL new file mode 100644 index 0000000000..190005d99e --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 new file mode 100644 index 0000000000..867e166d7f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 new file mode 100644 index 0000000000..5ab5bf39b9 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 new file mode 100644 index 0000000000..e769465866 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 new file mode 100644 index 0000000000..1c6430bd42 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull new file mode 100644 index 0000000000..42422b027a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL new file mode 100644 index 0000000000..d093960d59 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 new file mode 100644 index 0000000000..9ab4cdf9ae --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 new file mode 100644 index 0000000000..8a22d508b5 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 new file mode 100644 index 0000000000..e769465866 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 new file mode 100644 index 0000000000..1c6430bd42 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull new file mode 100644 index 0000000000..42422b027a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL new file mode 100644 index 0000000000..b1c1ffd1fa --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 new file mode 100644 index 0000000000..3e87c23b19 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 new file mode 100644 index 0000000000..296988ca1b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 new file mode 100644 index 0000000000..e769465866 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 new file mode 100644 index 0000000000..1c6430bd42 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull new file mode 100644 index 0000000000..42422b027a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL new file mode 100644 index 0000000000..c4d711d10a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 new file mode 100644 index 0000000000..126e0bde7c --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 new file mode 100644 index 0000000000..908b646bb7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 new file mode 100644 index 0000000000..e769465866 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 new file mode 100644 index 0000000000..1c6430bd42 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull new file mode 100644 index 0000000000..42422b027a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL new file mode 100644 index 0000000000..b1b1269b91 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 new file mode 100644 index 0000000000..c02cd056d2 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 new file mode 100644 index 0000000000..dd2c07c524 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 new file mode 100644 index 0000000000..e769465866 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 new file mode 100644 index 0000000000..1c6430bd42 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull new file mode 100644 index 0000000000..42422b027a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/heart_crate_side b/soh/assets/custom/objects/object_kibako2/heart_crate_side new file mode 100644 index 0000000000..d0d916c078 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/heart_crate_side differ diff --git a/soh/assets/custom/objects/object_kibako2/heart_crate_top b/soh/assets/custom/objects/object_kibako2/heart_crate_top new file mode 100644 index 0000000000..f5b47bd092 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/heart_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako2/junk_crate_side b/soh/assets/custom/objects/object_kibako2/junk_crate_side new file mode 100644 index 0000000000..08b491eb47 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/junk_crate_side differ diff --git a/soh/assets/custom/objects/object_kibako2/junk_crate_top b/soh/assets/custom/objects/object_kibako2/junk_crate_top new file mode 100644 index 0000000000..ef303867cc Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/junk_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako2/major_crate_side b/soh/assets/custom/objects/object_kibako2/major_crate_side new file mode 100644 index 0000000000..a1fe6d8196 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/major_crate_side differ diff --git a/soh/assets/custom/objects/object_kibako2/major_crate_top b/soh/assets/custom/objects/object_kibako2/major_crate_top new file mode 100644 index 0000000000..874104cf60 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/major_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako2/mask_crate_side b/soh/assets/custom/objects/object_kibako2/mask_crate_side new file mode 100644 index 0000000000..634969f2ad Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/mask_crate_side differ diff --git a/soh/assets/custom/objects/object_kibako2/mask_crate_top b/soh/assets/custom/objects/object_kibako2/mask_crate_top new file mode 100644 index 0000000000..d8292e33fe Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/mask_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_side_bosskey b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_side_bosskey new file mode 100644 index 0000000000..381376f7e7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_side_bosskey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey new file mode 100644 index 0000000000..6bbbe04089 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart new file mode 100644 index 0000000000..e79a71e401 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart new file mode 100644 index 0000000000..2e20008c7e --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk new file mode 100644 index 0000000000..b7eee4eb11 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk new file mode 100644 index 0000000000..d59ca15f8a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major new file mode 100644 index 0000000000..e930dced0f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major new file mode 100644 index 0000000000..ee053858d8 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor new file mode 100644 index 0000000000..c9b542226e --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor new file mode 100644 index 0000000000..619787be2e --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando new file mode 100644 index 0000000000..8e2e6bb460 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando new file mode 100644 index 0000000000..ca00e4780d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey new file mode 100644 index 0000000000..b4cb8d6724 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey new file mode 100644 index 0000000000..a0ea434990 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token new file mode 100644 index 0000000000..d87ec41480 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token new file mode 100644 index 0000000000..369b6a05ae --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/minor_crate_side b/soh/assets/custom/objects/object_kibako2/minor_crate_side new file mode 100644 index 0000000000..27a62c8c4d Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/minor_crate_side differ diff --git a/soh/assets/custom/objects/object_kibako2/minor_crate_top b/soh/assets/custom/objects/object_kibako2/minor_crate_top new file mode 100644 index 0000000000..830d8ff65b Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/minor_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako2/rando_crate_side b/soh/assets/custom/objects/object_kibako2/rando_crate_side new file mode 100644 index 0000000000..ea7c9e3b65 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/rando_crate_side differ diff --git a/soh/assets/custom/objects/object_kibako2/rando_crate_top b/soh/assets/custom/objects/object_kibako2/rando_crate_top new file mode 100644 index 0000000000..2d211d6125 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/rando_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako2/smallkey_crate_side b/soh/assets/custom/objects/object_kibako2/smallkey_crate_side new file mode 100644 index 0000000000..23ada846e9 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/smallkey_crate_side differ diff --git a/soh/assets/custom/objects/object_kibako2/smallkey_crate_top b/soh/assets/custom/objects/object_kibako2/smallkey_crate_top new file mode 100644 index 0000000000..542dfb837d Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/smallkey_crate_top differ diff --git a/soh/assets/custom/objects/object_kibako2/token_crate_side b/soh/assets/custom/objects/object_kibako2/token_crate_side new file mode 100644 index 0000000000..6de4f580f8 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/token_crate_side differ diff --git a/soh/assets/custom/objects/object_kibako2/token_crate_top b/soh/assets/custom/objects/object_kibako2/token_crate_top new file mode 100644 index 0000000000..d4d5442860 Binary files /dev/null and b/soh/assets/custom/objects/object_kibako2/token_crate_top differ diff --git a/soh/assets/custom/presets/Main Default.json b/soh/assets/custom/presets/Main Default.json new file mode 100644 index 0000000000..7d87c3d956 --- /dev/null +++ b/soh/assets/custom/presets/Main Default.json @@ -0,0 +1,11 @@ +{ + "blocks": { + "enhancements": { + "gCheats": null, + "gEnhancements": null, + "gRandoEnhancements": null + } + }, + "presetName": "Main Default", + "isBuiltIn": true +} \ No newline at end of file diff --git a/soh/assets/custom/presets/Main Enhanced.json b/soh/assets/custom/presets/Main Enhanced.json new file mode 100644 index 0000000000..026a78de75 --- /dev/null +++ b/soh/assets/custom/presets/Main Enhanced.json @@ -0,0 +1,56 @@ +{ + "blocks": { + "enhancements": { + "gCheats": null, + "gEnhancements": { + "AssignableTunicsAndBoots": 1, + "Autosave": 1, + "BetterOwl": 1, + "CreditsFix": 1, + "CustomizeFrogsOcarinaGame": 1, + "DekuNutUpgradeFix": 1, + "DisableLOD": 1, + "DpadEquips": 1, + "DpadNoDropOcarinaInput": 1, + "DynamicWalletIcon": 1, + "EnemySpawnsOverWaterboxes": 1, + "FasterRupeeAccumulator": 1, + "FixBrokenGiantsKnife": 1, + "FixDaruniaDanceSpeed": 1, + "FixDungeonMinimapIcon": 1, + "FixEyesOpenWhileSleeping": 1, + "FixFloorSwitches": 1, + "FixHammerHand": 1, + "FixMenuLR": 1, + "FixSawSoftlock": 1, + "FixTexturesOOB": 1, + "FixVineFall": 1, + "FixZoraHintDialogue": 1, + "FrogsModifyFailTime": 2, + "GerudoWarriorClothingFix": 1, + "GravediggingTourFix": 1, + "InjectItemCounts": { + "GoldSkulltula": 1, + "HeartContainer": 1, + "HeartPiece": 1 + }, + "NaviTextFix": 1, + "PulsateBossIcon": 1, + "RedGanonBlood": 1, + "RememberMapToggleState": 1, + "SceneSpecificDirtPathFix": 1, + "SilverRupeeJingleExtend": 1, + "SkipSaveConfirmation": 1, + "SkipText": 1, + "TextSpeed": 5, + "TimeFlowFileSelect": 1, + "TwoHandedIdle": 1, + "VisualAgony": 1, + "WidescreenActorCulling": 1 + }, + "gRandoEnhancements": null + } + }, + "presetName": "Main Enhanced", + "isBuiltIn": true +} \ No newline at end of file diff --git a/soh/assets/custom/presets/Main Randomizer.json b/soh/assets/custom/presets/Main Randomizer.json new file mode 100644 index 0000000000..59c24e9821 --- /dev/null +++ b/soh/assets/custom/presets/Main Randomizer.json @@ -0,0 +1,135 @@ +{ + "blocks": { + "enhancements": { + "gCheats": { + "EasyFrameAdvance": 1 + }, + "gEnhancements": { + "AdultMasks": 1, + "AssignableTunicsAndBoots": 1, + "Autosave": 1, + "BetterAmmoRendering": 1, + "BetterBombchuShopping": 1, + "BetterFarore": 1, + "BetterOwl": 1, + "BombchusOOB": 1, + "ClimbSpeed": 3, + "CrawlSpeed": 2, + "CreditsFix": 1, + "CustomizeFishing": 1, + "CustomizeFrogsOcarinaGame": 1, + "CustomizeOcarinaGame": 1, + "DampeAllNight": 1, + "DampeWin": 1, + "DayGravePull": 1, + "DekuNutUpgradeFix": 1, + "DisableCritWiggle": 1, + "DisableFirstPersonChus": 1, + "DisableLOD": 1, + "DpadEquips": 1, + "DpadNoDropOcarinaInput": 1, + "DynamicWalletIcon": 1, + "EarlyEyeballFrog": 1, + "EnemySpawnsOverWaterboxes": 1, + "EquipmentCanBeRemoved": 1, + "ExtendedCullingExcludeGlitchActors": 1, + "FastBoomerang": 1, + "FastChests": 1, + "FastDrops": 1, + "FastFarores": 1, + "FastOcarinaPlayback": 1, + "FasterBlockPush": 5, + "FasterHeavyBlockLift": 1, + "FasterRupeeAccumulator": 1, + "FileSelectMoreInfo": 1, + "FishNeverEscape": 1, + "FixBrokenGiantsKnife": 1, + "FixDaruniaDanceSpeed": 1, + "FixDungeonMinimapIcon": 1, + "FixFloorSwitches": 1, + "FixHammerHand": 1, + "FixMenuLR": 1, + "FixSawSoftlock": 1, + "FixTexturesOOB": 1, + "FixVineFall": 1, + "FixZoraHintDialogue": 1, + "ForgeTime": 0, + "FrogsModifyFailTime": 2, + "GerudoWarriorClothingFix": 1, + "GoronPot": 1, + "GravediggingTourFix": 1, + "GuaranteeFishingBite": 1, + "HoverFishing": 1, + "IncludeHeldInputsBufferWindow": 1, + "InjectItemCounts": { + "GoldSkulltula": 1, + "HeartContainer": 1, + "HeartPiece": 1 + }, + "InstantPutaway": 1, + "InstantScarecrow": 1, + "MMBunnyHood": 1, + "MarketSneak": 1, + "MaskSelect": 1, + "MinimumFishWeightAdult": 6, + "MinimumFishWeightChild": 3, + "MweepSpeed": 5.0, + "N64WeirdFrames": 1, + "NaviTextFix": 1, + "NewDrops": 1, + "NoInputForCredits": 1, + "NutsExplodeBombs": 1, + "OcarinaGame": { + "StartingNotes": 5 + }, + "PauseMenuAnimatedLink": 1, + "PauseWarp": 1, + "PersistentMasks": 1, + "PulsateBossIcon": 1, + "QuickBongoKill": 1, + "QuickPutaway": 1, + "QuitFishingAtDoor": 1, + "RedGanonBlood": 1, + "RememberMapToggleState": 1, + "SceneSpecificDirtPathFix": 1, + "SeparateArrows": 1, + "ShowDoorLocksOnBothSides": 1, + "SilverRupeeJingleExtend": 1, + "SkipArrowAnimation": 1, + "SkipSaveConfirmation": 1, + "SkipSwimDeepEndAnim": 1, + "SkipText": 1, + "SlowTextSpeed": 5, + "SwordToggle": 1, + "TextSpeed": 5, + "TimeFlowFileSelect": 1, + "TimeSavers": { + "DisableTitleCard": 1, + "SkipChildStealth": 1, + "SkipCutscene": { + "BossIntro": 1, + "Entrances": 1, + "Intro": 1, + "LearnSong": 1, + "OnePoint": 1, + "QuickBossDeaths": 1, + "Story": 1 + }, + "SkipForcedDialog": 3, + "SkipMiscInteractions": 1, + "SkipOwlInteractions": 1, + "SkipTowerEscape": 1, + "SleepingWaterfall": 1 + }, + "ToTMedallionsColors": 1, + "ToggleStrength": 1, + "TwoHandedIdle": 1, + "VisualAgony": 1, + "WidescreenActorCulling": 1 + }, + "gRandoEnhancements": null + } + }, + "presetName": "Main Randomizer", + "isBuiltIn": true +} \ No newline at end of file diff --git a/soh/assets/custom/presets/Main Vanilla+.json b/soh/assets/custom/presets/Main Vanilla+.json new file mode 100644 index 0000000000..0f6c1741ad --- /dev/null +++ b/soh/assets/custom/presets/Main Vanilla+.json @@ -0,0 +1,56 @@ +{ + "blocks": { + "enhancements": { + "gCheats": null, + "gEnhancements": { + "AssignableTunicsAndBoots": 1, + "Autosave": 1, + "BetterOwl": 1, + "CreditsFix": 1, + "CustomizeFrogsOcarinaGame": 1, + "DekuNutUpgradeFix": 1, + "DisableLOD": 1, + "DpadEquips": 1, + "DpadNoDropOcarinaInput": 1, + "DynamicWalletIcon": 1, + "EnemySpawnsOverWaterboxes": 1, + "FasterRupeeAccumulator": 1, + "FixBrokenGiantsKnife": 1, + "FixDaruniaDanceSpeed": 1, + "FixDungeonMinimapIcon": 1, + "FixEyesOpenWhileSleeping": 1, + "FixFloorSwitches": 1, + "FixHammerHand": 1, + "FixMenuLR": 1, + "FixSawSoftlock": 1, + "FixTexturesOOB": 1, + "FixVineFall": 1, + "FixZoraHintDialogue": 1, + "FrogsModifyFailTime": 2, + "GerudoWarriorClothingFix": 1, + "GravediggingTourFix": 1, + "InjectItemCounts": { + "GoldSkulltula": 1, + "HeartContainer": 1, + "HeartPiece": 1 + }, + "NaviTextFix": 1, + "PulsateBossIcon": 1, + "RedGanonBlood": 1, + "RememberMapToggleState": 1, + "SceneSpecificDirtPathFix": 1, + "SilverRupeeJingleExtend": 1, + "SkipSaveConfirmation": 1, + "SkipText": 1, + "TextSpeed": 5, + "TimeFlowFileSelect": 1, + "TwoHandedIdle": 1, + "VisualAgony": 1, + "WidescreenActorCulling": 1 + }, + "gRandoEnhancements": null + } + }, + "presetName": "Main Vanilla+", + "isBuiltIn": true +} \ No newline at end of file diff --git a/soh/assets/custom/presets/Rando Advanced.json b/soh/assets/custom/presets/Rando Advanced.json new file mode 100644 index 0000000000..4042c0688c --- /dev/null +++ b/soh/assets/custom/presets/Rando Advanced.json @@ -0,0 +1,69 @@ +{ + "blocks": { + "rando": { + "gRandoSettings": { + "40GSHint": 1, + "50GSHint": 1, + "BigPoeTargetCount": 1, + "BlueFireArrows": 1, + "BombchuBag": 1, + "BossKeysanity": 5, + "ClosedForest": 2, + "CompleteMaskQuest": 1, + "CuccosToReturn": 1, + "DampeHint": 1, + "DoorOfTime": 2, + "EnableBombchuDrops": 1, + "FortressCarpenters": 1, + "FrogsHint": 1, + "FullWallets": 1, + "GanonTrial": 0, + "GerudoKeys": 3, + "GregHint": 1, + "HBAHint": 1, + "IncludeTycoonWallet": 1, + "KakarikoGate": 1, + "Keysanity": 5, + "LacsRewardCount": 8, + "MalonHint": 1, + "MerchantText": 1, + "RainbowBridge": 7, + "SariaHint": 1, + "ScrubsFixedPrice": 2, + "ScrubsPrices": 3, + "SheikLAHint": 0, + "Shopsanity": 1, + "ShopsanityCount": 7, + "ShopsanityPrices": 2, + "ShuffleAdultTrade": 1, + "ShuffleBossEntrances": 2, + "ShuffleCows": 1, + "ShuffleDekuNutBag": 1, + "ShuffleDekuStickBag": 1, + "ShuffleDungeonsEntrances": 2, + "ShuffleFrogSongRupees": 1, + "ShuffleGanonBossKey": 9, + "ShuffleGerudoToken": 1, + "ShuffleKeyRings": 2, + "ShuffleKeyRingsRandomCount": 4, + "ShuffleKokiriSword": 1, + "ShuffleMasterSword": 1, + "ShuffleMerchants": 3, + "ShuffleOcarinas": 1, + "ShuffleOverworldSpawns": 1, + "ShuffleScrubs": 2, + "ShuffleSongs": 2, + "ShuffleSwim": 1, + "ShuffleTokens": 3, + "SkipChildZelda": 1, + "SkipEponaRace": 1, + "SkipScarecrowsSong": 1, + "StartingAge": 2, + "StartingMapsCompasses": 0, + "SunlightArrows": 1 + } + } + }, + "presetName": "Rando Advanced", + "isBuiltIn": true +} \ No newline at end of file diff --git a/soh/assets/custom/presets/Rando Beginner.json b/soh/assets/custom/presets/Rando Beginner.json new file mode 100644 index 0000000000..595734fe04 --- /dev/null +++ b/soh/assets/custom/presets/Rando Beginner.json @@ -0,0 +1,51 @@ +{ + "blocks": { + "rando": { + "gRandoSettings": { + "10GSHint": 1, + "20GSHint": 1, + "30GSHint": 1, + "40GSHint": 1, + "50GSHint": 1, + "BigPoeTargetCount": 1, + "BiggoronHint": 1, + "BlueFireArrows": 1, + "BossKeysanity": 2, + "ClosedForest": 2, + "CompleteMaskQuest": 1, + "CuccosToReturn": 1, + "DampeHint": 1, + "DoorOfTime": 2, + "EnableBombchuDrops": 1, + "ExcludedLocations": "147,148,233,323,", + "FortressCarpenters": 1, + "FrogsHint": 1, + "FullWallets": 1, + "GanonTrial": 0, + "GregHint": 1, + "HBAHint": 1, + "IncludeTycoonWallet": 1, + "KakarikoGate": 1, + "Keysanity": 2, + "LacsRewardCount": 6, + "MalonHint": 1, + "MerchantText": 1, + "RainbowBridge": 7, + "SariaHint": 1, + "SheikLAHint": 0, + "ShuffleGanonBossKey": 9, + "ShuffleOcarinas": 1, + "SkipChildZelda": 1, + "SkipEponaRace": 1, + "SkipScarecrowsSong": 1, + "StartingKokiriSword": 1, + "StartingMapsCompasses": 0, + "StartingOcarina": 1, + "SunlightArrows": 1, + "ZorasFountain": 1 + } + } + }, + "presetName": "Rando Beginner", + "isBuiltIn": true +} \ No newline at end of file diff --git a/soh/assets/custom/presets/Rando Default.json b/soh/assets/custom/presets/Rando Default.json new file mode 100644 index 0000000000..f5c5818e94 --- /dev/null +++ b/soh/assets/custom/presets/Rando Default.json @@ -0,0 +1,9 @@ +{ + "blocks": { + "rando": { + "gRandoSettings": null + } + }, + "presetName": "Rando Default", + "isBuiltIn": true +} \ No newline at end of file diff --git a/soh/assets/custom/presets/Rando Hell Mode.json b/soh/assets/custom/presets/Rando Hell Mode.json new file mode 100644 index 0000000000..d427271270 --- /dev/null +++ b/soh/assets/custom/presets/Rando Hell Mode.json @@ -0,0 +1,80 @@ +{ + "blocks": { + "rando": { + "gRandoSettings": { + "BigPoeTargetCount": 1, + "BlueFireArrows": 1, + "BombchuBag": 1, + "BossKeysanity": 5, + "ClosedForest": 2, + "CuccosToReturn": 1, + "DecoupleEntrances": 1, + "DoorOfTime": 2, + "EnableBombchuDrops": 1, + "Fishsanity": 4, + "FishsanityAgeSplit": 1, + "FishsanityPondCount": 17, + "GerudoKeys": 3, + "IncludeTycoonWallet": 1, + "KakarikoGate": 1, + "Keysanity": 5, + "LacsRewardCount": 10, + "LacsRewardOptions": 1, + "LockOverworldDoors": 1, + "MixBosses": 1, + "MixDungeons": 1, + "MixGrottos": 1, + "MixInteriors": 1, + "MixOverworld": 1, + "MixedEntrances": 1, + "RainbowBridge": 7, + "ScrubsPrices": 2, + "Shopsanity": 1, + "ShopsanityCount": 7, + "ShopsanityPrices": 2, + "Shuffle100GSReward": 1, + "ShuffleAdultTrade": 1, + "ShuffleBeehives": 1, + "ShuffleBossEntrances": 2, + "ShuffleBossSouls": 2, + "ShuffleChildWallet": 1, + "ShuffleCows": 1, + "ShuffleCrates": 3, + "ShuffleDekuNutBag": 1, + "ShuffleDekuStickBag": 1, + "ShuffleDungeonsEntrances": 2, + "ShuffleFairies": 1, + "ShuffleFishingPole": 1, + "ShuffleFreestanding": 3, + "ShuffleFrogSongRupees": 1, + "ShuffleGanonBossKey": 9, + "ShuffleGerudoToken": 1, + "ShuffleGrass": 3, + "ShuffleGrottosEntrances": 1, + "ShuffleInteriorsEntrances": 2, + "ShuffleKokiriSword": 1, + "ShuffleMasterSword": 1, + "ShuffleMerchants": 3, + "ShuffleOcarinaButtons": 1, + "ShuffleOcarinas": 1, + "ShuffleOverworldEntrances": 1, + "ShuffleOverworldSpawns": 1, + "ShuffleOwlDrops": 1, + "ShufflePots": 3, + "ShuffleScrubs": 2, + "ShuffleSongs": 2, + "ShuffleSwim": 1, + "ShuffleTokens": 3, + "ShuffleWarpSongs": 1, + "ShuffleWeirdEgg": 1, + "SkipEponaRace": 1, + "StartingAge": 2, + "StartingHearts": 0, + "StartingMapsCompasses": 5, + "SunlightArrows": 1 + } + } + }, + "presetName": "Rando Hell Mode", + "isBuiltIn": true +} \ No newline at end of file diff --git a/soh/assets/custom/presets/Rando Standard.json b/soh/assets/custom/presets/Rando Standard.json new file mode 100644 index 0000000000..ad91912de8 --- /dev/null +++ b/soh/assets/custom/presets/Rando Standard.json @@ -0,0 +1,63 @@ +{ + "blocks": { + "rando": { + "gRandoSettings": { + "10GSHint": 1, + "20GSHint": 1, + "30GSHint": 1, + "40GSHint": 1, + "50GSHint": 1, + "BigPoeTargetCount": 1, + "BiggoronHint": 1, + "BlueFireArrows": 1, + "BombchuBag": 1, + "BossKeysanity": 2, + "ClosedForest": 2, + "CompleteMaskQuest": 1, + "CuccosToReturn": 1, + "DampeHint": 1, + "DoorOfTime": 2, + "EnableBombchuDrops": 1, + "FortressCarpenters": 1, + "FrogsHint": 1, + "FullWallets": 1, + "GanonTrial": 0, + "GregHint": 1, + "HBAHint": 1, + "IncludeTycoonWallet": 1, + "KakarikoGate": 1, + "Keysanity": 5, + "LacsRewardCount": 7, + "MalonHint": 1, + "MerchantText": 1, + "RainbowBridge": 7, + "SariaHint": 1, + "ScrubsFixedPrice": 2, + "ScrubsPrices": 3, + "SheikLAHint": 0, + "Shopsanity": 1, + "ShopsanityCount": 4, + "ShopsanityPrices": 2, + "ShuffleGanonBossKey": 9, + "ShuffleGerudoToken": 1, + "ShuffleKeyRings": 2, + "ShuffleKeyRingsRandomCount": 8, + "ShuffleKokiriSword": 1, + "ShuffleMerchants": 1, + "ShuffleOcarinas": 1, + "ShuffleScrubs": 2, + "ShuffleSongs": 2, + "ShuffleTokens": 3, + "SkipChildZelda": 1, + "SkipEponaRace": 1, + "SkipScarecrowsSong": 1, + "StartingMapsCompasses": 0, + "StartingOcarina": 1, + "SunlightArrows": 1, + "ZorasFountain": 1 + } + } + }, + "presetName": "Rando Standard", + "isBuiltIn": true +} \ No newline at end of file diff --git a/soh/assets/custom/textures/title_static/gFileSelBossRushSettingsJPNTex.ia8.png b/soh/assets/custom/textures/title_static/gFileSelBossRushSettingsJPNTex.ia8.png new file mode 100644 index 0000000000..445111458b Binary files /dev/null and b/soh/assets/custom/textures/title_static/gFileSelBossRushSettingsJPNTex.ia8.png differ diff --git a/soh/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestJPNTex.ia8.png b/soh/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestJPNTex.ia8.png new file mode 100644 index 0000000000..08e42e476b Binary files /dev/null and b/soh/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestJPNTex.ia8.png differ diff --git a/soh/assets/extractor/Config_GC_MQ_D.xml b/soh/assets/extractor/Config_GC_MQ_D.xml index 51e5362922..9607bf02a5 100644 --- a/soh/assets/extractor/Config_GC_MQ_D.xml +++ b/soh/assets/extractor/Config_GC_MQ_D.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_GC_MQ_NTSC_J.xml b/soh/assets/extractor/Config_GC_MQ_NTSC_J.xml new file mode 100644 index 0000000000..f476c161fc --- /dev/null +++ b/soh/assets/extractor/Config_GC_MQ_NTSC_J.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_GC_MQ_NTSC_U.xml b/soh/assets/extractor/Config_GC_MQ_NTSC_U.xml new file mode 100644 index 0000000000..aa89e2d0f8 --- /dev/null +++ b/soh/assets/extractor/Config_GC_MQ_NTSC_U.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_GC_MQ_PAL_F.xml b/soh/assets/extractor/Config_GC_MQ_PAL_F.xml index 7c53369954..5c5cf66178 100644 --- a/soh/assets/extractor/Config_GC_MQ_PAL_F.xml +++ b/soh/assets/extractor/Config_GC_MQ_PAL_F.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_GC_NMQ_D.xml b/soh/assets/extractor/Config_GC_NMQ_D.xml index 7cc11ac18a..3ea47f975d 100644 --- a/soh/assets/extractor/Config_GC_NMQ_D.xml +++ b/soh/assets/extractor/Config_GC_NMQ_D.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml b/soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml new file mode 100644 index 0000000000..72b9258186 --- /dev/null +++ b/soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_GC_NMQ_NTSC_J_CE.xml b/soh/assets/extractor/Config_GC_NMQ_NTSC_J_CE.xml new file mode 100644 index 0000000000..b188b11629 --- /dev/null +++ b/soh/assets/extractor/Config_GC_NMQ_NTSC_J_CE.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml b/soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml new file mode 100644 index 0000000000..9bfb54700a --- /dev/null +++ b/soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_GC_NMQ_PAL_F.xml b/soh/assets/extractor/Config_GC_NMQ_PAL_F.xml index b98acfb00d..066ac144cd 100644 --- a/soh/assets/extractor/Config_GC_NMQ_PAL_F.xml +++ b/soh/assets/extractor/Config_GC_NMQ_PAL_F.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_N64_NTSC_10.xml b/soh/assets/extractor/Config_N64_NTSC_10.xml new file mode 100644 index 0000000000..8beed9fecb --- /dev/null +++ b/soh/assets/extractor/Config_N64_NTSC_10.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_N64_NTSC_11.xml b/soh/assets/extractor/Config_N64_NTSC_11.xml new file mode 100644 index 0000000000..6f7391649b --- /dev/null +++ b/soh/assets/extractor/Config_N64_NTSC_11.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_N64_NTSC_12.xml b/soh/assets/extractor/Config_N64_NTSC_12.xml new file mode 100644 index 0000000000..650bf75732 --- /dev/null +++ b/soh/assets/extractor/Config_N64_NTSC_12.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_N64_PAL_10.xml b/soh/assets/extractor/Config_N64_PAL_10.xml index e4f85e362e..1b8ba4af58 100644 --- a/soh/assets/extractor/Config_N64_PAL_10.xml +++ b/soh/assets/extractor/Config_N64_PAL_10.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_N64_PAL_11.xml b/soh/assets/extractor/Config_N64_PAL_11.xml index ddc5f21d8e..10463e3e6f 100644 --- a/soh/assets/extractor/Config_N64_PAL_11.xml +++ b/soh/assets/extractor/Config_N64_PAL_11.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/filelists/dbg.txt b/soh/assets/extractor/filelists/dbg.txt new file mode 100644 index 0000000000..68af5e5579 --- /dev/null +++ b/soh/assets/extractor/filelists/dbg.txt @@ -0,0 +1,1532 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_nes_static +icon_item_ger_static +icon_item_fra_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +nes_message_data_static +ger_message_data_static +fra_message_data_static +staff_message_data_static +map_grand_static +map_i_static +map_48x85_static +code +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_Arms_Hook +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Bg_Bdan_Objects +ovl_Bg_Bdan_Switch +ovl_Bg_Bom_Guard +ovl_Bg_Bombwall +ovl_Bg_Bowl_Wall +ovl_Bg_Breakwall +ovl_Bg_Ddan_Jd +ovl_Bg_Ddan_Kd +ovl_Bg_Dodoago +ovl_Bg_Dy_Yoseizo +ovl_Bg_Ganon_Otyuka +ovl_Bg_Gate_Shutter +ovl_Bg_Gjyo_Bridge +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Iceblock +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Haka +ovl_Bg_Haka_Gate +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Sgami +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Water +ovl_Bg_Haka_Zou +ovl_Bg_Heavy_Block +ovl_Bg_Hidan_Curtain +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Firewall +ovl_Bg_Hidan_Fslift +ovl_Bg_Hidan_Fwbig +ovl_Bg_Hidan_Hamstep +ovl_Bg_Hidan_Hrock +ovl_Bg_Hidan_Kousi +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_Bg_Ice_Objects +ovl_Bg_Ice_Shelter +ovl_Bg_Ice_Shutter +ovl_Bg_Ice_Turara +ovl_Bg_Ingate +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Block +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Bombiwa +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Haheniron +ovl_Bg_Jya_Ironobj +ovl_Bg_Jya_Kanaami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Menkuri_Eye +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Nisekabe +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Shutter +ovl_Bg_Mizu_Uzu +ovl_Bg_Mizu_Water +ovl_Bg_Mjin +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Hineri +ovl_Bg_Mori_Idomizu +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_Bg_Po_Event +ovl_Bg_Po_Syokudai +ovl_Bg_Pushbox +ovl_Bg_Relay_Objects +ovl_Bg_Spot00_Break +ovl_Bg_Spot00_Hanebasi +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Spot01_Idosoko +ovl_Bg_Spot01_Objects2 +ovl_Bg_Spot02_Objects +ovl_Bg_Spot03_Taki +ovl_Bg_Spot05_Soko +ovl_Bg_Spot06_Objects +ovl_Bg_Spot07_Taki +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot08_Iceblock +ovl_Bg_Spot09_Obj +ovl_Bg_Spot11_Bakudankabe +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_Bg_Spot15_Rrbox +ovl_Bg_Spot15_Saku +ovl_Bg_Spot16_Bombstone +ovl_Bg_Spot16_Doughnut +ovl_Bg_Spot17_Bakudankabe +ovl_Bg_Spot17_Funen +ovl_Bg_Spot18_Basket +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Obj +ovl_Bg_Spot18_Shutter +ovl_Bg_Sst_Floor +ovl_Bg_Toki_Hikari +ovl_Bg_Toki_Swd +ovl_Bg_Treemouth +ovl_Bg_Umajump +ovl_Bg_Vb_Sima +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Bg_Ydan_Sp +ovl_Bg_Zg +ovl_Boss_Dodongo +ovl_Boss_Fd +ovl_Boss_Fd2 +ovl_Boss_Ganon +ovl_Boss_Ganon2 +ovl_Boss_Ganondrof +ovl_Boss_Goma +ovl_Boss_Mo +ovl_Boss_Sst +ovl_Boss_Tw +ovl_Boss_Va +ovl_Demo_6K +ovl_Demo_Du +ovl_Demo_Ec +ovl_Demo_Effect +ovl_Demo_Ext +ovl_Demo_Geff +ovl_Demo_Gj +ovl_Demo_Go +ovl_Demo_Gt +ovl_Demo_Ik +ovl_Demo_Im +ovl_Demo_Kankyo +ovl_Demo_Kekkai +ovl_Demo_Sa +ovl_Demo_Shd +ovl_Demo_Tre_Lgt +ovl_Door_Ana +ovl_Door_Gerudo +ovl_Door_Killer +ovl_Door_Shutter +ovl_Door_Toki +ovl_Door_Warp1 +ovl_Efc_Erupc +ovl_Eff_Dust +ovl_Effect_Ss_Blast +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Dust +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_Ice_Smoke +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Stone1 +ovl_Elf_Msg +ovl_Elf_Msg2 +ovl_En_Am +ovl_En_Ani +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_En_Anubice_Tag +ovl_En_Arow_Trap +ovl_En_Arrow +ovl_En_Attack_Niw +ovl_En_Ba +ovl_En_Bb +ovl_En_Bdfire +ovl_En_Bigokuta +ovl_En_Bili +ovl_En_Bird +ovl_En_Blkobj +ovl_En_Bom +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Bom_Chu +ovl_En_Bombf +ovl_En_Boom +ovl_En_Box +ovl_En_Brob +ovl_En_Bubble +ovl_En_Butte +ovl_En_Bw +ovl_En_Bx +ovl_En_Changer +ovl_En_Clear_Tag +ovl_En_Cow +ovl_En_Crow +ovl_En_Cs +ovl_En_Daiku +ovl_En_Daiku_Kakariko +ovl_En_Dekubaba +ovl_En_Dekunuts +ovl_En_Dh +ovl_En_Dha +ovl_En_Diving_Game +ovl_En_Dns +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Dodojr +ovl_En_Dodongo +ovl_En_Dog +ovl_En_Door +ovl_En_Ds +ovl_En_Du +ovl_En_Dy_Extra +ovl_En_Eg +ovl_En_Eiyer +ovl_En_Elf +ovl_En_Encount1 +ovl_En_Encount2 +ovl_En_Ex_Item +ovl_En_Ex_Ruppy +ovl_En_Fd +ovl_En_Fd_Fire +ovl_En_Fhg_Fire +ovl_En_Fire_Rock +ovl_En_Firefly +ovl_En_Fish +ovl_En_Floormas +ovl_En_Fr +ovl_En_Fu +ovl_En_Fw +ovl_En_Fz +ovl_En_G_Switch +ovl_En_Ganon_Mant +ovl_En_Ganon_Organ +ovl_En_Gb +ovl_En_Ge1 +ovl_En_Ge2 +ovl_En_Ge3 +ovl_En_GeldB +ovl_En_GirlA +ovl_En_Gm +ovl_En_Go +ovl_En_Go2 +ovl_En_Goma +ovl_En_Goroiwa +ovl_En_Gs +ovl_En_Guest +ovl_En_Hata +ovl_En_Heishi1 +ovl_En_Heishi2 +ovl_En_Heishi3 +ovl_En_Heishi4 +ovl_En_Hintnuts +ovl_En_Holl +ovl_En_Honotrap +ovl_En_Horse +ovl_En_Horse_Game_Check +ovl_En_Horse_Ganon +ovl_En_Horse_Link_Child +ovl_En_Horse_Normal +ovl_En_Horse_Zelda +ovl_En_Hs +ovl_En_Hs2 +ovl_En_Hy +ovl_En_Ice_Hono +ovl_En_Ik +ovl_En_In +ovl_En_Insect +ovl_En_Ishi +ovl_En_It +ovl_En_Jj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Kakasi +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_En_Kanban +ovl_En_Karebaba +ovl_En_Ko +ovl_En_Kusa +ovl_En_Kz +ovl_En_Light +ovl_En_Lightbox +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_En_Ma1 +ovl_En_Ma2 +ovl_En_Ma3 +ovl_En_Mag +ovl_En_Mb +ovl_En_Md +ovl_En_Mk +ovl_En_Mm +ovl_En_Mm2 +ovl_En_Ms +ovl_En_Mu +ovl_En_Nb +ovl_En_Niw +ovl_En_Niw_Girl +ovl_En_Niw_Lady +ovl_En_Nutsball +ovl_En_Nwc +ovl_En_Ny +ovl_En_OE2 +ovl_En_Okarina_Effect +ovl_En_Okarina_Tag +ovl_En_Okuta +ovl_En_Ossan +ovl_En_Owl +ovl_En_Part +ovl_En_Peehat +ovl_En_Po_Desert +ovl_En_Po_Field +ovl_En_Po_Relay +ovl_En_Po_Sisters +ovl_En_Poh +ovl_En_Pu_box +ovl_En_Rd +ovl_En_Reeba +ovl_En_River_Sound +ovl_En_Rl +ovl_En_Rr +ovl_En_Ru1 +ovl_En_Ru2 +ovl_En_Sa +ovl_En_Sb +ovl_En_Scene_Change +ovl_En_Sda +ovl_En_Shopnuts +ovl_En_Si +ovl_En_Siofuki +ovl_En_Skb +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_Ssh +ovl_En_St +ovl_En_Sth +ovl_En_Stream +ovl_En_Sw +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Syateki_Niw +ovl_En_Ta +ovl_En_Takara_Man +ovl_En_Tana +ovl_En_Tg +ovl_En_Tite +ovl_En_Tk +ovl_En_Torch +ovl_En_Torch2 +ovl_En_Toryo +ovl_En_Tp +ovl_En_Tr +ovl_En_Trap +ovl_En_Tubo_Trap +ovl_En_Vali +ovl_En_Vase +ovl_En_Vb_Ball +ovl_En_Viewer +ovl_En_Vm +ovl_En_Wall_Tubo +ovl_En_Wallmas +ovl_En_Weather_Tag +ovl_En_Weiyer +ovl_En_Wf +ovl_En_Wonder_Item +ovl_En_Wonder_Talk +ovl_En_Wonder_Talk2 +ovl_En_Wood02 +ovl_En_Xc +ovl_En_Yabusame_Mark +ovl_En_Yukabyun +ovl_En_Zf +ovl_En_Zl1 +ovl_En_Zl2 +ovl_En_Zl3 +ovl_En_Zl4 +ovl_En_Zo +ovl_En_fHG +ovl_End_Title +ovl_Fishing +ovl_Item_B_Heart +ovl_Item_Etcetera +ovl_Item_Inbox +ovl_Item_Ocarina +ovl_Item_Shield +ovl_Magic_Dark +ovl_Magic_Fire +ovl_Magic_Wind +ovl_Mir_Ray +ovl_Obj_Bean +ovl_Obj_Blockstop +ovl_Obj_Bombiwa +ovl_Obj_Comb +ovl_Obj_Dekujr +ovl_Obj_Elevator +ovl_Obj_Hamishi +ovl_Obj_Hana +ovl_Obj_Hsblock +ovl_Obj_Ice_Poly +ovl_Obj_Kibako +ovl_Obj_Kibako2 +ovl_Obj_Lift +ovl_Obj_Lightswitch +ovl_Obj_Makekinsuta +ovl_Obj_Makeoshihiki +ovl_Obj_Mure +ovl_Obj_Mure2 +ovl_Obj_Mure3 +ovl_Obj_Oshihiki +ovl_Obj_Roomtimer +ovl_Obj_Switch +ovl_Obj_Syokudai +ovl_Obj_Timeblock +ovl_Obj_Tsubo +ovl_Obj_Warp2block +ovl_Object_Kankyo +ovl_Oceff_Spot +ovl_Oceff_Storm +ovl_Oceff_Wipe +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_Oceff_Wipe4 +ovl_Shot_Sun +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +syotes_scene +syotes_room_0 +syotes2_scene +syotes2_room_0 +depth_test_scene +depth_test_room_0 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +testroom_scene +testroom_room_0 +testroom_room_1 +testroom_room_2 +testroom_room_3 +testroom_room_4 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +sutaru_scene +sutaru_room_0 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +sasatest_scene +sasatest_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hairal_niwa2_scene +hairal_niwa2_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +besitu_scene +besitu_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +test01_scene +test01_room_0 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/soh/assets/extractor/filelists/gamecube.txt b/soh/assets/extractor/filelists/gamecube.txt new file mode 100644 index 0000000000..23794e1f65 --- /dev/null +++ b/soh/assets/extractor/filelists/gamecube.txt @@ -0,0 +1,1509 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +kanji +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_jpn_static +icon_item_nes_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +jpn_message_data_static +nes_message_data_static +staff_message_data_static +map_grand_static +map_48x85_static +map_i_static +code +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_Arms_Hook +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Bg_Bdan_Objects +ovl_Bg_Bdan_Switch +ovl_Bg_Bom_Guard +ovl_Bg_Bombwall +ovl_Bg_Bowl_Wall +ovl_Bg_Breakwall +ovl_Bg_Ddan_Jd +ovl_Bg_Ddan_Kd +ovl_Bg_Dodoago +ovl_Bg_Dy_Yoseizo +ovl_Bg_Ganon_Otyuka +ovl_Bg_Gate_Shutter +ovl_Bg_Gjyo_Bridge +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Iceblock +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Haka +ovl_Bg_Haka_Gate +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Sgami +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Water +ovl_Bg_Haka_Zou +ovl_Bg_Heavy_Block +ovl_Bg_Hidan_Curtain +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Firewall +ovl_Bg_Hidan_Fslift +ovl_Bg_Hidan_Fwbig +ovl_Bg_Hidan_Hamstep +ovl_Bg_Hidan_Hrock +ovl_Bg_Hidan_Kousi +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_Bg_Ice_Objects +ovl_Bg_Ice_Shelter +ovl_Bg_Ice_Shutter +ovl_Bg_Ice_Turara +ovl_Bg_Ingate +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Block +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Bombiwa +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Haheniron +ovl_Bg_Jya_Ironobj +ovl_Bg_Jya_Kanaami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Menkuri_Eye +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Nisekabe +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Shutter +ovl_Bg_Mizu_Uzu +ovl_Bg_Mizu_Water +ovl_Bg_Mjin +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Hineri +ovl_Bg_Mori_Idomizu +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_Bg_Po_Event +ovl_Bg_Po_Syokudai +ovl_Bg_Pushbox +ovl_Bg_Relay_Objects +ovl_Bg_Spot00_Break +ovl_Bg_Spot00_Hanebasi +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Spot01_Idosoko +ovl_Bg_Spot01_Objects2 +ovl_Bg_Spot02_Objects +ovl_Bg_Spot03_Taki +ovl_Bg_Spot05_Soko +ovl_Bg_Spot06_Objects +ovl_Bg_Spot07_Taki +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot08_Iceblock +ovl_Bg_Spot09_Obj +ovl_Bg_Spot11_Bakudankabe +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_Bg_Spot15_Rrbox +ovl_Bg_Spot15_Saku +ovl_Bg_Spot16_Bombstone +ovl_Bg_Spot16_Doughnut +ovl_Bg_Spot17_Bakudankabe +ovl_Bg_Spot17_Funen +ovl_Bg_Spot18_Basket +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Obj +ovl_Bg_Spot18_Shutter +ovl_Bg_Sst_Floor +ovl_Bg_Toki_Hikari +ovl_Bg_Toki_Swd +ovl_Bg_Treemouth +ovl_Bg_Umajump +ovl_Bg_Vb_Sima +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Bg_Ydan_Sp +ovl_Bg_Zg +ovl_Boss_Dodongo +ovl_Boss_Fd +ovl_Boss_Fd2 +ovl_Boss_Ganon +ovl_Boss_Ganon2 +ovl_Boss_Ganondrof +ovl_Boss_Goma +ovl_Boss_Mo +ovl_Boss_Sst +ovl_Boss_Tw +ovl_Boss_Va +ovl_Demo_6K +ovl_Demo_Du +ovl_Demo_Ec +ovl_Demo_Effect +ovl_Demo_Ext +ovl_Demo_Geff +ovl_Demo_Gj +ovl_Demo_Go +ovl_Demo_Gt +ovl_Demo_Ik +ovl_Demo_Im +ovl_Demo_Kankyo +ovl_Demo_Kekkai +ovl_Demo_Sa +ovl_Demo_Shd +ovl_Demo_Tre_Lgt +ovl_Door_Ana +ovl_Door_Gerudo +ovl_Door_Killer +ovl_Door_Shutter +ovl_Door_Toki +ovl_Door_Warp1 +ovl_Efc_Erupc +ovl_Eff_Dust +ovl_Effect_Ss_Blast +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Dust +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_Ice_Smoke +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Stone1 +ovl_Elf_Msg +ovl_Elf_Msg2 +ovl_En_Am +ovl_En_Ani +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_En_Anubice_Tag +ovl_En_Arow_Trap +ovl_En_Arrow +ovl_En_Attack_Niw +ovl_En_Ba +ovl_En_Bb +ovl_En_Bdfire +ovl_En_Bigokuta +ovl_En_Bili +ovl_En_Bird +ovl_En_Blkobj +ovl_En_Bom +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Bom_Chu +ovl_En_Bombf +ovl_En_Boom +ovl_En_Box +ovl_En_Brob +ovl_En_Bubble +ovl_En_Butte +ovl_En_Bw +ovl_En_Bx +ovl_En_Changer +ovl_En_Clear_Tag +ovl_En_Cow +ovl_En_Crow +ovl_En_Cs +ovl_En_Daiku +ovl_En_Daiku_Kakariko +ovl_En_Dekubaba +ovl_En_Dekunuts +ovl_En_Dh +ovl_En_Dha +ovl_En_Diving_Game +ovl_En_Dns +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Dodojr +ovl_En_Dodongo +ovl_En_Dog +ovl_En_Door +ovl_En_Ds +ovl_En_Du +ovl_En_Dy_Extra +ovl_En_Eg +ovl_En_Eiyer +ovl_En_Elf +ovl_En_Encount1 +ovl_En_Encount2 +ovl_En_Ex_Item +ovl_En_Ex_Ruppy +ovl_En_Fd +ovl_En_Fd_Fire +ovl_En_Fhg_Fire +ovl_En_Fire_Rock +ovl_En_Firefly +ovl_En_Fish +ovl_En_Floormas +ovl_En_Fr +ovl_En_Fu +ovl_En_Fw +ovl_En_Fz +ovl_En_G_Switch +ovl_En_Ganon_Mant +ovl_En_Ganon_Organ +ovl_En_Gb +ovl_En_Ge1 +ovl_En_Ge2 +ovl_En_Ge3 +ovl_En_GeldB +ovl_En_GirlA +ovl_En_Gm +ovl_En_Go +ovl_En_Go2 +ovl_En_Goma +ovl_En_Goroiwa +ovl_En_Gs +ovl_En_Guest +ovl_En_Hata +ovl_En_Heishi1 +ovl_En_Heishi2 +ovl_En_Heishi3 +ovl_En_Heishi4 +ovl_En_Hintnuts +ovl_En_Holl +ovl_En_Honotrap +ovl_En_Horse +ovl_En_Horse_Game_Check +ovl_En_Horse_Ganon +ovl_En_Horse_Link_Child +ovl_En_Horse_Normal +ovl_En_Horse_Zelda +ovl_En_Hs +ovl_En_Hs2 +ovl_En_Hy +ovl_En_Ice_Hono +ovl_En_Ik +ovl_En_In +ovl_En_Insect +ovl_En_Ishi +ovl_En_It +ovl_En_Jj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Kakasi +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_En_Kanban +ovl_En_Karebaba +ovl_En_Ko +ovl_En_Kusa +ovl_En_Kz +ovl_En_Light +ovl_En_Lightbox +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_En_Ma1 +ovl_En_Ma2 +ovl_En_Ma3 +ovl_En_Mag +ovl_En_Mb +ovl_En_Md +ovl_En_Mk +ovl_En_Mm +ovl_En_Mm2 +ovl_En_Ms +ovl_En_Mu +ovl_En_Nb +ovl_En_Niw +ovl_En_Niw_Girl +ovl_En_Niw_Lady +ovl_En_Nutsball +ovl_En_Nwc +ovl_En_Ny +ovl_En_OE2 +ovl_En_Okarina_Effect +ovl_En_Okarina_Tag +ovl_En_Okuta +ovl_En_Ossan +ovl_En_Owl +ovl_En_Part +ovl_En_Peehat +ovl_En_Po_Desert +ovl_En_Po_Field +ovl_En_Po_Relay +ovl_En_Po_Sisters +ovl_En_Poh +ovl_En_Pu_box +ovl_En_Rd +ovl_En_Reeba +ovl_En_River_Sound +ovl_En_Rl +ovl_En_Rr +ovl_En_Ru1 +ovl_En_Ru2 +ovl_En_Sa +ovl_En_Sb +ovl_En_Scene_Change +ovl_En_Sda +ovl_En_Shopnuts +ovl_En_Si +ovl_En_Siofuki +ovl_En_Skb +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_Ssh +ovl_En_St +ovl_En_Sth +ovl_En_Stream +ovl_En_Sw +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Syateki_Niw +ovl_En_Ta +ovl_En_Takara_Man +ovl_En_Tana +ovl_En_Tg +ovl_En_Tite +ovl_En_Tk +ovl_En_Torch +ovl_En_Torch2 +ovl_En_Toryo +ovl_En_Tp +ovl_En_Tr +ovl_En_Trap +ovl_En_Tubo_Trap +ovl_En_Vali +ovl_En_Vase +ovl_En_Vb_Ball +ovl_En_Viewer +ovl_En_Vm +ovl_En_Wall_Tubo +ovl_En_Wallmas +ovl_En_Weather_Tag +ovl_En_Weiyer +ovl_En_Wf +ovl_En_Wonder_Item +ovl_En_Wonder_Talk +ovl_En_Wonder_Talk2 +ovl_En_Wood02 +ovl_En_Xc +ovl_En_Yabusame_Mark +ovl_En_Yukabyun +ovl_En_Zf +ovl_En_Zl1 +ovl_En_Zl2 +ovl_En_Zl3 +ovl_En_Zl4 +ovl_En_Zo +ovl_En_fHG +ovl_End_Title +ovl_Fishing +ovl_Item_B_Heart +ovl_Item_Etcetera +ovl_Item_Inbox +ovl_Item_Ocarina +ovl_Item_Shield +ovl_Magic_Dark +ovl_Magic_Fire +ovl_Magic_Wind +ovl_Mir_Ray +ovl_Obj_Bean +ovl_Obj_Blockstop +ovl_Obj_Bombiwa +ovl_Obj_Comb +ovl_Obj_Dekujr +ovl_Obj_Elevator +ovl_Obj_Hamishi +ovl_Obj_Hana +ovl_Obj_Hsblock +ovl_Obj_Ice_Poly +ovl_Obj_Kibako +ovl_Obj_Kibako2 +ovl_Obj_Lift +ovl_Obj_Lightswitch +ovl_Obj_Makekinsuta +ovl_Obj_Makeoshihiki +ovl_Obj_Mure +ovl_Obj_Mure2 +ovl_Obj_Mure3 +ovl_Obj_Oshihiki +ovl_Obj_Roomtimer +ovl_Obj_Switch +ovl_Obj_Syokudai +ovl_Obj_Timeblock +ovl_Obj_Tsubo +ovl_Obj_Warp2block +ovl_Object_Kankyo +ovl_Oceff_Spot +ovl_Oceff_Storm +ovl_Oceff_Wipe +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_Oceff_Wipe4 +ovl_Shot_Sun +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/soh/assets/extractor/filelists/gamecube_pal.txt b/soh/assets/extractor/filelists/gamecube_pal.txt new file mode 100644 index 0000000000..c9746c1da9 --- /dev/null +++ b/soh/assets/extractor/filelists/gamecube_pal.txt @@ -0,0 +1,1510 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_nes_static +icon_item_ger_static +icon_item_fra_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +nes_message_data_static +ger_message_data_static +fra_message_data_static +staff_message_data_static +map_grand_static +map_48x85_static +map_i_static +code +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_Arms_Hook +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Bg_Bdan_Objects +ovl_Bg_Bdan_Switch +ovl_Bg_Bom_Guard +ovl_Bg_Bombwall +ovl_Bg_Bowl_Wall +ovl_Bg_Breakwall +ovl_Bg_Ddan_Jd +ovl_Bg_Ddan_Kd +ovl_Bg_Dodoago +ovl_Bg_Dy_Yoseizo +ovl_Bg_Ganon_Otyuka +ovl_Bg_Gate_Shutter +ovl_Bg_Gjyo_Bridge +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Iceblock +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Haka +ovl_Bg_Haka_Gate +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Sgami +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Water +ovl_Bg_Haka_Zou +ovl_Bg_Heavy_Block +ovl_Bg_Hidan_Curtain +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Firewall +ovl_Bg_Hidan_Fslift +ovl_Bg_Hidan_Fwbig +ovl_Bg_Hidan_Hamstep +ovl_Bg_Hidan_Hrock +ovl_Bg_Hidan_Kousi +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_Bg_Ice_Objects +ovl_Bg_Ice_Shelter +ovl_Bg_Ice_Shutter +ovl_Bg_Ice_Turara +ovl_Bg_Ingate +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Block +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Bombiwa +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Haheniron +ovl_Bg_Jya_Ironobj +ovl_Bg_Jya_Kanaami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Menkuri_Eye +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Nisekabe +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Shutter +ovl_Bg_Mizu_Uzu +ovl_Bg_Mizu_Water +ovl_Bg_Mjin +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Hineri +ovl_Bg_Mori_Idomizu +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_Bg_Po_Event +ovl_Bg_Po_Syokudai +ovl_Bg_Pushbox +ovl_Bg_Relay_Objects +ovl_Bg_Spot00_Break +ovl_Bg_Spot00_Hanebasi +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Spot01_Idosoko +ovl_Bg_Spot01_Objects2 +ovl_Bg_Spot02_Objects +ovl_Bg_Spot03_Taki +ovl_Bg_Spot05_Soko +ovl_Bg_Spot06_Objects +ovl_Bg_Spot07_Taki +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot08_Iceblock +ovl_Bg_Spot09_Obj +ovl_Bg_Spot11_Bakudankabe +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_Bg_Spot15_Rrbox +ovl_Bg_Spot15_Saku +ovl_Bg_Spot16_Bombstone +ovl_Bg_Spot16_Doughnut +ovl_Bg_Spot17_Bakudankabe +ovl_Bg_Spot17_Funen +ovl_Bg_Spot18_Basket +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Obj +ovl_Bg_Spot18_Shutter +ovl_Bg_Sst_Floor +ovl_Bg_Toki_Hikari +ovl_Bg_Toki_Swd +ovl_Bg_Treemouth +ovl_Bg_Umajump +ovl_Bg_Vb_Sima +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Bg_Ydan_Sp +ovl_Bg_Zg +ovl_Boss_Dodongo +ovl_Boss_Fd +ovl_Boss_Fd2 +ovl_Boss_Ganon +ovl_Boss_Ganon2 +ovl_Boss_Ganondrof +ovl_Boss_Goma +ovl_Boss_Mo +ovl_Boss_Sst +ovl_Boss_Tw +ovl_Boss_Va +ovl_Demo_6K +ovl_Demo_Du +ovl_Demo_Ec +ovl_Demo_Effect +ovl_Demo_Ext +ovl_Demo_Geff +ovl_Demo_Gj +ovl_Demo_Go +ovl_Demo_Gt +ovl_Demo_Ik +ovl_Demo_Im +ovl_Demo_Kankyo +ovl_Demo_Kekkai +ovl_Demo_Sa +ovl_Demo_Shd +ovl_Demo_Tre_Lgt +ovl_Door_Ana +ovl_Door_Gerudo +ovl_Door_Killer +ovl_Door_Shutter +ovl_Door_Toki +ovl_Door_Warp1 +ovl_Efc_Erupc +ovl_Eff_Dust +ovl_Effect_Ss_Blast +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Dust +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_Ice_Smoke +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Stone1 +ovl_Elf_Msg +ovl_Elf_Msg2 +ovl_En_Am +ovl_En_Ani +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_En_Anubice_Tag +ovl_En_Arow_Trap +ovl_En_Arrow +ovl_En_Attack_Niw +ovl_En_Ba +ovl_En_Bb +ovl_En_Bdfire +ovl_En_Bigokuta +ovl_En_Bili +ovl_En_Bird +ovl_En_Blkobj +ovl_En_Bom +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Bom_Chu +ovl_En_Bombf +ovl_En_Boom +ovl_En_Box +ovl_En_Brob +ovl_En_Bubble +ovl_En_Butte +ovl_En_Bw +ovl_En_Bx +ovl_En_Changer +ovl_En_Clear_Tag +ovl_En_Cow +ovl_En_Crow +ovl_En_Cs +ovl_En_Daiku +ovl_En_Daiku_Kakariko +ovl_En_Dekubaba +ovl_En_Dekunuts +ovl_En_Dh +ovl_En_Dha +ovl_En_Diving_Game +ovl_En_Dns +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Dodojr +ovl_En_Dodongo +ovl_En_Dog +ovl_En_Door +ovl_En_Ds +ovl_En_Du +ovl_En_Dy_Extra +ovl_En_Eg +ovl_En_Eiyer +ovl_En_Elf +ovl_En_Encount1 +ovl_En_Encount2 +ovl_En_Ex_Item +ovl_En_Ex_Ruppy +ovl_En_Fd +ovl_En_Fd_Fire +ovl_En_Fhg_Fire +ovl_En_Fire_Rock +ovl_En_Firefly +ovl_En_Fish +ovl_En_Floormas +ovl_En_Fr +ovl_En_Fu +ovl_En_Fw +ovl_En_Fz +ovl_En_G_Switch +ovl_En_Ganon_Mant +ovl_En_Ganon_Organ +ovl_En_Gb +ovl_En_Ge1 +ovl_En_Ge2 +ovl_En_Ge3 +ovl_En_GeldB +ovl_En_GirlA +ovl_En_Gm +ovl_En_Go +ovl_En_Go2 +ovl_En_Goma +ovl_En_Goroiwa +ovl_En_Gs +ovl_En_Guest +ovl_En_Hata +ovl_En_Heishi1 +ovl_En_Heishi2 +ovl_En_Heishi3 +ovl_En_Heishi4 +ovl_En_Hintnuts +ovl_En_Holl +ovl_En_Honotrap +ovl_En_Horse +ovl_En_Horse_Game_Check +ovl_En_Horse_Ganon +ovl_En_Horse_Link_Child +ovl_En_Horse_Normal +ovl_En_Horse_Zelda +ovl_En_Hs +ovl_En_Hs2 +ovl_En_Hy +ovl_En_Ice_Hono +ovl_En_Ik +ovl_En_In +ovl_En_Insect +ovl_En_Ishi +ovl_En_It +ovl_En_Jj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Kakasi +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_En_Kanban +ovl_En_Karebaba +ovl_En_Ko +ovl_En_Kusa +ovl_En_Kz +ovl_En_Light +ovl_En_Lightbox +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_En_Ma1 +ovl_En_Ma2 +ovl_En_Ma3 +ovl_En_Mag +ovl_En_Mb +ovl_En_Md +ovl_En_Mk +ovl_En_Mm +ovl_En_Mm2 +ovl_En_Ms +ovl_En_Mu +ovl_En_Nb +ovl_En_Niw +ovl_En_Niw_Girl +ovl_En_Niw_Lady +ovl_En_Nutsball +ovl_En_Nwc +ovl_En_Ny +ovl_En_OE2 +ovl_En_Okarina_Effect +ovl_En_Okarina_Tag +ovl_En_Okuta +ovl_En_Ossan +ovl_En_Owl +ovl_En_Part +ovl_En_Peehat +ovl_En_Po_Desert +ovl_En_Po_Field +ovl_En_Po_Relay +ovl_En_Po_Sisters +ovl_En_Poh +ovl_En_Pu_box +ovl_En_Rd +ovl_En_Reeba +ovl_En_River_Sound +ovl_En_Rl +ovl_En_Rr +ovl_En_Ru1 +ovl_En_Ru2 +ovl_En_Sa +ovl_En_Sb +ovl_En_Scene_Change +ovl_En_Sda +ovl_En_Shopnuts +ovl_En_Si +ovl_En_Siofuki +ovl_En_Skb +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_Ssh +ovl_En_St +ovl_En_Sth +ovl_En_Stream +ovl_En_Sw +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Syateki_Niw +ovl_En_Ta +ovl_En_Takara_Man +ovl_En_Tana +ovl_En_Tg +ovl_En_Tite +ovl_En_Tk +ovl_En_Torch +ovl_En_Torch2 +ovl_En_Toryo +ovl_En_Tp +ovl_En_Tr +ovl_En_Trap +ovl_En_Tubo_Trap +ovl_En_Vali +ovl_En_Vase +ovl_En_Vb_Ball +ovl_En_Viewer +ovl_En_Vm +ovl_En_Wall_Tubo +ovl_En_Wallmas +ovl_En_Weather_Tag +ovl_En_Weiyer +ovl_En_Wf +ovl_En_Wonder_Item +ovl_En_Wonder_Talk +ovl_En_Wonder_Talk2 +ovl_En_Wood02 +ovl_En_Xc +ovl_En_Yabusame_Mark +ovl_En_Yukabyun +ovl_En_Zf +ovl_En_Zl1 +ovl_En_Zl2 +ovl_En_Zl3 +ovl_En_Zl4 +ovl_En_Zo +ovl_En_fHG +ovl_End_Title +ovl_Fishing +ovl_Item_B_Heart +ovl_Item_Etcetera +ovl_Item_Inbox +ovl_Item_Ocarina +ovl_Item_Shield +ovl_Magic_Dark +ovl_Magic_Fire +ovl_Magic_Wind +ovl_Mir_Ray +ovl_Obj_Bean +ovl_Obj_Blockstop +ovl_Obj_Bombiwa +ovl_Obj_Comb +ovl_Obj_Dekujr +ovl_Obj_Elevator +ovl_Obj_Hamishi +ovl_Obj_Hana +ovl_Obj_Hsblock +ovl_Obj_Ice_Poly +ovl_Obj_Kibako +ovl_Obj_Kibako2 +ovl_Obj_Lift +ovl_Obj_Lightswitch +ovl_Obj_Makekinsuta +ovl_Obj_Makeoshihiki +ovl_Obj_Mure +ovl_Obj_Mure2 +ovl_Obj_Mure3 +ovl_Obj_Oshihiki +ovl_Obj_Roomtimer +ovl_Obj_Switch +ovl_Obj_Syokudai +ovl_Obj_Timeblock +ovl_Obj_Tsubo +ovl_Obj_Warp2block +ovl_Object_Kankyo +ovl_Oceff_Spot +ovl_Oceff_Storm +ovl_Oceff_Wipe +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_Oceff_Wipe4 +ovl_Shot_Sun +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/soh/assets/extractor/filelists/ntsc_12_oot.txt b/soh/assets/extractor/filelists/ntsc_12_oot.txt new file mode 100644 index 0000000000..0cf6ab9063 --- /dev/null +++ b/soh/assets/extractor/filelists/ntsc_12_oot.txt @@ -0,0 +1,1510 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +kanji +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_jpn_static +icon_item_nes_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +jpn_message_data_static +nes_message_data_static +staff_message_data_static +map_grand_static +map_i_static +map_48x85_static +code +n64dd +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_En_GirlA +ovl_En_Part +ovl_En_Light +ovl_En_Door +ovl_En_Box +ovl_En_Poh +ovl_En_Okuta +ovl_En_Bom +ovl_En_Wallmas +ovl_En_Dodongo +ovl_En_Firefly +ovl_En_Horse +ovl_En_Arrow +ovl_En_Elf +ovl_En_Niw +ovl_En_Tite +ovl_En_Reeba +ovl_En_Peehat +ovl_En_Holl +ovl_En_Scene_Change +ovl_En_Zf +ovl_En_Hata +ovl_Boss_Dodongo +ovl_Boss_Goma +ovl_En_Zl1 +ovl_En_Viewer +ovl_En_Goma +ovl_Bg_Pushbox +ovl_En_Bubble +ovl_Door_Shutter +ovl_En_Dodojr +ovl_En_Bdfire +ovl_En_Boom +ovl_En_Torch2 +ovl_En_Bili +ovl_En_Tp +ovl_En_St +ovl_En_Bw +ovl_En_Eiyer +ovl_En_River_Sound +ovl_En_Horse_Normal +ovl_En_Ossan +ovl_Bg_Treemouth +ovl_Bg_Dodoago +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Hrock +ovl_En_Horse_Ganon +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_En_Xc +ovl_Bg_Hidan_Curtain +ovl_Bg_Spot00_Hanebasi +ovl_En_Mb +ovl_En_Bombf +ovl_Bg_Hidan_Firewall +ovl_Bg_Dy_Yoseizo +ovl_En_Zl2 +ovl_Bg_Hidan_Fslift +ovl_En_OE2 +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Boss_Ganondrof +ovl_En_Am +ovl_En_Dekubaba +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_Bg_Ddan_Jd +ovl_Bg_Breakwall +ovl_En_Jj +ovl_En_Horse_Zelda +ovl_Bg_Ddan_Kd +ovl_Door_Warp1 +ovl_Obj_Syokudai +ovl_Item_B_Heart +ovl_En_Dekunuts +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Eye +ovl_En_Vali +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Water +ovl_Arms_Hook +ovl_En_fHG +ovl_Bg_Mori_Hineri +ovl_En_Bb +ovl_Bg_Toki_Hikari +ovl_En_Yukabyun +ovl_Bg_Toki_Swd +ovl_En_Fhg_Fire +ovl_Bg_Mjin +ovl_Bg_Hidan_Kousi +ovl_Door_Toki +ovl_Bg_Hidan_Hamstep +ovl_En_Bird +ovl_En_Wood02 +ovl_En_Lightbox +ovl_En_Pu_box +ovl_En_Trap +ovl_En_Arow_Trap +ovl_En_Vase +ovl_En_Ta +ovl_En_Tk +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_En_Vm +ovl_Demo_Effect +ovl_Demo_Kankyo +ovl_Bg_Hidan_Fwbig +ovl_En_Floormas +ovl_En_Heishi1 +ovl_En_Rd +ovl_En_Po_Sisters +ovl_Bg_Heavy_Block +ovl_Bg_Po_Event +ovl_Obj_Mure +ovl_En_Sw +ovl_Boss_Fd +ovl_Object_Kankyo +ovl_En_Du +ovl_En_Fd +ovl_En_Horse_Link_Child +ovl_Door_Ana +ovl_Bg_Spot02_Objects +ovl_Bg_Haka +ovl_Magic_Wind +ovl_Magic_Fire +ovl_En_Ru1 +ovl_Boss_Fd2 +ovl_En_Fd_Fire +ovl_En_Dh +ovl_En_Dha +ovl_En_Rl +ovl_En_Encount1 +ovl_Demo_Du +ovl_Demo_Im +ovl_Demo_Tre_Lgt +ovl_En_Fw +ovl_Bg_Vb_Sima +ovl_En_Vb_Ball +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Sgami +ovl_En_Heishi2 +ovl_En_Encount2 +ovl_En_Fire_Rock +ovl_En_Brob +ovl_Mir_Ray +ovl_Bg_Spot09_Obj +ovl_Bg_Spot18_Obj +ovl_Boss_Va +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Zou +ovl_Bg_Spot17_Funen +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Tana +ovl_En_Nb +ovl_Boss_Mo +ovl_En_Sb +ovl_En_Bigokuta +ovl_En_Karebaba +ovl_Bg_Bdan_Objects +ovl_Demo_Sa +ovl_Demo_Go +ovl_En_In +ovl_En_Tr +ovl_Bg_Spot16_Bombstone +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Bombwall +ovl_En_Ru2 +ovl_Obj_Dekujr +ovl_Bg_Mizu_Uzu +ovl_Bg_Spot06_Objects +ovl_Bg_Ice_Objects +ovl_Bg_Haka_Water +ovl_En_Ma2 +ovl_En_Bom_Chu +ovl_En_Horse_Game_Check +ovl_Boss_Tw +ovl_En_Rr +ovl_En_Ba +ovl_En_Bx +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Idomizu +ovl_Bg_Spot16_Doughnut +ovl_Bg_Bdan_Switch +ovl_En_Ma1 +ovl_Boss_Ganon +ovl_Boss_Sst +ovl_En_Ny +ovl_En_Fr +ovl_Item_Shield +ovl_Bg_Ice_Shelter +ovl_En_Ice_Hono +ovl_Item_Ocarina +ovl_Magic_Dark +ovl_Demo_6K +ovl_En_Anubice_Tag +ovl_Bg_Haka_Gate +ovl_Bg_Spot15_Saku +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Kanaami +ovl_Fishing +ovl_Obj_Oshihiki +ovl_Bg_Gate_Shutter +ovl_Eff_Dust +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Po_Syokudai +ovl_Bg_Ganon_Otyuka +ovl_Bg_Spot15_Rrbox +ovl_Bg_Umajump +ovl_En_Insect +ovl_En_Butte +ovl_En_Fish +ovl_Bg_Spot08_Iceblock +ovl_Item_Etcetera +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Obj_Kibako +ovl_Obj_Tsubo +ovl_En_Wonder_Item +ovl_En_Ik +ovl_Demo_Ik +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_G_Switch +ovl_Demo_Ext +ovl_Demo_Shd +ovl_En_Dns +ovl_Elf_Msg +ovl_En_Honotrap +ovl_En_Tubo_Trap +ovl_Obj_Ice_Poly +ovl_Bg_Spot03_Taki +ovl_Bg_Spot07_Taki +ovl_En_Fz +ovl_En_Po_Relay +ovl_Bg_Relay_Objects +ovl_En_Diving_Game +ovl_En_Kusa +ovl_Obj_Bean +ovl_Obj_Bombiwa +ovl_Obj_Switch +ovl_Obj_Elevator +ovl_Obj_Lift +ovl_Obj_Hsblock +ovl_En_Okarina_Tag +ovl_En_Yabusame_Mark +ovl_En_Goroiwa +ovl_En_Ex_Ruppy +ovl_En_Toryo +ovl_En_Daiku +ovl_En_Nwc +ovl_En_Blkobj +ovl_Item_Inbox +ovl_En_Ge1 +ovl_Obj_Blockstop +ovl_En_Sda +ovl_En_Clear_Tag +ovl_En_Niw_Lady +ovl_En_Gm +ovl_En_Ms +ovl_En_Hs +ovl_Bg_Ingate +ovl_En_Kanban +ovl_En_Heishi3 +ovl_En_Syateki_Niw +ovl_En_Attack_Niw +ovl_Bg_Spot01_Idosoko +ovl_En_Sa +ovl_En_Wonder_Talk +ovl_Bg_Gjyo_Bridge +ovl_En_Ds +ovl_En_Mk +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Owl +ovl_En_Ishi +ovl_Obj_Hana +ovl_Obj_Lightswitch +ovl_Obj_Mure2 +ovl_En_Go +ovl_En_Fu +ovl_En_Changer +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bombiwa +ovl_Bg_Spot18_Basket +ovl_En_Ganon_Organ +ovl_En_Siofuki +ovl_En_Stream +ovl_En_Mm +ovl_En_Ko +ovl_En_Kz +ovl_En_Weather_Tag +ovl_Bg_Sst_Floor +ovl_En_Ani +ovl_En_Ex_Item +ovl_Bg_Jya_Ironobj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Cs +ovl_En_Md +ovl_En_Hy +ovl_En_Ganon_Mant +ovl_En_Okarina_Effect +ovl_En_Mag +ovl_Door_Gerudo +ovl_Elf_Msg2 +ovl_Demo_Gt +ovl_En_Po_Field +ovl_Efc_Erupc +ovl_Bg_Zg +ovl_En_Heishi4 +ovl_En_Zl3 +ovl_Boss_Ganon2 +ovl_En_Kakasi +ovl_En_Takara_Man +ovl_Obj_Makeoshihiki +ovl_Oceff_Spot +ovl_End_Title +ovl_En_Torch +ovl_Demo_Ec +ovl_Shot_Sun +ovl_En_Dy_Extra +ovl_En_Wonder_Talk2 +ovl_En_Ge2 +ovl_Obj_Roomtimer +ovl_En_Ssh +ovl_En_Sth +ovl_Oceff_Wipe +ovl_Effect_Ss_Dust +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Blast +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_Stone1 +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Oceff_Storm +ovl_En_Weiyer +ovl_Bg_Spot05_Soko +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Haheniron +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_En_Hintnuts +ovl_En_Nutsball +ovl_Bg_Spot00_Break +ovl_En_Shopnuts +ovl_En_It +ovl_En_GeldB +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_En_Niw_Girl +ovl_En_Dog +ovl_En_Si +ovl_Bg_Spot01_Objects2 +ovl_Obj_Comb +ovl_Bg_Spot11_Bakudankabe +ovl_Obj_Kibako2 +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Guest +ovl_Bg_Bom_Guard +ovl_En_Hs2 +ovl_Demo_Kekkai +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot17_Bakudankabe +ovl_Obj_Mure3 +ovl_En_Tg +ovl_En_Mu +ovl_En_Go2 +ovl_En_Wf +ovl_En_Skb +ovl_Demo_Gj +ovl_Demo_Geff +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Iceblock +ovl_Bg_Ydan_Sp +ovl_En_Gb +ovl_En_Gs +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Shutter +ovl_En_Daiku_Kakariko +ovl_Bg_Bowl_Wall +ovl_En_Wall_Tubo +ovl_En_Po_Desert +ovl_En_Crow +ovl_Door_Killer +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Shutter +ovl_En_Ma3 +ovl_En_Cow +ovl_Bg_Ice_Turara +ovl_Bg_Ice_Shutter +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_Oceff_Wipe4 +ovl_En_Eg +ovl_Bg_Menkuri_Nisekabe +ovl_En_Zo +ovl_Effect_Ss_Ice_Smoke +ovl_Obj_Makekinsuta +ovl_En_Ge3 +ovl_Obj_Timeblock +ovl_Obj_Hamishi +ovl_En_Zl4 +ovl_En_Mm2 +ovl_Bg_Jya_Block +ovl_Obj_Warp2block +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static diff --git a/soh/assets/extractor/filelists/ntsc_oot.txt b/soh/assets/extractor/filelists/ntsc_oot.txt new file mode 100644 index 0000000000..21cebcbf2e --- /dev/null +++ b/soh/assets/extractor/filelists/ntsc_oot.txt @@ -0,0 +1,1510 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +kanji +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_jpn_static +icon_item_nes_static +item_name_static +map_name_static +do_action_static +message_static +jpn_message_data_static +message_texture_static +nes_font_static +nes_message_data_static +staff_message_data_static +map_grand_static +map_i_static +map_48x85_static +code +n64dd +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_En_GirlA +ovl_En_Part +ovl_En_Light +ovl_En_Door +ovl_En_Box +ovl_En_Poh +ovl_En_Okuta +ovl_En_Bom +ovl_En_Wallmas +ovl_En_Dodongo +ovl_En_Firefly +ovl_En_Horse +ovl_En_Arrow +ovl_En_Elf +ovl_En_Niw +ovl_En_Tite +ovl_En_Reeba +ovl_En_Peehat +ovl_En_Holl +ovl_En_Scene_Change +ovl_En_Zf +ovl_En_Hata +ovl_Boss_Dodongo +ovl_Boss_Goma +ovl_En_Zl1 +ovl_En_Viewer +ovl_En_Goma +ovl_Bg_Pushbox +ovl_En_Bubble +ovl_Door_Shutter +ovl_En_Dodojr +ovl_En_Bdfire +ovl_En_Boom +ovl_En_Torch2 +ovl_En_Bili +ovl_En_Tp +ovl_En_St +ovl_En_Bw +ovl_En_Eiyer +ovl_En_River_Sound +ovl_En_Horse_Normal +ovl_En_Ossan +ovl_Bg_Treemouth +ovl_Bg_Dodoago +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Hrock +ovl_En_Horse_Ganon +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_En_Xc +ovl_Bg_Hidan_Curtain +ovl_Bg_Spot00_Hanebasi +ovl_En_Mb +ovl_En_Bombf +ovl_Bg_Hidan_Firewall +ovl_Bg_Dy_Yoseizo +ovl_En_Zl2 +ovl_Bg_Hidan_Fslift +ovl_En_OE2 +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Boss_Ganondrof +ovl_En_Am +ovl_En_Dekubaba +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_Bg_Ddan_Jd +ovl_Bg_Breakwall +ovl_En_Jj +ovl_En_Horse_Zelda +ovl_Bg_Ddan_Kd +ovl_Door_Warp1 +ovl_Obj_Syokudai +ovl_Item_B_Heart +ovl_En_Dekunuts +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Eye +ovl_En_Vali +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Water +ovl_Arms_Hook +ovl_En_fHG +ovl_Bg_Mori_Hineri +ovl_En_Bb +ovl_Bg_Toki_Hikari +ovl_En_Yukabyun +ovl_Bg_Toki_Swd +ovl_En_Fhg_Fire +ovl_Bg_Mjin +ovl_Bg_Hidan_Kousi +ovl_Door_Toki +ovl_Bg_Hidan_Hamstep +ovl_En_Bird +ovl_En_Wood02 +ovl_En_Lightbox +ovl_En_Pu_box +ovl_En_Trap +ovl_En_Arow_Trap +ovl_En_Vase +ovl_En_Ta +ovl_En_Tk +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_En_Vm +ovl_Demo_Effect +ovl_Demo_Kankyo +ovl_Bg_Hidan_Fwbig +ovl_En_Floormas +ovl_En_Heishi1 +ovl_En_Rd +ovl_En_Po_Sisters +ovl_Bg_Heavy_Block +ovl_Bg_Po_Event +ovl_Obj_Mure +ovl_En_Sw +ovl_Boss_Fd +ovl_Object_Kankyo +ovl_En_Du +ovl_En_Fd +ovl_En_Horse_Link_Child +ovl_Door_Ana +ovl_Bg_Spot02_Objects +ovl_Bg_Haka +ovl_Magic_Wind +ovl_Magic_Fire +ovl_En_Ru1 +ovl_Boss_Fd2 +ovl_En_Fd_Fire +ovl_En_Dh +ovl_En_Dha +ovl_En_Rl +ovl_En_Encount1 +ovl_Demo_Du +ovl_Demo_Im +ovl_Demo_Tre_Lgt +ovl_En_Fw +ovl_Bg_Vb_Sima +ovl_En_Vb_Ball +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Sgami +ovl_En_Heishi2 +ovl_En_Encount2 +ovl_En_Fire_Rock +ovl_En_Brob +ovl_Mir_Ray +ovl_Bg_Spot09_Obj +ovl_Bg_Spot18_Obj +ovl_Boss_Va +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Zou +ovl_Bg_Spot17_Funen +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Tana +ovl_En_Nb +ovl_Boss_Mo +ovl_En_Sb +ovl_En_Bigokuta +ovl_En_Karebaba +ovl_Bg_Bdan_Objects +ovl_Demo_Sa +ovl_Demo_Go +ovl_En_In +ovl_En_Tr +ovl_Bg_Spot16_Bombstone +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Bombwall +ovl_En_Ru2 +ovl_Obj_Dekujr +ovl_Bg_Mizu_Uzu +ovl_Bg_Spot06_Objects +ovl_Bg_Ice_Objects +ovl_Bg_Haka_Water +ovl_En_Ma2 +ovl_En_Bom_Chu +ovl_En_Horse_Game_Check +ovl_Boss_Tw +ovl_En_Rr +ovl_En_Ba +ovl_En_Bx +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Idomizu +ovl_Bg_Spot16_Doughnut +ovl_Bg_Bdan_Switch +ovl_En_Ma1 +ovl_Boss_Ganon +ovl_Boss_Sst +ovl_En_Ny +ovl_En_Fr +ovl_Item_Shield +ovl_Bg_Ice_Shelter +ovl_En_Ice_Hono +ovl_Item_Ocarina +ovl_Magic_Dark +ovl_Demo_6K +ovl_En_Anubice_Tag +ovl_Bg_Haka_Gate +ovl_Bg_Spot15_Saku +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Kanaami +ovl_Fishing +ovl_Obj_Oshihiki +ovl_Bg_Gate_Shutter +ovl_Eff_Dust +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Po_Syokudai +ovl_Bg_Ganon_Otyuka +ovl_Bg_Spot15_Rrbox +ovl_Bg_Umajump +ovl_En_Insect +ovl_En_Butte +ovl_En_Fish +ovl_Bg_Spot08_Iceblock +ovl_Item_Etcetera +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Obj_Kibako +ovl_Obj_Tsubo +ovl_En_Wonder_Item +ovl_En_Ik +ovl_Demo_Ik +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_G_Switch +ovl_Demo_Ext +ovl_Demo_Shd +ovl_En_Dns +ovl_Elf_Msg +ovl_En_Honotrap +ovl_En_Tubo_Trap +ovl_Obj_Ice_Poly +ovl_Bg_Spot03_Taki +ovl_Bg_Spot07_Taki +ovl_En_Fz +ovl_En_Po_Relay +ovl_Bg_Relay_Objects +ovl_En_Diving_Game +ovl_En_Kusa +ovl_Obj_Bean +ovl_Obj_Bombiwa +ovl_Obj_Switch +ovl_Obj_Elevator +ovl_Obj_Lift +ovl_Obj_Hsblock +ovl_En_Okarina_Tag +ovl_En_Yabusame_Mark +ovl_En_Goroiwa +ovl_En_Ex_Ruppy +ovl_En_Toryo +ovl_En_Daiku +ovl_En_Nwc +ovl_En_Blkobj +ovl_Item_Inbox +ovl_En_Ge1 +ovl_Obj_Blockstop +ovl_En_Sda +ovl_En_Clear_Tag +ovl_En_Niw_Lady +ovl_En_Gm +ovl_En_Ms +ovl_En_Hs +ovl_Bg_Ingate +ovl_En_Kanban +ovl_En_Heishi3 +ovl_En_Syateki_Niw +ovl_En_Attack_Niw +ovl_Bg_Spot01_Idosoko +ovl_En_Sa +ovl_En_Wonder_Talk +ovl_Bg_Gjyo_Bridge +ovl_En_Ds +ovl_En_Mk +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Owl +ovl_En_Ishi +ovl_Obj_Hana +ovl_Obj_Lightswitch +ovl_Obj_Mure2 +ovl_En_Go +ovl_En_Fu +ovl_En_Changer +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bombiwa +ovl_Bg_Spot18_Basket +ovl_En_Ganon_Organ +ovl_En_Siofuki +ovl_En_Stream +ovl_En_Mm +ovl_En_Ko +ovl_En_Kz +ovl_En_Weather_Tag +ovl_Bg_Sst_Floor +ovl_En_Ani +ovl_En_Ex_Item +ovl_Bg_Jya_Ironobj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Cs +ovl_En_Md +ovl_En_Hy +ovl_En_Ganon_Mant +ovl_En_Okarina_Effect +ovl_En_Mag +ovl_Door_Gerudo +ovl_Elf_Msg2 +ovl_Demo_Gt +ovl_En_Po_Field +ovl_Efc_Erupc +ovl_Bg_Zg +ovl_En_Heishi4 +ovl_En_Zl3 +ovl_Boss_Ganon2 +ovl_En_Kakasi +ovl_En_Takara_Man +ovl_Obj_Makeoshihiki +ovl_Oceff_Spot +ovl_End_Title +ovl_En_Torch +ovl_Demo_Ec +ovl_Shot_Sun +ovl_En_Dy_Extra +ovl_En_Wonder_Talk2 +ovl_En_Ge2 +ovl_Obj_Roomtimer +ovl_En_Ssh +ovl_En_Sth +ovl_Oceff_Wipe +ovl_Effect_Ss_Dust +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Blast +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_Stone1 +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Oceff_Storm +ovl_En_Weiyer +ovl_Bg_Spot05_Soko +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Haheniron +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_En_Hintnuts +ovl_En_Nutsball +ovl_Bg_Spot00_Break +ovl_En_Shopnuts +ovl_En_It +ovl_En_GeldB +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_En_Niw_Girl +ovl_En_Dog +ovl_En_Si +ovl_Bg_Spot01_Objects2 +ovl_Obj_Comb +ovl_Bg_Spot11_Bakudankabe +ovl_Obj_Kibako2 +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Guest +ovl_Bg_Bom_Guard +ovl_En_Hs2 +ovl_Demo_Kekkai +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot17_Bakudankabe +ovl_Obj_Mure3 +ovl_En_Tg +ovl_En_Mu +ovl_En_Go2 +ovl_En_Wf +ovl_En_Skb +ovl_Demo_Gj +ovl_Demo_Geff +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Iceblock +ovl_Bg_Ydan_Sp +ovl_En_Gb +ovl_En_Gs +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Shutter +ovl_En_Daiku_Kakariko +ovl_Bg_Bowl_Wall +ovl_En_Wall_Tubo +ovl_En_Po_Desert +ovl_En_Crow +ovl_Door_Killer +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Shutter +ovl_En_Ma3 +ovl_En_Cow +ovl_Bg_Ice_Turara +ovl_Bg_Ice_Shutter +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_Oceff_Wipe4 +ovl_En_Eg +ovl_Bg_Menkuri_Nisekabe +ovl_En_Zo +ovl_Effect_Ss_Ice_Smoke +ovl_Obj_Makekinsuta +ovl_En_Ge3 +ovl_Obj_Timeblock +ovl_Obj_Hamishi +ovl_En_Zl4 +ovl_En_Mm2 +ovl_Bg_Jya_Block +ovl_Obj_Warp2block +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static diff --git a/soh/assets/extractor/filelists/pal_oot.txt b/soh/assets/extractor/filelists/pal_oot.txt new file mode 100644 index 0000000000..812d3ebdd7 --- /dev/null +++ b/soh/assets/extractor/filelists/pal_oot.txt @@ -0,0 +1,1511 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_nes_static +icon_item_ger_static +icon_item_fra_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +nes_message_data_static +ger_message_data_static +fra_message_data_static +staff_message_data_static +map_grand_static +map_i_static +map_48x85_static +code +n64dd +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_En_GirlA +ovl_En_Part +ovl_En_Light +ovl_En_Door +ovl_En_Box +ovl_En_Poh +ovl_En_Okuta +ovl_En_Bom +ovl_En_Wallmas +ovl_En_Dodongo +ovl_En_Firefly +ovl_En_Horse +ovl_En_Arrow +ovl_En_Elf +ovl_En_Niw +ovl_En_Tite +ovl_En_Reeba +ovl_En_Peehat +ovl_En_Holl +ovl_En_Scene_Change +ovl_En_Zf +ovl_En_Hata +ovl_Boss_Dodongo +ovl_Boss_Goma +ovl_En_Zl1 +ovl_En_Viewer +ovl_En_Goma +ovl_Bg_Pushbox +ovl_En_Bubble +ovl_Door_Shutter +ovl_En_Dodojr +ovl_En_Bdfire +ovl_En_Boom +ovl_En_Torch2 +ovl_En_Bili +ovl_En_Tp +ovl_En_St +ovl_En_Bw +ovl_En_Eiyer +ovl_En_River_Sound +ovl_En_Horse_Normal +ovl_En_Ossan +ovl_Bg_Treemouth +ovl_Bg_Dodoago +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Hrock +ovl_En_Horse_Ganon +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_En_Xc +ovl_Bg_Hidan_Curtain +ovl_Bg_Spot00_Hanebasi +ovl_En_Mb +ovl_En_Bombf +ovl_Bg_Hidan_Firewall +ovl_Bg_Dy_Yoseizo +ovl_En_Zl2 +ovl_Bg_Hidan_Fslift +ovl_En_OE2 +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Boss_Ganondrof +ovl_En_Am +ovl_En_Dekubaba +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_Bg_Ddan_Jd +ovl_Bg_Breakwall +ovl_En_Jj +ovl_En_Horse_Zelda +ovl_Bg_Ddan_Kd +ovl_Door_Warp1 +ovl_Obj_Syokudai +ovl_Item_B_Heart +ovl_En_Dekunuts +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Eye +ovl_En_Vali +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Water +ovl_Arms_Hook +ovl_En_fHG +ovl_Bg_Mori_Hineri +ovl_En_Bb +ovl_Bg_Toki_Hikari +ovl_En_Yukabyun +ovl_Bg_Toki_Swd +ovl_En_Fhg_Fire +ovl_Bg_Mjin +ovl_Bg_Hidan_Kousi +ovl_Door_Toki +ovl_Bg_Hidan_Hamstep +ovl_En_Bird +ovl_En_Wood02 +ovl_En_Lightbox +ovl_En_Pu_box +ovl_En_Trap +ovl_En_Arow_Trap +ovl_En_Vase +ovl_En_Ta +ovl_En_Tk +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_En_Vm +ovl_Demo_Effect +ovl_Demo_Kankyo +ovl_Bg_Hidan_Fwbig +ovl_En_Floormas +ovl_En_Heishi1 +ovl_En_Rd +ovl_En_Po_Sisters +ovl_Bg_Heavy_Block +ovl_Bg_Po_Event +ovl_Obj_Mure +ovl_En_Sw +ovl_Boss_Fd +ovl_Object_Kankyo +ovl_En_Du +ovl_En_Fd +ovl_En_Horse_Link_Child +ovl_Door_Ana +ovl_Bg_Spot02_Objects +ovl_Bg_Haka +ovl_Magic_Wind +ovl_Magic_Fire +ovl_En_Ru1 +ovl_Boss_Fd2 +ovl_En_Fd_Fire +ovl_En_Dh +ovl_En_Dha +ovl_En_Rl +ovl_En_Encount1 +ovl_Demo_Du +ovl_Demo_Im +ovl_Demo_Tre_Lgt +ovl_En_Fw +ovl_Bg_Vb_Sima +ovl_En_Vb_Ball +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Sgami +ovl_En_Heishi2 +ovl_En_Encount2 +ovl_En_Fire_Rock +ovl_En_Brob +ovl_Mir_Ray +ovl_Bg_Spot09_Obj +ovl_Bg_Spot18_Obj +ovl_Boss_Va +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Zou +ovl_Bg_Spot17_Funen +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Tana +ovl_En_Nb +ovl_Boss_Mo +ovl_En_Sb +ovl_En_Bigokuta +ovl_En_Karebaba +ovl_Bg_Bdan_Objects +ovl_Demo_Sa +ovl_Demo_Go +ovl_En_In +ovl_En_Tr +ovl_Bg_Spot16_Bombstone +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Bombwall +ovl_En_Ru2 +ovl_Obj_Dekujr +ovl_Bg_Mizu_Uzu +ovl_Bg_Spot06_Objects +ovl_Bg_Ice_Objects +ovl_Bg_Haka_Water +ovl_En_Ma2 +ovl_En_Bom_Chu +ovl_En_Horse_Game_Check +ovl_Boss_Tw +ovl_En_Rr +ovl_En_Ba +ovl_En_Bx +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Idomizu +ovl_Bg_Spot16_Doughnut +ovl_Bg_Bdan_Switch +ovl_En_Ma1 +ovl_Boss_Ganon +ovl_Boss_Sst +ovl_En_Ny +ovl_En_Fr +ovl_Item_Shield +ovl_Bg_Ice_Shelter +ovl_En_Ice_Hono +ovl_Item_Ocarina +ovl_Magic_Dark +ovl_Demo_6K +ovl_En_Anubice_Tag +ovl_Bg_Haka_Gate +ovl_Bg_Spot15_Saku +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Kanaami +ovl_Fishing +ovl_Obj_Oshihiki +ovl_Bg_Gate_Shutter +ovl_Eff_Dust +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Po_Syokudai +ovl_Bg_Ganon_Otyuka +ovl_Bg_Spot15_Rrbox +ovl_Bg_Umajump +ovl_En_Insect +ovl_En_Butte +ovl_En_Fish +ovl_Bg_Spot08_Iceblock +ovl_Item_Etcetera +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Obj_Kibako +ovl_Obj_Tsubo +ovl_En_Wonder_Item +ovl_En_Ik +ovl_Demo_Ik +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_G_Switch +ovl_Demo_Ext +ovl_Demo_Shd +ovl_En_Dns +ovl_Elf_Msg +ovl_En_Honotrap +ovl_En_Tubo_Trap +ovl_Obj_Ice_Poly +ovl_Bg_Spot03_Taki +ovl_Bg_Spot07_Taki +ovl_En_Fz +ovl_En_Po_Relay +ovl_Bg_Relay_Objects +ovl_En_Diving_Game +ovl_En_Kusa +ovl_Obj_Bean +ovl_Obj_Bombiwa +ovl_Obj_Switch +ovl_Obj_Elevator +ovl_Obj_Lift +ovl_Obj_Hsblock +ovl_En_Okarina_Tag +ovl_En_Yabusame_Mark +ovl_En_Goroiwa +ovl_En_Ex_Ruppy +ovl_En_Toryo +ovl_En_Daiku +ovl_En_Nwc +ovl_En_Blkobj +ovl_Item_Inbox +ovl_En_Ge1 +ovl_Obj_Blockstop +ovl_En_Sda +ovl_En_Clear_Tag +ovl_En_Niw_Lady +ovl_En_Gm +ovl_En_Ms +ovl_En_Hs +ovl_Bg_Ingate +ovl_En_Kanban +ovl_En_Heishi3 +ovl_En_Syateki_Niw +ovl_En_Attack_Niw +ovl_Bg_Spot01_Idosoko +ovl_En_Sa +ovl_En_Wonder_Talk +ovl_Bg_Gjyo_Bridge +ovl_En_Ds +ovl_En_Mk +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Owl +ovl_En_Ishi +ovl_Obj_Hana +ovl_Obj_Lightswitch +ovl_Obj_Mure2 +ovl_En_Go +ovl_En_Fu +ovl_En_Changer +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bombiwa +ovl_Bg_Spot18_Basket +ovl_En_Ganon_Organ +ovl_En_Siofuki +ovl_En_Stream +ovl_En_Mm +ovl_En_Ko +ovl_En_Kz +ovl_En_Weather_Tag +ovl_Bg_Sst_Floor +ovl_En_Ani +ovl_En_Ex_Item +ovl_Bg_Jya_Ironobj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Cs +ovl_En_Md +ovl_En_Hy +ovl_En_Ganon_Mant +ovl_En_Okarina_Effect +ovl_En_Mag +ovl_Door_Gerudo +ovl_Elf_Msg2 +ovl_Demo_Gt +ovl_En_Po_Field +ovl_Efc_Erupc +ovl_Bg_Zg +ovl_En_Heishi4 +ovl_En_Zl3 +ovl_Boss_Ganon2 +ovl_En_Kakasi +ovl_En_Takara_Man +ovl_Obj_Makeoshihiki +ovl_Oceff_Spot +ovl_End_Title +ovl_En_Torch +ovl_Demo_Ec +ovl_Shot_Sun +ovl_En_Dy_Extra +ovl_En_Wonder_Talk2 +ovl_En_Ge2 +ovl_Obj_Roomtimer +ovl_En_Ssh +ovl_En_Sth +ovl_Oceff_Wipe +ovl_Effect_Ss_Dust +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Blast +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_Stone1 +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Oceff_Storm +ovl_En_Weiyer +ovl_Bg_Spot05_Soko +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Haheniron +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_En_Hintnuts +ovl_En_Nutsball +ovl_Bg_Spot00_Break +ovl_En_Shopnuts +ovl_En_It +ovl_En_GeldB +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_En_Niw_Girl +ovl_En_Dog +ovl_En_Si +ovl_Bg_Spot01_Objects2 +ovl_Obj_Comb +ovl_Bg_Spot11_Bakudankabe +ovl_Obj_Kibako2 +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Guest +ovl_Bg_Bom_Guard +ovl_En_Hs2 +ovl_Demo_Kekkai +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot17_Bakudankabe +ovl_Obj_Mure3 +ovl_En_Tg +ovl_En_Mu +ovl_En_Go2 +ovl_En_Wf +ovl_En_Skb +ovl_Demo_Gj +ovl_Demo_Geff +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Iceblock +ovl_Bg_Ydan_Sp +ovl_En_Gb +ovl_En_Gs +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Shutter +ovl_En_Daiku_Kakariko +ovl_Bg_Bowl_Wall +ovl_En_Wall_Tubo +ovl_En_Po_Desert +ovl_En_Crow +ovl_Door_Killer +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Shutter +ovl_En_Ma3 +ovl_En_Cow +ovl_Bg_Ice_Turara +ovl_Bg_Ice_Shutter +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_Oceff_Wipe4 +ovl_En_Eg +ovl_Bg_Menkuri_Nisekabe +ovl_En_Zo +ovl_Effect_Ss_Ice_Smoke +ovl_Obj_Makekinsuta +ovl_En_Ge3 +ovl_Obj_Timeblock +ovl_Obj_Hamishi +ovl_En_Zl4 +ovl_En_Mm2 +ovl_Bg_Jya_Block +ovl_Obj_Warp2block +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/soh/assets/extractor/symbols/ActorList_OoTMqDbg.txt b/soh/assets/extractor/symbols/ActorList_OoTMqDbg.txt new file mode 100644 index 0000000000..a0395eb277 --- /dev/null +++ b/soh/assets/extractor/symbols/ActorList_OoTMqDbg.txt @@ -0,0 +1,472 @@ +ACTOR_PLAYER +ACTOR_UNSET_1 +ACTOR_EN_TEST +ACTOR_UNSET_3 +ACTOR_EN_GIRLA +ACTOR_UNSET_5 +ACTOR_UNSET_6 +ACTOR_EN_PART +ACTOR_EN_LIGHT +ACTOR_EN_DOOR +ACTOR_EN_BOX +ACTOR_BG_DY_YOSEIZO +ACTOR_BG_HIDAN_FIREWALL +ACTOR_EN_POH +ACTOR_EN_OKUTA +ACTOR_BG_YDAN_SP +ACTOR_EN_BOM +ACTOR_EN_WALLMAS +ACTOR_EN_DODONGO +ACTOR_EN_FIREFLY +ACTOR_EN_HORSE +ACTOR_EN_ITEM00 +ACTOR_EN_ARROW +ACTOR_UNSET_17 +ACTOR_EN_ELF +ACTOR_EN_NIW +ACTOR_UNSET_1A +ACTOR_EN_TITE +ACTOR_EN_REEBA +ACTOR_EN_PEEHAT +ACTOR_EN_BUTTE +ACTOR_UNSET_1F +ACTOR_EN_INSECT +ACTOR_EN_FISH +ACTOR_UNSET_22 +ACTOR_EN_HOLL +ACTOR_EN_SCENE_CHANGE +ACTOR_EN_ZF +ACTOR_EN_HATA +ACTOR_BOSS_DODONGO +ACTOR_BOSS_GOMA +ACTOR_EN_ZL1 +ACTOR_EN_VIEWER +ACTOR_EN_GOMA +ACTOR_BG_PUSHBOX +ACTOR_EN_BUBBLE +ACTOR_DOOR_SHUTTER +ACTOR_EN_DODOJR +ACTOR_EN_BDFIRE +ACTOR_UNSET_31 +ACTOR_EN_BOOM +ACTOR_EN_TORCH2 +ACTOR_EN_BILI +ACTOR_EN_TP +ACTOR_UNSET_36 +ACTOR_EN_ST +ACTOR_EN_BW +ACTOR_EN_A_OBJ +ACTOR_EN_EIYER +ACTOR_EN_RIVER_SOUND +ACTOR_EN_HORSE_NORMAL +ACTOR_EN_OSSAN +ACTOR_BG_TREEMOUTH +ACTOR_BG_DODOAGO +ACTOR_BG_HIDAN_DALM +ACTOR_BG_HIDAN_HROCK +ACTOR_EN_HORSE_GANON +ACTOR_BG_HIDAN_ROCK +ACTOR_BG_HIDAN_RSEKIZOU +ACTOR_BG_HIDAN_SEKIZOU +ACTOR_BG_HIDAN_SIMA +ACTOR_BG_HIDAN_SYOKU +ACTOR_EN_XC +ACTOR_BG_HIDAN_CURTAIN +ACTOR_BG_SPOT00_HANEBASI +ACTOR_EN_MB +ACTOR_EN_BOMBF +ACTOR_EN_ZL2 +ACTOR_BG_HIDAN_FSLIFT +ACTOR_EN_OE2 +ACTOR_BG_YDAN_HASI +ACTOR_BG_YDAN_MARUTA +ACTOR_BOSS_GANONDROF +ACTOR_UNSET_53 +ACTOR_EN_AM +ACTOR_EN_DEKUBABA +ACTOR_EN_M_FIRE1 +ACTOR_EN_M_THUNDER +ACTOR_BG_DDAN_JD +ACTOR_BG_BREAKWALL +ACTOR_EN_JJ +ACTOR_EN_HORSE_ZELDA +ACTOR_BG_DDAN_KD +ACTOR_DOOR_WARP1 +ACTOR_OBJ_SYOKUDAI +ACTOR_ITEM_B_HEART +ACTOR_EN_DEKUNUTS +ACTOR_BG_MENKURI_KAITEN +ACTOR_BG_MENKURI_EYE +ACTOR_EN_VALI +ACTOR_BG_MIZU_MOVEBG +ACTOR_BG_MIZU_WATER +ACTOR_ARMS_HOOK +ACTOR_EN_FHG +ACTOR_BG_MORI_HINERI +ACTOR_EN_BB +ACTOR_BG_TOKI_HIKARI +ACTOR_EN_YUKABYUN +ACTOR_BG_TOKI_SWD +ACTOR_EN_FHG_FIRE +ACTOR_BG_MJIN +ACTOR_BG_HIDAN_KOUSI +ACTOR_DOOR_TOKI +ACTOR_BG_HIDAN_HAMSTEP +ACTOR_EN_BIRD +ACTOR_UNSET_73 +ACTOR_UNSET_74 +ACTOR_UNSET_75 +ACTOR_UNSET_76 +ACTOR_EN_WOOD02 +ACTOR_UNSET_78 +ACTOR_UNSET_79 +ACTOR_UNSET_7A +ACTOR_UNSET_7B +ACTOR_EN_LIGHTBOX +ACTOR_EN_PU_BOX +ACTOR_UNSET_7E +ACTOR_UNSET_7F +ACTOR_EN_TRAP +ACTOR_EN_AROW_TRAP +ACTOR_EN_VASE +ACTOR_UNSET_83 +ACTOR_EN_TA +ACTOR_EN_TK +ACTOR_BG_MORI_BIGST +ACTOR_BG_MORI_ELEVATOR +ACTOR_BG_MORI_KAITENKABE +ACTOR_BG_MORI_RAKKATENJO +ACTOR_EN_VM +ACTOR_DEMO_EFFECT +ACTOR_DEMO_KANKYO +ACTOR_BG_HIDAN_FWBIG +ACTOR_EN_FLOORMAS +ACTOR_EN_HEISHI1 +ACTOR_EN_RD +ACTOR_EN_PO_SISTERS +ACTOR_BG_HEAVY_BLOCK +ACTOR_BG_PO_EVENT +ACTOR_OBJ_MURE +ACTOR_EN_SW +ACTOR_BOSS_FD +ACTOR_OBJECT_KANKYO +ACTOR_EN_DU +ACTOR_EN_FD +ACTOR_EN_HORSE_LINK_CHILD +ACTOR_DOOR_ANA +ACTOR_BG_SPOT02_OBJECTS +ACTOR_BG_HAKA +ACTOR_MAGIC_WIND +ACTOR_MAGIC_FIRE +ACTOR_UNSET_A0 +ACTOR_EN_RU1 +ACTOR_BOSS_FD2 +ACTOR_EN_FD_FIRE +ACTOR_EN_DH +ACTOR_EN_DHA +ACTOR_EN_RL +ACTOR_EN_ENCOUNT1 +ACTOR_DEMO_DU +ACTOR_DEMO_IM +ACTOR_DEMO_TRE_LGT +ACTOR_EN_FW +ACTOR_BG_VB_SIMA +ACTOR_EN_VB_BALL +ACTOR_BG_HAKA_MEGANE +ACTOR_BG_HAKA_MEGANEBG +ACTOR_BG_HAKA_SHIP +ACTOR_BG_HAKA_SGAMI +ACTOR_UNSET_B2 +ACTOR_EN_HEISHI2 +ACTOR_EN_ENCOUNT2 +ACTOR_EN_FIRE_ROCK +ACTOR_EN_BROB +ACTOR_MIR_RAY +ACTOR_BG_SPOT09_OBJ +ACTOR_BG_SPOT18_OBJ +ACTOR_BOSS_VA +ACTOR_BG_HAKA_TUBO +ACTOR_BG_HAKA_TRAP +ACTOR_BG_HAKA_HUTA +ACTOR_BG_HAKA_ZOU +ACTOR_BG_SPOT17_FUNEN +ACTOR_EN_SYATEKI_ITM +ACTOR_EN_SYATEKI_MAN +ACTOR_EN_TANA +ACTOR_EN_NB +ACTOR_BOSS_MO +ACTOR_EN_SB +ACTOR_EN_BIGOKUTA +ACTOR_EN_KAREBABA +ACTOR_BG_BDAN_OBJECTS +ACTOR_DEMO_SA +ACTOR_DEMO_GO +ACTOR_EN_IN +ACTOR_EN_TR +ACTOR_BG_SPOT16_BOMBSTONE +ACTOR_UNSET_CE +ACTOR_BG_HIDAN_KOWARERUKABE +ACTOR_BG_BOMBWALL +ACTOR_BG_SPOT08_ICEBLOCK +ACTOR_EN_RU2 +ACTOR_OBJ_DEKUJR +ACTOR_BG_MIZU_UZU +ACTOR_BG_SPOT06_OBJECTS +ACTOR_BG_ICE_OBJECTS +ACTOR_BG_HAKA_WATER +ACTOR_UNSET_D8 +ACTOR_EN_MA2 +ACTOR_EN_BOM_CHU +ACTOR_EN_HORSE_GAME_CHECK +ACTOR_BOSS_TW +ACTOR_EN_RR +ACTOR_EN_BA +ACTOR_EN_BX +ACTOR_EN_ANUBICE +ACTOR_EN_ANUBICE_FIRE +ACTOR_BG_MORI_HASHIGO +ACTOR_BG_MORI_HASHIRA4 +ACTOR_BG_MORI_IDOMIZU +ACTOR_BG_SPOT16_DOUGHNUT +ACTOR_BG_BDAN_SWITCH +ACTOR_EN_MA1 +ACTOR_BOSS_GANON +ACTOR_BOSS_SST +ACTOR_UNSET_EA +ACTOR_UNSET_EB +ACTOR_EN_NY +ACTOR_EN_FR +ACTOR_ITEM_SHIELD +ACTOR_BG_ICE_SHELTER +ACTOR_EN_ICE_HONO +ACTOR_ITEM_OCARINA +ACTOR_UNSET_F2 +ACTOR_UNSET_F3 +ACTOR_MAGIC_DARK +ACTOR_DEMO_6K +ACTOR_EN_ANUBICE_TAG +ACTOR_BG_HAKA_GATE +ACTOR_BG_SPOT15_SAKU +ACTOR_BG_JYA_GOROIWA +ACTOR_BG_JYA_ZURERUKABE +ACTOR_UNSET_FB +ACTOR_BG_JYA_COBRA +ACTOR_BG_JYA_KANAAMI +ACTOR_FISHING +ACTOR_OBJ_OSHIHIKI +ACTOR_BG_GATE_SHUTTER +ACTOR_EFF_DUST +ACTOR_BG_SPOT01_FUSYA +ACTOR_BG_SPOT01_IDOHASHIRA +ACTOR_BG_SPOT01_IDOMIZU +ACTOR_BG_PO_SYOKUDAI +ACTOR_BG_GANON_OTYUKA +ACTOR_BG_SPOT15_RRBOX +ACTOR_BG_UMAJUMP +ACTOR_UNSET_109 +ACTOR_ARROW_FIRE +ACTOR_ARROW_ICE +ACTOR_ARROW_LIGHT +ACTOR_UNSET_10D +ACTOR_UNSET_10E +ACTOR_ITEM_ETCETERA +ACTOR_OBJ_KIBAKO +ACTOR_OBJ_TSUBO +ACTOR_EN_WONDER_ITEM +ACTOR_EN_IK +ACTOR_DEMO_IK +ACTOR_EN_SKJ +ACTOR_EN_SKJNEEDLE +ACTOR_EN_G_SWITCH +ACTOR_DEMO_EXT +ACTOR_DEMO_SHD +ACTOR_EN_DNS +ACTOR_ELF_MSG +ACTOR_EN_HONOTRAP +ACTOR_EN_TUBO_TRAP +ACTOR_OBJ_ICE_POLY +ACTOR_BG_SPOT03_TAKI +ACTOR_BG_SPOT07_TAKI +ACTOR_EN_FZ +ACTOR_EN_PO_RELAY +ACTOR_BG_RELAY_OBJECTS +ACTOR_EN_DIVING_GAME +ACTOR_EN_KUSA +ACTOR_OBJ_BEAN +ACTOR_OBJ_BOMBIWA +ACTOR_UNSET_128 +ACTOR_UNSET_129 +ACTOR_OBJ_SWITCH +ACTOR_OBJ_ELEVATOR +ACTOR_OBJ_LIFT +ACTOR_OBJ_HSBLOCK +ACTOR_EN_OKARINA_TAG +ACTOR_EN_YABUSAME_MARK +ACTOR_EN_GOROIWA +ACTOR_EN_EX_RUPPY +ACTOR_EN_TORYO +ACTOR_EN_DAIKU +ACTOR_UNSET_134 +ACTOR_EN_NWC +ACTOR_EN_BLKOBJ +ACTOR_ITEM_INBOX +ACTOR_EN_GE1 +ACTOR_OBJ_BLOCKSTOP +ACTOR_EN_SDA +ACTOR_EN_CLEAR_TAG +ACTOR_EN_NIW_LADY +ACTOR_EN_GM +ACTOR_EN_MS +ACTOR_EN_HS +ACTOR_BG_INGATE +ACTOR_EN_KANBAN +ACTOR_EN_HEISHI3 +ACTOR_EN_SYATEKI_NIW +ACTOR_EN_ATTACK_NIW +ACTOR_BG_SPOT01_IDOSOKO +ACTOR_EN_SA +ACTOR_EN_WONDER_TALK +ACTOR_BG_GJYO_BRIDGE +ACTOR_EN_DS +ACTOR_EN_MK +ACTOR_EN_BOM_BOWL_MAN +ACTOR_EN_BOM_BOWL_PIT +ACTOR_EN_OWL +ACTOR_EN_ISHI +ACTOR_OBJ_HANA +ACTOR_OBJ_LIGHTSWITCH +ACTOR_OBJ_MURE2 +ACTOR_EN_GO +ACTOR_EN_FU +ACTOR_UNSET_154 +ACTOR_EN_CHANGER +ACTOR_BG_JYA_MEGAMI +ACTOR_BG_JYA_LIFT +ACTOR_BG_JYA_BIGMIRROR +ACTOR_BG_JYA_BOMBCHUIWA +ACTOR_BG_JYA_AMISHUTTER +ACTOR_BG_JYA_BOMBIWA +ACTOR_BG_SPOT18_BASKET +ACTOR_UNSET_15D +ACTOR_EN_GANON_ORGAN +ACTOR_EN_SIOFUKI +ACTOR_EN_STREAM +ACTOR_UNSET_161 +ACTOR_EN_MM +ACTOR_EN_KO +ACTOR_EN_KZ +ACTOR_EN_WEATHER_TAG +ACTOR_BG_SST_FLOOR +ACTOR_EN_ANI +ACTOR_EN_EX_ITEM +ACTOR_BG_JYA_IRONOBJ +ACTOR_EN_JS +ACTOR_EN_JSJUTAN +ACTOR_EN_CS +ACTOR_EN_MD +ACTOR_EN_HY +ACTOR_EN_GANON_MANT +ACTOR_EN_OKARINA_EFFECT +ACTOR_EN_MAG +ACTOR_DOOR_GERUDO +ACTOR_ELF_MSG2 +ACTOR_DEMO_GT +ACTOR_EN_PO_FIELD +ACTOR_EFC_ERUPC +ACTOR_BG_ZG +ACTOR_EN_HEISHI4 +ACTOR_EN_ZL3 +ACTOR_BOSS_GANON2 +ACTOR_EN_KAKASI +ACTOR_EN_TAKARA_MAN +ACTOR_OBJ_MAKEOSHIHIKI +ACTOR_OCEFF_SPOT +ACTOR_END_TITLE +ACTOR_UNSET_180 +ACTOR_EN_TORCH +ACTOR_DEMO_EC +ACTOR_SHOT_SUN +ACTOR_EN_DY_EXTRA +ACTOR_EN_WONDER_TALK2 +ACTOR_EN_GE2 +ACTOR_OBJ_ROOMTIMER +ACTOR_EN_SSH +ACTOR_EN_STH +ACTOR_OCEFF_WIPE +ACTOR_OCEFF_STORM +ACTOR_EN_WEIYER +ACTOR_BG_SPOT05_SOKO +ACTOR_BG_JYA_1FLIFT +ACTOR_BG_JYA_HAHENIRON +ACTOR_BG_SPOT12_GATE +ACTOR_BG_SPOT12_SAKU +ACTOR_EN_HINTNUTS +ACTOR_EN_NUTSBALL +ACTOR_BG_SPOT00_BREAK +ACTOR_EN_SHOPNUTS +ACTOR_EN_IT +ACTOR_EN_GELDB +ACTOR_OCEFF_WIPE2 +ACTOR_OCEFF_WIPE3 +ACTOR_EN_NIW_GIRL +ACTOR_EN_DOG +ACTOR_EN_SI +ACTOR_BG_SPOT01_OBJECTS2 +ACTOR_OBJ_COMB +ACTOR_BG_SPOT11_BAKUDANKABE +ACTOR_OBJ_KIBAKO2 +ACTOR_EN_DNT_DEMO +ACTOR_EN_DNT_JIJI +ACTOR_EN_DNT_NOMAL +ACTOR_EN_GUEST +ACTOR_BG_BOM_GUARD +ACTOR_EN_HS2 +ACTOR_DEMO_KEKKAI +ACTOR_BG_SPOT08_BAKUDANKABE +ACTOR_BG_SPOT17_BAKUDANKABE +ACTOR_UNSET_1AA +ACTOR_OBJ_MURE3 +ACTOR_EN_TG +ACTOR_EN_MU +ACTOR_EN_GO2 +ACTOR_EN_WF +ACTOR_EN_SKB +ACTOR_DEMO_GJ +ACTOR_DEMO_GEFF +ACTOR_BG_GND_FIREMEIRO +ACTOR_BG_GND_DARKMEIRO +ACTOR_BG_GND_SOULMEIRO +ACTOR_BG_GND_NISEKABE +ACTOR_BG_GND_ICEBLOCK +ACTOR_EN_GB +ACTOR_EN_GS +ACTOR_BG_MIZU_BWALL +ACTOR_BG_MIZU_SHUTTER +ACTOR_EN_DAIKU_KAKARIKO +ACTOR_BG_BOWL_WALL +ACTOR_EN_WALL_TUBO +ACTOR_EN_PO_DESERT +ACTOR_EN_CROW +ACTOR_DOOR_KILLER +ACTOR_BG_SPOT11_OASIS +ACTOR_BG_SPOT18_FUTA +ACTOR_BG_SPOT18_SHUTTER +ACTOR_EN_MA3 +ACTOR_EN_COW +ACTOR_BG_ICE_TURARA +ACTOR_BG_ICE_SHUTTER +ACTOR_EN_KAKASI2 +ACTOR_EN_KAKASI3 +ACTOR_OCEFF_WIPE4 +ACTOR_EN_EG +ACTOR_BG_MENKURI_NISEKABE +ACTOR_EN_ZO +ACTOR_OBJ_MAKEKINSUTA +ACTOR_EN_GE3 +ACTOR_OBJ_TIMEBLOCK +ACTOR_OBJ_HAMISHI +ACTOR_EN_ZL4 +ACTOR_EN_MM2 +ACTOR_BG_JYA_BLOCK +ACTOR_OBJ_WARP2BLOCK +ACTOR_ID_MAX \ No newline at end of file diff --git a/soh/assets/extractor/symbols/ObjectList_OoTMqDbg.txt b/soh/assets/extractor/symbols/ObjectList_OoTMqDbg.txt new file mode 100644 index 0000000000..1ecc3441bb --- /dev/null +++ b/soh/assets/extractor/symbols/ObjectList_OoTMqDbg.txt @@ -0,0 +1,402 @@ +OBJECT_INVALID +OBJECT_GAMEPLAY_KEEP +OBJECT_GAMEPLAY_FIELD_KEEP +OBJECT_GAMEPLAY_DANGEON_KEEP +OBJECT_UNSET_4 +OBJECT_UNSET_5 +OBJECT_HUMAN +OBJECT_OKUTA +OBJECT_CROW +OBJECT_POH +OBJECT_DY_OBJ +OBJECT_WALLMASTER +OBJECT_DODONGO +OBJECT_FIREFLY +OBJECT_BOX +OBJECT_FIRE +OBJECT_UNSET_10 +OBJECT_UNSET_11 +OBJECT_BUBBLE +OBJECT_NIW +OBJECT_LINK_BOY +OBJECT_LINK_CHILD +OBJECT_TITE +OBJECT_REEBA +OBJECT_PEEHAT +OBJECT_KINGDODONGO +OBJECT_HORSE +OBJECT_ZF +OBJECT_GOMA +OBJECT_ZL1 +OBJECT_GOL +OBJECT_DODOJR +OBJECT_TORCH2 +OBJECT_BL +OBJECT_TP +OBJECT_OA1 +OBJECT_ST +OBJECT_BW +OBJECT_EI +OBJECT_HORSE_NORMAL +OBJECT_OB1 +OBJECT_O_ANIME +OBJECT_SPOT04_OBJECTS +OBJECT_DDAN_OBJECTS +OBJECT_HIDAN_OBJECTS +OBJECT_HORSE_GANON +OBJECT_OA2 +OBJECT_SPOT00_OBJECTS +OBJECT_MB +OBJECT_BOMBF +OBJECT_SK2 +OBJECT_OE1 +OBJECT_OE_ANIME +OBJECT_OE2 +OBJECT_YDAN_OBJECTS +OBJECT_GND +OBJECT_AM +OBJECT_DEKUBABA +OBJECT_UNSET_3A +OBJECT_OA3 +OBJECT_OA4 +OBJECT_OA5 +OBJECT_OA6 +OBJECT_OA7 +OBJECT_JJ +OBJECT_OA8 +OBJECT_OA9 +OBJECT_OB2 +OBJECT_OB3 +OBJECT_OB4 +OBJECT_HORSE_ZELDA +OBJECT_OPENING_DEMO1 +OBJECT_WARP1 +OBJECT_B_HEART +OBJECT_DEKUNUTS +OBJECT_OE3 +OBJECT_OE4 +OBJECT_MENKURI_OBJECTS +OBJECT_OE5 +OBJECT_OE6 +OBJECT_OE7 +OBJECT_OE8 +OBJECT_OE9 +OBJECT_OE10 +OBJECT_OE11 +OBJECT_OE12 +OBJECT_VALI +OBJECT_OA10 +OBJECT_OA11 +OBJECT_MIZU_OBJECTS +OBJECT_FHG +OBJECT_OSSAN +OBJECT_MORI_HINERI1 +OBJECT_BB +OBJECT_TOKI_OBJECTS +OBJECT_YUKABYUN +OBJECT_ZL2 +OBJECT_MJIN +OBJECT_MJIN_FLASH +OBJECT_MJIN_DARK +OBJECT_MJIN_FLAME +OBJECT_MJIN_ICE +OBJECT_MJIN_SOUL +OBJECT_MJIN_WIND +OBJECT_MJIN_OKA +OBJECT_HAKA_OBJECTS +OBJECT_SPOT06_OBJECTS +OBJECT_ICE_OBJECTS +OBJECT_RELAY_OBJECTS +OBJECT_PO_FIELD +OBJECT_PO_COMPOSER +OBJECT_MORI_HINERI1A +OBJECT_MORI_HINERI2 +OBJECT_MORI_HINERI2A +OBJECT_MORI_OBJECTS +OBJECT_MORI_TEX +OBJECT_SPOT08_OBJ +OBJECT_WARP2 +OBJECT_HATA +OBJECT_BIRD +OBJECT_UNSET_78 +OBJECT_UNSET_79 +OBJECT_UNSET_7A +OBJECT_UNSET_7B +OBJECT_WOOD02 +OBJECT_UNSET_7D +OBJECT_UNSET_7E +OBJECT_UNSET_7F +OBJECT_UNSET_80 +OBJECT_LIGHTBOX +OBJECT_PU_BOX +OBJECT_UNSET_83 +OBJECT_UNSET_84 +OBJECT_TRAP +OBJECT_VASE +OBJECT_IM +OBJECT_TA +OBJECT_TK +OBJECT_XC +OBJECT_VM +OBJECT_BV +OBJECT_HAKACH_OBJECTS +OBJECT_EFC_CRYSTAL_LIGHT +OBJECT_EFC_FIRE_BALL +OBJECT_EFC_FLASH +OBJECT_EFC_LGT_SHOWER +OBJECT_EFC_STAR_FIELD +OBJECT_GOD_LGT +OBJECT_LIGHT_RING +OBJECT_TRIFORCE_SPOT +OBJECT_BDAN_OBJECTS +OBJECT_SD +OBJECT_RD +OBJECT_PO_SISTERS +OBJECT_HEAVY_OBJECT +OBJECT_GNDD +OBJECT_FD +OBJECT_DU +OBJECT_FW +OBJECT_MEDAL +OBJECT_HORSE_LINK_CHILD +OBJECT_SPOT02_OBJECTS +OBJECT_HAKA +OBJECT_RU1 +OBJECT_SYOKUDAI +OBJECT_FD2 +OBJECT_DH +OBJECT_RL +OBJECT_EFC_TW +OBJECT_DEMO_TRE_LGT +OBJECT_GI_KEY +OBJECT_MIR_RAY +OBJECT_BROB +OBJECT_GI_JEWEL +OBJECT_SPOT09_OBJ +OBJECT_SPOT18_OBJ +OBJECT_BDOOR +OBJECT_SPOT17_OBJ +OBJECT_SHOP_DUNGEN +OBJECT_NB +OBJECT_MO +OBJECT_SB +OBJECT_GI_MELODY +OBJECT_GI_HEART +OBJECT_GI_COMPASS +OBJECT_GI_BOSSKEY +OBJECT_GI_MEDAL +OBJECT_GI_NUTS +OBJECT_SA +OBJECT_GI_HEARTS +OBJECT_GI_ARROWCASE +OBJECT_GI_BOMBPOUCH +OBJECT_IN +OBJECT_TR +OBJECT_SPOT16_OBJ +OBJECT_OE1S +OBJECT_OE4S +OBJECT_OS_ANIME +OBJECT_GI_BOTTLE +OBJECT_GI_STICK +OBJECT_GI_MAP +OBJECT_OF1D_MAP +OBJECT_RU2 +OBJECT_GI_SHIELD_1 +OBJECT_DEKUJR +OBJECT_GI_MAGICPOT +OBJECT_GI_BOMB_1 +OBJECT_OF1S +OBJECT_MA2 +OBJECT_GI_PURSE +OBJECT_HNI +OBJECT_TW +OBJECT_RR +OBJECT_BXA +OBJECT_ANUBICE +OBJECT_GI_GERUDO +OBJECT_GI_ARROW +OBJECT_GI_BOMB_2 +OBJECT_GI_EGG +OBJECT_GI_SCALE +OBJECT_GI_SHIELD_2 +OBJECT_GI_HOOKSHOT +OBJECT_GI_OCARINA +OBJECT_GI_MILK +OBJECT_MA1 +OBJECT_GANON +OBJECT_SST +OBJECT_NY_UNUSED +OBJECT_UNSET_E4 +OBJECT_NY +OBJECT_FR +OBJECT_GI_PACHINKO +OBJECT_GI_BOOMERANG +OBJECT_GI_BOW +OBJECT_GI_GLASSES +OBJECT_GI_LIQUID +OBJECT_ANI +OBJECT_DEMO_6K +OBJECT_GI_SHIELD_3 +OBJECT_GI_LETTER +OBJECT_SPOT15_OBJ +OBJECT_JYA_OBJ +OBJECT_GI_CLOTHES +OBJECT_GI_BEAN +OBJECT_GI_FISH +OBJECT_GI_SAW +OBJECT_GI_HAMMER +OBJECT_GI_GRASS +OBJECT_GI_LONGSWORD +OBJECT_SPOT01_OBJECTS +OBJECT_MD_UNUSED +OBJECT_MD +OBJECT_KM1 +OBJECT_KW1 +OBJECT_ZO +OBJECT_KZ +OBJECT_UMAJUMP +OBJECT_MASTERKOKIRI +OBJECT_MASTERKOKIRIHEAD +OBJECT_MASTERGOLON +OBJECT_MASTERZOORA +OBJECT_AOB +OBJECT_IK +OBJECT_AHG +OBJECT_CNE +OBJECT_GI_NIWATORI +OBJECT_SKJ +OBJECT_GI_BOTTLE_LETTER +OBJECT_BJI +OBJECT_BBA +OBJECT_GI_OCARINA_0 +OBJECT_DS +OBJECT_ANE +OBJECT_BOJ +OBJECT_SPOT03_OBJECT +OBJECT_SPOT07_OBJECT +OBJECT_FZ +OBJECT_BOB +OBJECT_GE1 +OBJECT_YABUSAME_POINT +OBJECT_GI_BOOTS_2 +OBJECT_GI_SEED +OBJECT_GND_MAGIC +OBJECT_D_ELEVATOR +OBJECT_D_HSBLOCK +OBJECT_D_LIFT +OBJECT_MAMENOKI +OBJECT_GOROIWA +OBJECT_UNSET_120 +OBJECT_TORYO +OBJECT_DAIKU +OBJECT_UNSET_123 +OBJECT_NWC +OBJECT_BLKOBJ +OBJECT_GM +OBJECT_MS +OBJECT_HS +OBJECT_INGATE +OBJECT_LIGHTSWITCH +OBJECT_KUSA +OBJECT_TSUBO +OBJECT_GI_GLOVES +OBJECT_GI_COIN +OBJECT_KANBAN +OBJECT_GJYO_OBJECTS +OBJECT_OWL +OBJECT_MK +OBJECT_FU +OBJECT_GI_KI_TAN_MASK +OBJECT_GI_REDEAD_MASK +OBJECT_GI_SKJ_MASK +OBJECT_GI_RABIT_MASK +OBJECT_GI_TRUTH_MASK +OBJECT_GANON_OBJECTS +OBJECT_SIOFUKI +OBJECT_STREAM +OBJECT_MM +OBJECT_FA +OBJECT_OS +OBJECT_GI_EYE_LOTION +OBJECT_GI_POWDER +OBJECT_GI_MUSHROOM +OBJECT_GI_TICKETSTONE +OBJECT_GI_BROKENSWORD +OBJECT_JS +OBJECT_CS +OBJECT_GI_PRESCRIPTION +OBJECT_GI_BRACELET +OBJECT_GI_SOLDOUT +OBJECT_GI_FROG +OBJECT_MAG +OBJECT_DOOR_GERUDO +OBJECT_GT +OBJECT_EFC_ERUPC +OBJECT_ZL2_ANIME1 +OBJECT_ZL2_ANIME2 +OBJECT_GI_GOLONMASK +OBJECT_GI_ZORAMASK +OBJECT_GI_GERUDOMASK +OBJECT_GANON2 +OBJECT_KA +OBJECT_TS +OBJECT_ZG +OBJECT_GI_HOVERBOOTS +OBJECT_GI_M_ARROW +OBJECT_DS2 +OBJECT_EC +OBJECT_FISH +OBJECT_GI_SUTARU +OBJECT_GI_GODDESS +OBJECT_SSH +OBJECT_BIGOKUTA +OBJECT_BG +OBJECT_SPOT05_OBJECTS +OBJECT_SPOT12_OBJ +OBJECT_BOMBIWA +OBJECT_HINTNUTS +OBJECT_RS +OBJECT_SPOT00_BREAK +OBJECT_GLA +OBJECT_SHOPNUTS +OBJECT_GELDB +OBJECT_GR +OBJECT_DOG +OBJECT_JYA_IRON +OBJECT_JYA_DOOR +OBJECT_UNSET_16E +OBJECT_SPOT11_OBJ +OBJECT_KIBAKO2 +OBJECT_DNS +OBJECT_DNK +OBJECT_GI_FIRE +OBJECT_GI_INSECT +OBJECT_GI_BUTTERFLY +OBJECT_GI_GHOST +OBJECT_GI_SOUL +OBJECT_BOWL +OBJECT_DEMO_KEKKAI +OBJECT_EFC_DOUGHNUT +OBJECT_GI_DEKUPOUCH +OBJECT_GANON_ANIME1 +OBJECT_GANON_ANIME2 +OBJECT_GANON_ANIME3 +OBJECT_GI_RUPY +OBJECT_SPOT01_MATOYA +OBJECT_SPOT01_MATOYAB +OBJECT_MU +OBJECT_WF +OBJECT_SKB +OBJECT_GJ +OBJECT_GEFF +OBJECT_HAKA_DOOR +OBJECT_GS +OBJECT_PS +OBJECT_BWALL +OBJECT_COW +OBJECT_COB +OBJECT_GI_SWORD_1 +OBJECT_DOOR_KILLER +OBJECT_OUKE_HAKA +OBJECT_TIMEBLOCK +OBJECT_ZL4 \ No newline at end of file diff --git a/soh/assets/extractor/symbols/SymbolMap_OoTMqDbg.txt b/soh/assets/extractor/symbols/SymbolMap_OoTMqDbg.txt new file mode 100644 index 0000000000..015e7e88a3 --- /dev/null +++ b/soh/assets/extractor/symbols/SymbolMap_OoTMqDbg.txt @@ -0,0 +1 @@ +8012DB20 gMtxClear \ No newline at end of file diff --git a/soh/assets/objects/gameplay_keep/gameplay_keep.h b/soh/assets/objects/gameplay_keep/gameplay_keep.h index 6377e165dd..afd7b7495d 100644 --- a/soh/assets/objects/gameplay_keep/gameplay_keep.h +++ b/soh/assets/objects/gameplay_keep/gameplay_keep.h @@ -21,6 +21,9 @@ static const ALIGN_ASSET(2) char gHilite1Tex[] = dgHilite1Tex; #define dgHilite2Tex "__OTR__objects/gameplay_keep/gHilite2Tex" static const ALIGN_ASSET(2) char gHilite2Tex[] = dgHilite2Tex; +#define dgHilite2Tex_Overflow "__OTR__objects/gameplay_keep/gHilite2Tex_Overflow" +static const ALIGN_ASSET(2) char gHilite2Tex_Overflow[] = dgHilite2Tex_Overflow; + #define dgHylianShieldDesignTex "__OTR__objects/gameplay_keep/gHylianShieldDesignTex" static const ALIGN_ASSET(2) char gHylianShieldDesignTex[] = dgHylianShieldDesignTex; @@ -2847,5 +2850,62 @@ static const ALIGN_ASSET(2) char gFishSkelLimbsLimb_018FB0DL_018950[] = dgFishSk #define dgFishSkelLimbsLimb_018FBCDL_0188B0 "__OTR__objects/gameplay_keep/gFishSkelLimbsLimb_018FBCDL_0188B0" static const ALIGN_ASSET(2) char gFishSkelLimbsLimb_018FBCDL_0188B0[] = dgFishSkelLimbsLimb_018FBCDL_0188B0; +// #region NTSC + +#define dgameplay_keep_DL_0C8B0 "__OTR__objects/gameplay_keep/gameplay_keep_DL_0C8B0" +static const ALIGN_ASSET(2) char gameplay_keep_DL_0C8B0[] = dgameplay_keep_DL_0C8B0; + +#define dgameplay_keep_Tex_0CE60 "__OTR__objects/gameplay_keep/gameplay_keep_Tex_0CE60" +static const ALIGN_ASSET(2) char gameplay_keep_Tex_0CE60[] = dgameplay_keep_Tex_0CE60; + +#define dgameplay_keep_DL_39890 "__OTR__objects/gameplay_keep/gameplay_keep_DL_39890" +static const ALIGN_ASSET(2) char gameplay_keep_DL_39890[] = dgameplay_keep_DL_39890; + +#define dgameplay_keep_DL_399B0 "__OTR__objects/gameplay_keep/gameplay_keep_DL_399B0" +static const ALIGN_ASSET(2) char gameplay_keep_DL_399B0[] = dgameplay_keep_DL_399B0; + +#define dgameplay_keep_DL_39A80 "__OTR__objects/gameplay_keep/gameplay_keep_DL_39A80" +static const ALIGN_ASSET(2) char gameplay_keep_DL_39A80[] = dgameplay_keep_DL_39A80; + +#define dgameplay_keep_DL_39B50 "__OTR__objects/gameplay_keep/gameplay_keep_DL_39B50" +static const ALIGN_ASSET(2) char gameplay_keep_DL_39B50[] = dgameplay_keep_DL_39B50; + +#define dgameplay_keep_DL_3CFD0 "__OTR__objects/gameplay_keep/gameplay_keep_DL_3CFD0" +static const ALIGN_ASSET(2) char gameplay_keep_DL_3CFD0[] = dgameplay_keep_DL_3CFD0; + +#define dgameplay_keep_DL_3D108 "__OTR__objects/gameplay_keep/gameplay_keep_DL_3D108" +static const ALIGN_ASSET(2) char gameplay_keep_DL_3D108[] = dgameplay_keep_DL_3D108; + +#define dgameplay_keep_DL_3D260 "__OTR__objects/gameplay_keep/gameplay_keep_DL_3D260" +static const ALIGN_ASSET(2) char gameplay_keep_DL_3D260[] = dgameplay_keep_DL_3D260; + +#define dgUnusedDropBombchuTex "__OTR__objects/gameplay_keep/gUnusedDropBombchuTex" +static const ALIGN_ASSET(2) char gUnusedDropBombchuTex[] = dgUnusedDropBombchuTex; + +#define dgUnusedWalletTex "__OTR__objects/gameplay_keep/gUnusedWalletTex" +static const ALIGN_ASSET(2) char gUnusedWalletTex[] = dgUnusedWalletTex; + +#define dgUnusedHeartPieceTex "__OTR__objects/gameplay_keep/gUnusedHeartPieceTex" +static const ALIGN_ASSET(2) char gUnusedHeartPieceTex[] = dgUnusedHeartPieceTex; + +#define dgUnusedDropRecoveryHeartTex "__OTR__objects/gameplay_keep/gUnusedDropRecoveryHeartTex" +static const ALIGN_ASSET(2) char gUnusedDropRecoveryHeartTex[] = dgUnusedDropRecoveryHeartTex; + +#define dgUnusedDropBombTex "__OTR__objects/gameplay_keep/gUnusedDropBombTex" +static const ALIGN_ASSET(2) char gUnusedDropBombTex[] = dgUnusedDropBombTex; + +#define dgUnusedDropArrows1Tex "__OTR__objects/gameplay_keep/gUnusedDropArrows1Tex" +static const ALIGN_ASSET(2) char gUnusedDropArrows1Tex[] = dgUnusedDropArrows1Tex; + +#define dgUnusedRupeeLightBlueTex "__OTR__objects/gameplay_keep/gUnusedRupeeLightBlueTex" +static const ALIGN_ASSET(2) char gUnusedRupeeLightBlueTex[] = dgUnusedRupeeLightBlueTex; + +#define dgUnusedHeartContainerTex "__OTR__objects/gameplay_keep/gUnusedHeartContainerTex" +static const ALIGN_ASSET(2) char gUnusedHeartContainerTex[] = dgUnusedHeartContainerTex; + +#define dgUnusedTreeBarkTex "__OTR__objects/gameplay_keep/gUnusedTreeBarkTex" +static const ALIGN_ASSET(2) char gUnusedTreeBarkTex[] = dgUnusedTreeBarkTex; + + #endif // OBJECTS_GAMEPLAY_KEEP_H diff --git a/soh/assets/objects/object_mag/object_mag.h b/soh/assets/objects/object_mag/object_mag.h index 07ccd88db5..720d0cbe59 100644 --- a/soh/assets/objects/object_mag/object_mag.h +++ b/soh/assets/objects/object_mag/object_mag.h @@ -9,12 +9,21 @@ static const ALIGN_ASSET(2) char gTitleZeldaShieldLogoMQTex[] = dgTitleZeldaShie #define dgTitleZeldaShieldLogoTex "__OTR__objects/object_mag/gTitleZeldaShieldLogoTex" static const ALIGN_ASSET(2) char gTitleZeldaShieldLogoTex[] = dgTitleZeldaShieldLogoTex; +#define dgTitleCopyright1998Tex "__OTR__objects/object_mag/gTitleCopyright1998Tex" +static const ALIGN_ASSET(2) char gTitleCopyright1998Tex[] = dgTitleCopyright1998Tex; + #define dgTitleCopyright19982002Tex "__OTR__objects/object_mag/gTitleCopyright19982002Tex" static const ALIGN_ASSET(2) char gTitleCopyright19982002Tex[] = dgTitleCopyright19982002Tex; #define dgTitleCopyright19982003Tex "__OTR__objects/object_mag/gTitleCopyright19982003Tex" static const ALIGN_ASSET(2) char gTitleCopyright19982003Tex[] = dgTitleCopyright19982003Tex; +#define dgTitleCopyright19982004EngTex "__OTR__objects/object_mag/gTitleCopyright19982004EngTex" +static const ALIGN_ASSET(2) char gTitleCopyright19982004EngTex[] = dgTitleCopyright19982004EngTex; + +#define dgTitleCopyright19982004JpnTex "__OTR__objects/object_mag/gTitleCopyright19982004JpnTex" +static const ALIGN_ASSET(2) char gTitleCopyright19982004JpnTex[] = dgTitleCopyright19982004JpnTex; + #define dgTitleMasterQuestSubtitleTex "__OTR__objects/object_mag/gTitleMasterQuestSubtitleTex" static const ALIGN_ASSET(2) char gTitleMasterQuestSubtitleTex[] = dgTitleMasterQuestSubtitleTex; diff --git a/soh/assets/overlays/ovl_File_Choose/ovl_file_choose.h b/soh/assets/overlays/ovl_File_Choose/ovl_file_choose.h index 9077b1ac5a..46342f7366 100644 --- a/soh/assets/overlays/ovl_File_Choose/ovl_file_choose.h +++ b/soh/assets/overlays/ovl_File_Choose/ovl_file_choose.h @@ -27,4 +27,13 @@ static const ALIGN_ASSET(2) char gOptionsDividerMiddleVtx[] = dgOptionsDividerMi #define dgOptionsDividerBottomVtx "__OTR__overlays/ovl_file_choose/gOptionsDividerBottomVtx" static const ALIGN_ASSET(2) char gOptionsDividerBottomVtx[] = dgOptionsDividerBottomVtx; +#define dD_80811BB0_NTSC "__OTR__overlays/ovl_file_choose/D_80811BB0_NTSC" +static const ALIGN_ASSET(2) char D_80811BB0_NTSC[] = dD_80811BB0_NTSC; + +#define dD_80811D30_NTSC "__OTR__overlays/ovl_file_choose/D_80811D30_NTSC" +static const ALIGN_ASSET(2) char D_80811D30_NTSC[] = dD_80811D30_NTSC; + +#define dD_80811F30_NTSC "__OTR__overlays/ovl_file_choose/D_80811F30_NTSC" +static const ALIGN_ASSET(2) char D_80811F30_NTSC[] = dD_80811F30_NTSC; + #endif // OVERLAYS_OVL_FILE_CHOOSE_H diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index ace1588542..3c3ddcf5a7 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -77,6 +77,66 @@ static const ALIGN_ASSET(2) char gBossSoulSkullDL[] = dgBossSoulSkullDL; #define dgRandoPotDL "__OTR__objects/gameplay_dangeon_keep/gRandoPotDL" static const ALIGN_ASSET(2) char gRandoPotDL[] = dgRandoPotDL; +#define dgRandoBushDL "__OTR__objects/gameplay_field_keep/gFieldBushRandomDL" +static const ALIGN_ASSET(2) char gRandoBushDL[] = dgRandoBushDL; + +#define dgRandoBushMinorDL "__OTR__objects/gameplay_field_keep/gFieldBushMinorDL" +static const ALIGN_ASSET(2) char gRandoBushMinorDL[] = dgRandoBushMinorDL; + +#define dgRandoBushMajorDL "__OTR__objects/gameplay_field_keep/gFieldBushMajorDL" +static const ALIGN_ASSET(2) char gRandoBushMajorDL[] = dgRandoBushMajorDL; + +#define dgRandoBushSmallKeyDL "__OTR__objects/gameplay_field_keep/gFieldBushSmallKeyDL" +static const ALIGN_ASSET(2) char gRandoBushSmallKeyDL[] = dgRandoBushSmallKeyDL; + +#define dgRandoBushBossKeyDL "__OTR__objects/gameplay_field_keep/gFieldBushBossKeyDL" +static const ALIGN_ASSET(2) char gRandoBushBossKeyDL[] = dgRandoBushBossKeyDL; + +#define dgRandoBushTokenDL "__OTR__objects/gameplay_field_keep/gFieldBushTokenDL" +static const ALIGN_ASSET(2) char gRandoBushTokenDL[] = dgRandoBushTokenDL; + +#define dgRandoBushMaskDL "__OTR__objects/gameplay_field_keep/gFieldBushMaskDL" +static const ALIGN_ASSET(2) char gRandoBushMaskDL[] = dgRandoBushMaskDL; + +#define dgRandoBushFairyDL "__OTR__objects/gameplay_field_keep/gFieldBushFairyDL" +static const ALIGN_ASSET(2) char gRandoBushFairyDL[] = dgRandoBushFairyDL; + +#define dgRandoBushHeartDL "__OTR__objects/gameplay_field_keep/gFieldBushHeartDL" +static const ALIGN_ASSET(2) char gRandoBushHeartDL[] = dgRandoBushHeartDL; + +#define dgRandoBushJunkDL "__OTR__objects/gameplay_field_keep/gFieldBushJunkDL" +static const ALIGN_ASSET(2) char gRandoBushJunkDL[] = dgRandoBushJunkDL; + +#define dgRandoCuttableGrassRandomDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassRandomDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassDL[] = dgRandoCuttableGrassRandomDL; + +#define dgRandoCuttableGrassMinorDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMinorDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassMinorDL[] = dgRandoCuttableGrassMinorDL; + +#define dgRandoCuttableGrassMajorDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMajorDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassMajorDL[] = dgRandoCuttableGrassMajorDL; + +#define dgRandoCuttableGrassSmallKeyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassSmallKeyDL[] = dgRandoCuttableGrassSmallKeyDL; + +#define dgRandoCuttableGrassBossKeyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassBossKeyDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassBossKeyDL[] = dgRandoCuttableGrassBossKeyDL; + +#define dgRandoCuttableGrassTokenDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassTokenDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassTokenDL[] = dgRandoCuttableGrassTokenDL; + +#define dgRandoCuttableGrassMaskDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMaskDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassMaskDL[] = dgRandoCuttableGrassMaskDL; + +#define dgRandoCuttableGrassFairyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassFairyDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassFairyDL[] = dgRandoCuttableGrassFairyDL; + +#define dgRandoCuttableGrassHeartDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassHeartDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassHeartDL[] = dgRandoCuttableGrassHeartDL; + +#define dgRandoCuttableGrassJunkDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassJunkDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassJunkDL[] = dgRandoCuttableGrassJunkDL; + #define dgFishingPoleGiDL "__OTR__objects/object_gi_fishing_pole/gFishingPoleGiDL" static const ALIGN_ASSET(2) char gFishingPoleGiDL[] = dgFishingPoleGiDL; @@ -89,6 +149,54 @@ static const ALIGN_ASSET(2) char gBombchuBagBodyDL[] = dgBombchuBagBodyDL; #define dgBombchuBagMaskDL "__OTR__objects/object_bombchubag/gBombchuBagMaskDL" static const ALIGN_ASSET(2) char gBombchuBagMaskDL[] = dgBombchuBagMaskDL; +#define dgLargeMajorCrateDL "__OTR__objects/object_kibako2/gLargeMajorCrateDL" +static const ALIGN_ASSET(2) char gLargeMajorCrateDL[] = dgLargeMajorCrateDL; + +#define dgLargeMinorCrateDL "__OTR__objects/object_kibako2/gLargeMinorCrateDL" +static const ALIGN_ASSET(2) char gLargeMinorCrateDL[] = dgLargeMinorCrateDL; + +#define dgLargeRandoCrateDL "__OTR__objects/object_kibako2/gLargeRandoCrateDL" +static const ALIGN_ASSET(2) char gLargeRandoCrateDL[] = dgLargeRandoCrateDL; + +#define dgLargeSmallKeyCrateDL "__OTR__objects/object_kibako2/gLargeSmallKeyCrateDL" +static const ALIGN_ASSET(2) char gLargeSmallKeyCrateDL[] = dgLargeSmallKeyCrateDL; + +#define dgLargeTokenCrateDL "__OTR__objects/object_kibako2/gLargeTokenCrateDL" +static const ALIGN_ASSET(2) char gLargeTokenCrateDL[] = dgLargeTokenCrateDL; + +#define dgLargeBossKeyCrateDL "__OTR__objects/object_kibako2/gLargeBossKeyCrateDL" +static const ALIGN_ASSET(2) char gLargeBossKeyCrateDL[] = dgLargeBossKeyCrateDL; + +#define dgLargeHeartCrateDL "__OTR__objects/object_kibako2/gLargeHeartCrateDL" +static const ALIGN_ASSET(2) char gLargeHeartCrateDL[] = dgLargeHeartCrateDL; + +#define dgLargeJunkCrateDL "__OTR__objects/object_kibako2/gLargeJunkCrateDL" +static const ALIGN_ASSET(2) char gLargeJunkCrateDL[] = dgLargeJunkCrateDL; + +#define dgSmallMajorCrateDL "__OTR__objects/object_kibako/gSmallMajorCrateDL" +static const ALIGN_ASSET(2) char gSmallMajorCrateDL[] = dgSmallMajorCrateDL; + +#define dgSmallMinorCrateDL "__OTR__objects/object_kibako/gSmallMinorCrateDL" +static const ALIGN_ASSET(2) char gSmallMinorCrateDL[] = dgSmallMinorCrateDL; + +#define dgSmallRandoCrateDL "__OTR__objects/object_kibako/gSmallRandoCrateDL" +static const ALIGN_ASSET(2) char gSmallRandoCrateDL[] = dgSmallRandoCrateDL; + +#define dgSmallSmallKeyCrateDL "__OTR__objects/object_kibako/gSmallSmallKeyCrateDL" +static const ALIGN_ASSET(2) char gSmallSmallKeyCrateDL[] = dgSmallSmallKeyCrateDL; + +#define dgSmallTokenCrateDL "__OTR__objects/object_kibako/gSmallTokenCrateDL" +static const ALIGN_ASSET(2) char gSmallTokenCrateDL[] = dgSmallTokenCrateDL; + +#define dgSmallBossKeyCrateDL "__OTR__objects/object_kibako/gSmallBossKeyCrateDL" +static const ALIGN_ASSET(2) char gSmallBossKeyCrateDL[] = dgSmallBossKeyCrateDL; + +#define dgSmallHeartCrateDL "__OTR__objects/object_kibako/gSmallHeartCrateDL" +static const ALIGN_ASSET(2) char gSmallHeartCrateDL[] = dgSmallHeartCrateDL; + +#define dgSmallJunkCrateDL "__OTR__objects/object_kibako/gSmallJunkCrateDL" +static const ALIGN_ASSET(2) char gSmallJunkCrateDL[] = dgSmallJunkCrateDL; + //boss keys #define dgBossKeyCustomDL "__OTR__objects/object_bosskey/gBossKeyCustomDL" static const ALIGN_ASSET(2) char gBossKeyCustomDL[] = dgBossKeyCustomDL; @@ -287,6 +395,9 @@ static const ALIGN_ASSET(2) char gFileSelPleaseChooseAQuestFRATex[] = dgFileSelP #define dgFileSelPleaseChooseAQuestGERTex "__OTR__textures/title_static/gFileSelPleaseChooseAQuestGERTex" static const ALIGN_ASSET(2) char gFileSelPleaseChooseAQuestGERTex[] = dgFileSelPleaseChooseAQuestGERTex; +#define dgFileSelPleaseChooseAQuestJPNTex "__OTR__textures/title_static/gFileSelPleaseChooseAQuestJPNTex" +static const ALIGN_ASSET(2) char gFileSelPleaseChooseAQuestJPNTex[] = dgFileSelPleaseChooseAQuestJPNTex; + #define dgFileSelBossRushSettingsENGTex "__OTR__textures/title_static/gFileSelBossRushSettingsENGTex" static const ALIGN_ASSET(2) char gFileSelBossRushSettingsENGText[] = dgFileSelBossRushSettingsENGTex; @@ -296,6 +407,9 @@ static const ALIGN_ASSET(2) char gFileSelBossRushSettingsFRAText[] = dgFileSelBo #define dgFileSelBossRushSettingsGERTex "__OTR__textures/title_static/gFileSelBossRushSettingsGERTex" static const ALIGN_ASSET(2) char gFileSelBossRushSettingsGERText[] = dgFileSelBossRushSettingsGERTex; +#define dgFileSelBossRushSettingsJPNTex "__OTR__textures/title_static/gFileSelBossRushSettingsJPNTex" +static const ALIGN_ASSET(2) char gFileSelBossRushSettingsJPNText[] = dgFileSelBossRushSettingsJPNTex; + #define dgFileSelRANDButtonTex "__OTR__textures/title_static/gFileSelRANDButtonTex" static const ALIGN_ASSET(2) char gFileSelRANDButtonTex[] = dgFileSelRANDButtonTex; diff --git a/soh/assets/textures/boss_title_cards/object_bv.h b/soh/assets/textures/boss_title_cards/object_bv.h index 60a4d30748..3c4b7c0905 100644 --- a/soh/assets/textures/boss_title_cards/object_bv.h +++ b/soh/assets/textures/boss_title_cards/object_bv.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gBarinadeTitleCardGERTex[] = dgBarinadeTitleCar #define dgBarinadeTitleCardFRATex "__OTR__textures/object_bv/gBarinadeTitleCardFRATex" static const ALIGN_ASSET(2) char gBarinadeTitleCardFRATex[] = dgBarinadeTitleCardFRATex; +#define dgBarinadeTitleCardJPNTex "__OTR__textures/object_bv/gBarinadeTitleCardJPNTex" +static const ALIGN_ASSET(2) char gBarinadeTitleCardJPNTex[] = dgBarinadeTitleCardJPNTex; + #endif // TEXTURES_OBJECT_BV_H diff --git a/soh/assets/textures/boss_title_cards/object_fd.h b/soh/assets/textures/boss_title_cards/object_fd.h index 56d765a86c..01fa7a534f 100644 --- a/soh/assets/textures/boss_title_cards/object_fd.h +++ b/soh/assets/textures/boss_title_cards/object_fd.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gVolvagiaBossTitleCardGERTex[] = dgVolvagiaBoss #define dgVolvagiaBossTitleCardFRATex "__OTR__textures/object_fd/gVolvagiaBossTitleCardFRATex" static const ALIGN_ASSET(2) char gVolvagiaBossTitleCardFRATex[] = dgVolvagiaBossTitleCardFRATex; +#define dgVolvagiaBossTitleCardJPNTex "__OTR__textures/object_fd/gVolvagiaBossTitleCardJPNTex" +static const ALIGN_ASSET(2) char gVolvagiaBossTitleCardJPNTex[] = dgVolvagiaBossTitleCardJPNTex; + #endif // TEXTURES_OBJECT_FD_H diff --git a/soh/assets/textures/boss_title_cards/object_fhg.h b/soh/assets/textures/boss_title_cards/object_fhg.h index 68d09d0839..81a26cd4d5 100644 --- a/soh/assets/textures/boss_title_cards/object_fhg.h +++ b/soh/assets/textures/boss_title_cards/object_fhg.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gPhantomGanonTitleCardGERTex[] = dgPhantomGanon #define dgPhantomGanonTitleCardFRATex "__OTR__textures/object_fhg/gPhantomGanonTitleCardFRATex" static const ALIGN_ASSET(2) char gPhantomGanonTitleCardFRATex[] = dgPhantomGanonTitleCardFRATex; +#define dgPhantomGanonTitleCardJPNTex "__OTR__textures/object_fhg/gPhantomGanonTitleCardJPNTex" +static const ALIGN_ASSET(2) char gPhantomGanonTitleCardJPNTex[] = dgPhantomGanonTitleCardJPNTex; + #endif // TEXTURES_OBJECT_FHG_H diff --git a/soh/assets/textures/boss_title_cards/object_ganon.h b/soh/assets/textures/boss_title_cards/object_ganon.h index 0b855ac806..41db9df963 100644 --- a/soh/assets/textures/boss_title_cards/object_ganon.h +++ b/soh/assets/textures/boss_title_cards/object_ganon.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gGanondorfTitleCardGERTex[] = dgGanondorfTitleC #define dgGanondorfTitleCardFRATex "__OTR__textures/object_ganon/gGanondorfTitleCardFRATex" static const ALIGN_ASSET(2) char gGanondorfTitleCardFRATex[] = dgGanondorfTitleCardFRATex; +#define dgGanondorfTitleCardJPNTex "__OTR__textures/object_ganon/gGanondorfTitleCardJPNTex" +static const ALIGN_ASSET(2) char gGanondorfTitleCardJPNTex[] = dgGanondorfTitleCardJPNTex; + #endif // TEXTURES_OBJECT_GANON_H diff --git a/soh/assets/textures/boss_title_cards/object_ganon2.h b/soh/assets/textures/boss_title_cards/object_ganon2.h index d9eb76cc14..30241aa970 100644 --- a/soh/assets/textures/boss_title_cards/object_ganon2.h +++ b/soh/assets/textures/boss_title_cards/object_ganon2.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gGanonTitleCardGERTex[] = dgGanonTitleCardGERTe #define dgGanonTitleCardFRATex "__OTR__textures/object_ganon2/gGanonTitleCardFRATex" static const ALIGN_ASSET(2) char gGanonTitleCardFRATex[] = dgGanonTitleCardFRATex; +#define dgGanonTitleCardJPNTex "__OTR__textures/object_ganon2/gGanonTitleCardJPNTex" +static const ALIGN_ASSET(2) char gGanonTitleCardJPNTex[] = dgGanonTitleCardJPNTex; + #endif // TEXTURES_OBJECT_GANON2_H diff --git a/soh/assets/textures/boss_title_cards/object_goma.h b/soh/assets/textures/boss_title_cards/object_goma.h index 96243178b1..81a962691a 100644 --- a/soh/assets/textures/boss_title_cards/object_goma.h +++ b/soh/assets/textures/boss_title_cards/object_goma.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gGohmaTitleCardGERTex[] = dgGohmaTitleCardGERTe #define dgGohmaTitleCardFRATex "__OTR__textures/object_goma/gGohmaTitleCardFRATex" static const ALIGN_ASSET(2) char gGohmaTitleCardFRATex[] = dgGohmaTitleCardFRATex; +#define dgGohmaTitleCardJPNTex "__OTR__textures/object_goma/gGohmaTitleCardJPNTex" +static const ALIGN_ASSET(2) char gGohmaTitleCardJPNTex[] = dgGohmaTitleCardJPNTex; + #endif // TEXTURES_OBJECT_GOMA_H diff --git a/soh/assets/textures/boss_title_cards/object_kingdodongo.h b/soh/assets/textures/boss_title_cards/object_kingdodongo.h index d03784a28f..cc8ce47aab 100644 --- a/soh/assets/textures/boss_title_cards/object_kingdodongo.h +++ b/soh/assets/textures/boss_title_cards/object_kingdodongo.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gKingDodongoTitleCardGERTex[] = dgKingDodongoTi #define dgKingDodongoTitleCardFRATex "__OTR__textures/object_kingdodongo/gKingDodongoTitleCardFRATex" static const ALIGN_ASSET(2) char gKingDodongoTitleCardFRATex[] = dgKingDodongoTitleCardFRATex; +#define dgKingDodongoTitleCardJPNTex "__OTR__textures/object_kingdodongo/gKingDodongoTitleCardJPNTex" +static const ALIGN_ASSET(2) char gKingDodongoTitleCardJPNTex[] = dgKingDodongoTitleCardJPNTex; + #endif // TEXTURES_OBJECT_KINGDODONGO_H diff --git a/soh/assets/textures/boss_title_cards/object_mo.h b/soh/assets/textures/boss_title_cards/object_mo.h index 1d2d1489ad..312b8be85f 100644 --- a/soh/assets/textures/boss_title_cards/object_mo.h +++ b/soh/assets/textures/boss_title_cards/object_mo.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gMorphaTitleCardGERTex[] = dgMorphaTitleCardGER #define dgMorphaTitleCardFRATex "__OTR__textures/object_mo/gMorphaTitleCardFRATex" static const ALIGN_ASSET(2) char gMorphaTitleCardFRATex[] = dgMorphaTitleCardFRATex; +#define dgMorphaTitleCardJPNTex "__OTR__textures/object_mo/gMorphaTitleCardJPNTex" +static const ALIGN_ASSET(2) char gMorphaTitleCardJPNTex[] = dgMorphaTitleCardJPNTex; + #endif // TEXTURES_OBJECT_MO_H diff --git a/soh/assets/textures/boss_title_cards/object_sst.h b/soh/assets/textures/boss_title_cards/object_sst.h index f986705670..d9148df6ca 100644 --- a/soh/assets/textures/boss_title_cards/object_sst.h +++ b/soh/assets/textures/boss_title_cards/object_sst.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gBongoTitleCardGERTex[] = dgBongoTitleCardGERTe #define dgBongoTitleCardFRATex "__OTR__textures/object_sst/gBongoTitleCardFRATex" static const ALIGN_ASSET(2) char gBongoTitleCardFRATex[] = dgBongoTitleCardFRATex; +#define dgBongoTitleCardJPNTex "__OTR__textures/object_sst/gBongoTitleCardJPNTex" +static const ALIGN_ASSET(2) char gBongoTitleCardJPNTex[] = dgBongoTitleCardJPNTex; + #endif // TEXTURES_OBJECT_SST_H diff --git a/soh/assets/textures/boss_title_cards/object_tw.h b/soh/assets/textures/boss_title_cards/object_tw.h index d3a4b22fc0..fa6d4fcaad 100644 --- a/soh/assets/textures/boss_title_cards/object_tw.h +++ b/soh/assets/textures/boss_title_cards/object_tw.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gTwinrovaTitleCardGERTex[] = dgTwinrovaTitleCar #define dgTwinrovaTitleCardFRATex "__OTR__textures/object_tw/gTwinrovaTitleCardFRATex" static const ALIGN_ASSET(2) char gTwinrovaTitleCardFRATex[] = dgTwinrovaTitleCardFRATex; +#define dgTwinrovaTitleCardJPNTex "__OTR__textures/object_tw/gTwinrovaTitleCardJPNTex" +static const ALIGN_ASSET(2) char gTwinrovaTitleCardJPNTex[] = dgTwinrovaTitleCardJPNTex; + #endif // TEXTURES_OBJECT_TW_H diff --git a/soh/assets/textures/do_action_static/do_action_static.h b/soh/assets/textures/do_action_static/do_action_static.h index 9b721d7119..84553ba661 100644 --- a/soh/assets/textures/do_action_static/do_action_static.h +++ b/soh/assets/textures/do_action_static/do_action_static.h @@ -264,4 +264,92 @@ static const ALIGN_ASSET(2) char gNum7DoActionFRATex[] = dgNum7DoActionFRATex; #define dgNum8DoActionFRATex "__OTR__textures/do_action_static/gNum8DoActionFRATex" static const ALIGN_ASSET(2) char gNum8DoActionFRATex[] = dgNum8DoActionFRATex; +#define dgAttackDoActionJPNTex "__OTR__textures/do_action_static/gAttackDoActionJPNTex" +static const ALIGN_ASSET(2) char gAttackDoActionJPNTex[] = dgAttackDoActionJPNTex; + +#define dgCheckDoActionJPNTex "__OTR__textures/do_action_static/gCheckDoActionJPNTex" +static const ALIGN_ASSET(2) char gCheckDoActionJPNTex[] = dgCheckDoActionJPNTex; + +#define dgEnterDoActionJPNTex "__OTR__textures/do_action_static/gEnterDoActionJPNTex" +static const ALIGN_ASSET(2) char gEnterDoActionJPNTex[] = dgEnterDoActionJPNTex; + +#define dgReturnDoActionJPNTex "__OTR__textures/do_action_static/gReturnDoActionJPNTex" +static const ALIGN_ASSET(2) char gReturnDoActionJPNTex[] = dgReturnDoActionJPNTex; + +#define dgOpenDoActionJPNTex "__OTR__textures/do_action_static/gOpenDoActionJPNTex" +static const ALIGN_ASSET(2) char gOpenDoActionJPNTex[] = dgOpenDoActionJPNTex; + +#define dgJumpDoActionJPNTex "__OTR__textures/do_action_static/gJumpDoActionJPNTex" +static const ALIGN_ASSET(2) char gJumpDoActionJPNTex[] = dgJumpDoActionJPNTex; + +#define dgDecideDoActionJPNTex "__OTR__textures/do_action_static/gDecideDoActionJPNTex" +static const ALIGN_ASSET(2) char gDecideDoActionJPNTex[] = dgDecideDoActionJPNTex; + +#define dgDiveDoActionJPNTex "__OTR__textures/do_action_static/gDiveDoActionJPNTex" +static const ALIGN_ASSET(2) char gDiveDoActionJPNTex[] = dgDiveDoActionJPNTex; + +#define dgFasterDoActionJPNTex "__OTR__textures/do_action_static/gFasterDoActionJPNTex" +static const ALIGN_ASSET(2) char gFasterDoActionJPNTex[] = dgFasterDoActionJPNTex; + +#define dgThrowDoActionJPNTex "__OTR__textures/do_action_static/gThrowDoActionJPNTex" +static const ALIGN_ASSET(2) char gThrowDoActionJPNTex[] = dgThrowDoActionJPNTex; + +#define dgUnusedNaviDoActionJPNTex "__OTR__textures/do_action_static/gUnusedNaviDoActionJPNTex" +static const ALIGN_ASSET(2) char gUnusedNaviDoActionJPNTex[] = dgUnusedNaviDoActionJPNTex; + +#define dgClimbDoActionJPNTex "__OTR__textures/do_action_static/gClimbDoActionJPNTex" +static const ALIGN_ASSET(2) char gClimbDoActionJPNTex[] = dgClimbDoActionJPNTex; + +#define dgDropDoActionJPNTex "__OTR__textures/do_action_static/gDropDoActionJPNTex" +static const ALIGN_ASSET(2) char gDropDoActionJPNTex[] = dgDropDoActionJPNTex; + +#define dgDownDoActionJPNTex "__OTR__textures/do_action_static/gDownDoActionJPNTex" +static const ALIGN_ASSET(2) char gDownDoActionJPNTex[] = dgDownDoActionJPNTex; + +#define dgSaveDoActionJPNTex "__OTR__textures/do_action_static/gSaveDoActionJPNTex" +static const ALIGN_ASSET(2) char gSaveDoActionJPNTex[] = dgSaveDoActionJPNTex; + +#define dgSpeakDoActionJPNTex "__OTR__textures/do_action_static/gSpeakDoActionJPNTex" +static const ALIGN_ASSET(2) char gSpeakDoActionJPNTex[] = dgSpeakDoActionJPNTex; + +#define dgNextDoActionJPNTex "__OTR__textures/do_action_static/gNextDoActionJPNTex" +static const ALIGN_ASSET(2) char gNextDoActionJPNTex[] = dgNextDoActionJPNTex; + +#define dgGrabDoActionJPNTex "__OTR__textures/do_action_static/gGrabDoActionJPNTex" +static const ALIGN_ASSET(2) char gGrabDoActionJPNTex[] = dgGrabDoActionJPNTex; + +#define dgStopDoActionJPNTex "__OTR__textures/do_action_static/gStopDoActionJPNTex" +static const ALIGN_ASSET(2) char gStopDoActionJPNTex[] = dgStopDoActionJPNTex; + +#define dgPutAwayDoActionJPNTex "__OTR__textures/do_action_static/gPutAwayDoActionJPNTex" +static const ALIGN_ASSET(2) char gPutAwayDoActionJPNTex[] = dgPutAwayDoActionJPNTex; + +#define dgReelDoActionJPNTex "__OTR__textures/do_action_static/gReelDoActionJPNTex" +static const ALIGN_ASSET(2) char gReelDoActionJPNTex[] = dgReelDoActionJPNTex; + +#define dgNum1DoActionJPNTex "__OTR__textures/do_action_static/gNum1DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum1DoActionJPNTex[] = dgNum1DoActionJPNTex; + +#define dgNum2DoActionJPNTex "__OTR__textures/do_action_static/gNum2DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum2DoActionJPNTex[] = dgNum2DoActionJPNTex; + +#define dgNum3DoActionJPNTex "__OTR__textures/do_action_static/gNum3DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum3DoActionJPNTex[] = dgNum3DoActionJPNTex; + +#define dgNum4DoActionJPNTex "__OTR__textures/do_action_static/gNum4DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum4DoActionJPNTex[] = dgNum4DoActionJPNTex; + +#define dgNum5DoActionJPNTex "__OTR__textures/do_action_static/gNum5DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum5DoActionJPNTex[] = dgNum5DoActionJPNTex; + +#define dgNum6DoActionJPNTex "__OTR__textures/do_action_static/gNum6DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum6DoActionJPNTex[] = dgNum6DoActionJPNTex; + +#define dgNum7DoActionJPNTex "__OTR__textures/do_action_static/gNum7DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum7DoActionJPNTex[] = dgNum7DoActionJPNTex; + +#define dgNum8DoActionJPNTex "__OTR__textures/do_action_static/gNum8DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum8DoActionJPNTex[] = dgNum8DoActionJPNTex; + + #endif // TEXTURES_DO_ACTION_STATIC_H diff --git a/soh/assets/textures/icon_item_gameover_static/icon_item_gameover_static.h b/soh/assets/textures/icon_item_gameover_static/icon_item_gameover_static.h index 2afcd89871..5f04c8faaf 100644 --- a/soh/assets/textures/icon_item_gameover_static/icon_item_gameover_static.h +++ b/soh/assets/textures/icon_item_gameover_static/icon_item_gameover_static.h @@ -24,4 +24,7 @@ static const ALIGN_ASSET(2) char gContinuePlayingGERTex[] = dgContinuePlayingGER #define dgContinuePlayingFRATex "__OTR__textures/icon_item_gameover_static/gContinuePlayingFRATex" static const ALIGN_ASSET(2) char gContinuePlayingFRATex[] = dgContinuePlayingFRATex; +#define dgContinuePlayingJPNTex "__OTR__textures/icon_item_gameover_static/gContinuePlayingJPNTex" +static const ALIGN_ASSET(2) char gContinuePlayingJPNTex[] = dgContinuePlayingJPNTex; + #endif // TEXTURES_ICON_ITEM_GAMEOVER_STATIC_H diff --git a/soh/assets/textures/icon_item_jpn_static/icon_item_jpn_static.h b/soh/assets/textures/icon_item_jpn_static/icon_item_jpn_static.h new file mode 100644 index 0000000000..615e7259e5 --- /dev/null +++ b/soh/assets/textures/icon_item_jpn_static/icon_item_jpn_static.h @@ -0,0 +1,100 @@ +#ifndef TEXTURES_ICON_ITEM_JPN_STATIC_H +#define TEXTURES_ICON_ITEM_JPN_STATIC_H 1 + +#include "align_asset_macro.h" + +#define dgPauseDekuTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseDekuTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseDekuTitleJPNTex[] = dgPauseDekuTitleJPNTex; + +#define dgPauseDodongoTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseDodongoTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseDodongoTitleJPNTex[] = dgPauseDodongoTitleJPNTex; + +#define dgPauseJabuTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseJabuTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseJabuTitleJPNTex[] = dgPauseJabuTitleJPNTex; + +#define dgPauseForestTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseForestTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseForestTitleJPNTex[] = dgPauseForestTitleJPNTex; + +#define dgPauseFireTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseFireTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseFireTitleJPNTex[] = dgPauseFireTitleJPNTex; + +#define dgPauseWaterTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseWaterTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseWaterTitleJPNTex[] = dgPauseWaterTitleJPNTex; + +#define dgPauseSpiritTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseSpiritTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseSpiritTitleJPNTex[] = dgPauseSpiritTitleJPNTex; + +#define dgPauseShadowTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseShadowTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseShadowTitleJPNTex[] = dgPauseShadowTitleJPNTex; + +#define dgPauseBotWTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseBotWTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseBotWTitleJPNTex[] = dgPauseBotWTitleJPNTex; + +#define dgPauseIceCavernTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseIceCavernTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseIceCavernTitleJPNTex[] = dgPauseIceCavernTitleJPNTex; + +#define dgPauseToEquipJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToEquipJPNTex" +static const ALIGN_ASSET(2) char gPauseToEquipJPNTex[] = dgPauseToEquipJPNTex; + +#define dgPauseToDecideJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToDecideJPNTex" +static const ALIGN_ASSET(2) char gPauseToDecideJPNTex[] = dgPauseToDecideJPNTex; + +#define dgPauseToPlayMelodyJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToPlayMelodyJPNTex" +static const ALIGN_ASSET(2) char gPauseToPlayMelodyJPNTex[] = dgPauseToPlayMelodyJPNTex; + +#define dgPauseToSelectItemJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToSelectItemJPNTex" +static const ALIGN_ASSET(2) char gPauseToSelectItemJPNTex[] = dgPauseToSelectItemJPNTex; + +#define dgPauseToMapJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToMapJPNTex" +static const ALIGN_ASSET(2) char gPauseToMapJPNTex[] = dgPauseToMapJPNTex; + +#define dgPauseToQuestStatusJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToQuestStatusJPNTex" +static const ALIGN_ASSET(2) char gPauseToQuestStatusJPNTex[] = dgPauseToQuestStatusJPNTex; + +#define dgPauseToEquipmentJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToEquipmentJPNTex" +static const ALIGN_ASSET(2) char gPauseToEquipmentJPNTex[] = dgPauseToEquipmentJPNTex; + +#define dgPauseSavePromptJPNTex "__OTR__textures/icon_item_jpn_static/gPauseSavePromptJPNTex" +static const ALIGN_ASSET(2) char gPauseSavePromptJPNTex[] = dgPauseSavePromptJPNTex; + +#define dgPauseSaveConfirmationJPNTex "__OTR__textures/icon_item_jpn_static/gPauseSaveConfirmationJPNTex" +static const ALIGN_ASSET(2) char gPauseSaveConfirmationJPNTex[] = dgPauseSaveConfirmationJPNTex; + +#define dgPauseYesJPNTex "__OTR__textures/icon_item_jpn_static/gPauseYesJPNTex" +static const ALIGN_ASSET(2) char gPauseYesJPNTex[] = dgPauseYesJPNTex; + +#define dgPauseNoJPNTex "__OTR__textures/icon_item_jpn_static/gPauseNoJPNTex" +static const ALIGN_ASSET(2) char gPauseNoJPNTex[] = dgPauseNoJPNTex; + +#define dgPauseCurrentPositionJPNTex "__OTR__textures/icon_item_jpn_static/gPauseCurrentPositionJPNTex" +static const ALIGN_ASSET(2) char gPauseCurrentPositionJPNTex[] = dgPauseCurrentPositionJPNTex; + +#define dgPauseEquipment10JPNTex "__OTR__textures/icon_item_jpn_static/gPauseEquipment10JPNTex" +static const ALIGN_ASSET(2) char gPauseEquipment10JPNTex[] = dgPauseEquipment10JPNTex; + +#define dgPauseSelectItem00JPNTex "__OTR__textures/icon_item_jpn_static/gPauseSelectItem00JPNTex" +static const ALIGN_ASSET(2) char gPauseSelectItem00JPNTex[] = dgPauseSelectItem00JPNTex; + +#define dgPauseSelectItem10JPNTex "__OTR__textures/icon_item_jpn_static/gPauseSelectItem10JPNTex" +static const ALIGN_ASSET(2) char gPauseSelectItem10JPNTex[] = dgPauseSelectItem10JPNTex; + +#define dgPauseSelectItem20JPNTex "__OTR__textures/icon_item_jpn_static/gPauseSelectItem20JPNTex" +static const ALIGN_ASSET(2) char gPauseSelectItem20JPNTex[] = dgPauseSelectItem20JPNTex; + +#define dgPauseMap10JPNTex "__OTR__textures/icon_item_jpn_static/gPauseMap10JPNTex" +static const ALIGN_ASSET(2) char gPauseMap10JPNTex[] = dgPauseMap10JPNTex; + +#define dgPauseQuestStatus00JPNTex "__OTR__textures/icon_item_jpn_static/gPauseQuestStatus00JPNTex" +static const ALIGN_ASSET(2) char gPauseQuestStatus00JPNTex[] = dgPauseQuestStatus00JPNTex; + +#define dgPauseQuestStatus10JPNTex "__OTR__textures/icon_item_jpn_static/gPauseQuestStatus10JPNTex" +static const ALIGN_ASSET(2) char gPauseQuestStatus10JPNTex[] = dgPauseQuestStatus10JPNTex; + +#define dgPauseQuestStatus20JPNTex "__OTR__textures/icon_item_jpn_static/gPauseQuestStatus20JPNTex" +static const ALIGN_ASSET(2) char gPauseQuestStatus20JPNTex[] = dgPauseQuestStatus20JPNTex; + +#define dgPauseSave10JPNTex "__OTR__textures/icon_item_jpn_static/gPauseSave10JPNTex" +static const ALIGN_ASSET(2) char gPauseSave10JPNTex[] = dgPauseSave10JPNTex; + + +#endif // TEXTURES_ICON_ITEM_JPN_STATIC_H \ No newline at end of file diff --git a/soh/assets/textures/item_name_static/item_name_static.h b/soh/assets/textures/item_name_static/item_name_static.h index 86af0cab01..0f97677a6a 100644 --- a/soh/assets/textures/item_name_static/item_name_static.h +++ b/soh/assets/textures/item_name_static/item_name_static.h @@ -1110,4 +1110,340 @@ static const ALIGN_ASSET(2) char gUnusedBossKeyItemName21JPNTex[] = dgUnusedBoss #define dgBiggoronsSwordItemNameFRATex "__OTR__textures/item_name_static/gBiggoronsSwordItemNameFRATex" static const ALIGN_ASSET(2) char gBiggoronsSwordItemNameFRATex[] = dgBiggoronsSwordItemNameFRATex; +#define dgDekuStickItemNameJPNTex "__OTR__textures/item_name_static/gDekuStickItemNameJPNTex" +static const ALIGN_ASSET(2) char gDekuStickItemNameJPNTex[] = dgDekuStickItemNameJPNTex; + +#define dgDekuNutItemNameJPNTex "__OTR__textures/item_name_static/gDekuNutItemNameJPNTex" +static const ALIGN_ASSET(2) char gDekuNutItemNameJPNTex[] = dgDekuNutItemNameJPNTex; + +#define dgBombItemNameJPNTex "__OTR__textures/item_name_static/gBombItemNameJPNTex" +static const ALIGN_ASSET(2) char gBombItemNameJPNTex[] = dgBombItemNameJPNTex; + +#define dgFairyBowItemNameJPNTex "__OTR__textures/item_name_static/gFairyBowItemNameJPNTex" +static const ALIGN_ASSET(2) char gFairyBowItemNameJPNTex[] = dgFairyBowItemNameJPNTex; + +#define dgFireArrowItemNameJPNTex "__OTR__textures/item_name_static/gFireArrowItemNameJPNTex" +static const ALIGN_ASSET(2) char gFireArrowItemNameJPNTex[] = dgFireArrowItemNameJPNTex; + +#define dgDinsFireItemNameJPNTex "__OTR__textures/item_name_static/gDinsFireItemNameJPNTex" +static const ALIGN_ASSET(2) char gDinsFireItemNameJPNTex[] = dgDinsFireItemNameJPNTex; + +#define dgFairySlingshotItemNameJPNTex "__OTR__textures/item_name_static/gFairySlingshotItemNameJPNTex" +static const ALIGN_ASSET(2) char gFairySlingshotItemNameJPNTex[] = dgFairySlingshotItemNameJPNTex; + +#define dgFairyOcarinaItemNameJPNTex "__OTR__textures/item_name_static/gFairyOcarinaItemNameJPNTex" +static const ALIGN_ASSET(2) char gFairyOcarinaItemNameJPNTex[] = dgFairyOcarinaItemNameJPNTex; + +#define dgOcarinaOfTimeItemNameJPNTex "__OTR__textures/item_name_static/gOcarinaOfTimeItemNameJPNTex" +static const ALIGN_ASSET(2) char gOcarinaOfTimeItemNameJPNTex[] = dgOcarinaOfTimeItemNameJPNTex; + +#define dgBombchuItemNameJPNTex "__OTR__textures/item_name_static/gBombchuItemNameJPNTex" +static const ALIGN_ASSET(2) char gBombchuItemNameJPNTex[] = dgBombchuItemNameJPNTex; + +#define dgHookshotItemNameJPNTex "__OTR__textures/item_name_static/gHookshotItemNameJPNTex" +static const ALIGN_ASSET(2) char gHookshotItemNameJPNTex[] = dgHookshotItemNameJPNTex; + +#define dgLongshotItemNameJPNTex "__OTR__textures/item_name_static/gLongshotItemNameJPNTex" +static const ALIGN_ASSET(2) char gLongshotItemNameJPNTex[] = dgLongshotItemNameJPNTex; + +#define dgIceArrowItemNameJPNTex "__OTR__textures/item_name_static/gIceArrowItemNameJPNTex" +static const ALIGN_ASSET(2) char gIceArrowItemNameJPNTex[] = dgIceArrowItemNameJPNTex; + +#define dgFaroresWindItemNameJPNTex "__OTR__textures/item_name_static/gFaroresWindItemNameJPNTex" +static const ALIGN_ASSET(2) char gFaroresWindItemNameJPNTex[] = dgFaroresWindItemNameJPNTex; + +#define dgBoomerangItemNameJPNTex "__OTR__textures/item_name_static/gBoomerangItemNameJPNTex" +static const ALIGN_ASSET(2) char gBoomerangItemNameJPNTex[] = dgBoomerangItemNameJPNTex; + +#define dgLensItemNameJPNTex "__OTR__textures/item_name_static/gLensItemNameJPNTex" +static const ALIGN_ASSET(2) char gLensItemNameJPNTex[] = dgLensItemNameJPNTex; + +#define dgMagicBeansItemNameJPNTex "__OTR__textures/item_name_static/gMagicBeansItemNameJPNTex" +static const ALIGN_ASSET(2) char gMagicBeansItemNameJPNTex[] = dgMagicBeansItemNameJPNTex; + +#define dgMegatonHammerItemNameJPNTex "__OTR__textures/item_name_static/gMegatonHammerItemNameJPNTex" +static const ALIGN_ASSET(2) char gMegatonHammerItemNameJPNTex[] = dgMegatonHammerItemNameJPNTex; + +#define dgLightArrowItemNameJPNTex "__OTR__textures/item_name_static/gLightArrowItemNameJPNTex" +static const ALIGN_ASSET(2) char gLightArrowItemNameJPNTex[] = dgLightArrowItemNameJPNTex; + +#define dgNayrusLoveItemNameJPNTex "__OTR__textures/item_name_static/gNayrusLoveItemNameJPNTex" +static const ALIGN_ASSET(2) char gNayrusLoveItemNameJPNTex[] = dgNayrusLoveItemNameJPNTex; + +#define dgEmptyBottleItemNameJPNTex "__OTR__textures/item_name_static/gEmptyBottleItemNameJPNTex" +static const ALIGN_ASSET(2) char gEmptyBottleItemNameJPNTex[] = dgEmptyBottleItemNameJPNTex; + +#define dgRedPotionItemNameJPNTex "__OTR__textures/item_name_static/gRedPotionItemNameJPNTex" +static const ALIGN_ASSET(2) char gRedPotionItemNameJPNTex[] = dgRedPotionItemNameJPNTex; + +#define dgGreenPotionItemNameJPNTex "__OTR__textures/item_name_static/gGreenPotionItemNameJPNTex" +static const ALIGN_ASSET(2) char gGreenPotionItemNameJPNTex[] = dgGreenPotionItemNameJPNTex; + +#define dgBluePotionItemNameJPNTex "__OTR__textures/item_name_static/gBluePotionItemNameJPNTex" +static const ALIGN_ASSET(2) char gBluePotionItemNameJPNTex[] = dgBluePotionItemNameJPNTex; + +#define dgBottledFairyItemNameJPNTex "__OTR__textures/item_name_static/gBottledFairyItemNameJPNTex" +static const ALIGN_ASSET(2) char gBottledFairyItemNameJPNTex[] = dgBottledFairyItemNameJPNTex; + +#define dgFishItemNameJPNTex "__OTR__textures/item_name_static/gFishItemNameJPNTex" +static const ALIGN_ASSET(2) char gFishItemNameJPNTex[] = dgFishItemNameJPNTex; + +#define dgFullMilkItemNameJPNTex "__OTR__textures/item_name_static/gFullMilkItemNameJPNTex" +static const ALIGN_ASSET(2) char gFullMilkItemNameJPNTex[] = dgFullMilkItemNameJPNTex; + +#define dgRutosLetterItemNameJPNTex "__OTR__textures/item_name_static/gRutosLetterItemNameJPNTex" +static const ALIGN_ASSET(2) char gRutosLetterItemNameJPNTex[] = dgRutosLetterItemNameJPNTex; + +#define dgBlueFireItemNameJPNTex "__OTR__textures/item_name_static/gBlueFireItemNameJPNTex" +static const ALIGN_ASSET(2) char gBlueFireItemNameJPNTex[] = dgBlueFireItemNameJPNTex; + +#define dgBugItemNameJPNTex "__OTR__textures/item_name_static/gBugItemNameJPNTex" +static const ALIGN_ASSET(2) char gBugItemNameJPNTex[] = dgBugItemNameJPNTex; + +#define dgBigPoeItemNameJPNTex "__OTR__textures/item_name_static/gBigPoeItemNameJPNTex" +static const ALIGN_ASSET(2) char gBigPoeItemNameJPNTex[] = dgBigPoeItemNameJPNTex; + +#define dgHalfMilkItemNameJPNTex "__OTR__textures/item_name_static/gHalfMilkItemNameJPNTex" +static const ALIGN_ASSET(2) char gHalfMilkItemNameJPNTex[] = dgHalfMilkItemNameJPNTex; + +#define dgPoeItemNameJPNTex "__OTR__textures/item_name_static/gPoeItemNameJPNTex" +static const ALIGN_ASSET(2) char gPoeItemNameJPNTex[] = dgPoeItemNameJPNTex; + +#define dgWeirdEggItemNameJPNTex "__OTR__textures/item_name_static/gWeirdEggItemNameJPNTex" +static const ALIGN_ASSET(2) char gWeirdEggItemNameJPNTex[] = dgWeirdEggItemNameJPNTex; + +#define dgCuccoItemNameJPNTex "__OTR__textures/item_name_static/gCuccoItemNameJPNTex" +static const ALIGN_ASSET(2) char gCuccoItemNameJPNTex[] = dgCuccoItemNameJPNTex; + +#define dgZeldasLetterItemNameJPNTex "__OTR__textures/item_name_static/gZeldasLetterItemNameJPNTex" +static const ALIGN_ASSET(2) char gZeldasLetterItemNameJPNTex[] = dgZeldasLetterItemNameJPNTex; + +#define dgKeatonMaskItemNameJPNTex "__OTR__textures/item_name_static/gKeatonMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gKeatonMaskItemNameJPNTex[] = dgKeatonMaskItemNameJPNTex; + +#define dgSkullMaskItemNameJPNTex "__OTR__textures/item_name_static/gSkullMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gSkullMaskItemNameJPNTex[] = dgSkullMaskItemNameJPNTex; + +#define dgSpookyMaskItemNameJPNTex "__OTR__textures/item_name_static/gSpookyMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gSpookyMaskItemNameJPNTex[] = dgSpookyMaskItemNameJPNTex; + +#define dgBunnyHoodItemNameJPNTex "__OTR__textures/item_name_static/gBunnyHoodItemNameJPNTex" +static const ALIGN_ASSET(2) char gBunnyHoodItemNameJPNTex[] = dgBunnyHoodItemNameJPNTex; + +#define dgGoronMaskItemNameJPNTex "__OTR__textures/item_name_static/gGoronMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoronMaskItemNameJPNTex[] = dgGoronMaskItemNameJPNTex; + +#define dgZoraMaskItemNameJPNTex "__OTR__textures/item_name_static/gZoraMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gZoraMaskItemNameJPNTex[] = dgZoraMaskItemNameJPNTex; + +#define dgGerudoMaskItemNameJPNTex "__OTR__textures/item_name_static/gGerudoMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gGerudoMaskItemNameJPNTex[] = dgGerudoMaskItemNameJPNTex; + +#define dgMaskofTruthItemNameJPNTex "__OTR__textures/item_name_static/gMaskofTruthItemNameJPNTex" +static const ALIGN_ASSET(2) char gMaskofTruthItemNameJPNTex[] = dgMaskofTruthItemNameJPNTex; + +#define dgSOLDOUTItemNameJPNTex "__OTR__textures/item_name_static/gSOLDOUTItemNameJPNTex" +static const ALIGN_ASSET(2) char gSOLDOUTItemNameJPNTex[] = dgSOLDOUTItemNameJPNTex; + +#define dgPocketEggItemNameJPNTex "__OTR__textures/item_name_static/gPocketEggItemNameJPNTex" +static const ALIGN_ASSET(2) char gPocketEggItemNameJPNTex[] = dgPocketEggItemNameJPNTex; + +#define dgPocketCuccoItemNameJPNTex "__OTR__textures/item_name_static/gPocketCuccoItemNameJPNTex" +static const ALIGN_ASSET(2) char gPocketCuccoItemNameJPNTex[] = dgPocketCuccoItemNameJPNTex; + +#define dgCojiroItemNameJPNTex "__OTR__textures/item_name_static/gCojiroItemNameJPNTex" +static const ALIGN_ASSET(2) char gCojiroItemNameJPNTex[] = dgCojiroItemNameJPNTex; + +#define dgOddMushroomItemNameJPNTex "__OTR__textures/item_name_static/gOddMushroomItemNameJPNTex" +static const ALIGN_ASSET(2) char gOddMushroomItemNameJPNTex[] = dgOddMushroomItemNameJPNTex; + +#define dgOddPotionItemNameJPNTex "__OTR__textures/item_name_static/gOddPotionItemNameJPNTex" +static const ALIGN_ASSET(2) char gOddPotionItemNameJPNTex[] = dgOddPotionItemNameJPNTex; + +#define dgPoachersSawItemNameJPNTex "__OTR__textures/item_name_static/gPoachersSawItemNameJPNTex" +static const ALIGN_ASSET(2) char gPoachersSawItemNameJPNTex[] = dgPoachersSawItemNameJPNTex; + +#define dgBrokenGoronsSwordItemNameJPNTex "__OTR__textures/item_name_static/gBrokenGoronsSwordItemNameJPNTex" +static const ALIGN_ASSET(2) char gBrokenGoronsSwordItemNameJPNTex[] = dgBrokenGoronsSwordItemNameJPNTex; + +#define dgPrescriptionItemNameJPNTex "__OTR__textures/item_name_static/gPrescriptionItemNameJPNTex" +static const ALIGN_ASSET(2) char gPrescriptionItemNameJPNTex[] = dgPrescriptionItemNameJPNTex; + +#define dgEyeBallFrogItemNameJPNTex "__OTR__textures/item_name_static/gEyeBallFrogItemNameJPNTex" +static const ALIGN_ASSET(2) char gEyeBallFrogItemNameJPNTex[] = dgEyeBallFrogItemNameJPNTex; + +#define dgEyeDropsItemNameJPNTex "__OTR__textures/item_name_static/gEyeDropsItemNameJPNTex" +static const ALIGN_ASSET(2) char gEyeDropsItemNameJPNTex[] = dgEyeDropsItemNameJPNTex; + +#define dgClaimCheckItemNameJPNTex "__OTR__textures/item_name_static/gClaimCheckItemNameJPNTex" +static const ALIGN_ASSET(2) char gClaimCheckItemNameJPNTex[] = dgClaimCheckItemNameJPNTex; + +#define dgKokiriSwordItemNameJPNTex "__OTR__textures/item_name_static/gKokiriSwordItemNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriSwordItemNameJPNTex[] = dgKokiriSwordItemNameJPNTex; + +#define dgMasterSwordItemNameJPNTex "__OTR__textures/item_name_static/gMasterSwordItemNameJPNTex" +static const ALIGN_ASSET(2) char gMasterSwordItemNameJPNTex[] = dgMasterSwordItemNameJPNTex; + +#define dgGiantsKnifeItemNameJPNTex "__OTR__textures/item_name_static/gGiantsKnifeItemNameJPNTex" +static const ALIGN_ASSET(2) char gGiantsKnifeItemNameJPNTex[] = dgGiantsKnifeItemNameJPNTex; + +#define dgDekuShieldItemNameJPNTex "__OTR__textures/item_name_static/gDekuShieldItemNameJPNTex" +static const ALIGN_ASSET(2) char gDekuShieldItemNameJPNTex[] = dgDekuShieldItemNameJPNTex; + +#define dgHylianShieldItemNameJPNTex "__OTR__textures/item_name_static/gHylianShieldItemNameJPNTex" +static const ALIGN_ASSET(2) char gHylianShieldItemNameJPNTex[] = dgHylianShieldItemNameJPNTex; + +#define dgMirrorShieldItemNameJPNTex "__OTR__textures/item_name_static/gMirrorShieldItemNameJPNTex" +static const ALIGN_ASSET(2) char gMirrorShieldItemNameJPNTex[] = dgMirrorShieldItemNameJPNTex; + +#define dgKokiriTunicItemNameJPNTex "__OTR__textures/item_name_static/gKokiriTunicItemNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriTunicItemNameJPNTex[] = dgKokiriTunicItemNameJPNTex; + +#define dgGoronTunicItemNameJPNTex "__OTR__textures/item_name_static/gGoronTunicItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoronTunicItemNameJPNTex[] = dgGoronTunicItemNameJPNTex; + +#define dgZoraTunicItemNameJPNTex "__OTR__textures/item_name_static/gZoraTunicItemNameJPNTex" +static const ALIGN_ASSET(2) char gZoraTunicItemNameJPNTex[] = dgZoraTunicItemNameJPNTex; + +#define dgKokiriBootsItemNameJPNTex "__OTR__textures/item_name_static/gKokiriBootsItemNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriBootsItemNameJPNTex[] = dgKokiriBootsItemNameJPNTex; + +#define dgIronBootsItemNameJPNTex "__OTR__textures/item_name_static/gIronBootsItemNameJPNTex" +static const ALIGN_ASSET(2) char gIronBootsItemNameJPNTex[] = dgIronBootsItemNameJPNTex; + +#define dgHoverBootsItemNameJPNTex "__OTR__textures/item_name_static/gHoverBootsItemNameJPNTex" +static const ALIGN_ASSET(2) char gHoverBootsItemNameJPNTex[] = dgHoverBootsItemNameJPNTex; + +#define dgBulletBag30ItemNameJPNTex "__OTR__textures/item_name_static/gBulletBag30ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBulletBag30ItemNameJPNTex[] = dgBulletBag30ItemNameJPNTex; + +#define dgBulletBag40ItemNameJPNTex "__OTR__textures/item_name_static/gBulletBag40ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBulletBag40ItemNameJPNTex[] = dgBulletBag40ItemNameJPNTex; + +#define dgBulletBag50ItemNameJPNTex "__OTR__textures/item_name_static/gBulletBag50ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBulletBag50ItemNameJPNTex[] = dgBulletBag50ItemNameJPNTex; + +#define dgQuiver30ItemNameJPNTex "__OTR__textures/item_name_static/gQuiver30ItemNameJPNTex" +static const ALIGN_ASSET(2) char gQuiver30ItemNameJPNTex[] = dgQuiver30ItemNameJPNTex; + +#define dgQuiver40ItemNameJPNTex "__OTR__textures/item_name_static/gQuiver40ItemNameJPNTex" +static const ALIGN_ASSET(2) char gQuiver40ItemNameJPNTex[] = dgQuiver40ItemNameJPNTex; + +#define dgQuiver50ItemNameJPNTex "__OTR__textures/item_name_static/gQuiver50ItemNameJPNTex" +static const ALIGN_ASSET(2) char gQuiver50ItemNameJPNTex[] = dgQuiver50ItemNameJPNTex; + +#define dgBombBag20ItemNameJPNTex "__OTR__textures/item_name_static/gBombBag20ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBombBag20ItemNameJPNTex[] = dgBombBag20ItemNameJPNTex; + +#define dgBombBag30ItemNameJPNTex "__OTR__textures/item_name_static/gBombBag30ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBombBag30ItemNameJPNTex[] = dgBombBag30ItemNameJPNTex; + +#define dgBombBag40ItemNameJPNTex "__OTR__textures/item_name_static/gBombBag40ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBombBag40ItemNameJPNTex[] = dgBombBag40ItemNameJPNTex; + +#define dgGoronsBraceletItemNameJPNTex "__OTR__textures/item_name_static/gGoronsBraceletItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoronsBraceletItemNameJPNTex[] = dgGoronsBraceletItemNameJPNTex; + +#define dgSilverGauntletsItemNameJPNTex "__OTR__textures/item_name_static/gSilverGauntletsItemNameJPNTex" +static const ALIGN_ASSET(2) char gSilverGauntletsItemNameJPNTex[] = dgSilverGauntletsItemNameJPNTex; + +#define dgGoldenGauntletsItemNameJPNTex "__OTR__textures/item_name_static/gGoldenGauntletsItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoldenGauntletsItemNameJPNTex[] = dgGoldenGauntletsItemNameJPNTex; + +#define dgSilverScaleItemNameJPNTex "__OTR__textures/item_name_static/gSilverScaleItemNameJPNTex" +static const ALIGN_ASSET(2) char gSilverScaleItemNameJPNTex[] = dgSilverScaleItemNameJPNTex; + +#define dgGoldenScaleItemNameJPNTex "__OTR__textures/item_name_static/gGoldenScaleItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoldenScaleItemNameJPNTex[] = dgGoldenScaleItemNameJPNTex; + +#define dgBrokenGiantsKnifeItemNameJPNTex "__OTR__textures/item_name_static/gBrokenGiantsKnifeItemNameJPNTex" +static const ALIGN_ASSET(2) char gBrokenGiantsKnifeItemNameJPNTex[] = dgBrokenGiantsKnifeItemNameJPNTex; + +#define dgMinuetOfForestItemNameJPNTex "__OTR__textures/item_name_static/gMinuetOfForestItemNameJPNTex" +static const ALIGN_ASSET(2) char gMinuetOfForestItemNameJPNTex[] = dgMinuetOfForestItemNameJPNTex; + +#define dgBoleroOfFireItemNameJPNTex "__OTR__textures/item_name_static/gBoleroOfFireItemNameJPNTex" +static const ALIGN_ASSET(2) char gBoleroOfFireItemNameJPNTex[] = dgBoleroOfFireItemNameJPNTex; + +#define dgSerenadeOfWaterItemNameJPNTex "__OTR__textures/item_name_static/gSerenadeOfWaterItemNameJPNTex" +static const ALIGN_ASSET(2) char gSerenadeOfWaterItemNameJPNTex[] = dgSerenadeOfWaterItemNameJPNTex; + +#define dgRequiemOfSpiritItemNameJPNTex "__OTR__textures/item_name_static/gRequiemOfSpiritItemNameJPNTex" +static const ALIGN_ASSET(2) char gRequiemOfSpiritItemNameJPNTex[] = dgRequiemOfSpiritItemNameJPNTex; + +#define dgNocturneOfShadowItemNameJPNTex "__OTR__textures/item_name_static/gNocturneOfShadowItemNameJPNTex" +static const ALIGN_ASSET(2) char gNocturneOfShadowItemNameJPNTex[] = dgNocturneOfShadowItemNameJPNTex; + +#define dgPreludeOfLightItemNameJPNTex "__OTR__textures/item_name_static/gPreludeOfLightItemNameJPNTex" +static const ALIGN_ASSET(2) char gPreludeOfLightItemNameJPNTex[] = dgPreludeOfLightItemNameJPNTex; + +#define dgZeldasLullabyItemNameJPNTex "__OTR__textures/item_name_static/gZeldasLullabyItemNameJPNTex" +static const ALIGN_ASSET(2) char gZeldasLullabyItemNameJPNTex[] = dgZeldasLullabyItemNameJPNTex; + +#define dgEponasSongItemNameJPNTex "__OTR__textures/item_name_static/gEponasSongItemNameJPNTex" +static const ALIGN_ASSET(2) char gEponasSongItemNameJPNTex[] = dgEponasSongItemNameJPNTex; + +#define dgSariasSongItemNameJPNTex "__OTR__textures/item_name_static/gSariasSongItemNameJPNTex" +static const ALIGN_ASSET(2) char gSariasSongItemNameJPNTex[] = dgSariasSongItemNameJPNTex; + +#define dgSunsSongItemNameJPNTex "__OTR__textures/item_name_static/gSunsSongItemNameJPNTex" +static const ALIGN_ASSET(2) char gSunsSongItemNameJPNTex[] = dgSunsSongItemNameJPNTex; + +#define dgSongOfTimeItemNameJPNTex "__OTR__textures/item_name_static/gSongOfTimeItemNameJPNTex" +static const ALIGN_ASSET(2) char gSongOfTimeItemNameJPNTex[] = dgSongOfTimeItemNameJPNTex; + +#define dgSongOfStormsItemNameJPNTex "__OTR__textures/item_name_static/gSongOfStormsItemNameJPNTex" +static const ALIGN_ASSET(2) char gSongOfStormsItemNameJPNTex[] = dgSongOfStormsItemNameJPNTex; + +#define dgForestMedallionItemNameJPNTex "__OTR__textures/item_name_static/gForestMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gForestMedallionItemNameJPNTex[] = dgForestMedallionItemNameJPNTex; + +#define dgFireMedallionItemNameJPNTex "__OTR__textures/item_name_static/gFireMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gFireMedallionItemNameJPNTex[] = dgFireMedallionItemNameJPNTex; + +#define dgWaterMedallionItemNameJPNTex "__OTR__textures/item_name_static/gWaterMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gWaterMedallionItemNameJPNTex[] = dgWaterMedallionItemNameJPNTex; + +#define dgSpiritMedallionItemNameJPNTex "__OTR__textures/item_name_static/gSpiritMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gSpiritMedallionItemNameJPNTex[] = dgSpiritMedallionItemNameJPNTex; + +#define dgShadowMedallionItemNameJPNTex "__OTR__textures/item_name_static/gShadowMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gShadowMedallionItemNameJPNTex[] = dgShadowMedallionItemNameJPNTex; + +#define dgLightMedallionItemNameJPNTex "__OTR__textures/item_name_static/gLightMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gLightMedallionItemNameJPNTex[] = dgLightMedallionItemNameJPNTex; + +#define dgKokiriEmeraldItemNameJPNTex "__OTR__textures/item_name_static/gKokiriEmeraldItemNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriEmeraldItemNameJPNTex[] = dgKokiriEmeraldItemNameJPNTex; + +#define dgGoronsRubyItemNameJPNTex "__OTR__textures/item_name_static/gGoronsRubyItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoronsRubyItemNameJPNTex[] = dgGoronsRubyItemNameJPNTex; + +#define dgZorasSapphireItemNameJPNTex "__OTR__textures/item_name_static/gZorasSapphireItemNameJPNTex" +static const ALIGN_ASSET(2) char gZorasSapphireItemNameJPNTex[] = dgZorasSapphireItemNameJPNTex; + +#define dgStoneofAgonyItemNameJPNTex "__OTR__textures/item_name_static/gStoneofAgonyItemNameJPNTex" +static const ALIGN_ASSET(2) char gStoneofAgonyItemNameJPNTex[] = dgStoneofAgonyItemNameJPNTex; + +#define dgGerudosCardItemNameJPNTex "__OTR__textures/item_name_static/gGerudosCardItemNameJPNTex" +static const ALIGN_ASSET(2) char gGerudosCardItemNameJPNTex[] = dgGerudosCardItemNameJPNTex; + +#define dgGoldSkulltulaItemNameJPNTex "__OTR__textures/item_name_static/gGoldSkulltulaItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoldSkulltulaItemNameJPNTex[] = dgGoldSkulltulaItemNameJPNTex; + +#define dgPieceOfHeartItemNameJPNTex "__OTR__textures/item_name_static/gPieceOfHeartItemNameJPNTex" +static const ALIGN_ASSET(2) char gPieceOfHeartItemNameJPNTex[] = dgPieceOfHeartItemNameJPNTex; + +#define dgUnusedBigKeyItemNameJPNTex "__OTR__textures/item_name_static/gUnusedBigKeyItemNameJPNTex" +static const ALIGN_ASSET(2) char gUnusedBigKeyItemNameJPNTex[] = dgUnusedBigKeyItemNameJPNTex; + +#define dgCompassItemNameJPNTex "__OTR__textures/item_name_static/gCompassItemNameJPNTex" +static const ALIGN_ASSET(2) char gCompassItemNameJPNTex[] = dgCompassItemNameJPNTex; + +#define dgDungeonMapItemNameJPNTex "__OTR__textures/item_name_static/gDungeonMapItemNameJPNTex" +static const ALIGN_ASSET(2) char gDungeonMapItemNameJPNTex[] = dgDungeonMapItemNameJPNTex; + +#define dgBiggoronsSwordItemNameJPNTex "__OTR__textures/item_name_static/gBiggoronsSwordItemNameJPNTex" +static const ALIGN_ASSET(2) char gBiggoronsSwordItemNameJPNTex[] = dgBiggoronsSwordItemNameJPNTex; + #endif // TEXTURES_ITEM_NAME_STATIC_H diff --git a/soh/assets/textures/kanji/kanji.h b/soh/assets/textures/kanji/kanji.h new file mode 100644 index 0000000000..4f961601ec --- /dev/null +++ b/soh/assets/textures/kanji/kanji.h @@ -0,0 +1,11927 @@ +#ifndef INTERFACE_KANJI_H +#define INTERFACE_KANJI_H 1 + +#include "align_asset_macro.h" + +#define dgMsgKanji8140SpaceTex "__OTR__textures/kanji/gMsgKanji8140SpaceTex" +static const ALIGN_ASSET(2) char gMsgKanji8140SpaceTex[] = dgMsgKanji8140SpaceTex; + +#define dgMsgKanji8141ToutenTex "__OTR__textures/kanji/gMsgKanji8141ToutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8141ToutenTex[] = dgMsgKanji8141ToutenTex; + +#define dgMsgKanji8142KutenTex "__OTR__textures/kanji/gMsgKanji8142KutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8142KutenTex[] = dgMsgKanji8142KutenTex; + +#define dgMsgKanji8143CommaTex "__OTR__textures/kanji/gMsgKanji8143CommaTex" +static const ALIGN_ASSET(2) char gMsgKanji8143CommaTex[] = dgMsgKanji8143CommaTex; + +#define dgMsgKanji8144PeriodTex "__OTR__textures/kanji/gMsgKanji8144PeriodTex" +static const ALIGN_ASSET(2) char gMsgKanji8144PeriodTex[] = dgMsgKanji8144PeriodTex; + +#define dgMsgKanji8145NakatenTex "__OTR__textures/kanji/gMsgKanji8145NakatenTex" +static const ALIGN_ASSET(2) char gMsgKanji8145NakatenTex[] = dgMsgKanji8145NakatenTex; + +#define dgMsgKanji8146ColonTex "__OTR__textures/kanji/gMsgKanji8146ColonTex" +static const ALIGN_ASSET(2) char gMsgKanji8146ColonTex[] = dgMsgKanji8146ColonTex; + +#define dgMsgKanji8147SemicolonTex "__OTR__textures/kanji/gMsgKanji8147SemicolonTex" +static const ALIGN_ASSET(2) char gMsgKanji8147SemicolonTex[] = dgMsgKanji8147SemicolonTex; + +#define dgMsgKanji8148QuestionMarkTex "__OTR__textures/kanji/gMsgKanji8148QuestionMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji8148QuestionMarkTex[] = dgMsgKanji8148QuestionMarkTex; + +#define dgMsgKanji8149ExclamationMarkTex "__OTR__textures/kanji/gMsgKanji8149ExclamationMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji8149ExclamationMarkTex[] = dgMsgKanji8149ExclamationMarkTex; + +#define dgMsgKanji814ADakutenTex "__OTR__textures/kanji/gMsgKanji814ADakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji814ADakutenTex[] = dgMsgKanji814ADakutenTex; + +#define dgMsgKanji814BHandakutenTex "__OTR__textures/kanji/gMsgKanji814BHandakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji814BHandakutenTex[] = dgMsgKanji814BHandakutenTex; + +#define dgMsgKanji814CAcuteAccentTex "__OTR__textures/kanji/gMsgKanji814CAcuteAccentTex" +static const ALIGN_ASSET(2) char gMsgKanji814CAcuteAccentTex[] = dgMsgKanji814CAcuteAccentTex; + +#define dgMsgKanji814DGraveAccentTex "__OTR__textures/kanji/gMsgKanji814DGraveAccentTex" +static const ALIGN_ASSET(2) char gMsgKanji814DGraveAccentTex[] = dgMsgKanji814DGraveAccentTex; + +#define dgMsgKanji814EDiaeresisTex "__OTR__textures/kanji/gMsgKanji814EDiaeresisTex" +static const ALIGN_ASSET(2) char gMsgKanji814EDiaeresisTex[] = dgMsgKanji814EDiaeresisTex; + +#define dgMsgKanji814FCircumflexAccentTex "__OTR__textures/kanji/gMsgKanji814FCircumflexAccentTex" +static const ALIGN_ASSET(2) char gMsgKanji814FCircumflexAccentTex[] = dgMsgKanji814FCircumflexAccentTex; + +#define dgMsgKanji8150EmptyTex "__OTR__textures/kanji/gMsgKanji8150EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8150EmptyTex[] = dgMsgKanji8150EmptyTex; + +#define dgMsgKanji8151EmptyTex "__OTR__textures/kanji/gMsgKanji8151EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8151EmptyTex[] = dgMsgKanji8151EmptyTex; + +#define dgMsgKanji8152IchinojitenKatakanaTex "__OTR__textures/kanji/gMsgKanji8152IchinojitenKatakanaTex" +static const ALIGN_ASSET(2) char gMsgKanji8152IchinojitenKatakanaTex[] = dgMsgKanji8152IchinojitenKatakanaTex; + +#define dgMsgKanji8153IchinojitenKatakanaDakutenTex "__OTR__textures/kanji/gMsgKanji8153IchinojitenKatakanaDakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8153IchinojitenKatakanaDakutenTex[] = dgMsgKanji8153IchinojitenKatakanaDakutenTex; + +#define dgMsgKanji8154IchinojitenHiraganaTex "__OTR__textures/kanji/gMsgKanji8154IchinojitenHiraganaTex" +static const ALIGN_ASSET(2) char gMsgKanji8154IchinojitenHiraganaTex[] = dgMsgKanji8154IchinojitenHiraganaTex; + +#define dgMsgKanji8155IchinojitenHiraganaDakutenTex "__OTR__textures/kanji/gMsgKanji8155IchinojitenHiraganaDakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8155IchinojitenHiraganaDakutenTex[] = dgMsgKanji8155IchinojitenHiraganaDakutenTex; + +#define dgMsgKanji8156NonojitenTex "__OTR__textures/kanji/gMsgKanji8156NonojitenTex" +static const ALIGN_ASSET(2) char gMsgKanji8156NonojitenTex[] = dgMsgKanji8156NonojitenTex; + +#define dgMsgKanji8157Tex "__OTR__textures/kanji/gMsgKanji8157Tex" +static const ALIGN_ASSET(2) char gMsgKanji8157Tex[] = dgMsgKanji8157Tex; + +#define dgMsgKanji8158DounojitenTex "__OTR__textures/kanji/gMsgKanji8158DounojitenTex" +static const ALIGN_ASSET(2) char gMsgKanji8158DounojitenTex[] = dgMsgKanji8158DounojitenTex; + +#define dgMsgKanji8159ShimeTex "__OTR__textures/kanji/gMsgKanji8159ShimeTex" +static const ALIGN_ASSET(2) char gMsgKanji8159ShimeTex[] = dgMsgKanji8159ShimeTex; + +#define dgMsgKanji815AZeroTex "__OTR__textures/kanji/gMsgKanji815AZeroTex" +static const ALIGN_ASSET(2) char gMsgKanji815AZeroTex[] = dgMsgKanji815AZeroTex; + +#define dgMsgKanji815BChouonpuTex "__OTR__textures/kanji/gMsgKanji815BChouonpuTex" +static const ALIGN_ASSET(2) char gMsgKanji815BChouonpuTex[] = dgMsgKanji815BChouonpuTex; + +#define dgMsgKanji815CDashTex "__OTR__textures/kanji/gMsgKanji815CDashTex" +static const ALIGN_ASSET(2) char gMsgKanji815CDashTex[] = dgMsgKanji815CDashTex; + +#define dgMsgKanji815DHyphenTex "__OTR__textures/kanji/gMsgKanji815DHyphenTex" +static const ALIGN_ASSET(2) char gMsgKanji815DHyphenTex[] = dgMsgKanji815DHyphenTex; + +#define dgMsgKanji815ESlashTex "__OTR__textures/kanji/gMsgKanji815ESlashTex" +static const ALIGN_ASSET(2) char gMsgKanji815ESlashTex[] = dgMsgKanji815ESlashTex; + +#define dgMsgKanji815FBackSlashTex "__OTR__textures/kanji/gMsgKanji815FBackSlashTex" +static const ALIGN_ASSET(2) char gMsgKanji815FBackSlashTex[] = dgMsgKanji815FBackSlashTex; + +#define dgMsgKanji8160WaveDashTex "__OTR__textures/kanji/gMsgKanji8160WaveDashTex" +static const ALIGN_ASSET(2) char gMsgKanji8160WaveDashTex[] = dgMsgKanji8160WaveDashTex; + +#define dgMsgKanji8161DoubleVerticalLineTex "__OTR__textures/kanji/gMsgKanji8161DoubleVerticalLineTex" +static const ALIGN_ASSET(2) char gMsgKanji8161DoubleVerticalLineTex[] = dgMsgKanji8161DoubleVerticalLineTex; + +#define dgMsgKanji8162VerticalLineTex "__OTR__textures/kanji/gMsgKanji8162VerticalLineTex" +static const ALIGN_ASSET(2) char gMsgKanji8162VerticalLineTex[] = dgMsgKanji8162VerticalLineTex; + +#define dgMsgKanji8163SantenLeaderTex "__OTR__textures/kanji/gMsgKanji8163SantenLeaderTex" +static const ALIGN_ASSET(2) char gMsgKanji8163SantenLeaderTex[] = dgMsgKanji8163SantenLeaderTex; + +#define dgMsgKanji8164NitenLeaderTex "__OTR__textures/kanji/gMsgKanji8164NitenLeaderTex" +static const ALIGN_ASSET(2) char gMsgKanji8164NitenLeaderTex[] = dgMsgKanji8164NitenLeaderTex; + +#define dgMsgKanji8165SingleQuotationMarkLeftTex "__OTR__textures/kanji/gMsgKanji8165SingleQuotationMarkLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8165SingleQuotationMarkLeftTex[] = dgMsgKanji8165SingleQuotationMarkLeftTex; + +#define dgMsgKanji8166SingleQuotationMarkRightTex "__OTR__textures/kanji/gMsgKanji8166SingleQuotationMarkRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8166SingleQuotationMarkRightTex[] = dgMsgKanji8166SingleQuotationMarkRightTex; + +#define dgMsgKanji8167DoubleQuotationMarkLeftTex "__OTR__textures/kanji/gMsgKanji8167DoubleQuotationMarkLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8167DoubleQuotationMarkLeftTex[] = dgMsgKanji8167DoubleQuotationMarkLeftTex; + +#define dgMsgKanji8168DoubleQuotationMarkRightTex "__OTR__textures/kanji/gMsgKanji8168DoubleQuotationMarkRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8168DoubleQuotationMarkRightTex[] = dgMsgKanji8168DoubleQuotationMarkRightTex; + +#define dgMsgKanji8169ParenthesesLeftTex "__OTR__textures/kanji/gMsgKanji8169ParenthesesLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8169ParenthesesLeftTex[] = dgMsgKanji8169ParenthesesLeftTex; + +#define dgMsgKanji816AParenthesesRightTex "__OTR__textures/kanji/gMsgKanji816AParenthesesRightTex" +static const ALIGN_ASSET(2) char gMsgKanji816AParenthesesRightTex[] = dgMsgKanji816AParenthesesRightTex; + +#define dgMsgKanji816BKikkoukakkoLeftTex "__OTR__textures/kanji/gMsgKanji816BKikkoukakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji816BKikkoukakkoLeftTex[] = dgMsgKanji816BKikkoukakkoLeftTex; + +#define dgMsgKanji816CKikkoukakkoRightTex "__OTR__textures/kanji/gMsgKanji816CKikkoukakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji816CKikkoukakkoRightTex[] = dgMsgKanji816CKikkoukakkoRightTex; + +#define dgMsgKanji816DSquareBracketLeftTex "__OTR__textures/kanji/gMsgKanji816DSquareBracketLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji816DSquareBracketLeftTex[] = dgMsgKanji816DSquareBracketLeftTex; + +#define dgMsgKanji816ESquareBracketRightTex "__OTR__textures/kanji/gMsgKanji816ESquareBracketRightTex" +static const ALIGN_ASSET(2) char gMsgKanji816ESquareBracketRightTex[] = dgMsgKanji816ESquareBracketRightTex; + +#define dgMsgKanji816FCurlyBracketLeftTex "__OTR__textures/kanji/gMsgKanji816FCurlyBracketLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji816FCurlyBracketLeftTex[] = dgMsgKanji816FCurlyBracketLeftTex; + +#define dgMsgKanji8170CurlyBracketRightTex "__OTR__textures/kanji/gMsgKanji8170CurlyBracketRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8170CurlyBracketRightTex[] = dgMsgKanji8170CurlyBracketRightTex; + +#define dgMsgKanji8171YamakakkoLeftTex "__OTR__textures/kanji/gMsgKanji8171YamakakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8171YamakakkoLeftTex[] = dgMsgKanji8171YamakakkoLeftTex; + +#define dgMsgKanji8172YamakakkoRightTex "__OTR__textures/kanji/gMsgKanji8172YamakakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8172YamakakkoRightTex[] = dgMsgKanji8172YamakakkoRightTex; + +#define dgMsgKanji8173NijyuuyamakakkoLeftTex "__OTR__textures/kanji/gMsgKanji8173NijyuuyamakakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8173NijyuuyamakakkoLeftTex[] = dgMsgKanji8173NijyuuyamakakkoLeftTex; + +#define dgMsgKanji8174NijyuuyamakakkoRightTex "__OTR__textures/kanji/gMsgKanji8174NijyuuyamakakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8174NijyuuyamakakkoRightTex[] = dgMsgKanji8174NijyuuyamakakkoRightTex; + +#define dgMsgKanji8175KagikakkoLeftTex "__OTR__textures/kanji/gMsgKanji8175KagikakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8175KagikakkoLeftTex[] = dgMsgKanji8175KagikakkoLeftTex; + +#define dgMsgKanji8176KagikakkoRightTex "__OTR__textures/kanji/gMsgKanji8176KagikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8176KagikakkoRightTex[] = dgMsgKanji8176KagikakkoRightTex; + +#define dgMsgKanji8177NijyuukagikakkoLeftTex "__OTR__textures/kanji/gMsgKanji8177NijyuukagikakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8177NijyuukagikakkoLeftTex[] = dgMsgKanji8177NijyuukagikakkoLeftTex; + +#define dgMsgKanji8178NijyuukagikakkoRightTex "__OTR__textures/kanji/gMsgKanji8178NijyuukagikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8178NijyuukagikakkoRightTex[] = dgMsgKanji8178NijyuukagikakkoRightTex; + +#define dgMsgKanji8179SumitsukikakkoLeftTex "__OTR__textures/kanji/gMsgKanji8179SumitsukikakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8179SumitsukikakkoLeftTex[] = dgMsgKanji8179SumitsukikakkoLeftTex; + +#define dgMsgKanji817ASumitsukikakkoRightTex "__OTR__textures/kanji/gMsgKanji817ASumitsukikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji817ASumitsukikakkoRightTex[] = dgMsgKanji817ASumitsukikakkoRightTex; + +#define dgMsgKanji817BPlusSignTex "__OTR__textures/kanji/gMsgKanji817BPlusSignTex" +static const ALIGN_ASSET(2) char gMsgKanji817BPlusSignTex[] = dgMsgKanji817BPlusSignTex; + +#define dgMsgKanji817CMinusSignTex "__OTR__textures/kanji/gMsgKanji817CMinusSignTex" +static const ALIGN_ASSET(2) char gMsgKanji817CMinusSignTex[] = dgMsgKanji817CMinusSignTex; + +#define dgMsgKanji817DPlusMinusSignTex "__OTR__textures/kanji/gMsgKanji817DPlusMinusSignTex" +static const ALIGN_ASSET(2) char gMsgKanji817DPlusMinusSignTex[] = dgMsgKanji817DPlusMinusSignTex; + +#define dgMsgKanji817EMultiplicationSignTex "__OTR__textures/kanji/gMsgKanji817EMultiplicationSignTex" +static const ALIGN_ASSET(2) char gMsgKanji817EMultiplicationSignTex[] = dgMsgKanji817EMultiplicationSignTex; + +#define dgMsgKanji8180DivisionSignTex "__OTR__textures/kanji/gMsgKanji8180DivisionSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8180DivisionSignTex[] = dgMsgKanji8180DivisionSignTex; + +#define dgMsgKanji8181EqualsSignTex "__OTR__textures/kanji/gMsgKanji8181EqualsSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8181EqualsSignTex[] = dgMsgKanji8181EqualsSignTex; + +#define dgMsgKanji8182NotEqualSignTex "__OTR__textures/kanji/gMsgKanji8182NotEqualSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8182NotEqualSignTex[] = dgMsgKanji8182NotEqualSignTex; + +#define dgMsgKanji8183LessThanSignTex "__OTR__textures/kanji/gMsgKanji8183LessThanSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8183LessThanSignTex[] = dgMsgKanji8183LessThanSignTex; + +#define dgMsgKanji8184GreaterThanSignTex "__OTR__textures/kanji/gMsgKanji8184GreaterThanSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8184GreaterThanSignTex[] = dgMsgKanji8184GreaterThanSignTex; + +#define dgMsgKanji8185LessThanOrEqualToTex "__OTR__textures/kanji/gMsgKanji8185LessThanOrEqualToTex" +static const ALIGN_ASSET(2) char gMsgKanji8185LessThanOrEqualToTex[] = dgMsgKanji8185LessThanOrEqualToTex; + +#define dgMsgKanji8186GreaterThanOrEqualToTex "__OTR__textures/kanji/gMsgKanji8186GreaterThanOrEqualToTex" +static const ALIGN_ASSET(2) char gMsgKanji8186GreaterThanOrEqualToTex[] = dgMsgKanji8186GreaterThanOrEqualToTex; + +#define dgMsgKanji8187InfinityTex "__OTR__textures/kanji/gMsgKanji8187InfinityTex" +static const ALIGN_ASSET(2) char gMsgKanji8187InfinityTex[] = dgMsgKanji8187InfinityTex; + +#define dgMsgKanji8188ThereforeTex "__OTR__textures/kanji/gMsgKanji8188ThereforeTex" +static const ALIGN_ASSET(2) char gMsgKanji8188ThereforeTex[] = dgMsgKanji8188ThereforeTex; + +#define dgMsgKanji8189MaleTex "__OTR__textures/kanji/gMsgKanji8189MaleTex" +static const ALIGN_ASSET(2) char gMsgKanji8189MaleTex[] = dgMsgKanji8189MaleTex; + +#define dgMsgKanji818AFemaleTex "__OTR__textures/kanji/gMsgKanji818AFemaleTex" +static const ALIGN_ASSET(2) char gMsgKanji818AFemaleTex[] = dgMsgKanji818AFemaleTex; + +#define dgMsgKanji818BDegreeSignTex "__OTR__textures/kanji/gMsgKanji818BDegreeSignTex" +static const ALIGN_ASSET(2) char gMsgKanji818BDegreeSignTex[] = dgMsgKanji818BDegreeSignTex; + +#define dgMsgKanji818CPrimeTex "__OTR__textures/kanji/gMsgKanji818CPrimeTex" +static const ALIGN_ASSET(2) char gMsgKanji818CPrimeTex[] = dgMsgKanji818CPrimeTex; + +#define dgMsgKanji818DDoublePrimeTex "__OTR__textures/kanji/gMsgKanji818DDoublePrimeTex" +static const ALIGN_ASSET(2) char gMsgKanji818DDoublePrimeTex[] = dgMsgKanji818DDoublePrimeTex; + +#define dgMsgKanji818ECelciusTex "__OTR__textures/kanji/gMsgKanji818ECelciusTex" +static const ALIGN_ASSET(2) char gMsgKanji818ECelciusTex[] = dgMsgKanji818ECelciusTex; + +#define dgMsgKanji818FYenSignTex "__OTR__textures/kanji/gMsgKanji818FYenSignTex" +static const ALIGN_ASSET(2) char gMsgKanji818FYenSignTex[] = dgMsgKanji818FYenSignTex; + +#define dgMsgKanji8190DollarSignTex "__OTR__textures/kanji/gMsgKanji8190DollarSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8190DollarSignTex[] = dgMsgKanji8190DollarSignTex; + +#define dgMsgKanji8191CentSignTex "__OTR__textures/kanji/gMsgKanji8191CentSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8191CentSignTex[] = dgMsgKanji8191CentSignTex; + +#define dgMsgKanji8192PoundSignTex "__OTR__textures/kanji/gMsgKanji8192PoundSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8192PoundSignTex[] = dgMsgKanji8192PoundSignTex; + +#define dgMsgKanji8193PercentSignTex "__OTR__textures/kanji/gMsgKanji8193PercentSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8193PercentSignTex[] = dgMsgKanji8193PercentSignTex; + +#define dgMsgKanji8194NumberSignTex "__OTR__textures/kanji/gMsgKanji8194NumberSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8194NumberSignTex[] = dgMsgKanji8194NumberSignTex; + +#define dgMsgKanji8195AmpersandTex "__OTR__textures/kanji/gMsgKanji8195AmpersandTex" +static const ALIGN_ASSET(2) char gMsgKanji8195AmpersandTex[] = dgMsgKanji8195AmpersandTex; + +#define dgMsgKanji8196AsteriskTex "__OTR__textures/kanji/gMsgKanji8196AsteriskTex" +static const ALIGN_ASSET(2) char gMsgKanji8196AsteriskTex[] = dgMsgKanji8196AsteriskTex; + +#define dgMsgKanji8197AtSignTex "__OTR__textures/kanji/gMsgKanji8197AtSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8197AtSignTex[] = dgMsgKanji8197AtSignTex; + +#define dgMsgKanji8198SectionSignTex "__OTR__textures/kanji/gMsgKanji8198SectionSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8198SectionSignTex[] = dgMsgKanji8198SectionSignTex; + +#define dgMsgKanji8199WhiteStarTex "__OTR__textures/kanji/gMsgKanji8199WhiteStarTex" +static const ALIGN_ASSET(2) char gMsgKanji8199WhiteStarTex[] = dgMsgKanji8199WhiteStarTex; + +#define dgMsgKanji819ABlackStarTex "__OTR__textures/kanji/gMsgKanji819ABlackStarTex" +static const ALIGN_ASSET(2) char gMsgKanji819ABlackStarTex[] = dgMsgKanji819ABlackStarTex; + +#define dgMsgKanji819BWhiteCircleTex "__OTR__textures/kanji/gMsgKanji819BWhiteCircleTex" +static const ALIGN_ASSET(2) char gMsgKanji819BWhiteCircleTex[] = dgMsgKanji819BWhiteCircleTex; + +#define dgMsgKanji819CBlackCircleTex "__OTR__textures/kanji/gMsgKanji819CBlackCircleTex" +static const ALIGN_ASSET(2) char gMsgKanji819CBlackCircleTex[] = dgMsgKanji819CBlackCircleTex; + +#define dgMsgKanji819DDoubleCircleTex "__OTR__textures/kanji/gMsgKanji819DDoubleCircleTex" +static const ALIGN_ASSET(2) char gMsgKanji819DDoubleCircleTex[] = dgMsgKanji819DDoubleCircleTex; + +#define dgMsgKanji819EWhiteDiamondTex "__OTR__textures/kanji/gMsgKanji819EWhiteDiamondTex" +static const ALIGN_ASSET(2) char gMsgKanji819EWhiteDiamondTex[] = dgMsgKanji819EWhiteDiamondTex; + +#define dgMsgKanji819FBlackDiamondTex "__OTR__textures/kanji/gMsgKanji819FBlackDiamondTex" +static const ALIGN_ASSET(2) char gMsgKanji819FBlackDiamondTex[] = dgMsgKanji819FBlackDiamondTex; + +#define dgMsgKanji81A0WhiteSquareTex "__OTR__textures/kanji/gMsgKanji81A0WhiteSquareTex" +static const ALIGN_ASSET(2) char gMsgKanji81A0WhiteSquareTex[] = dgMsgKanji81A0WhiteSquareTex; + +#define dgMsgKanji81A1BlackSquareTex "__OTR__textures/kanji/gMsgKanji81A1BlackSquareTex" +static const ALIGN_ASSET(2) char gMsgKanji81A1BlackSquareTex[] = dgMsgKanji81A1BlackSquareTex; + +#define dgMsgKanji81A2WhiteTriangleTex "__OTR__textures/kanji/gMsgKanji81A2WhiteTriangleTex" +static const ALIGN_ASSET(2) char gMsgKanji81A2WhiteTriangleTex[] = dgMsgKanji81A2WhiteTriangleTex; + +#define dgMsgKanji81A3BlackTriangleTex "__OTR__textures/kanji/gMsgKanji81A3BlackTriangleTex" +static const ALIGN_ASSET(2) char gMsgKanji81A3BlackTriangleTex[] = dgMsgKanji81A3BlackTriangleTex; + +#define dgMsgKanji81A4WhiteInvertedTriangleTex "__OTR__textures/kanji/gMsgKanji81A4WhiteInvertedTriangleTex" +static const ALIGN_ASSET(2) char gMsgKanji81A4WhiteInvertedTriangleTex[] = dgMsgKanji81A4WhiteInvertedTriangleTex; + +#define dgMsgKanji81A5BlackInvertedTriangleTex "__OTR__textures/kanji/gMsgKanji81A5BlackInvertedTriangleTex" +static const ALIGN_ASSET(2) char gMsgKanji81A5BlackInvertedTriangleTex[] = dgMsgKanji81A5BlackInvertedTriangleTex; + +#define dgMsgKanji81A6KomejirushiTex "__OTR__textures/kanji/gMsgKanji81A6KomejirushiTex" +static const ALIGN_ASSET(2) char gMsgKanji81A6KomejirushiTex[] = dgMsgKanji81A6KomejirushiTex; + +#define dgMsgKanji81A7PostalMarkTex "__OTR__textures/kanji/gMsgKanji81A7PostalMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji81A7PostalMarkTex[] = dgMsgKanji81A7PostalMarkTex; + +#define dgMsgKanji81A8ArrowRightTex "__OTR__textures/kanji/gMsgKanji81A8ArrowRightTex" +static const ALIGN_ASSET(2) char gMsgKanji81A8ArrowRightTex[] = dgMsgKanji81A8ArrowRightTex; + +#define dgMsgKanji81A9ArrowLeftTex "__OTR__textures/kanji/gMsgKanji81A9ArrowLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji81A9ArrowLeftTex[] = dgMsgKanji81A9ArrowLeftTex; + +#define dgMsgKanji81AAArrowUpTex "__OTR__textures/kanji/gMsgKanji81AAArrowUpTex" +static const ALIGN_ASSET(2) char gMsgKanji81AAArrowUpTex[] = dgMsgKanji81AAArrowUpTex; + +#define dgMsgKanji81ABArrowDownTex "__OTR__textures/kanji/gMsgKanji81ABArrowDownTex" +static const ALIGN_ASSET(2) char gMsgKanji81ABArrowDownTex[] = dgMsgKanji81ABArrowDownTex; + +#define dgMsgKanji81ACGetaTex "__OTR__textures/kanji/gMsgKanji81ACGetaTex" +static const ALIGN_ASSET(2) char gMsgKanji81ACGetaTex[] = dgMsgKanji81ACGetaTex; + +#define dgMsgKanji81B8EmptyTex "__OTR__textures/kanji/gMsgKanji81B8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81B8EmptyTex[] = dgMsgKanji81B8EmptyTex; + +#define dgMsgKanji81B9EmptyTex "__OTR__textures/kanji/gMsgKanji81B9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81B9EmptyTex[] = dgMsgKanji81B9EmptyTex; + +#define dgMsgKanji81BAEmptyTex "__OTR__textures/kanji/gMsgKanji81BAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81BAEmptyTex[] = dgMsgKanji81BAEmptyTex; + +#define dgMsgKanji81BBEmptyTex "__OTR__textures/kanji/gMsgKanji81BBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81BBEmptyTex[] = dgMsgKanji81BBEmptyTex; + +#define dgMsgKanji81BCEmptyTex "__OTR__textures/kanji/gMsgKanji81BCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81BCEmptyTex[] = dgMsgKanji81BCEmptyTex; + +#define dgMsgKanji81BDEmptyTex "__OTR__textures/kanji/gMsgKanji81BDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81BDEmptyTex[] = dgMsgKanji81BDEmptyTex; + +#define dgMsgKanji81BEEmptyTex "__OTR__textures/kanji/gMsgKanji81BEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81BEEmptyTex[] = dgMsgKanji81BEEmptyTex; + +#define dgMsgKanji81BFIntersectionTex "__OTR__textures/kanji/gMsgKanji81BFIntersectionTex" +static const ALIGN_ASSET(2) char gMsgKanji81BFIntersectionTex[] = dgMsgKanji81BFIntersectionTex; + +#define dgMsgKanji81C8EmptyTex "__OTR__textures/kanji/gMsgKanji81C8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81C8EmptyTex[] = dgMsgKanji81C8EmptyTex; + +#define dgMsgKanji81C9EmptyTex "__OTR__textures/kanji/gMsgKanji81C9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81C9EmptyTex[] = dgMsgKanji81C9EmptyTex; + +#define dgMsgKanji81CAEmptyTex "__OTR__textures/kanji/gMsgKanji81CAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81CAEmptyTex[] = dgMsgKanji81CAEmptyTex; + +#define dgMsgKanji81CBEmptyTex "__OTR__textures/kanji/gMsgKanji81CBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81CBEmptyTex[] = dgMsgKanji81CBEmptyTex; + +#define dgMsgKanji81CCEmptyTex "__OTR__textures/kanji/gMsgKanji81CCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81CCEmptyTex[] = dgMsgKanji81CCEmptyTex; + +#define dgMsgKanji81CDEmptyTex "__OTR__textures/kanji/gMsgKanji81CDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81CDEmptyTex[] = dgMsgKanji81CDEmptyTex; + +#define dgMsgKanji81CEEmptyTex "__OTR__textures/kanji/gMsgKanji81CEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81CEEmptyTex[] = dgMsgKanji81CEEmptyTex; + +#define dgMsgKanji81DBEmptyTex "__OTR__textures/kanji/gMsgKanji81DBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81DBEmptyTex[] = dgMsgKanji81DBEmptyTex; + +#define dgMsgKanji81DCEmptyTex "__OTR__textures/kanji/gMsgKanji81DCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81DCEmptyTex[] = dgMsgKanji81DCEmptyTex; + +#define dgMsgKanji81DDEmptyTex "__OTR__textures/kanji/gMsgKanji81DDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81DDEmptyTex[] = dgMsgKanji81DDEmptyTex; + +#define dgMsgKanji81DEEmptyTex "__OTR__textures/kanji/gMsgKanji81DEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81DEEmptyTex[] = dgMsgKanji81DEEmptyTex; + +#define dgMsgKanji81DFEmptyTex "__OTR__textures/kanji/gMsgKanji81DFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81DFEmptyTex[] = dgMsgKanji81DFEmptyTex; + +#define dgMsgKanji81E0ApproximatelyEqualToTex "__OTR__textures/kanji/gMsgKanji81E0ApproximatelyEqualToTex" +static const ALIGN_ASSET(2) char gMsgKanji81E0ApproximatelyEqualToTex[] = dgMsgKanji81E0ApproximatelyEqualToTex; + +#define dgMsgKanji81E1MuchLessThanTex "__OTR__textures/kanji/gMsgKanji81E1MuchLessThanTex" +static const ALIGN_ASSET(2) char gMsgKanji81E1MuchLessThanTex[] = dgMsgKanji81E1MuchLessThanTex; + +#define dgMsgKanji81E2MuchGreaterThanTex "__OTR__textures/kanji/gMsgKanji81E2MuchGreaterThanTex" +static const ALIGN_ASSET(2) char gMsgKanji81E2MuchGreaterThanTex[] = dgMsgKanji81E2MuchGreaterThanTex; + +#define dgMsgKanji81E3SquareRootTex "__OTR__textures/kanji/gMsgKanji81E3SquareRootTex" +static const ALIGN_ASSET(2) char gMsgKanji81E3SquareRootTex[] = dgMsgKanji81E3SquareRootTex; + +#define dgMsgKanji81E4SimilarTex "__OTR__textures/kanji/gMsgKanji81E4SimilarTex" +static const ALIGN_ASSET(2) char gMsgKanji81E4SimilarTex[] = dgMsgKanji81E4SimilarTex; + +#define dgMsgKanji81E5ProportionalTex "__OTR__textures/kanji/gMsgKanji81E5ProportionalTex" +static const ALIGN_ASSET(2) char gMsgKanji81E5ProportionalTex[] = dgMsgKanji81E5ProportionalTex; + +#define dgMsgKanji81E6BecauseTex "__OTR__textures/kanji/gMsgKanji81E6BecauseTex" +static const ALIGN_ASSET(2) char gMsgKanji81E6BecauseTex[] = dgMsgKanji81E6BecauseTex; + +#define dgMsgKanji81E7IntegralTex "__OTR__textures/kanji/gMsgKanji81E7IntegralTex" +static const ALIGN_ASSET(2) char gMsgKanji81E7IntegralTex[] = dgMsgKanji81E7IntegralTex; + +#define dgMsgKanji81E8DoubleIntegralTex "__OTR__textures/kanji/gMsgKanji81E8DoubleIntegralTex" +static const ALIGN_ASSET(2) char gMsgKanji81E8DoubleIntegralTex[] = dgMsgKanji81E8DoubleIntegralTex; + +#define dgMsgKanji81F0EmptyTex "__OTR__textures/kanji/gMsgKanji81F0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F0EmptyTex[] = dgMsgKanji81F0EmptyTex; + +#define dgMsgKanji81F1EmptyTex "__OTR__textures/kanji/gMsgKanji81F1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F1EmptyTex[] = dgMsgKanji81F1EmptyTex; + +#define dgMsgKanji81F2EmptyTex "__OTR__textures/kanji/gMsgKanji81F2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F2EmptyTex[] = dgMsgKanji81F2EmptyTex; + +#define dgMsgKanji81F3EmptyTex "__OTR__textures/kanji/gMsgKanji81F3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F3EmptyTex[] = dgMsgKanji81F3EmptyTex; + +#define dgMsgKanji81F4EmptyTex "__OTR__textures/kanji/gMsgKanji81F4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F4EmptyTex[] = dgMsgKanji81F4EmptyTex; + +#define dgMsgKanji81F5EmptyTex "__OTR__textures/kanji/gMsgKanji81F5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F5EmptyTex[] = dgMsgKanji81F5EmptyTex; + +#define dgMsgKanji81F6EmptyTex "__OTR__textures/kanji/gMsgKanji81F6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F6EmptyTex[] = dgMsgKanji81F6EmptyTex; + +#define dgMsgKanji81F7EmptyTex "__OTR__textures/kanji/gMsgKanji81F7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F7EmptyTex[] = dgMsgKanji81F7EmptyTex; + +#define dgMsgKanji81FCEmptyTex "__OTR__textures/kanji/gMsgKanji81FCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81FCEmptyTex[] = dgMsgKanji81FCEmptyTex; + +#define dgMsgKanji824FZeroTex "__OTR__textures/kanji/gMsgKanji824FZeroTex" +static const ALIGN_ASSET(2) char gMsgKanji824FZeroTex[] = dgMsgKanji824FZeroTex; + +#define dgMsgKanji8250OneTex "__OTR__textures/kanji/gMsgKanji8250OneTex" +static const ALIGN_ASSET(2) char gMsgKanji8250OneTex[] = dgMsgKanji8250OneTex; + +#define dgMsgKanji8251TwoTex "__OTR__textures/kanji/gMsgKanji8251TwoTex" +static const ALIGN_ASSET(2) char gMsgKanji8251TwoTex[] = dgMsgKanji8251TwoTex; + +#define dgMsgKanji8252ThreeTex "__OTR__textures/kanji/gMsgKanji8252ThreeTex" +static const ALIGN_ASSET(2) char gMsgKanji8252ThreeTex[] = dgMsgKanji8252ThreeTex; + +#define dgMsgKanji8253FourTex "__OTR__textures/kanji/gMsgKanji8253FourTex" +static const ALIGN_ASSET(2) char gMsgKanji8253FourTex[] = dgMsgKanji8253FourTex; + +#define dgMsgKanji8254FiveTex "__OTR__textures/kanji/gMsgKanji8254FiveTex" +static const ALIGN_ASSET(2) char gMsgKanji8254FiveTex[] = dgMsgKanji8254FiveTex; + +#define dgMsgKanji8255SixTex "__OTR__textures/kanji/gMsgKanji8255SixTex" +static const ALIGN_ASSET(2) char gMsgKanji8255SixTex[] = dgMsgKanji8255SixTex; + +#define dgMsgKanji8256SevenTex "__OTR__textures/kanji/gMsgKanji8256SevenTex" +static const ALIGN_ASSET(2) char gMsgKanji8256SevenTex[] = dgMsgKanji8256SevenTex; + +#define dgMsgKanji8257EightTex "__OTR__textures/kanji/gMsgKanji8257EightTex" +static const ALIGN_ASSET(2) char gMsgKanji8257EightTex[] = dgMsgKanji8257EightTex; + +#define dgMsgKanji8258NineTex "__OTR__textures/kanji/gMsgKanji8258NineTex" +static const ALIGN_ASSET(2) char gMsgKanji8258NineTex[] = dgMsgKanji8258NineTex; + +#define dgMsgKanji8260CapitalATex "__OTR__textures/kanji/gMsgKanji8260CapitalATex" +static const ALIGN_ASSET(2) char gMsgKanji8260CapitalATex[] = dgMsgKanji8260CapitalATex; + +#define dgMsgKanji8261CapitalBTex "__OTR__textures/kanji/gMsgKanji8261CapitalBTex" +static const ALIGN_ASSET(2) char gMsgKanji8261CapitalBTex[] = dgMsgKanji8261CapitalBTex; + +#define dgMsgKanji8262CapitalCTex "__OTR__textures/kanji/gMsgKanji8262CapitalCTex" +static const ALIGN_ASSET(2) char gMsgKanji8262CapitalCTex[] = dgMsgKanji8262CapitalCTex; + +#define dgMsgKanji8263CapitalDTex "__OTR__textures/kanji/gMsgKanji8263CapitalDTex" +static const ALIGN_ASSET(2) char gMsgKanji8263CapitalDTex[] = dgMsgKanji8263CapitalDTex; + +#define dgMsgKanji8264CapitalETex "__OTR__textures/kanji/gMsgKanji8264CapitalETex" +static const ALIGN_ASSET(2) char gMsgKanji8264CapitalETex[] = dgMsgKanji8264CapitalETex; + +#define dgMsgKanji8265CapitalFTex "__OTR__textures/kanji/gMsgKanji8265CapitalFTex" +static const ALIGN_ASSET(2) char gMsgKanji8265CapitalFTex[] = dgMsgKanji8265CapitalFTex; + +#define dgMsgKanji8266CapitalGTex "__OTR__textures/kanji/gMsgKanji8266CapitalGTex" +static const ALIGN_ASSET(2) char gMsgKanji8266CapitalGTex[] = dgMsgKanji8266CapitalGTex; + +#define dgMsgKanji8267CapitalHTex "__OTR__textures/kanji/gMsgKanji8267CapitalHTex" +static const ALIGN_ASSET(2) char gMsgKanji8267CapitalHTex[] = dgMsgKanji8267CapitalHTex; + +#define dgMsgKanji8268CapitalITex "__OTR__textures/kanji/gMsgKanji8268CapitalITex" +static const ALIGN_ASSET(2) char gMsgKanji8268CapitalITex[] = dgMsgKanji8268CapitalITex; + +#define dgMsgKanji8269CapitalJTex "__OTR__textures/kanji/gMsgKanji8269CapitalJTex" +static const ALIGN_ASSET(2) char gMsgKanji8269CapitalJTex[] = dgMsgKanji8269CapitalJTex; + +#define dgMsgKanji826ACapitalKTex "__OTR__textures/kanji/gMsgKanji826ACapitalKTex" +static const ALIGN_ASSET(2) char gMsgKanji826ACapitalKTex[] = dgMsgKanji826ACapitalKTex; + +#define dgMsgKanji826BCapitalLTex "__OTR__textures/kanji/gMsgKanji826BCapitalLTex" +static const ALIGN_ASSET(2) char gMsgKanji826BCapitalLTex[] = dgMsgKanji826BCapitalLTex; + +#define dgMsgKanji826CCapitalMTex "__OTR__textures/kanji/gMsgKanji826CCapitalMTex" +static const ALIGN_ASSET(2) char gMsgKanji826CCapitalMTex[] = dgMsgKanji826CCapitalMTex; + +#define dgMsgKanji826DCapitalNTex "__OTR__textures/kanji/gMsgKanji826DCapitalNTex" +static const ALIGN_ASSET(2) char gMsgKanji826DCapitalNTex[] = dgMsgKanji826DCapitalNTex; + +#define dgMsgKanji826ECapitalOTex "__OTR__textures/kanji/gMsgKanji826ECapitalOTex" +static const ALIGN_ASSET(2) char gMsgKanji826ECapitalOTex[] = dgMsgKanji826ECapitalOTex; + +#define dgMsgKanji826FCapitalPTex "__OTR__textures/kanji/gMsgKanji826FCapitalPTex" +static const ALIGN_ASSET(2) char gMsgKanji826FCapitalPTex[] = dgMsgKanji826FCapitalPTex; + +#define dgMsgKanji8270CapitalQTex "__OTR__textures/kanji/gMsgKanji8270CapitalQTex" +static const ALIGN_ASSET(2) char gMsgKanji8270CapitalQTex[] = dgMsgKanji8270CapitalQTex; + +#define dgMsgKanji8271CapitalRTex "__OTR__textures/kanji/gMsgKanji8271CapitalRTex" +static const ALIGN_ASSET(2) char gMsgKanji8271CapitalRTex[] = dgMsgKanji8271CapitalRTex; + +#define dgMsgKanji8272CapitalSTex "__OTR__textures/kanji/gMsgKanji8272CapitalSTex" +static const ALIGN_ASSET(2) char gMsgKanji8272CapitalSTex[] = dgMsgKanji8272CapitalSTex; + +#define dgMsgKanji8273CapitalTTex "__OTR__textures/kanji/gMsgKanji8273CapitalTTex" +static const ALIGN_ASSET(2) char gMsgKanji8273CapitalTTex[] = dgMsgKanji8273CapitalTTex; + +#define dgMsgKanji8274CapitalUTex "__OTR__textures/kanji/gMsgKanji8274CapitalUTex" +static const ALIGN_ASSET(2) char gMsgKanji8274CapitalUTex[] = dgMsgKanji8274CapitalUTex; + +#define dgMsgKanji8275CapitalVTex "__OTR__textures/kanji/gMsgKanji8275CapitalVTex" +static const ALIGN_ASSET(2) char gMsgKanji8275CapitalVTex[] = dgMsgKanji8275CapitalVTex; + +#define dgMsgKanji8276CapitalWTex "__OTR__textures/kanji/gMsgKanji8276CapitalWTex" +static const ALIGN_ASSET(2) char gMsgKanji8276CapitalWTex[] = dgMsgKanji8276CapitalWTex; + +#define dgMsgKanji8277CapitalXTex "__OTR__textures/kanji/gMsgKanji8277CapitalXTex" +static const ALIGN_ASSET(2) char gMsgKanji8277CapitalXTex[] = dgMsgKanji8277CapitalXTex; + +#define dgMsgKanji8278CapitalYTex "__OTR__textures/kanji/gMsgKanji8278CapitalYTex" +static const ALIGN_ASSET(2) char gMsgKanji8278CapitalYTex[] = dgMsgKanji8278CapitalYTex; + +#define dgMsgKanji8279CapitalZTex "__OTR__textures/kanji/gMsgKanji8279CapitalZTex" +static const ALIGN_ASSET(2) char gMsgKanji8279CapitalZTex[] = dgMsgKanji8279CapitalZTex; + +#define dgMsgKanji8281LowercaseATex "__OTR__textures/kanji/gMsgKanji8281LowercaseATex" +static const ALIGN_ASSET(2) char gMsgKanji8281LowercaseATex[] = dgMsgKanji8281LowercaseATex; + +#define dgMsgKanji8282LowercaseBTex "__OTR__textures/kanji/gMsgKanji8282LowercaseBTex" +static const ALIGN_ASSET(2) char gMsgKanji8282LowercaseBTex[] = dgMsgKanji8282LowercaseBTex; + +#define dgMsgKanji8283LowercaseCTex "__OTR__textures/kanji/gMsgKanji8283LowercaseCTex" +static const ALIGN_ASSET(2) char gMsgKanji8283LowercaseCTex[] = dgMsgKanji8283LowercaseCTex; + +#define dgMsgKanji8284LowercaseDTex "__OTR__textures/kanji/gMsgKanji8284LowercaseDTex" +static const ALIGN_ASSET(2) char gMsgKanji8284LowercaseDTex[] = dgMsgKanji8284LowercaseDTex; + +#define dgMsgKanji8285LowercaseETex "__OTR__textures/kanji/gMsgKanji8285LowercaseETex" +static const ALIGN_ASSET(2) char gMsgKanji8285LowercaseETex[] = dgMsgKanji8285LowercaseETex; + +#define dgMsgKanji8286LowercaseFTex "__OTR__textures/kanji/gMsgKanji8286LowercaseFTex" +static const ALIGN_ASSET(2) char gMsgKanji8286LowercaseFTex[] = dgMsgKanji8286LowercaseFTex; + +#define dgMsgKanji8287LowercaseGTex "__OTR__textures/kanji/gMsgKanji8287LowercaseGTex" +static const ALIGN_ASSET(2) char gMsgKanji8287LowercaseGTex[] = dgMsgKanji8287LowercaseGTex; + +#define dgMsgKanji8288LowercaseHTex "__OTR__textures/kanji/gMsgKanji8288LowercaseHTex" +static const ALIGN_ASSET(2) char gMsgKanji8288LowercaseHTex[] = dgMsgKanji8288LowercaseHTex; + +#define dgMsgKanji8289LowercaseITex "__OTR__textures/kanji/gMsgKanji8289LowercaseITex" +static const ALIGN_ASSET(2) char gMsgKanji8289LowercaseITex[] = dgMsgKanji8289LowercaseITex; + +#define dgMsgKanji828ALowercaseJTex "__OTR__textures/kanji/gMsgKanji828ALowercaseJTex" +static const ALIGN_ASSET(2) char gMsgKanji828ALowercaseJTex[] = dgMsgKanji828ALowercaseJTex; + +#define dgMsgKanji828BLowercaseKTex "__OTR__textures/kanji/gMsgKanji828BLowercaseKTex" +static const ALIGN_ASSET(2) char gMsgKanji828BLowercaseKTex[] = dgMsgKanji828BLowercaseKTex; + +#define dgMsgKanji828CLowercaseLTex "__OTR__textures/kanji/gMsgKanji828CLowercaseLTex" +static const ALIGN_ASSET(2) char gMsgKanji828CLowercaseLTex[] = dgMsgKanji828CLowercaseLTex; + +#define dgMsgKanji828DLowercaseMTex "__OTR__textures/kanji/gMsgKanji828DLowercaseMTex" +static const ALIGN_ASSET(2) char gMsgKanji828DLowercaseMTex[] = dgMsgKanji828DLowercaseMTex; + +#define dgMsgKanji828ELowercaseNTex "__OTR__textures/kanji/gMsgKanji828ELowercaseNTex" +static const ALIGN_ASSET(2) char gMsgKanji828ELowercaseNTex[] = dgMsgKanji828ELowercaseNTex; + +#define dgMsgKanji828FLowercaseOTex "__OTR__textures/kanji/gMsgKanji828FLowercaseOTex" +static const ALIGN_ASSET(2) char gMsgKanji828FLowercaseOTex[] = dgMsgKanji828FLowercaseOTex; + +#define dgMsgKanji8290LowercasePTex "__OTR__textures/kanji/gMsgKanji8290LowercasePTex" +static const ALIGN_ASSET(2) char gMsgKanji8290LowercasePTex[] = dgMsgKanji8290LowercasePTex; + +#define dgMsgKanji8291LowercaseQTex "__OTR__textures/kanji/gMsgKanji8291LowercaseQTex" +static const ALIGN_ASSET(2) char gMsgKanji8291LowercaseQTex[] = dgMsgKanji8291LowercaseQTex; + +#define dgMsgKanji8292LowercaseRTex "__OTR__textures/kanji/gMsgKanji8292LowercaseRTex" +static const ALIGN_ASSET(2) char gMsgKanji8292LowercaseRTex[] = dgMsgKanji8292LowercaseRTex; + +#define dgMsgKanji8293LowercaseSTex "__OTR__textures/kanji/gMsgKanji8293LowercaseSTex" +static const ALIGN_ASSET(2) char gMsgKanji8293LowercaseSTex[] = dgMsgKanji8293LowercaseSTex; + +#define dgMsgKanji8294LowercaseTTex "__OTR__textures/kanji/gMsgKanji8294LowercaseTTex" +static const ALIGN_ASSET(2) char gMsgKanji8294LowercaseTTex[] = dgMsgKanji8294LowercaseTTex; + +#define dgMsgKanji8295LowercaseUTex "__OTR__textures/kanji/gMsgKanji8295LowercaseUTex" +static const ALIGN_ASSET(2) char gMsgKanji8295LowercaseUTex[] = dgMsgKanji8295LowercaseUTex; + +#define dgMsgKanji8296LowercaseVTex "__OTR__textures/kanji/gMsgKanji8296LowercaseVTex" +static const ALIGN_ASSET(2) char gMsgKanji8296LowercaseVTex[] = dgMsgKanji8296LowercaseVTex; + +#define dgMsgKanji8297LowercaseWTex "__OTR__textures/kanji/gMsgKanji8297LowercaseWTex" +static const ALIGN_ASSET(2) char gMsgKanji8297LowercaseWTex[] = dgMsgKanji8297LowercaseWTex; + +#define dgMsgKanji8298LowercaseXTex "__OTR__textures/kanji/gMsgKanji8298LowercaseXTex" +static const ALIGN_ASSET(2) char gMsgKanji8298LowercaseXTex[] = dgMsgKanji8298LowercaseXTex; + +#define dgMsgKanji8299LowercaseYTex "__OTR__textures/kanji/gMsgKanji8299LowercaseYTex" +static const ALIGN_ASSET(2) char gMsgKanji8299LowercaseYTex[] = dgMsgKanji8299LowercaseYTex; + +#define dgMsgKanji829ALowercaseZTex "__OTR__textures/kanji/gMsgKanji829ALowercaseZTex" +static const ALIGN_ASSET(2) char gMsgKanji829ALowercaseZTex[] = dgMsgKanji829ALowercaseZTex; + +#define dgMsgKanji829FHiraganaSmallATex "__OTR__textures/kanji/gMsgKanji829FHiraganaSmallATex" +static const ALIGN_ASSET(2) char gMsgKanji829FHiraganaSmallATex[] = dgMsgKanji829FHiraganaSmallATex; + +#define dgMsgKanji82A0HiraganaATex "__OTR__textures/kanji/gMsgKanji82A0HiraganaATex" +static const ALIGN_ASSET(2) char gMsgKanji82A0HiraganaATex[] = dgMsgKanji82A0HiraganaATex; + +#define dgMsgKanji82A1HiraganaSmallITex "__OTR__textures/kanji/gMsgKanji82A1HiraganaSmallITex" +static const ALIGN_ASSET(2) char gMsgKanji82A1HiraganaSmallITex[] = dgMsgKanji82A1HiraganaSmallITex; + +#define dgMsgKanji82A2HiraganaITex "__OTR__textures/kanji/gMsgKanji82A2HiraganaITex" +static const ALIGN_ASSET(2) char gMsgKanji82A2HiraganaITex[] = dgMsgKanji82A2HiraganaITex; + +#define dgMsgKanji82A3HiraganaSmallUTex "__OTR__textures/kanji/gMsgKanji82A3HiraganaSmallUTex" +static const ALIGN_ASSET(2) char gMsgKanji82A3HiraganaSmallUTex[] = dgMsgKanji82A3HiraganaSmallUTex; + +#define dgMsgKanji82A4HiraganaUTex "__OTR__textures/kanji/gMsgKanji82A4HiraganaUTex" +static const ALIGN_ASSET(2) char gMsgKanji82A4HiraganaUTex[] = dgMsgKanji82A4HiraganaUTex; + +#define dgMsgKanji82A5HiraganaSmallETex "__OTR__textures/kanji/gMsgKanji82A5HiraganaSmallETex" +static const ALIGN_ASSET(2) char gMsgKanji82A5HiraganaSmallETex[] = dgMsgKanji82A5HiraganaSmallETex; + +#define dgMsgKanji82A6HiraganaETex "__OTR__textures/kanji/gMsgKanji82A6HiraganaETex" +static const ALIGN_ASSET(2) char gMsgKanji82A6HiraganaETex[] = dgMsgKanji82A6HiraganaETex; + +#define dgMsgKanji82A7HiraganaSmallOTex "__OTR__textures/kanji/gMsgKanji82A7HiraganaSmallOTex" +static const ALIGN_ASSET(2) char gMsgKanji82A7HiraganaSmallOTex[] = dgMsgKanji82A7HiraganaSmallOTex; + +#define dgMsgKanji82A8HiraganaOTex "__OTR__textures/kanji/gMsgKanji82A8HiraganaOTex" +static const ALIGN_ASSET(2) char gMsgKanji82A8HiraganaOTex[] = dgMsgKanji82A8HiraganaOTex; + +#define dgMsgKanji82A9HiraganaKaTex "__OTR__textures/kanji/gMsgKanji82A9HiraganaKaTex" +static const ALIGN_ASSET(2) char gMsgKanji82A9HiraganaKaTex[] = dgMsgKanji82A9HiraganaKaTex; + +#define dgMsgKanji82AAHiraganaGaTex "__OTR__textures/kanji/gMsgKanji82AAHiraganaGaTex" +static const ALIGN_ASSET(2) char gMsgKanji82AAHiraganaGaTex[] = dgMsgKanji82AAHiraganaGaTex; + +#define dgMsgKanji82ABHiraganaKiTex "__OTR__textures/kanji/gMsgKanji82ABHiraganaKiTex" +static const ALIGN_ASSET(2) char gMsgKanji82ABHiraganaKiTex[] = dgMsgKanji82ABHiraganaKiTex; + +#define dgMsgKanji82ACHiraganaGiTex "__OTR__textures/kanji/gMsgKanji82ACHiraganaGiTex" +static const ALIGN_ASSET(2) char gMsgKanji82ACHiraganaGiTex[] = dgMsgKanji82ACHiraganaGiTex; + +#define dgMsgKanji82ADHiraganaKuTex "__OTR__textures/kanji/gMsgKanji82ADHiraganaKuTex" +static const ALIGN_ASSET(2) char gMsgKanji82ADHiraganaKuTex[] = dgMsgKanji82ADHiraganaKuTex; + +#define dgMsgKanji82AEHiraganaGuTex "__OTR__textures/kanji/gMsgKanji82AEHiraganaGuTex" +static const ALIGN_ASSET(2) char gMsgKanji82AEHiraganaGuTex[] = dgMsgKanji82AEHiraganaGuTex; + +#define dgMsgKanji82AFHiraganaKeTex "__OTR__textures/kanji/gMsgKanji82AFHiraganaKeTex" +static const ALIGN_ASSET(2) char gMsgKanji82AFHiraganaKeTex[] = dgMsgKanji82AFHiraganaKeTex; + +#define dgMsgKanji82B0HiraganaGeTex "__OTR__textures/kanji/gMsgKanji82B0HiraganaGeTex" +static const ALIGN_ASSET(2) char gMsgKanji82B0HiraganaGeTex[] = dgMsgKanji82B0HiraganaGeTex; + +#define dgMsgKanji82B1HiraganaKoTex "__OTR__textures/kanji/gMsgKanji82B1HiraganaKoTex" +static const ALIGN_ASSET(2) char gMsgKanji82B1HiraganaKoTex[] = dgMsgKanji82B1HiraganaKoTex; + +#define dgMsgKanji82B2HiraganaGoTex "__OTR__textures/kanji/gMsgKanji82B2HiraganaGoTex" +static const ALIGN_ASSET(2) char gMsgKanji82B2HiraganaGoTex[] = dgMsgKanji82B2HiraganaGoTex; + +#define dgMsgKanji82B3HiraganaSaTex "__OTR__textures/kanji/gMsgKanji82B3HiraganaSaTex" +static const ALIGN_ASSET(2) char gMsgKanji82B3HiraganaSaTex[] = dgMsgKanji82B3HiraganaSaTex; + +#define dgMsgKanji82B4HiraganaZaTex "__OTR__textures/kanji/gMsgKanji82B4HiraganaZaTex" +static const ALIGN_ASSET(2) char gMsgKanji82B4HiraganaZaTex[] = dgMsgKanji82B4HiraganaZaTex; + +#define dgMsgKanji82B5HiraganaShiTex "__OTR__textures/kanji/gMsgKanji82B5HiraganaShiTex" +static const ALIGN_ASSET(2) char gMsgKanji82B5HiraganaShiTex[] = dgMsgKanji82B5HiraganaShiTex; + +#define dgMsgKanji82B6HiraganaJiTex "__OTR__textures/kanji/gMsgKanji82B6HiraganaJiTex" +static const ALIGN_ASSET(2) char gMsgKanji82B6HiraganaJiTex[] = dgMsgKanji82B6HiraganaJiTex; + +#define dgMsgKanji82B7HiraganaSuTex "__OTR__textures/kanji/gMsgKanji82B7HiraganaSuTex" +static const ALIGN_ASSET(2) char gMsgKanji82B7HiraganaSuTex[] = dgMsgKanji82B7HiraganaSuTex; + +#define dgMsgKanji82B8HiraganaZuTex "__OTR__textures/kanji/gMsgKanji82B8HiraganaZuTex" +static const ALIGN_ASSET(2) char gMsgKanji82B8HiraganaZuTex[] = dgMsgKanji82B8HiraganaZuTex; + +#define dgMsgKanji82B9HiraganaSeTex "__OTR__textures/kanji/gMsgKanji82B9HiraganaSeTex" +static const ALIGN_ASSET(2) char gMsgKanji82B9HiraganaSeTex[] = dgMsgKanji82B9HiraganaSeTex; + +#define dgMsgKanji82BAHiraganaZeTex "__OTR__textures/kanji/gMsgKanji82BAHiraganaZeTex" +static const ALIGN_ASSET(2) char gMsgKanji82BAHiraganaZeTex[] = dgMsgKanji82BAHiraganaZeTex; + +#define dgMsgKanji82BBHiraganaSoTex "__OTR__textures/kanji/gMsgKanji82BBHiraganaSoTex" +static const ALIGN_ASSET(2) char gMsgKanji82BBHiraganaSoTex[] = dgMsgKanji82BBHiraganaSoTex; + +#define dgMsgKanji82BCHiraganaZoTex "__OTR__textures/kanji/gMsgKanji82BCHiraganaZoTex" +static const ALIGN_ASSET(2) char gMsgKanji82BCHiraganaZoTex[] = dgMsgKanji82BCHiraganaZoTex; + +#define dgMsgKanji82BDHiraganaTaTex "__OTR__textures/kanji/gMsgKanji82BDHiraganaTaTex" +static const ALIGN_ASSET(2) char gMsgKanji82BDHiraganaTaTex[] = dgMsgKanji82BDHiraganaTaTex; + +#define dgMsgKanji82BEHiraganaDaTex "__OTR__textures/kanji/gMsgKanji82BEHiraganaDaTex" +static const ALIGN_ASSET(2) char gMsgKanji82BEHiraganaDaTex[] = dgMsgKanji82BEHiraganaDaTex; + +#define dgMsgKanji82BFHiraganaChiTex "__OTR__textures/kanji/gMsgKanji82BFHiraganaChiTex" +static const ALIGN_ASSET(2) char gMsgKanji82BFHiraganaChiTex[] = dgMsgKanji82BFHiraganaChiTex; + +#define dgMsgKanji82C0HiraganaDiTex "__OTR__textures/kanji/gMsgKanji82C0HiraganaDiTex" +static const ALIGN_ASSET(2) char gMsgKanji82C0HiraganaDiTex[] = dgMsgKanji82C0HiraganaDiTex; + +#define dgMsgKanji82C1HiraganaSmallTsuTex "__OTR__textures/kanji/gMsgKanji82C1HiraganaSmallTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji82C1HiraganaSmallTsuTex[] = dgMsgKanji82C1HiraganaSmallTsuTex; + +#define dgMsgKanji82C2HiraganaTsuTex "__OTR__textures/kanji/gMsgKanji82C2HiraganaTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji82C2HiraganaTsuTex[] = dgMsgKanji82C2HiraganaTsuTex; + +#define dgMsgKanji82C3HiraganaDuTex "__OTR__textures/kanji/gMsgKanji82C3HiraganaDuTex" +static const ALIGN_ASSET(2) char gMsgKanji82C3HiraganaDuTex[] = dgMsgKanji82C3HiraganaDuTex; + +#define dgMsgKanji82C4HiraganaTeTex "__OTR__textures/kanji/gMsgKanji82C4HiraganaTeTex" +static const ALIGN_ASSET(2) char gMsgKanji82C4HiraganaTeTex[] = dgMsgKanji82C4HiraganaTeTex; + +#define dgMsgKanji82C5HiraganaDeTex "__OTR__textures/kanji/gMsgKanji82C5HiraganaDeTex" +static const ALIGN_ASSET(2) char gMsgKanji82C5HiraganaDeTex[] = dgMsgKanji82C5HiraganaDeTex; + +#define dgMsgKanji82C6HiraganaToTex "__OTR__textures/kanji/gMsgKanji82C6HiraganaToTex" +static const ALIGN_ASSET(2) char gMsgKanji82C6HiraganaToTex[] = dgMsgKanji82C6HiraganaToTex; + +#define dgMsgKanji82C7HiraganaDoTex "__OTR__textures/kanji/gMsgKanji82C7HiraganaDoTex" +static const ALIGN_ASSET(2) char gMsgKanji82C7HiraganaDoTex[] = dgMsgKanji82C7HiraganaDoTex; + +#define dgMsgKanji82C8HiraganaNaTex "__OTR__textures/kanji/gMsgKanji82C8HiraganaNaTex" +static const ALIGN_ASSET(2) char gMsgKanji82C8HiraganaNaTex[] = dgMsgKanji82C8HiraganaNaTex; + +#define dgMsgKanji82C9HiraganaNiTex "__OTR__textures/kanji/gMsgKanji82C9HiraganaNiTex" +static const ALIGN_ASSET(2) char gMsgKanji82C9HiraganaNiTex[] = dgMsgKanji82C9HiraganaNiTex; + +#define dgMsgKanji82CAHiraganaNuTex "__OTR__textures/kanji/gMsgKanji82CAHiraganaNuTex" +static const ALIGN_ASSET(2) char gMsgKanji82CAHiraganaNuTex[] = dgMsgKanji82CAHiraganaNuTex; + +#define dgMsgKanji82CBHiraganaNeTex "__OTR__textures/kanji/gMsgKanji82CBHiraganaNeTex" +static const ALIGN_ASSET(2) char gMsgKanji82CBHiraganaNeTex[] = dgMsgKanji82CBHiraganaNeTex; + +#define dgMsgKanji82CCHiraganaNoTex "__OTR__textures/kanji/gMsgKanji82CCHiraganaNoTex" +static const ALIGN_ASSET(2) char gMsgKanji82CCHiraganaNoTex[] = dgMsgKanji82CCHiraganaNoTex; + +#define dgMsgKanji82CDHiraganaHaTex "__OTR__textures/kanji/gMsgKanji82CDHiraganaHaTex" +static const ALIGN_ASSET(2) char gMsgKanji82CDHiraganaHaTex[] = dgMsgKanji82CDHiraganaHaTex; + +#define dgMsgKanji82CEHiraganaBaTex "__OTR__textures/kanji/gMsgKanji82CEHiraganaBaTex" +static const ALIGN_ASSET(2) char gMsgKanji82CEHiraganaBaTex[] = dgMsgKanji82CEHiraganaBaTex; + +#define dgMsgKanji82CFHiraganaPaTex "__OTR__textures/kanji/gMsgKanji82CFHiraganaPaTex" +static const ALIGN_ASSET(2) char gMsgKanji82CFHiraganaPaTex[] = dgMsgKanji82CFHiraganaPaTex; + +#define dgMsgKanji82D0HiraganaHiTex "__OTR__textures/kanji/gMsgKanji82D0HiraganaHiTex" +static const ALIGN_ASSET(2) char gMsgKanji82D0HiraganaHiTex[] = dgMsgKanji82D0HiraganaHiTex; + +#define dgMsgKanji82D1HiraganaBiTex "__OTR__textures/kanji/gMsgKanji82D1HiraganaBiTex" +static const ALIGN_ASSET(2) char gMsgKanji82D1HiraganaBiTex[] = dgMsgKanji82D1HiraganaBiTex; + +#define dgMsgKanji82D2HiraganaPiTex "__OTR__textures/kanji/gMsgKanji82D2HiraganaPiTex" +static const ALIGN_ASSET(2) char gMsgKanji82D2HiraganaPiTex[] = dgMsgKanji82D2HiraganaPiTex; + +#define dgMsgKanji82D3HiraganaFuTex "__OTR__textures/kanji/gMsgKanji82D3HiraganaFuTex" +static const ALIGN_ASSET(2) char gMsgKanji82D3HiraganaFuTex[] = dgMsgKanji82D3HiraganaFuTex; + +#define dgMsgKanji82D4HiraganaBuTex "__OTR__textures/kanji/gMsgKanji82D4HiraganaBuTex" +static const ALIGN_ASSET(2) char gMsgKanji82D4HiraganaBuTex[] = dgMsgKanji82D4HiraganaBuTex; + +#define dgMsgKanji82D5HiraganaPuTex "__OTR__textures/kanji/gMsgKanji82D5HiraganaPuTex" +static const ALIGN_ASSET(2) char gMsgKanji82D5HiraganaPuTex[] = dgMsgKanji82D5HiraganaPuTex; + +#define dgMsgKanji82D6HiraganaHeTex "__OTR__textures/kanji/gMsgKanji82D6HiraganaHeTex" +static const ALIGN_ASSET(2) char gMsgKanji82D6HiraganaHeTex[] = dgMsgKanji82D6HiraganaHeTex; + +#define dgMsgKanji82D7HiraganaBeTex "__OTR__textures/kanji/gMsgKanji82D7HiraganaBeTex" +static const ALIGN_ASSET(2) char gMsgKanji82D7HiraganaBeTex[] = dgMsgKanji82D7HiraganaBeTex; + +#define dgMsgKanji82D8HiraganaPeTex "__OTR__textures/kanji/gMsgKanji82D8HiraganaPeTex" +static const ALIGN_ASSET(2) char gMsgKanji82D8HiraganaPeTex[] = dgMsgKanji82D8HiraganaPeTex; + +#define dgMsgKanji82D9HiraganaHoTex "__OTR__textures/kanji/gMsgKanji82D9HiraganaHoTex" +static const ALIGN_ASSET(2) char gMsgKanji82D9HiraganaHoTex[] = dgMsgKanji82D9HiraganaHoTex; + +#define dgMsgKanji82DAHiraganaBoTex "__OTR__textures/kanji/gMsgKanji82DAHiraganaBoTex" +static const ALIGN_ASSET(2) char gMsgKanji82DAHiraganaBoTex[] = dgMsgKanji82DAHiraganaBoTex; + +#define dgMsgKanji82DBHiraganaPoTex "__OTR__textures/kanji/gMsgKanji82DBHiraganaPoTex" +static const ALIGN_ASSET(2) char gMsgKanji82DBHiraganaPoTex[] = dgMsgKanji82DBHiraganaPoTex; + +#define dgMsgKanji82DCHiraganaMaTex "__OTR__textures/kanji/gMsgKanji82DCHiraganaMaTex" +static const ALIGN_ASSET(2) char gMsgKanji82DCHiraganaMaTex[] = dgMsgKanji82DCHiraganaMaTex; + +#define dgMsgKanji82DDHiraganaMiTex "__OTR__textures/kanji/gMsgKanji82DDHiraganaMiTex" +static const ALIGN_ASSET(2) char gMsgKanji82DDHiraganaMiTex[] = dgMsgKanji82DDHiraganaMiTex; + +#define dgMsgKanji82DEHiraganaMuTex "__OTR__textures/kanji/gMsgKanji82DEHiraganaMuTex" +static const ALIGN_ASSET(2) char gMsgKanji82DEHiraganaMuTex[] = dgMsgKanji82DEHiraganaMuTex; + +#define dgMsgKanji82DFHiraganaMeTex "__OTR__textures/kanji/gMsgKanji82DFHiraganaMeTex" +static const ALIGN_ASSET(2) char gMsgKanji82DFHiraganaMeTex[] = dgMsgKanji82DFHiraganaMeTex; + +#define dgMsgKanji82E0HiraganaMoTex "__OTR__textures/kanji/gMsgKanji82E0HiraganaMoTex" +static const ALIGN_ASSET(2) char gMsgKanji82E0HiraganaMoTex[] = dgMsgKanji82E0HiraganaMoTex; + +#define dgMsgKanji82E1HiraganaSmallYaTex "__OTR__textures/kanji/gMsgKanji82E1HiraganaSmallYaTex" +static const ALIGN_ASSET(2) char gMsgKanji82E1HiraganaSmallYaTex[] = dgMsgKanji82E1HiraganaSmallYaTex; + +#define dgMsgKanji82E2HiraganaYaTex "__OTR__textures/kanji/gMsgKanji82E2HiraganaYaTex" +static const ALIGN_ASSET(2) char gMsgKanji82E2HiraganaYaTex[] = dgMsgKanji82E2HiraganaYaTex; + +#define dgMsgKanji82E3HiraganaSmallYuTex "__OTR__textures/kanji/gMsgKanji82E3HiraganaSmallYuTex" +static const ALIGN_ASSET(2) char gMsgKanji82E3HiraganaSmallYuTex[] = dgMsgKanji82E3HiraganaSmallYuTex; + +#define dgMsgKanji82E4HiraganaYuTex "__OTR__textures/kanji/gMsgKanji82E4HiraganaYuTex" +static const ALIGN_ASSET(2) char gMsgKanji82E4HiraganaYuTex[] = dgMsgKanji82E4HiraganaYuTex; + +#define dgMsgKanji82E5HiraganaSmallYoTex "__OTR__textures/kanji/gMsgKanji82E5HiraganaSmallYoTex" +static const ALIGN_ASSET(2) char gMsgKanji82E5HiraganaSmallYoTex[] = dgMsgKanji82E5HiraganaSmallYoTex; + +#define dgMsgKanji82E6HiraganaYoTex "__OTR__textures/kanji/gMsgKanji82E6HiraganaYoTex" +static const ALIGN_ASSET(2) char gMsgKanji82E6HiraganaYoTex[] = dgMsgKanji82E6HiraganaYoTex; + +#define dgMsgKanji82E7HiraganaRaTex "__OTR__textures/kanji/gMsgKanji82E7HiraganaRaTex" +static const ALIGN_ASSET(2) char gMsgKanji82E7HiraganaRaTex[] = dgMsgKanji82E7HiraganaRaTex; + +#define dgMsgKanji82E8HiraganaRiTex "__OTR__textures/kanji/gMsgKanji82E8HiraganaRiTex" +static const ALIGN_ASSET(2) char gMsgKanji82E8HiraganaRiTex[] = dgMsgKanji82E8HiraganaRiTex; + +#define dgMsgKanji82E9HiraganaRuTex "__OTR__textures/kanji/gMsgKanji82E9HiraganaRuTex" +static const ALIGN_ASSET(2) char gMsgKanji82E9HiraganaRuTex[] = dgMsgKanji82E9HiraganaRuTex; + +#define dgMsgKanji82EAHiraganaReTex "__OTR__textures/kanji/gMsgKanji82EAHiraganaReTex" +static const ALIGN_ASSET(2) char gMsgKanji82EAHiraganaReTex[] = dgMsgKanji82EAHiraganaReTex; + +#define dgMsgKanji82EBHiraganaRoTex "__OTR__textures/kanji/gMsgKanji82EBHiraganaRoTex" +static const ALIGN_ASSET(2) char gMsgKanji82EBHiraganaRoTex[] = dgMsgKanji82EBHiraganaRoTex; + +#define dgMsgKanji82ECHiraganaSmallWaTex "__OTR__textures/kanji/gMsgKanji82ECHiraganaSmallWaTex" +static const ALIGN_ASSET(2) char gMsgKanji82ECHiraganaSmallWaTex[] = dgMsgKanji82ECHiraganaSmallWaTex; + +#define dgMsgKanji82EDHiraganaWaTex "__OTR__textures/kanji/gMsgKanji82EDHiraganaWaTex" +static const ALIGN_ASSET(2) char gMsgKanji82EDHiraganaWaTex[] = dgMsgKanji82EDHiraganaWaTex; + +#define dgMsgKanji82EEHiraganaWiTex "__OTR__textures/kanji/gMsgKanji82EEHiraganaWiTex" +static const ALIGN_ASSET(2) char gMsgKanji82EEHiraganaWiTex[] = dgMsgKanji82EEHiraganaWiTex; + +#define dgMsgKanji82EFHiraganaWeTex "__OTR__textures/kanji/gMsgKanji82EFHiraganaWeTex" +static const ALIGN_ASSET(2) char gMsgKanji82EFHiraganaWeTex[] = dgMsgKanji82EFHiraganaWeTex; + +#define dgMsgKanji82F0HiraganaWoTex "__OTR__textures/kanji/gMsgKanji82F0HiraganaWoTex" +static const ALIGN_ASSET(2) char gMsgKanji82F0HiraganaWoTex[] = dgMsgKanji82F0HiraganaWoTex; + +#define dgMsgKanji82F1HiraganaNTex "__OTR__textures/kanji/gMsgKanji82F1HiraganaNTex" +static const ALIGN_ASSET(2) char gMsgKanji82F1HiraganaNTex[] = dgMsgKanji82F1HiraganaNTex; + +#define dgMsgKanji82F2EmptyTex "__OTR__textures/kanji/gMsgKanji82F2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji82F2EmptyTex[] = dgMsgKanji82F2EmptyTex; + +#define dgMsgKanji8340KatakanaSmallATex "__OTR__textures/kanji/gMsgKanji8340KatakanaSmallATex" +static const ALIGN_ASSET(2) char gMsgKanji8340KatakanaSmallATex[] = dgMsgKanji8340KatakanaSmallATex; + +#define dgMsgKanji8341KatakanaATex "__OTR__textures/kanji/gMsgKanji8341KatakanaATex" +static const ALIGN_ASSET(2) char gMsgKanji8341KatakanaATex[] = dgMsgKanji8341KatakanaATex; + +#define dgMsgKanji8342KatakanaSmallITex "__OTR__textures/kanji/gMsgKanji8342KatakanaSmallITex" +static const ALIGN_ASSET(2) char gMsgKanji8342KatakanaSmallITex[] = dgMsgKanji8342KatakanaSmallITex; + +#define dgMsgKanji8343KatakanaITex "__OTR__textures/kanji/gMsgKanji8343KatakanaITex" +static const ALIGN_ASSET(2) char gMsgKanji8343KatakanaITex[] = dgMsgKanji8343KatakanaITex; + +#define dgMsgKanji8344KatakanaSmallUTex "__OTR__textures/kanji/gMsgKanji8344KatakanaSmallUTex" +static const ALIGN_ASSET(2) char gMsgKanji8344KatakanaSmallUTex[] = dgMsgKanji8344KatakanaSmallUTex; + +#define dgMsgKanji8345KatakanaUTex "__OTR__textures/kanji/gMsgKanji8345KatakanaUTex" +static const ALIGN_ASSET(2) char gMsgKanji8345KatakanaUTex[] = dgMsgKanji8345KatakanaUTex; + +#define dgMsgKanji8346KatakanaSmallETex "__OTR__textures/kanji/gMsgKanji8346KatakanaSmallETex" +static const ALIGN_ASSET(2) char gMsgKanji8346KatakanaSmallETex[] = dgMsgKanji8346KatakanaSmallETex; + +#define dgMsgKanji8347KatakanaETex "__OTR__textures/kanji/gMsgKanji8347KatakanaETex" +static const ALIGN_ASSET(2) char gMsgKanji8347KatakanaETex[] = dgMsgKanji8347KatakanaETex; + +#define dgMsgKanji8348KatakanaSmallOTex "__OTR__textures/kanji/gMsgKanji8348KatakanaSmallOTex" +static const ALIGN_ASSET(2) char gMsgKanji8348KatakanaSmallOTex[] = dgMsgKanji8348KatakanaSmallOTex; + +#define dgMsgKanji8349KatakanaOTex "__OTR__textures/kanji/gMsgKanji8349KatakanaOTex" +static const ALIGN_ASSET(2) char gMsgKanji8349KatakanaOTex[] = dgMsgKanji8349KatakanaOTex; + +#define dgMsgKanji834AKatakanaKaTex "__OTR__textures/kanji/gMsgKanji834AKatakanaKaTex" +static const ALIGN_ASSET(2) char gMsgKanji834AKatakanaKaTex[] = dgMsgKanji834AKatakanaKaTex; + +#define dgMsgKanji834BKatakanaGaTex "__OTR__textures/kanji/gMsgKanji834BKatakanaGaTex" +static const ALIGN_ASSET(2) char gMsgKanji834BKatakanaGaTex[] = dgMsgKanji834BKatakanaGaTex; + +#define dgMsgKanji834CKatakanaKiTex "__OTR__textures/kanji/gMsgKanji834CKatakanaKiTex" +static const ALIGN_ASSET(2) char gMsgKanji834CKatakanaKiTex[] = dgMsgKanji834CKatakanaKiTex; + +#define dgMsgKanji834DKatakanaGiTex "__OTR__textures/kanji/gMsgKanji834DKatakanaGiTex" +static const ALIGN_ASSET(2) char gMsgKanji834DKatakanaGiTex[] = dgMsgKanji834DKatakanaGiTex; + +#define dgMsgKanji834EKatakanaKuTex "__OTR__textures/kanji/gMsgKanji834EKatakanaKuTex" +static const ALIGN_ASSET(2) char gMsgKanji834EKatakanaKuTex[] = dgMsgKanji834EKatakanaKuTex; + +#define dgMsgKanji834FKatakanaGuTex "__OTR__textures/kanji/gMsgKanji834FKatakanaGuTex" +static const ALIGN_ASSET(2) char gMsgKanji834FKatakanaGuTex[] = dgMsgKanji834FKatakanaGuTex; + +#define dgMsgKanji8350KatakanaKeTex "__OTR__textures/kanji/gMsgKanji8350KatakanaKeTex" +static const ALIGN_ASSET(2) char gMsgKanji8350KatakanaKeTex[] = dgMsgKanji8350KatakanaKeTex; + +#define dgMsgKanji8351KatakanaGeTex "__OTR__textures/kanji/gMsgKanji8351KatakanaGeTex" +static const ALIGN_ASSET(2) char gMsgKanji8351KatakanaGeTex[] = dgMsgKanji8351KatakanaGeTex; + +#define dgMsgKanji8352KatakanaKoTex "__OTR__textures/kanji/gMsgKanji8352KatakanaKoTex" +static const ALIGN_ASSET(2) char gMsgKanji8352KatakanaKoTex[] = dgMsgKanji8352KatakanaKoTex; + +#define dgMsgKanji8353KatakanaGoTex "__OTR__textures/kanji/gMsgKanji8353KatakanaGoTex" +static const ALIGN_ASSET(2) char gMsgKanji8353KatakanaGoTex[] = dgMsgKanji8353KatakanaGoTex; + +#define dgMsgKanji8354KatakanaSaTex "__OTR__textures/kanji/gMsgKanji8354KatakanaSaTex" +static const ALIGN_ASSET(2) char gMsgKanji8354KatakanaSaTex[] = dgMsgKanji8354KatakanaSaTex; + +#define dgMsgKanji8355KatakanaZaTex "__OTR__textures/kanji/gMsgKanji8355KatakanaZaTex" +static const ALIGN_ASSET(2) char gMsgKanji8355KatakanaZaTex[] = dgMsgKanji8355KatakanaZaTex; + +#define dgMsgKanji8356KatakanaShiTex "__OTR__textures/kanji/gMsgKanji8356KatakanaShiTex" +static const ALIGN_ASSET(2) char gMsgKanji8356KatakanaShiTex[] = dgMsgKanji8356KatakanaShiTex; + +#define dgMsgKanji8357KatakanaJiTex "__OTR__textures/kanji/gMsgKanji8357KatakanaJiTex" +static const ALIGN_ASSET(2) char gMsgKanji8357KatakanaJiTex[] = dgMsgKanji8357KatakanaJiTex; + +#define dgMsgKanji8358KatakanaSuTex "__OTR__textures/kanji/gMsgKanji8358KatakanaSuTex" +static const ALIGN_ASSET(2) char gMsgKanji8358KatakanaSuTex[] = dgMsgKanji8358KatakanaSuTex; + +#define dgMsgKanji8359KatakanaZuTex "__OTR__textures/kanji/gMsgKanji8359KatakanaZuTex" +static const ALIGN_ASSET(2) char gMsgKanji8359KatakanaZuTex[] = dgMsgKanji8359KatakanaZuTex; + +#define dgMsgKanji835AKatakanaSeTex "__OTR__textures/kanji/gMsgKanji835AKatakanaSeTex" +static const ALIGN_ASSET(2) char gMsgKanji835AKatakanaSeTex[] = dgMsgKanji835AKatakanaSeTex; + +#define dgMsgKanji835BKatakanaZeTex "__OTR__textures/kanji/gMsgKanji835BKatakanaZeTex" +static const ALIGN_ASSET(2) char gMsgKanji835BKatakanaZeTex[] = dgMsgKanji835BKatakanaZeTex; + +#define dgMsgKanji835CKatakanaSoTex "__OTR__textures/kanji/gMsgKanji835CKatakanaSoTex" +static const ALIGN_ASSET(2) char gMsgKanji835CKatakanaSoTex[] = dgMsgKanji835CKatakanaSoTex; + +#define dgMsgKanji835DKatakanaZoTex "__OTR__textures/kanji/gMsgKanji835DKatakanaZoTex" +static const ALIGN_ASSET(2) char gMsgKanji835DKatakanaZoTex[] = dgMsgKanji835DKatakanaZoTex; + +#define dgMsgKanji835EKatakanaTaTex "__OTR__textures/kanji/gMsgKanji835EKatakanaTaTex" +static const ALIGN_ASSET(2) char gMsgKanji835EKatakanaTaTex[] = dgMsgKanji835EKatakanaTaTex; + +#define dgMsgKanji835FKatakanaDaTex "__OTR__textures/kanji/gMsgKanji835FKatakanaDaTex" +static const ALIGN_ASSET(2) char gMsgKanji835FKatakanaDaTex[] = dgMsgKanji835FKatakanaDaTex; + +#define dgMsgKanji8360KatakanaChiTex "__OTR__textures/kanji/gMsgKanji8360KatakanaChiTex" +static const ALIGN_ASSET(2) char gMsgKanji8360KatakanaChiTex[] = dgMsgKanji8360KatakanaChiTex; + +#define dgMsgKanji8361KatakanaDiTex "__OTR__textures/kanji/gMsgKanji8361KatakanaDiTex" +static const ALIGN_ASSET(2) char gMsgKanji8361KatakanaDiTex[] = dgMsgKanji8361KatakanaDiTex; + +#define dgMsgKanji8362KatakanaSmallTsuTex "__OTR__textures/kanji/gMsgKanji8362KatakanaSmallTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji8362KatakanaSmallTsuTex[] = dgMsgKanji8362KatakanaSmallTsuTex; + +#define dgMsgKanji8363KatakanaTsuTex "__OTR__textures/kanji/gMsgKanji8363KatakanaTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji8363KatakanaTsuTex[] = dgMsgKanji8363KatakanaTsuTex; + +#define dgMsgKanji8364KatakanaDuTex "__OTR__textures/kanji/gMsgKanji8364KatakanaDuTex" +static const ALIGN_ASSET(2) char gMsgKanji8364KatakanaDuTex[] = dgMsgKanji8364KatakanaDuTex; + +#define dgMsgKanji8365KatakanaTeTex "__OTR__textures/kanji/gMsgKanji8365KatakanaTeTex" +static const ALIGN_ASSET(2) char gMsgKanji8365KatakanaTeTex[] = dgMsgKanji8365KatakanaTeTex; + +#define dgMsgKanji8366KatakanaDeTex "__OTR__textures/kanji/gMsgKanji8366KatakanaDeTex" +static const ALIGN_ASSET(2) char gMsgKanji8366KatakanaDeTex[] = dgMsgKanji8366KatakanaDeTex; + +#define dgMsgKanji8367KatakanaToTex "__OTR__textures/kanji/gMsgKanji8367KatakanaToTex" +static const ALIGN_ASSET(2) char gMsgKanji8367KatakanaToTex[] = dgMsgKanji8367KatakanaToTex; + +#define dgMsgKanji8368KatakanaDoTex "__OTR__textures/kanji/gMsgKanji8368KatakanaDoTex" +static const ALIGN_ASSET(2) char gMsgKanji8368KatakanaDoTex[] = dgMsgKanji8368KatakanaDoTex; + +#define dgMsgKanji8369KatakanaNaTex "__OTR__textures/kanji/gMsgKanji8369KatakanaNaTex" +static const ALIGN_ASSET(2) char gMsgKanji8369KatakanaNaTex[] = dgMsgKanji8369KatakanaNaTex; + +#define dgMsgKanji836AKatakanaNiTex "__OTR__textures/kanji/gMsgKanji836AKatakanaNiTex" +static const ALIGN_ASSET(2) char gMsgKanji836AKatakanaNiTex[] = dgMsgKanji836AKatakanaNiTex; + +#define dgMsgKanji836BKatakanaNuTex "__OTR__textures/kanji/gMsgKanji836BKatakanaNuTex" +static const ALIGN_ASSET(2) char gMsgKanji836BKatakanaNuTex[] = dgMsgKanji836BKatakanaNuTex; + +#define dgMsgKanji836CKatakanaNeTex "__OTR__textures/kanji/gMsgKanji836CKatakanaNeTex" +static const ALIGN_ASSET(2) char gMsgKanji836CKatakanaNeTex[] = dgMsgKanji836CKatakanaNeTex; + +#define dgMsgKanji836DKatakanaNoTex "__OTR__textures/kanji/gMsgKanji836DKatakanaNoTex" +static const ALIGN_ASSET(2) char gMsgKanji836DKatakanaNoTex[] = dgMsgKanji836DKatakanaNoTex; + +#define dgMsgKanji836EKatakanaHaTex "__OTR__textures/kanji/gMsgKanji836EKatakanaHaTex" +static const ALIGN_ASSET(2) char gMsgKanji836EKatakanaHaTex[] = dgMsgKanji836EKatakanaHaTex; + +#define dgMsgKanji836FKatakanaBaTex "__OTR__textures/kanji/gMsgKanji836FKatakanaBaTex" +static const ALIGN_ASSET(2) char gMsgKanji836FKatakanaBaTex[] = dgMsgKanji836FKatakanaBaTex; + +#define dgMsgKanji8370KatakanaPaTex "__OTR__textures/kanji/gMsgKanji8370KatakanaPaTex" +static const ALIGN_ASSET(2) char gMsgKanji8370KatakanaPaTex[] = dgMsgKanji8370KatakanaPaTex; + +#define dgMsgKanji8371KatakanaHiTex "__OTR__textures/kanji/gMsgKanji8371KatakanaHiTex" +static const ALIGN_ASSET(2) char gMsgKanji8371KatakanaHiTex[] = dgMsgKanji8371KatakanaHiTex; + +#define dgMsgKanji8372KatakanaBiTex "__OTR__textures/kanji/gMsgKanji8372KatakanaBiTex" +static const ALIGN_ASSET(2) char gMsgKanji8372KatakanaBiTex[] = dgMsgKanji8372KatakanaBiTex; + +#define dgMsgKanji8373KatakanaPiTex "__OTR__textures/kanji/gMsgKanji8373KatakanaPiTex" +static const ALIGN_ASSET(2) char gMsgKanji8373KatakanaPiTex[] = dgMsgKanji8373KatakanaPiTex; + +#define dgMsgKanji8374KatakanaFuTex "__OTR__textures/kanji/gMsgKanji8374KatakanaFuTex" +static const ALIGN_ASSET(2) char gMsgKanji8374KatakanaFuTex[] = dgMsgKanji8374KatakanaFuTex; + +#define dgMsgKanji8375KatakanaBuTex "__OTR__textures/kanji/gMsgKanji8375KatakanaBuTex" +static const ALIGN_ASSET(2) char gMsgKanji8375KatakanaBuTex[] = dgMsgKanji8375KatakanaBuTex; + +#define dgMsgKanji8376KatakanaPuTex "__OTR__textures/kanji/gMsgKanji8376KatakanaPuTex" +static const ALIGN_ASSET(2) char gMsgKanji8376KatakanaPuTex[] = dgMsgKanji8376KatakanaPuTex; + +#define dgMsgKanji8377KatakanaHeTex "__OTR__textures/kanji/gMsgKanji8377KatakanaHeTex" +static const ALIGN_ASSET(2) char gMsgKanji8377KatakanaHeTex[] = dgMsgKanji8377KatakanaHeTex; + +#define dgMsgKanji8378KatakanaBeTex "__OTR__textures/kanji/gMsgKanji8378KatakanaBeTex" +static const ALIGN_ASSET(2) char gMsgKanji8378KatakanaBeTex[] = dgMsgKanji8378KatakanaBeTex; + +#define dgMsgKanji8379KatakanaPeTex "__OTR__textures/kanji/gMsgKanji8379KatakanaPeTex" +static const ALIGN_ASSET(2) char gMsgKanji8379KatakanaPeTex[] = dgMsgKanji8379KatakanaPeTex; + +#define dgMsgKanji837AKatakanaHoTex "__OTR__textures/kanji/gMsgKanji837AKatakanaHoTex" +static const ALIGN_ASSET(2) char gMsgKanji837AKatakanaHoTex[] = dgMsgKanji837AKatakanaHoTex; + +#define dgMsgKanji837BKatakanaBoTex "__OTR__textures/kanji/gMsgKanji837BKatakanaBoTex" +static const ALIGN_ASSET(2) char gMsgKanji837BKatakanaBoTex[] = dgMsgKanji837BKatakanaBoTex; + +#define dgMsgKanji837CKatakanaPoTex "__OTR__textures/kanji/gMsgKanji837CKatakanaPoTex" +static const ALIGN_ASSET(2) char gMsgKanji837CKatakanaPoTex[] = dgMsgKanji837CKatakanaPoTex; + +#define dgMsgKanji837DKatakanaMaTex "__OTR__textures/kanji/gMsgKanji837DKatakanaMaTex" +static const ALIGN_ASSET(2) char gMsgKanji837DKatakanaMaTex[] = dgMsgKanji837DKatakanaMaTex; + +#define dgMsgKanji837EKatakanaMiTex "__OTR__textures/kanji/gMsgKanji837EKatakanaMiTex" +static const ALIGN_ASSET(2) char gMsgKanji837EKatakanaMiTex[] = dgMsgKanji837EKatakanaMiTex; + +#define dgMsgKanji8380KatakanaMuTex "__OTR__textures/kanji/gMsgKanji8380KatakanaMuTex" +static const ALIGN_ASSET(2) char gMsgKanji8380KatakanaMuTex[] = dgMsgKanji8380KatakanaMuTex; + +#define dgMsgKanji8381KatakanaMeTex "__OTR__textures/kanji/gMsgKanji8381KatakanaMeTex" +static const ALIGN_ASSET(2) char gMsgKanji8381KatakanaMeTex[] = dgMsgKanji8381KatakanaMeTex; + +#define dgMsgKanji8382KatakanaMoTex "__OTR__textures/kanji/gMsgKanji8382KatakanaMoTex" +static const ALIGN_ASSET(2) char gMsgKanji8382KatakanaMoTex[] = dgMsgKanji8382KatakanaMoTex; + +#define dgMsgKanji8383KatakanaSmallYaTex "__OTR__textures/kanji/gMsgKanji8383KatakanaSmallYaTex" +static const ALIGN_ASSET(2) char gMsgKanji8383KatakanaSmallYaTex[] = dgMsgKanji8383KatakanaSmallYaTex; + +#define dgMsgKanji8384KatakanaYaTex "__OTR__textures/kanji/gMsgKanji8384KatakanaYaTex" +static const ALIGN_ASSET(2) char gMsgKanji8384KatakanaYaTex[] = dgMsgKanji8384KatakanaYaTex; + +#define dgMsgKanji8385KatakanaSmallYuTex "__OTR__textures/kanji/gMsgKanji8385KatakanaSmallYuTex" +static const ALIGN_ASSET(2) char gMsgKanji8385KatakanaSmallYuTex[] = dgMsgKanji8385KatakanaSmallYuTex; + +#define dgMsgKanji8386KatakanaYuTex "__OTR__textures/kanji/gMsgKanji8386KatakanaYuTex" +static const ALIGN_ASSET(2) char gMsgKanji8386KatakanaYuTex[] = dgMsgKanji8386KatakanaYuTex; + +#define dgMsgKanji8387KatakanaSmallYoTex "__OTR__textures/kanji/gMsgKanji8387KatakanaSmallYoTex" +static const ALIGN_ASSET(2) char gMsgKanji8387KatakanaSmallYoTex[] = dgMsgKanji8387KatakanaSmallYoTex; + +#define dgMsgKanji8388KatakanaYoTex "__OTR__textures/kanji/gMsgKanji8388KatakanaYoTex" +static const ALIGN_ASSET(2) char gMsgKanji8388KatakanaYoTex[] = dgMsgKanji8388KatakanaYoTex; + +#define dgMsgKanji8389KatakanaRaTex "__OTR__textures/kanji/gMsgKanji8389KatakanaRaTex" +static const ALIGN_ASSET(2) char gMsgKanji8389KatakanaRaTex[] = dgMsgKanji8389KatakanaRaTex; + +#define dgMsgKanji838AKatakanaRiTex "__OTR__textures/kanji/gMsgKanji838AKatakanaRiTex" +static const ALIGN_ASSET(2) char gMsgKanji838AKatakanaRiTex[] = dgMsgKanji838AKatakanaRiTex; + +#define dgMsgKanji838BKatakanaRuTex "__OTR__textures/kanji/gMsgKanji838BKatakanaRuTex" +static const ALIGN_ASSET(2) char gMsgKanji838BKatakanaRuTex[] = dgMsgKanji838BKatakanaRuTex; + +#define dgMsgKanji838CKatakanaReTex "__OTR__textures/kanji/gMsgKanji838CKatakanaReTex" +static const ALIGN_ASSET(2) char gMsgKanji838CKatakanaReTex[] = dgMsgKanji838CKatakanaReTex; + +#define dgMsgKanji838DKatakanaRoTex "__OTR__textures/kanji/gMsgKanji838DKatakanaRoTex" +static const ALIGN_ASSET(2) char gMsgKanji838DKatakanaRoTex[] = dgMsgKanji838DKatakanaRoTex; + +#define dgMsgKanji838EKatakanaSmallWaTex "__OTR__textures/kanji/gMsgKanji838EKatakanaSmallWaTex" +static const ALIGN_ASSET(2) char gMsgKanji838EKatakanaSmallWaTex[] = dgMsgKanji838EKatakanaSmallWaTex; + +#define dgMsgKanji838FKatakanaWaTex "__OTR__textures/kanji/gMsgKanji838FKatakanaWaTex" +static const ALIGN_ASSET(2) char gMsgKanji838FKatakanaWaTex[] = dgMsgKanji838FKatakanaWaTex; + +#define dgMsgKanji8390KatakanaWiTex "__OTR__textures/kanji/gMsgKanji8390KatakanaWiTex" +static const ALIGN_ASSET(2) char gMsgKanji8390KatakanaWiTex[] = dgMsgKanji8390KatakanaWiTex; + +#define dgMsgKanji8391KatakanaWeTex "__OTR__textures/kanji/gMsgKanji8391KatakanaWeTex" +static const ALIGN_ASSET(2) char gMsgKanji8391KatakanaWeTex[] = dgMsgKanji8391KatakanaWeTex; + +#define dgMsgKanji8392KatakanaWoTex "__OTR__textures/kanji/gMsgKanji8392KatakanaWoTex" +static const ALIGN_ASSET(2) char gMsgKanji8392KatakanaWoTex[] = dgMsgKanji8392KatakanaWoTex; + +#define dgMsgKanji8393KatakanaNTex "__OTR__textures/kanji/gMsgKanji8393KatakanaNTex" +static const ALIGN_ASSET(2) char gMsgKanji8393KatakanaNTex[] = dgMsgKanji8393KatakanaNTex; + +#define dgMsgKanji8394KatakanaVuTex "__OTR__textures/kanji/gMsgKanji8394KatakanaVuTex" +static const ALIGN_ASSET(2) char gMsgKanji8394KatakanaVuTex[] = dgMsgKanji8394KatakanaVuTex; + +#define dgMsgKanji8395KatakanaSmallKaTex "__OTR__textures/kanji/gMsgKanji8395KatakanaSmallKaTex" +static const ALIGN_ASSET(2) char gMsgKanji8395KatakanaSmallKaTex[] = dgMsgKanji8395KatakanaSmallKaTex; + +#define dgMsgKanji8396KatakanaSmallKeTex "__OTR__textures/kanji/gMsgKanji8396KatakanaSmallKeTex" +static const ALIGN_ASSET(2) char gMsgKanji8396KatakanaSmallKeTex[] = dgMsgKanji8396KatakanaSmallKeTex; + +#define dgMsgKanji839FButtonATex "__OTR__textures/kanji/gMsgKanji839FButtonATex" +static const ALIGN_ASSET(2) char gMsgKanji839FButtonATex[] = dgMsgKanji839FButtonATex; + +#define dgMsgKanji83A0ButtonBTex "__OTR__textures/kanji/gMsgKanji83A0ButtonBTex" +static const ALIGN_ASSET(2) char gMsgKanji83A0ButtonBTex[] = dgMsgKanji83A0ButtonBTex; + +#define dgMsgKanji83A1ButtonCTex "__OTR__textures/kanji/gMsgKanji83A1ButtonCTex" +static const ALIGN_ASSET(2) char gMsgKanji83A1ButtonCTex[] = dgMsgKanji83A1ButtonCTex; + +#define dgMsgKanji83A2ButtonLTex "__OTR__textures/kanji/gMsgKanji83A2ButtonLTex" +static const ALIGN_ASSET(2) char gMsgKanji83A2ButtonLTex[] = dgMsgKanji83A2ButtonLTex; + +#define dgMsgKanji83A3ButtonRTex "__OTR__textures/kanji/gMsgKanji83A3ButtonRTex" +static const ALIGN_ASSET(2) char gMsgKanji83A3ButtonRTex[] = dgMsgKanji83A3ButtonRTex; + +#define dgMsgKanji83A4ButtonZTex "__OTR__textures/kanji/gMsgKanji83A4ButtonZTex" +static const ALIGN_ASSET(2) char gMsgKanji83A4ButtonZTex[] = dgMsgKanji83A4ButtonZTex; + +#define dgMsgKanji83A5ButtonCUpTex "__OTR__textures/kanji/gMsgKanji83A5ButtonCUpTex" +static const ALIGN_ASSET(2) char gMsgKanji83A5ButtonCUpTex[] = dgMsgKanji83A5ButtonCUpTex; + +#define dgMsgKanji83A6ButtonCDownTex "__OTR__textures/kanji/gMsgKanji83A6ButtonCDownTex" +static const ALIGN_ASSET(2) char gMsgKanji83A6ButtonCDownTex[] = dgMsgKanji83A6ButtonCDownTex; + +#define dgMsgKanji83A7ButtonCLeftTex "__OTR__textures/kanji/gMsgKanji83A7ButtonCLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji83A7ButtonCLeftTex[] = dgMsgKanji83A7ButtonCLeftTex; + +#define dgMsgKanji83A8ButtonCRightTex "__OTR__textures/kanji/gMsgKanji83A8ButtonCRightTex" +static const ALIGN_ASSET(2) char gMsgKanji83A8ButtonCRightTex[] = dgMsgKanji83A8ButtonCRightTex; + +#define dgMsgKanji83A9ZTargetSignTex "__OTR__textures/kanji/gMsgKanji83A9ZTargetSignTex" +static const ALIGN_ASSET(2) char gMsgKanji83A9ZTargetSignTex[] = dgMsgKanji83A9ZTargetSignTex; + +#define dgMsgKanji83AAControlStickTex "__OTR__textures/kanji/gMsgKanji83AAControlStickTex" +static const ALIGN_ASSET(2) char gMsgKanji83AAControlStickTex[] = dgMsgKanji83AAControlStickTex; + +#define dgMsgKanji83ABGreekCapitalNuTex "__OTR__textures/kanji/gMsgKanji83ABGreekCapitalNuTex" +static const ALIGN_ASSET(2) char gMsgKanji83ABGreekCapitalNuTex[] = dgMsgKanji83ABGreekCapitalNuTex; + +#define dgMsgKanji83ACGreekCapitalXiTex "__OTR__textures/kanji/gMsgKanji83ACGreekCapitalXiTex" +static const ALIGN_ASSET(2) char gMsgKanji83ACGreekCapitalXiTex[] = dgMsgKanji83ACGreekCapitalXiTex; + +#define dgMsgKanji83ADGreekCapitalOmicronTex "__OTR__textures/kanji/gMsgKanji83ADGreekCapitalOmicronTex" +static const ALIGN_ASSET(2) char gMsgKanji83ADGreekCapitalOmicronTex[] = dgMsgKanji83ADGreekCapitalOmicronTex; + +#define dgMsgKanji83AEGreekCapitalPiTex "__OTR__textures/kanji/gMsgKanji83AEGreekCapitalPiTex" +static const ALIGN_ASSET(2) char gMsgKanji83AEGreekCapitalPiTex[] = dgMsgKanji83AEGreekCapitalPiTex; + +#define dgMsgKanji83AFGreekCapitalRhoTex "__OTR__textures/kanji/gMsgKanji83AFGreekCapitalRhoTex" +static const ALIGN_ASSET(2) char gMsgKanji83AFGreekCapitalRhoTex[] = dgMsgKanji83AFGreekCapitalRhoTex; + +#define dgMsgKanji83B0GreekCapitalSigmaTex "__OTR__textures/kanji/gMsgKanji83B0GreekCapitalSigmaTex" +static const ALIGN_ASSET(2) char gMsgKanji83B0GreekCapitalSigmaTex[] = dgMsgKanji83B0GreekCapitalSigmaTex; + +#define dgMsgKanji83B1GreekCapitalTauTex "__OTR__textures/kanji/gMsgKanji83B1GreekCapitalTauTex" +static const ALIGN_ASSET(2) char gMsgKanji83B1GreekCapitalTauTex[] = dgMsgKanji83B1GreekCapitalTauTex; + +#define dgMsgKanji83B2GreekCapitalUpsilonTex "__OTR__textures/kanji/gMsgKanji83B2GreekCapitalUpsilonTex" +static const ALIGN_ASSET(2) char gMsgKanji83B2GreekCapitalUpsilonTex[] = dgMsgKanji83B2GreekCapitalUpsilonTex; + +#define dgMsgKanji83B3GreekCapitalPhiTex "__OTR__textures/kanji/gMsgKanji83B3GreekCapitalPhiTex" +static const ALIGN_ASSET(2) char gMsgKanji83B3GreekCapitalPhiTex[] = dgMsgKanji83B3GreekCapitalPhiTex; + +#define dgMsgKanji83B4GreekCapitalChiTex "__OTR__textures/kanji/gMsgKanji83B4GreekCapitalChiTex" +static const ALIGN_ASSET(2) char gMsgKanji83B4GreekCapitalChiTex[] = dgMsgKanji83B4GreekCapitalChiTex; + +#define dgMsgKanji83B5GreekCapitalPsiTex "__OTR__textures/kanji/gMsgKanji83B5GreekCapitalPsiTex" +static const ALIGN_ASSET(2) char gMsgKanji83B5GreekCapitalPsiTex[] = dgMsgKanji83B5GreekCapitalPsiTex; + +#define dgMsgKanji83B6GreekCapitalOmegaTex "__OTR__textures/kanji/gMsgKanji83B6GreekCapitalOmegaTex" +static const ALIGN_ASSET(2) char gMsgKanji83B6GreekCapitalOmegaTex[] = dgMsgKanji83B6GreekCapitalOmegaTex; + +#define dgMsgKanji83BFGreekLowercaseAlphaTex "__OTR__textures/kanji/gMsgKanji83BFGreekLowercaseAlphaTex" +static const ALIGN_ASSET(2) char gMsgKanji83BFGreekLowercaseAlphaTex[] = dgMsgKanji83BFGreekLowercaseAlphaTex; + +#define dgMsgKanji83C0GreekLowercaseBetaTex "__OTR__textures/kanji/gMsgKanji83C0GreekLowercaseBetaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C0GreekLowercaseBetaTex[] = dgMsgKanji83C0GreekLowercaseBetaTex; + +#define dgMsgKanji83C1GreekLowercaseGammaTex "__OTR__textures/kanji/gMsgKanji83C1GreekLowercaseGammaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C1GreekLowercaseGammaTex[] = dgMsgKanji83C1GreekLowercaseGammaTex; + +#define dgMsgKanji83C2GreekLowercaseDeltaTex "__OTR__textures/kanji/gMsgKanji83C2GreekLowercaseDeltaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C2GreekLowercaseDeltaTex[] = dgMsgKanji83C2GreekLowercaseDeltaTex; + +#define dgMsgKanji83C3GreekLowercaseEpsilonTex "__OTR__textures/kanji/gMsgKanji83C3GreekLowercaseEpsilonTex" +static const ALIGN_ASSET(2) char gMsgKanji83C3GreekLowercaseEpsilonTex[] = dgMsgKanji83C3GreekLowercaseEpsilonTex; + +#define dgMsgKanji83C4GreekLowercaseZetaTex "__OTR__textures/kanji/gMsgKanji83C4GreekLowercaseZetaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C4GreekLowercaseZetaTex[] = dgMsgKanji83C4GreekLowercaseZetaTex; + +#define dgMsgKanji83C5GreekLowercaseEtaTex "__OTR__textures/kanji/gMsgKanji83C5GreekLowercaseEtaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C5GreekLowercaseEtaTex[] = dgMsgKanji83C5GreekLowercaseEtaTex; + +#define dgMsgKanji83C6GreekLowercaseThetaTex "__OTR__textures/kanji/gMsgKanji83C6GreekLowercaseThetaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C6GreekLowercaseThetaTex[] = dgMsgKanji83C6GreekLowercaseThetaTex; + +#define dgMsgKanji83C7GreekLowercaseIotaTex "__OTR__textures/kanji/gMsgKanji83C7GreekLowercaseIotaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C7GreekLowercaseIotaTex[] = dgMsgKanji83C7GreekLowercaseIotaTex; + +#define dgMsgKanji83C8GreekLowercaseKappaTex "__OTR__textures/kanji/gMsgKanji83C8GreekLowercaseKappaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C8GreekLowercaseKappaTex[] = dgMsgKanji83C8GreekLowercaseKappaTex; + +#define dgMsgKanji83C9GreekLowercaseLamdaTex "__OTR__textures/kanji/gMsgKanji83C9GreekLowercaseLamdaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C9GreekLowercaseLamdaTex[] = dgMsgKanji83C9GreekLowercaseLamdaTex; + +#define dgMsgKanji83CAGreekLowercaseMuTex "__OTR__textures/kanji/gMsgKanji83CAGreekLowercaseMuTex" +static const ALIGN_ASSET(2) char gMsgKanji83CAGreekLowercaseMuTex[] = dgMsgKanji83CAGreekLowercaseMuTex; + +#define dgMsgKanji83CBGreekLowercaseNuTex "__OTR__textures/kanji/gMsgKanji83CBGreekLowercaseNuTex" +static const ALIGN_ASSET(2) char gMsgKanji83CBGreekLowercaseNuTex[] = dgMsgKanji83CBGreekLowercaseNuTex; + +#define dgMsgKanji83CCGreekLowercaseXiTex "__OTR__textures/kanji/gMsgKanji83CCGreekLowercaseXiTex" +static const ALIGN_ASSET(2) char gMsgKanji83CCGreekLowercaseXiTex[] = dgMsgKanji83CCGreekLowercaseXiTex; + +#define dgMsgKanji83CDGreekLowercaseOmicronTex "__OTR__textures/kanji/gMsgKanji83CDGreekLowercaseOmicronTex" +static const ALIGN_ASSET(2) char gMsgKanji83CDGreekLowercaseOmicronTex[] = dgMsgKanji83CDGreekLowercaseOmicronTex; + +#define dgMsgKanji83CEGreekLowercasePiTex "__OTR__textures/kanji/gMsgKanji83CEGreekLowercasePiTex" +static const ALIGN_ASSET(2) char gMsgKanji83CEGreekLowercasePiTex[] = dgMsgKanji83CEGreekLowercasePiTex; + +#define dgMsgKanji83CFGreekLowercaseRhoTex "__OTR__textures/kanji/gMsgKanji83CFGreekLowercaseRhoTex" +static const ALIGN_ASSET(2) char gMsgKanji83CFGreekLowercaseRhoTex[] = dgMsgKanji83CFGreekLowercaseRhoTex; + +#define dgMsgKanji83D0GreekLowercaseSigmaTex "__OTR__textures/kanji/gMsgKanji83D0GreekLowercaseSigmaTex" +static const ALIGN_ASSET(2) char gMsgKanji83D0GreekLowercaseSigmaTex[] = dgMsgKanji83D0GreekLowercaseSigmaTex; + +#define dgMsgKanji83D1GreekLowercaseTauTex "__OTR__textures/kanji/gMsgKanji83D1GreekLowercaseTauTex" +static const ALIGN_ASSET(2) char gMsgKanji83D1GreekLowercaseTauTex[] = dgMsgKanji83D1GreekLowercaseTauTex; + +#define dgMsgKanji83D2GreekLowercaseUpsilonTex "__OTR__textures/kanji/gMsgKanji83D2GreekLowercaseUpsilonTex" +static const ALIGN_ASSET(2) char gMsgKanji83D2GreekLowercaseUpsilonTex[] = dgMsgKanji83D2GreekLowercaseUpsilonTex; + +#define dgMsgKanji83D3GreekLowercasePhiTex "__OTR__textures/kanji/gMsgKanji83D3GreekLowercasePhiTex" +static const ALIGN_ASSET(2) char gMsgKanji83D3GreekLowercasePhiTex[] = dgMsgKanji83D3GreekLowercasePhiTex; + +#define dgMsgKanji83D4GreekLowercaseChiTex "__OTR__textures/kanji/gMsgKanji83D4GreekLowercaseChiTex" +static const ALIGN_ASSET(2) char gMsgKanji83D4GreekLowercaseChiTex[] = dgMsgKanji83D4GreekLowercaseChiTex; + +#define dgMsgKanji83D5GreekLowercasePsiTex "__OTR__textures/kanji/gMsgKanji83D5GreekLowercasePsiTex" +static const ALIGN_ASSET(2) char gMsgKanji83D5GreekLowercasePsiTex[] = dgMsgKanji83D5GreekLowercasePsiTex; + +#define dgMsgKanji83D6GreekLowercaseOmegaTex "__OTR__textures/kanji/gMsgKanji83D6GreekLowercaseOmegaTex" +static const ALIGN_ASSET(2) char gMsgKanji83D6GreekLowercaseOmegaTex[] = dgMsgKanji83D6GreekLowercaseOmegaTex; + +#define dgMsgKanji83D7EmptyTex "__OTR__textures/kanji/gMsgKanji83D7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji83D7EmptyTex[] = dgMsgKanji83D7EmptyTex; + +#define dgMsgKanji8440HylianATex "__OTR__textures/kanji/gMsgKanji8440HylianATex" +static const ALIGN_ASSET(2) char gMsgKanji8440HylianATex[] = dgMsgKanji8440HylianATex; + +#define dgMsgKanji8441HylianITex "__OTR__textures/kanji/gMsgKanji8441HylianITex" +static const ALIGN_ASSET(2) char gMsgKanji8441HylianITex[] = dgMsgKanji8441HylianITex; + +#define dgMsgKanji8442HylianUTex "__OTR__textures/kanji/gMsgKanji8442HylianUTex" +static const ALIGN_ASSET(2) char gMsgKanji8442HylianUTex[] = dgMsgKanji8442HylianUTex; + +#define dgMsgKanji8443HylianETex "__OTR__textures/kanji/gMsgKanji8443HylianETex" +static const ALIGN_ASSET(2) char gMsgKanji8443HylianETex[] = dgMsgKanji8443HylianETex; + +#define dgMsgKanji8444HylianOTex "__OTR__textures/kanji/gMsgKanji8444HylianOTex" +static const ALIGN_ASSET(2) char gMsgKanji8444HylianOTex[] = dgMsgKanji8444HylianOTex; + +#define dgMsgKanji8445HylianKaTex "__OTR__textures/kanji/gMsgKanji8445HylianKaTex" +static const ALIGN_ASSET(2) char gMsgKanji8445HylianKaTex[] = dgMsgKanji8445HylianKaTex; + +#define dgMsgKanji8446HylianKiTex "__OTR__textures/kanji/gMsgKanji8446HylianKiTex" +static const ALIGN_ASSET(2) char gMsgKanji8446HylianKiTex[] = dgMsgKanji8446HylianKiTex; + +#define dgMsgKanji8447HylianKuTex "__OTR__textures/kanji/gMsgKanji8447HylianKuTex" +static const ALIGN_ASSET(2) char gMsgKanji8447HylianKuTex[] = dgMsgKanji8447HylianKuTex; + +#define dgMsgKanji8448HylianKeTex "__OTR__textures/kanji/gMsgKanji8448HylianKeTex" +static const ALIGN_ASSET(2) char gMsgKanji8448HylianKeTex[] = dgMsgKanji8448HylianKeTex; + +#define dgMsgKanji8449HylianKoTex "__OTR__textures/kanji/gMsgKanji8449HylianKoTex" +static const ALIGN_ASSET(2) char gMsgKanji8449HylianKoTex[] = dgMsgKanji8449HylianKoTex; + +#define dgMsgKanji844AHylianSaTex "__OTR__textures/kanji/gMsgKanji844AHylianSaTex" +static const ALIGN_ASSET(2) char gMsgKanji844AHylianSaTex[] = dgMsgKanji844AHylianSaTex; + +#define dgMsgKanji844BHylianShiTex "__OTR__textures/kanji/gMsgKanji844BHylianShiTex" +static const ALIGN_ASSET(2) char gMsgKanji844BHylianShiTex[] = dgMsgKanji844BHylianShiTex; + +#define dgMsgKanji844CHylianSuTex "__OTR__textures/kanji/gMsgKanji844CHylianSuTex" +static const ALIGN_ASSET(2) char gMsgKanji844CHylianSuTex[] = dgMsgKanji844CHylianSuTex; + +#define dgMsgKanji844DHylianSeTex "__OTR__textures/kanji/gMsgKanji844DHylianSeTex" +static const ALIGN_ASSET(2) char gMsgKanji844DHylianSeTex[] = dgMsgKanji844DHylianSeTex; + +#define dgMsgKanji844EHylianSoTex "__OTR__textures/kanji/gMsgKanji844EHylianSoTex" +static const ALIGN_ASSET(2) char gMsgKanji844EHylianSoTex[] = dgMsgKanji844EHylianSoTex; + +#define dgMsgKanji844FHylianTaTex "__OTR__textures/kanji/gMsgKanji844FHylianTaTex" +static const ALIGN_ASSET(2) char gMsgKanji844FHylianTaTex[] = dgMsgKanji844FHylianTaTex; + +#define dgMsgKanji8450HylianChiTex "__OTR__textures/kanji/gMsgKanji8450HylianChiTex" +static const ALIGN_ASSET(2) char gMsgKanji8450HylianChiTex[] = dgMsgKanji8450HylianChiTex; + +#define dgMsgKanji8451HylianTsuTex "__OTR__textures/kanji/gMsgKanji8451HylianTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji8451HylianTsuTex[] = dgMsgKanji8451HylianTsuTex; + +#define dgMsgKanji8452HylianTeTex "__OTR__textures/kanji/gMsgKanji8452HylianTeTex" +static const ALIGN_ASSET(2) char gMsgKanji8452HylianTeTex[] = dgMsgKanji8452HylianTeTex; + +#define dgMsgKanji8453HylianToTex "__OTR__textures/kanji/gMsgKanji8453HylianToTex" +static const ALIGN_ASSET(2) char gMsgKanji8453HylianToTex[] = dgMsgKanji8453HylianToTex; + +#define dgMsgKanji8454HylianNaTex "__OTR__textures/kanji/gMsgKanji8454HylianNaTex" +static const ALIGN_ASSET(2) char gMsgKanji8454HylianNaTex[] = dgMsgKanji8454HylianNaTex; + +#define dgMsgKanji8455HylianNiTex "__OTR__textures/kanji/gMsgKanji8455HylianNiTex" +static const ALIGN_ASSET(2) char gMsgKanji8455HylianNiTex[] = dgMsgKanji8455HylianNiTex; + +#define dgMsgKanji8456HylianNuTex "__OTR__textures/kanji/gMsgKanji8456HylianNuTex" +static const ALIGN_ASSET(2) char gMsgKanji8456HylianNuTex[] = dgMsgKanji8456HylianNuTex; + +#define dgMsgKanji8457HylianNeTex "__OTR__textures/kanji/gMsgKanji8457HylianNeTex" +static const ALIGN_ASSET(2) char gMsgKanji8457HylianNeTex[] = dgMsgKanji8457HylianNeTex; + +#define dgMsgKanji8458HylianNoTex "__OTR__textures/kanji/gMsgKanji8458HylianNoTex" +static const ALIGN_ASSET(2) char gMsgKanji8458HylianNoTex[] = dgMsgKanji8458HylianNoTex; + +#define dgMsgKanji8459HylianHaTex "__OTR__textures/kanji/gMsgKanji8459HylianHaTex" +static const ALIGN_ASSET(2) char gMsgKanji8459HylianHaTex[] = dgMsgKanji8459HylianHaTex; + +#define dgMsgKanji845AHylianHiTex "__OTR__textures/kanji/gMsgKanji845AHylianHiTex" +static const ALIGN_ASSET(2) char gMsgKanji845AHylianHiTex[] = dgMsgKanji845AHylianHiTex; + +#define dgMsgKanji845BHylianFuTex "__OTR__textures/kanji/gMsgKanji845BHylianFuTex" +static const ALIGN_ASSET(2) char gMsgKanji845BHylianFuTex[] = dgMsgKanji845BHylianFuTex; + +#define dgMsgKanji845CHylianHeTex "__OTR__textures/kanji/gMsgKanji845CHylianHeTex" +static const ALIGN_ASSET(2) char gMsgKanji845CHylianHeTex[] = dgMsgKanji845CHylianHeTex; + +#define dgMsgKanji845DHylianHoTex "__OTR__textures/kanji/gMsgKanji845DHylianHoTex" +static const ALIGN_ASSET(2) char gMsgKanji845DHylianHoTex[] = dgMsgKanji845DHylianHoTex; + +#define dgMsgKanji845EHylianMaTex "__OTR__textures/kanji/gMsgKanji845EHylianMaTex" +static const ALIGN_ASSET(2) char gMsgKanji845EHylianMaTex[] = dgMsgKanji845EHylianMaTex; + +#define dgMsgKanji845FHylianMiTex "__OTR__textures/kanji/gMsgKanji845FHylianMiTex" +static const ALIGN_ASSET(2) char gMsgKanji845FHylianMiTex[] = dgMsgKanji845FHylianMiTex; + +#define dgMsgKanji8460HylianMuTex "__OTR__textures/kanji/gMsgKanji8460HylianMuTex" +static const ALIGN_ASSET(2) char gMsgKanji8460HylianMuTex[] = dgMsgKanji8460HylianMuTex; + +#define dgMsgKanji8470HylianMeTex "__OTR__textures/kanji/gMsgKanji8470HylianMeTex" +static const ALIGN_ASSET(2) char gMsgKanji8470HylianMeTex[] = dgMsgKanji8470HylianMeTex; + +#define dgMsgKanji8471HylianMoTex "__OTR__textures/kanji/gMsgKanji8471HylianMoTex" +static const ALIGN_ASSET(2) char gMsgKanji8471HylianMoTex[] = dgMsgKanji8471HylianMoTex; + +#define dgMsgKanji8472HylianYaTex "__OTR__textures/kanji/gMsgKanji8472HylianYaTex" +static const ALIGN_ASSET(2) char gMsgKanji8472HylianYaTex[] = dgMsgKanji8472HylianYaTex; + +#define dgMsgKanji8473HylianYuTex "__OTR__textures/kanji/gMsgKanji8473HylianYuTex" +static const ALIGN_ASSET(2) char gMsgKanji8473HylianYuTex[] = dgMsgKanji8473HylianYuTex; + +#define dgMsgKanji8474HylianYoTex "__OTR__textures/kanji/gMsgKanji8474HylianYoTex" +static const ALIGN_ASSET(2) char gMsgKanji8474HylianYoTex[] = dgMsgKanji8474HylianYoTex; + +#define dgMsgKanji8475HylianRaTex "__OTR__textures/kanji/gMsgKanji8475HylianRaTex" +static const ALIGN_ASSET(2) char gMsgKanji8475HylianRaTex[] = dgMsgKanji8475HylianRaTex; + +#define dgMsgKanji8476HylianRiTex "__OTR__textures/kanji/gMsgKanji8476HylianRiTex" +static const ALIGN_ASSET(2) char gMsgKanji8476HylianRiTex[] = dgMsgKanji8476HylianRiTex; + +#define dgMsgKanji8477HylianRuTex "__OTR__textures/kanji/gMsgKanji8477HylianRuTex" +static const ALIGN_ASSET(2) char gMsgKanji8477HylianRuTex[] = dgMsgKanji8477HylianRuTex; + +#define dgMsgKanji8478HylianReTex "__OTR__textures/kanji/gMsgKanji8478HylianReTex" +static const ALIGN_ASSET(2) char gMsgKanji8478HylianReTex[] = dgMsgKanji8478HylianReTex; + +#define dgMsgKanji8479HylianRoTex "__OTR__textures/kanji/gMsgKanji8479HylianRoTex" +static const ALIGN_ASSET(2) char gMsgKanji8479HylianRoTex[] = dgMsgKanji8479HylianRoTex; + +#define dgMsgKanji847AHylianWaTex "__OTR__textures/kanji/gMsgKanji847AHylianWaTex" +static const ALIGN_ASSET(2) char gMsgKanji847AHylianWaTex[] = dgMsgKanji847AHylianWaTex; + +#define dgMsgKanji847BHylianWoTex "__OTR__textures/kanji/gMsgKanji847BHylianWoTex" +static const ALIGN_ASSET(2) char gMsgKanji847BHylianWoTex[] = dgMsgKanji847BHylianWoTex; + +#define dgMsgKanji847CHylianNTex "__OTR__textures/kanji/gMsgKanji847CHylianNTex" +static const ALIGN_ASSET(2) char gMsgKanji847CHylianNTex[] = dgMsgKanji847CHylianNTex; + +#define dgMsgKanji847DHylianToutenTex "__OTR__textures/kanji/gMsgKanji847DHylianToutenTex" +static const ALIGN_ASSET(2) char gMsgKanji847DHylianToutenTex[] = dgMsgKanji847DHylianToutenTex; + +#define dgMsgKanji847EHylianKutenTex "__OTR__textures/kanji/gMsgKanji847EHylianKutenTex" +static const ALIGN_ASSET(2) char gMsgKanji847EHylianKutenTex[] = dgMsgKanji847EHylianKutenTex; + +#define dgMsgKanji8480CyrillicLowercaseOTex "__OTR__textures/kanji/gMsgKanji8480CyrillicLowercaseOTex" +static const ALIGN_ASSET(2) char gMsgKanji8480CyrillicLowercaseOTex[] = dgMsgKanji8480CyrillicLowercaseOTex; + +#define dgMsgKanji8481CyrillicLowercasePeTex "__OTR__textures/kanji/gMsgKanji8481CyrillicLowercasePeTex" +static const ALIGN_ASSET(2) char gMsgKanji8481CyrillicLowercasePeTex[] = dgMsgKanji8481CyrillicLowercasePeTex; + +#define dgMsgKanji8482CyrillicLowercaseErTex "__OTR__textures/kanji/gMsgKanji8482CyrillicLowercaseErTex" +static const ALIGN_ASSET(2) char gMsgKanji8482CyrillicLowercaseErTex[] = dgMsgKanji8482CyrillicLowercaseErTex; + +#define dgMsgKanji8483CyrillicLowercaseEsTex "__OTR__textures/kanji/gMsgKanji8483CyrillicLowercaseEsTex" +static const ALIGN_ASSET(2) char gMsgKanji8483CyrillicLowercaseEsTex[] = dgMsgKanji8483CyrillicLowercaseEsTex; + +#define dgMsgKanji8484CyrillicLowercaseTeTex "__OTR__textures/kanji/gMsgKanji8484CyrillicLowercaseTeTex" +static const ALIGN_ASSET(2) char gMsgKanji8484CyrillicLowercaseTeTex[] = dgMsgKanji8484CyrillicLowercaseTeTex; + +#define dgMsgKanji8485CyrillicLowercaseUTex "__OTR__textures/kanji/gMsgKanji8485CyrillicLowercaseUTex" +static const ALIGN_ASSET(2) char gMsgKanji8485CyrillicLowercaseUTex[] = dgMsgKanji8485CyrillicLowercaseUTex; + +#define dgMsgKanji8486CyrillicLowercaseEfTex "__OTR__textures/kanji/gMsgKanji8486CyrillicLowercaseEfTex" +static const ALIGN_ASSET(2) char gMsgKanji8486CyrillicLowercaseEfTex[] = dgMsgKanji8486CyrillicLowercaseEfTex; + +#define dgMsgKanji8487CyrillicLowercaseHaTex "__OTR__textures/kanji/gMsgKanji8487CyrillicLowercaseHaTex" +static const ALIGN_ASSET(2) char gMsgKanji8487CyrillicLowercaseHaTex[] = dgMsgKanji8487CyrillicLowercaseHaTex; + +#define dgMsgKanji8488CyrillicLowercaseTseTex "__OTR__textures/kanji/gMsgKanji8488CyrillicLowercaseTseTex" +static const ALIGN_ASSET(2) char gMsgKanji8488CyrillicLowercaseTseTex[] = dgMsgKanji8488CyrillicLowercaseTseTex; + +#define dgMsgKanji8489CyrillicLowercaseCheTex "__OTR__textures/kanji/gMsgKanji8489CyrillicLowercaseCheTex" +static const ALIGN_ASSET(2) char gMsgKanji8489CyrillicLowercaseCheTex[] = dgMsgKanji8489CyrillicLowercaseCheTex; + +#define dgMsgKanji848ACyrillicLowercaseShaTex "__OTR__textures/kanji/gMsgKanji848ACyrillicLowercaseShaTex" +static const ALIGN_ASSET(2) char gMsgKanji848ACyrillicLowercaseShaTex[] = dgMsgKanji848ACyrillicLowercaseShaTex; + +#define dgMsgKanji848BCyrillicLowercaseShchaTex "__OTR__textures/kanji/gMsgKanji848BCyrillicLowercaseShchaTex" +static const ALIGN_ASSET(2) char gMsgKanji848BCyrillicLowercaseShchaTex[] = dgMsgKanji848BCyrillicLowercaseShchaTex; + +#define dgMsgKanji848CCyrillicLowercaseHardSignTex "__OTR__textures/kanji/gMsgKanji848CCyrillicLowercaseHardSignTex" +static const ALIGN_ASSET(2) char gMsgKanji848CCyrillicLowercaseHardSignTex[] = dgMsgKanji848CCyrillicLowercaseHardSignTex; + +#define dgMsgKanji848DCyrillicLowercaseYeruTex "__OTR__textures/kanji/gMsgKanji848DCyrillicLowercaseYeruTex" +static const ALIGN_ASSET(2) char gMsgKanji848DCyrillicLowercaseYeruTex[] = dgMsgKanji848DCyrillicLowercaseYeruTex; + +#define dgMsgKanji848ECyrillicLowercaseSoftSignTex "__OTR__textures/kanji/gMsgKanji848ECyrillicLowercaseSoftSignTex" +static const ALIGN_ASSET(2) char gMsgKanji848ECyrillicLowercaseSoftSignTex[] = dgMsgKanji848ECyrillicLowercaseSoftSignTex; + +#define dgMsgKanji848FCyrillicLowercaseETex "__OTR__textures/kanji/gMsgKanji848FCyrillicLowercaseETex" +static const ALIGN_ASSET(2) char gMsgKanji848FCyrillicLowercaseETex[] = dgMsgKanji848FCyrillicLowercaseETex; + +#define dgMsgKanji8490CyrillicLowercaseYuTex "__OTR__textures/kanji/gMsgKanji8490CyrillicLowercaseYuTex" +static const ALIGN_ASSET(2) char gMsgKanji8490CyrillicLowercaseYuTex[] = dgMsgKanji8490CyrillicLowercaseYuTex; + +#define dgMsgKanji8491CyrillicLowercaseYaTex "__OTR__textures/kanji/gMsgKanji8491CyrillicLowercaseYaTex" +static const ALIGN_ASSET(2) char gMsgKanji8491CyrillicLowercaseYaTex[] = dgMsgKanji8491CyrillicLowercaseYaTex; + +#define dgMsgKanji849FBoxThinHorizontalTex "__OTR__textures/kanji/gMsgKanji849FBoxThinHorizontalTex" +static const ALIGN_ASSET(2) char gMsgKanji849FBoxThinHorizontalTex[] = dgMsgKanji849FBoxThinHorizontalTex; + +#define dgMsgKanji84A0BoxThinVerticalTex "__OTR__textures/kanji/gMsgKanji84A0BoxThinVerticalTex" +static const ALIGN_ASSET(2) char gMsgKanji84A0BoxThinVerticalTex[] = dgMsgKanji84A0BoxThinVerticalTex; + +#define dgMsgKanji84A1BoxThinTopLeftTex "__OTR__textures/kanji/gMsgKanji84A1BoxThinTopLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84A1BoxThinTopLeftTex[] = dgMsgKanji84A1BoxThinTopLeftTex; + +#define dgMsgKanji84A2BoxThinTopRightTex "__OTR__textures/kanji/gMsgKanji84A2BoxThinTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84A2BoxThinTopRightTex[] = dgMsgKanji84A2BoxThinTopRightTex; + +#define dgMsgKanji84A3BoxThinBottomRightTex "__OTR__textures/kanji/gMsgKanji84A3BoxThinBottomRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84A3BoxThinBottomRightTex[] = dgMsgKanji84A3BoxThinBottomRightTex; + +#define dgMsgKanji84A4BoxThinBottomLeftTex "__OTR__textures/kanji/gMsgKanji84A4BoxThinBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84A4BoxThinBottomLeftTex[] = dgMsgKanji84A4BoxThinBottomLeftTex; + +#define dgMsgKanji84A5BoxThinLeftTex "__OTR__textures/kanji/gMsgKanji84A5BoxThinLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84A5BoxThinLeftTex[] = dgMsgKanji84A5BoxThinLeftTex; + +#define dgMsgKanji84A6BoxThinTopTex "__OTR__textures/kanji/gMsgKanji84A6BoxThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji84A6BoxThinTopTex[] = dgMsgKanji84A6BoxThinTopTex; + +#define dgMsgKanji84A7BoxThinRightTex "__OTR__textures/kanji/gMsgKanji84A7BoxThinRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84A7BoxThinRightTex[] = dgMsgKanji84A7BoxThinRightTex; + +#define dgMsgKanji84A8BoxThinBottomTex "__OTR__textures/kanji/gMsgKanji84A8BoxThinBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji84A8BoxThinBottomTex[] = dgMsgKanji84A8BoxThinBottomTex; + +#define dgMsgKanji84A9BoxThinCenterTex "__OTR__textures/kanji/gMsgKanji84A9BoxThinCenterTex" +static const ALIGN_ASSET(2) char gMsgKanji84A9BoxThinCenterTex[] = dgMsgKanji84A9BoxThinCenterTex; + +#define dgMsgKanji84AABoxThickHorizontalTex "__OTR__textures/kanji/gMsgKanji84AABoxThickHorizontalTex" +static const ALIGN_ASSET(2) char gMsgKanji84AABoxThickHorizontalTex[] = dgMsgKanji84AABoxThickHorizontalTex; + +#define dgMsgKanji84ABBoxThickVerticalTex "__OTR__textures/kanji/gMsgKanji84ABBoxThickVerticalTex" +static const ALIGN_ASSET(2) char gMsgKanji84ABBoxThickVerticalTex[] = dgMsgKanji84ABBoxThickVerticalTex; + +#define dgMsgKanji84ACBoxThickTopLeftTex "__OTR__textures/kanji/gMsgKanji84ACBoxThickTopLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84ACBoxThickTopLeftTex[] = dgMsgKanji84ACBoxThickTopLeftTex; + +#define dgMsgKanji84ADBoxThickTopRightTex "__OTR__textures/kanji/gMsgKanji84ADBoxThickTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84ADBoxThickTopRightTex[] = dgMsgKanji84ADBoxThickTopRightTex; + +#define dgMsgKanji84AEBoxThickBottomRightTex "__OTR__textures/kanji/gMsgKanji84AEBoxThickBottomRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84AEBoxThickBottomRightTex[] = dgMsgKanji84AEBoxThickBottomRightTex; + +#define dgMsgKanji84AFBoxThickBottomLeftTex "__OTR__textures/kanji/gMsgKanji84AFBoxThickBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84AFBoxThickBottomLeftTex[] = dgMsgKanji84AFBoxThickBottomLeftTex; + +#define dgMsgKanji84B0BoxThickLeftTex "__OTR__textures/kanji/gMsgKanji84B0BoxThickLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84B0BoxThickLeftTex[] = dgMsgKanji84B0BoxThickLeftTex; + +#define dgMsgKanji84B1BoxThickTopTex "__OTR__textures/kanji/gMsgKanji84B1BoxThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji84B1BoxThickTopTex[] = dgMsgKanji84B1BoxThickTopTex; + +#define dgMsgKanji84B2BoxThickRightTex "__OTR__textures/kanji/gMsgKanji84B2BoxThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84B2BoxThickRightTex[] = dgMsgKanji84B2BoxThickRightTex; + +#define dgMsgKanji84B3BoxThickBottomTex "__OTR__textures/kanji/gMsgKanji84B3BoxThickBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji84B3BoxThickBottomTex[] = dgMsgKanji84B3BoxThickBottomTex; + +#define dgMsgKanji84B4BoxThickCenterTex "__OTR__textures/kanji/gMsgKanji84B4BoxThickCenterTex" +static const ALIGN_ASSET(2) char gMsgKanji84B4BoxThickCenterTex[] = dgMsgKanji84B4BoxThickCenterTex; + +#define dgMsgKanji84B5BoxVertThickHorizThinLeftTex "__OTR__textures/kanji/gMsgKanji84B5BoxVertThickHorizThinLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84B5BoxVertThickHorizThinLeftTex[] = dgMsgKanji84B5BoxVertThickHorizThinLeftTex; + +#define dgMsgKanji84B6BoxVertThinHorizThickTopTex "__OTR__textures/kanji/gMsgKanji84B6BoxVertThinHorizThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji84B6BoxVertThinHorizThickTopTex[] = dgMsgKanji84B6BoxVertThinHorizThickTopTex; + +#define dgMsgKanji84B7BoxVertThickHorizThinRightTex "__OTR__textures/kanji/gMsgKanji84B7BoxVertThickHorizThinRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84B7BoxVertThickHorizThinRightTex[] = dgMsgKanji84B7BoxVertThickHorizThinRightTex; + +#define dgMsgKanji84B8BoxVertThinHorizThickBottomTex "__OTR__textures/kanji/gMsgKanji84B8BoxVertThinHorizThickBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji84B8BoxVertThinHorizThickBottomTex[] = dgMsgKanji84B8BoxVertThinHorizThickBottomTex; + +#define dgMsgKanji84B9BoxVertThinHorizThickCenterTex "__OTR__textures/kanji/gMsgKanji84B9BoxVertThinHorizThickCenterTex" +static const ALIGN_ASSET(2) char gMsgKanji84B9BoxVertThinHorizThickCenterTex[] = dgMsgKanji84B9BoxVertThinHorizThickCenterTex; + +#define dgMsgKanji84BABoxVertThinHorizThickLeftTex "__OTR__textures/kanji/gMsgKanji84BABoxVertThinHorizThickLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84BABoxVertThinHorizThickLeftTex[] = dgMsgKanji84BABoxVertThinHorizThickLeftTex; + +#define dgMsgKanji84BBBoxVertThickHorizThinTopTex "__OTR__textures/kanji/gMsgKanji84BBBoxVertThickHorizThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji84BBBoxVertThickHorizThinTopTex[] = dgMsgKanji84BBBoxVertThickHorizThinTopTex; + +#define dgMsgKanji84BCBoxVertThinHorizThickRightTex "__OTR__textures/kanji/gMsgKanji84BCBoxVertThinHorizThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84BCBoxVertThinHorizThickRightTex[] = dgMsgKanji84BCBoxVertThinHorizThickRightTex; + +#define dgMsgKanji84BDBoxVertThickHorizThinBottomTex "__OTR__textures/kanji/gMsgKanji84BDBoxVertThickHorizThinBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji84BDBoxVertThickHorizThinBottomTex[] = dgMsgKanji84BDBoxVertThickHorizThinBottomTex; + +#define dgMsgKanji84BEBoxVertThickHorizThinCenterTex "__OTR__textures/kanji/gMsgKanji84BEBoxVertThickHorizThinCenterTex" +static const ALIGN_ASSET(2) char gMsgKanji84BEBoxVertThickHorizThinCenterTex[] = dgMsgKanji84BEBoxVertThickHorizThinCenterTex; + +#define dgMsgKanji84BFEmptyTex "__OTR__textures/kanji/gMsgKanji84BFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji84BFEmptyTex[] = dgMsgKanji84BFEmptyTex; + +#define dgMsgKanji8540HalfwidthExclamationMarkTex "__OTR__textures/kanji/gMsgKanji8540HalfwidthExclamationMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji8540HalfwidthExclamationMarkTex[] = dgMsgKanji8540HalfwidthExclamationMarkTex; + +#define dgMsgKanji8541HalfwidthQuotationMarkTex "__OTR__textures/kanji/gMsgKanji8541HalfwidthQuotationMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji8541HalfwidthQuotationMarkTex[] = dgMsgKanji8541HalfwidthQuotationMarkTex; + +#define dgMsgKanji8542HalfwidthNumberSignTex "__OTR__textures/kanji/gMsgKanji8542HalfwidthNumberSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8542HalfwidthNumberSignTex[] = dgMsgKanji8542HalfwidthNumberSignTex; + +#define dgMsgKanji8543HalfwidthDollarSignTex "__OTR__textures/kanji/gMsgKanji8543HalfwidthDollarSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8543HalfwidthDollarSignTex[] = dgMsgKanji8543HalfwidthDollarSignTex; + +#define dgMsgKanji8544HalfwidthPercentSignTex "__OTR__textures/kanji/gMsgKanji8544HalfwidthPercentSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8544HalfwidthPercentSignTex[] = dgMsgKanji8544HalfwidthPercentSignTex; + +#define dgMsgKanji8545HalfwidthAmpersandTex "__OTR__textures/kanji/gMsgKanji8545HalfwidthAmpersandTex" +static const ALIGN_ASSET(2) char gMsgKanji8545HalfwidthAmpersandTex[] = dgMsgKanji8545HalfwidthAmpersandTex; + +#define dgMsgKanji8546HalfwidthApostropheTex "__OTR__textures/kanji/gMsgKanji8546HalfwidthApostropheTex" +static const ALIGN_ASSET(2) char gMsgKanji8546HalfwidthApostropheTex[] = dgMsgKanji8546HalfwidthApostropheTex; + +#define dgMsgKanji8547HalfwidthParenthesesLeftTex "__OTR__textures/kanji/gMsgKanji8547HalfwidthParenthesesLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8547HalfwidthParenthesesLeftTex[] = dgMsgKanji8547HalfwidthParenthesesLeftTex; + +#define dgMsgKanji8548HalfwidthParenthesesRightTex "__OTR__textures/kanji/gMsgKanji8548HalfwidthParenthesesRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8548HalfwidthParenthesesRightTex[] = dgMsgKanji8548HalfwidthParenthesesRightTex; + +#define dgMsgKanji8549HalfwidthAsteriskTex "__OTR__textures/kanji/gMsgKanji8549HalfwidthAsteriskTex" +static const ALIGN_ASSET(2) char gMsgKanji8549HalfwidthAsteriskTex[] = dgMsgKanji8549HalfwidthAsteriskTex; + +#define dgMsgKanji854AHalfwidthPlusSignTex "__OTR__textures/kanji/gMsgKanji854AHalfwidthPlusSignTex" +static const ALIGN_ASSET(2) char gMsgKanji854AHalfwidthPlusSignTex[] = dgMsgKanji854AHalfwidthPlusSignTex; + +#define dgMsgKanji854BHalfwidthCommaTex "__OTR__textures/kanji/gMsgKanji854BHalfwidthCommaTex" +static const ALIGN_ASSET(2) char gMsgKanji854BHalfwidthCommaTex[] = dgMsgKanji854BHalfwidthCommaTex; + +#define dgMsgKanji854CHalfwidthHyphenMinusTex "__OTR__textures/kanji/gMsgKanji854CHalfwidthHyphenMinusTex" +static const ALIGN_ASSET(2) char gMsgKanji854CHalfwidthHyphenMinusTex[] = dgMsgKanji854CHalfwidthHyphenMinusTex; + +#define dgMsgKanji854DHalfwidthPeriodTex "__OTR__textures/kanji/gMsgKanji854DHalfwidthPeriodTex" +static const ALIGN_ASSET(2) char gMsgKanji854DHalfwidthPeriodTex[] = dgMsgKanji854DHalfwidthPeriodTex; + +#define dgMsgKanji854EHalfwidthSlashTex "__OTR__textures/kanji/gMsgKanji854EHalfwidthSlashTex" +static const ALIGN_ASSET(2) char gMsgKanji854EHalfwidthSlashTex[] = dgMsgKanji854EHalfwidthSlashTex; + +#define dgMsgKanji854FHalfwidth0Tex "__OTR__textures/kanji/gMsgKanji854FHalfwidth0Tex" +static const ALIGN_ASSET(2) char gMsgKanji854FHalfwidth0Tex[] = dgMsgKanji854FHalfwidth0Tex; + +#define dgMsgKanji8550Halfwidth1Tex "__OTR__textures/kanji/gMsgKanji8550Halfwidth1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8550Halfwidth1Tex[] = dgMsgKanji8550Halfwidth1Tex; + +#define dgMsgKanji8551Halfwidth2Tex "__OTR__textures/kanji/gMsgKanji8551Halfwidth2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8551Halfwidth2Tex[] = dgMsgKanji8551Halfwidth2Tex; + +#define dgMsgKanji8552Halfwidth3Tex "__OTR__textures/kanji/gMsgKanji8552Halfwidth3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8552Halfwidth3Tex[] = dgMsgKanji8552Halfwidth3Tex; + +#define dgMsgKanji8553Halfwidth4Tex "__OTR__textures/kanji/gMsgKanji8553Halfwidth4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8553Halfwidth4Tex[] = dgMsgKanji8553Halfwidth4Tex; + +#define dgMsgKanji855EHalfwidthQuestionMarkTex "__OTR__textures/kanji/gMsgKanji855EHalfwidthQuestionMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji855EHalfwidthQuestionMarkTex[] = dgMsgKanji855EHalfwidthQuestionMarkTex; + +#define dgMsgKanji855FHalfwidthAtSignTex "__OTR__textures/kanji/gMsgKanji855FHalfwidthAtSignTex" +static const ALIGN_ASSET(2) char gMsgKanji855FHalfwidthAtSignTex[] = dgMsgKanji855FHalfwidthAtSignTex; + +#define dgMsgKanji8560HalfwidthCapitalATex "__OTR__textures/kanji/gMsgKanji8560HalfwidthCapitalATex" +static const ALIGN_ASSET(2) char gMsgKanji8560HalfwidthCapitalATex[] = dgMsgKanji8560HalfwidthCapitalATex; + +#define dgMsgKanji8561HalfwidthCapitalBTex "__OTR__textures/kanji/gMsgKanji8561HalfwidthCapitalBTex" +static const ALIGN_ASSET(2) char gMsgKanji8561HalfwidthCapitalBTex[] = dgMsgKanji8561HalfwidthCapitalBTex; + +#define dgMsgKanji8562HalfwidthCapitalCTex "__OTR__textures/kanji/gMsgKanji8562HalfwidthCapitalCTex" +static const ALIGN_ASSET(2) char gMsgKanji8562HalfwidthCapitalCTex[] = dgMsgKanji8562HalfwidthCapitalCTex; + +#define dgMsgKanji8563HalfwidthCapitalDTex "__OTR__textures/kanji/gMsgKanji8563HalfwidthCapitalDTex" +static const ALIGN_ASSET(2) char gMsgKanji8563HalfwidthCapitalDTex[] = dgMsgKanji8563HalfwidthCapitalDTex; + +#define dgMsgKanji8564HalfwidthCapitalETex "__OTR__textures/kanji/gMsgKanji8564HalfwidthCapitalETex" +static const ALIGN_ASSET(2) char gMsgKanji8564HalfwidthCapitalETex[] = dgMsgKanji8564HalfwidthCapitalETex; + +#define dgMsgKanji8565HalfwidthCapitalFTex "__OTR__textures/kanji/gMsgKanji8565HalfwidthCapitalFTex" +static const ALIGN_ASSET(2) char gMsgKanji8565HalfwidthCapitalFTex[] = dgMsgKanji8565HalfwidthCapitalFTex; + +#define dgMsgKanji8566HalfwidthCapitalGTex "__OTR__textures/kanji/gMsgKanji8566HalfwidthCapitalGTex" +static const ALIGN_ASSET(2) char gMsgKanji8566HalfwidthCapitalGTex[] = dgMsgKanji8566HalfwidthCapitalGTex; + +#define dgMsgKanji8567HalfwidthCapitalHTex "__OTR__textures/kanji/gMsgKanji8567HalfwidthCapitalHTex" +static const ALIGN_ASSET(2) char gMsgKanji8567HalfwidthCapitalHTex[] = dgMsgKanji8567HalfwidthCapitalHTex; + +#define dgMsgKanji8568HalfwidthCapitalITex "__OTR__textures/kanji/gMsgKanji8568HalfwidthCapitalITex" +static const ALIGN_ASSET(2) char gMsgKanji8568HalfwidthCapitalITex[] = dgMsgKanji8568HalfwidthCapitalITex; + +#define dgMsgKanji8569HalfwidthCapitalJTex "__OTR__textures/kanji/gMsgKanji8569HalfwidthCapitalJTex" +static const ALIGN_ASSET(2) char gMsgKanji8569HalfwidthCapitalJTex[] = dgMsgKanji8569HalfwidthCapitalJTex; + +#define dgMsgKanji856AHalfwidthCapitalKTex "__OTR__textures/kanji/gMsgKanji856AHalfwidthCapitalKTex" +static const ALIGN_ASSET(2) char gMsgKanji856AHalfwidthCapitalKTex[] = dgMsgKanji856AHalfwidthCapitalKTex; + +#define dgMsgKanji856BHalfwidthCapitalLTex "__OTR__textures/kanji/gMsgKanji856BHalfwidthCapitalLTex" +static const ALIGN_ASSET(2) char gMsgKanji856BHalfwidthCapitalLTex[] = dgMsgKanji856BHalfwidthCapitalLTex; + +#define dgMsgKanji856CHalfwidthCapitalMTex "__OTR__textures/kanji/gMsgKanji856CHalfwidthCapitalMTex" +static const ALIGN_ASSET(2) char gMsgKanji856CHalfwidthCapitalMTex[] = dgMsgKanji856CHalfwidthCapitalMTex; + +#define dgMsgKanji856DHalfwidthCapitalNTex "__OTR__textures/kanji/gMsgKanji856DHalfwidthCapitalNTex" +static const ALIGN_ASSET(2) char gMsgKanji856DHalfwidthCapitalNTex[] = dgMsgKanji856DHalfwidthCapitalNTex; + +#define dgMsgKanji856EHalfwidthCapitalOTex "__OTR__textures/kanji/gMsgKanji856EHalfwidthCapitalOTex" +static const ALIGN_ASSET(2) char gMsgKanji856EHalfwidthCapitalOTex[] = dgMsgKanji856EHalfwidthCapitalOTex; + +#define dgMsgKanji856FHalfwidthCapitalPTex "__OTR__textures/kanji/gMsgKanji856FHalfwidthCapitalPTex" +static const ALIGN_ASSET(2) char gMsgKanji856FHalfwidthCapitalPTex[] = dgMsgKanji856FHalfwidthCapitalPTex; + +#define dgMsgKanji8570HalfwidthCapitalQTex "__OTR__textures/kanji/gMsgKanji8570HalfwidthCapitalQTex" +static const ALIGN_ASSET(2) char gMsgKanji8570HalfwidthCapitalQTex[] = dgMsgKanji8570HalfwidthCapitalQTex; + +#define dgMsgKanji8571HalfwidthCapitalRTex "__OTR__textures/kanji/gMsgKanji8571HalfwidthCapitalRTex" +static const ALIGN_ASSET(2) char gMsgKanji8571HalfwidthCapitalRTex[] = dgMsgKanji8571HalfwidthCapitalRTex; + +#define dgMsgKanji857CHalfwidthSquareBracketRightTex "__OTR__textures/kanji/gMsgKanji857CHalfwidthSquareBracketRightTex" +static const ALIGN_ASSET(2) char gMsgKanji857CHalfwidthSquareBracketRightTex[] = dgMsgKanji857CHalfwidthSquareBracketRightTex; + +#define dgMsgKanji857DHalfwidthCircumflexAccentTex "__OTR__textures/kanji/gMsgKanji857DHalfwidthCircumflexAccentTex" +static const ALIGN_ASSET(2) char gMsgKanji857DHalfwidthCircumflexAccentTex[] = dgMsgKanji857DHalfwidthCircumflexAccentTex; + +#define dgMsgKanji857EEmptyTex "__OTR__textures/kanji/gMsgKanji857EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji857EEmptyTex[] = dgMsgKanji857EEmptyTex; + +#define dgMsgKanji8580HalfwidthGraveAccentTex "__OTR__textures/kanji/gMsgKanji8580HalfwidthGraveAccentTex" +static const ALIGN_ASSET(2) char gMsgKanji8580HalfwidthGraveAccentTex[] = dgMsgKanji8580HalfwidthGraveAccentTex; + +#define dgMsgKanji8581HalfwidthLowercaseATex "__OTR__textures/kanji/gMsgKanji8581HalfwidthLowercaseATex" +static const ALIGN_ASSET(2) char gMsgKanji8581HalfwidthLowercaseATex[] = dgMsgKanji8581HalfwidthLowercaseATex; + +#define dgMsgKanji8582HalfwidthLowercaseBTex "__OTR__textures/kanji/gMsgKanji8582HalfwidthLowercaseBTex" +static const ALIGN_ASSET(2) char gMsgKanji8582HalfwidthLowercaseBTex[] = dgMsgKanji8582HalfwidthLowercaseBTex; + +#define dgMsgKanji8583HalfwidthLowercaseCTex "__OTR__textures/kanji/gMsgKanji8583HalfwidthLowercaseCTex" +static const ALIGN_ASSET(2) char gMsgKanji8583HalfwidthLowercaseCTex[] = dgMsgKanji8583HalfwidthLowercaseCTex; + +#define dgMsgKanji8584HalfwidthLowercaseDTex "__OTR__textures/kanji/gMsgKanji8584HalfwidthLowercaseDTex" +static const ALIGN_ASSET(2) char gMsgKanji8584HalfwidthLowercaseDTex[] = dgMsgKanji8584HalfwidthLowercaseDTex; + +#define dgMsgKanji8585HalfwidthLowercaseETex "__OTR__textures/kanji/gMsgKanji8585HalfwidthLowercaseETex" +static const ALIGN_ASSET(2) char gMsgKanji8585HalfwidthLowercaseETex[] = dgMsgKanji8585HalfwidthLowercaseETex; + +#define dgMsgKanji8591HalfwidthLowercaseQTex "__OTR__textures/kanji/gMsgKanji8591HalfwidthLowercaseQTex" +static const ALIGN_ASSET(2) char gMsgKanji8591HalfwidthLowercaseQTex[] = dgMsgKanji8591HalfwidthLowercaseQTex; + +#define dgMsgKanji8592HalfwidthLowercaseRTex "__OTR__textures/kanji/gMsgKanji8592HalfwidthLowercaseRTex" +static const ALIGN_ASSET(2) char gMsgKanji8592HalfwidthLowercaseRTex[] = dgMsgKanji8592HalfwidthLowercaseRTex; + +#define dgMsgKanji8593HalfwidthLowercaseSTex "__OTR__textures/kanji/gMsgKanji8593HalfwidthLowercaseSTex" +static const ALIGN_ASSET(2) char gMsgKanji8593HalfwidthLowercaseSTex[] = dgMsgKanji8593HalfwidthLowercaseSTex; + +#define dgMsgKanji8594HalfwidthLowercaseTTex "__OTR__textures/kanji/gMsgKanji8594HalfwidthLowercaseTTex" +static const ALIGN_ASSET(2) char gMsgKanji8594HalfwidthLowercaseTTex[] = dgMsgKanji8594HalfwidthLowercaseTTex; + +#define dgMsgKanji8595HalfwidthLowercaseUTex "__OTR__textures/kanji/gMsgKanji8595HalfwidthLowercaseUTex" +static const ALIGN_ASSET(2) char gMsgKanji8595HalfwidthLowercaseUTex[] = dgMsgKanji8595HalfwidthLowercaseUTex; + +#define dgMsgKanji8596HalfwidthLowercaseVTex "__OTR__textures/kanji/gMsgKanji8596HalfwidthLowercaseVTex" +static const ALIGN_ASSET(2) char gMsgKanji8596HalfwidthLowercaseVTex[] = dgMsgKanji8596HalfwidthLowercaseVTex; + +#define dgMsgKanji8597HalfwidthLowercaseWTex "__OTR__textures/kanji/gMsgKanji8597HalfwidthLowercaseWTex" +static const ALIGN_ASSET(2) char gMsgKanji8597HalfwidthLowercaseWTex[] = dgMsgKanji8597HalfwidthLowercaseWTex; + +#define dgMsgKanji8598HalfwidthLowercaseXTex "__OTR__textures/kanji/gMsgKanji8598HalfwidthLowercaseXTex" +static const ALIGN_ASSET(2) char gMsgKanji8598HalfwidthLowercaseXTex[] = dgMsgKanji8598HalfwidthLowercaseXTex; + +#define dgMsgKanji8599HalfwidthLowercaseYTex "__OTR__textures/kanji/gMsgKanji8599HalfwidthLowercaseYTex" +static const ALIGN_ASSET(2) char gMsgKanji8599HalfwidthLowercaseYTex[] = dgMsgKanji8599HalfwidthLowercaseYTex; + +#define dgMsgKanji859AHalfwidthLowercaseZTex "__OTR__textures/kanji/gMsgKanji859AHalfwidthLowercaseZTex" +static const ALIGN_ASSET(2) char gMsgKanji859AHalfwidthLowercaseZTex[] = dgMsgKanji859AHalfwidthLowercaseZTex; + +#define dgMsgKanji859FHalfwidthKutenTex "__OTR__textures/kanji/gMsgKanji859FHalfwidthKutenTex" +static const ALIGN_ASSET(2) char gMsgKanji859FHalfwidthKutenTex[] = dgMsgKanji859FHalfwidthKutenTex; + +#define dgMsgKanji85A0HalfwidthKagikakkoLeftTex "__OTR__textures/kanji/gMsgKanji85A0HalfwidthKagikakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji85A0HalfwidthKagikakkoLeftTex[] = dgMsgKanji85A0HalfwidthKagikakkoLeftTex; + +#define dgMsgKanji85A1HalfwidthKagikakkoRightTex "__OTR__textures/kanji/gMsgKanji85A1HalfwidthKagikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji85A1HalfwidthKagikakkoRightTex[] = dgMsgKanji85A1HalfwidthKagikakkoRightTex; + +#define dgMsgKanji85A2HalfwidthToutenTex "__OTR__textures/kanji/gMsgKanji85A2HalfwidthToutenTex" +static const ALIGN_ASSET(2) char gMsgKanji85A2HalfwidthToutenTex[] = dgMsgKanji85A2HalfwidthToutenTex; + +#define dgMsgKanji85A3HalfwidthNakatenTex "__OTR__textures/kanji/gMsgKanji85A3HalfwidthNakatenTex" +static const ALIGN_ASSET(2) char gMsgKanji85A3HalfwidthNakatenTex[] = dgMsgKanji85A3HalfwidthNakatenTex; + +#define dgMsgKanji85A4HalfwidthKatakanaWoTex "__OTR__textures/kanji/gMsgKanji85A4HalfwidthKatakanaWoTex" +static const ALIGN_ASSET(2) char gMsgKanji85A4HalfwidthKatakanaWoTex[] = dgMsgKanji85A4HalfwidthKatakanaWoTex; + +#define dgMsgKanji85A5HalfwidthKatakanaSmallATex "__OTR__textures/kanji/gMsgKanji85A5HalfwidthKatakanaSmallATex" +static const ALIGN_ASSET(2) char gMsgKanji85A5HalfwidthKatakanaSmallATex[] = dgMsgKanji85A5HalfwidthKatakanaSmallATex; + +#define dgMsgKanji85A6HalfwidthKatakanaSmallITex "__OTR__textures/kanji/gMsgKanji85A6HalfwidthKatakanaSmallITex" +static const ALIGN_ASSET(2) char gMsgKanji85A6HalfwidthKatakanaSmallITex[] = dgMsgKanji85A6HalfwidthKatakanaSmallITex; + +#define dgMsgKanji85A7HalfwidthKatakanaSmallUTex "__OTR__textures/kanji/gMsgKanji85A7HalfwidthKatakanaSmallUTex" +static const ALIGN_ASSET(2) char gMsgKanji85A7HalfwidthKatakanaSmallUTex[] = dgMsgKanji85A7HalfwidthKatakanaSmallUTex; + +#define dgMsgKanji85A8HalfwidthKatakanaSmallETex "__OTR__textures/kanji/gMsgKanji85A8HalfwidthKatakanaSmallETex" +static const ALIGN_ASSET(2) char gMsgKanji85A8HalfwidthKatakanaSmallETex[] = dgMsgKanji85A8HalfwidthKatakanaSmallETex; + +#define dgMsgKanji85A9HalfwidthKatakanaSmallOTex "__OTR__textures/kanji/gMsgKanji85A9HalfwidthKatakanaSmallOTex" +static const ALIGN_ASSET(2) char gMsgKanji85A9HalfwidthKatakanaSmallOTex[] = dgMsgKanji85A9HalfwidthKatakanaSmallOTex; + +#define dgMsgKanji85AAHalfwidthKatakanaSmallYaTex "__OTR__textures/kanji/gMsgKanji85AAHalfwidthKatakanaSmallYaTex" +static const ALIGN_ASSET(2) char gMsgKanji85AAHalfwidthKatakanaSmallYaTex[] = dgMsgKanji85AAHalfwidthKatakanaSmallYaTex; + +#define dgMsgKanji85ABHalfwidthKatakanaSmallYuTex "__OTR__textures/kanji/gMsgKanji85ABHalfwidthKatakanaSmallYuTex" +static const ALIGN_ASSET(2) char gMsgKanji85ABHalfwidthKatakanaSmallYuTex[] = dgMsgKanji85ABHalfwidthKatakanaSmallYuTex; + +#define dgMsgKanji85ACHalfwidthKatakanaSmallYoTex "__OTR__textures/kanji/gMsgKanji85ACHalfwidthKatakanaSmallYoTex" +static const ALIGN_ASSET(2) char gMsgKanji85ACHalfwidthKatakanaSmallYoTex[] = dgMsgKanji85ACHalfwidthKatakanaSmallYoTex; + +#define dgMsgKanji85ADHalfwidthKatakanaSmallTsuTex "__OTR__textures/kanji/gMsgKanji85ADHalfwidthKatakanaSmallTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji85ADHalfwidthKatakanaSmallTsuTex[] = dgMsgKanji85ADHalfwidthKatakanaSmallTsuTex; + +#define dgMsgKanji85B3HalfwidthKatakanaOTex "__OTR__textures/kanji/gMsgKanji85B3HalfwidthKatakanaOTex" +static const ALIGN_ASSET(2) char gMsgKanji85B3HalfwidthKatakanaOTex[] = dgMsgKanji85B3HalfwidthKatakanaOTex; + +#define dgMsgKanji85B4HalfwidthKatakanaKaTex "__OTR__textures/kanji/gMsgKanji85B4HalfwidthKatakanaKaTex" +static const ALIGN_ASSET(2) char gMsgKanji85B4HalfwidthKatakanaKaTex[] = dgMsgKanji85B4HalfwidthKatakanaKaTex; + +#define dgMsgKanji85B5HalfwidthKatakanaKiTex "__OTR__textures/kanji/gMsgKanji85B5HalfwidthKatakanaKiTex" +static const ALIGN_ASSET(2) char gMsgKanji85B5HalfwidthKatakanaKiTex[] = dgMsgKanji85B5HalfwidthKatakanaKiTex; + +#define dgMsgKanji85B6HalfwidthKatakanaKuTex "__OTR__textures/kanji/gMsgKanji85B6HalfwidthKatakanaKuTex" +static const ALIGN_ASSET(2) char gMsgKanji85B6HalfwidthKatakanaKuTex[] = dgMsgKanji85B6HalfwidthKatakanaKuTex; + +#define dgMsgKanji85B7HalfwidthKatakanaKeTex "__OTR__textures/kanji/gMsgKanji85B7HalfwidthKatakanaKeTex" +static const ALIGN_ASSET(2) char gMsgKanji85B7HalfwidthKatakanaKeTex[] = dgMsgKanji85B7HalfwidthKatakanaKeTex; + +#define dgMsgKanji85B8HalfwidthKatakanaKoTex "__OTR__textures/kanji/gMsgKanji85B8HalfwidthKatakanaKoTex" +static const ALIGN_ASSET(2) char gMsgKanji85B8HalfwidthKatakanaKoTex[] = dgMsgKanji85B8HalfwidthKatakanaKoTex; + +#define dgMsgKanji85B9HalfwidthKatakanaSaTex "__OTR__textures/kanji/gMsgKanji85B9HalfwidthKatakanaSaTex" +static const ALIGN_ASSET(2) char gMsgKanji85B9HalfwidthKatakanaSaTex[] = dgMsgKanji85B9HalfwidthKatakanaSaTex; + +#define dgMsgKanji85BAHalfwidthKatakanaShiTex "__OTR__textures/kanji/gMsgKanji85BAHalfwidthKatakanaShiTex" +static const ALIGN_ASSET(2) char gMsgKanji85BAHalfwidthKatakanaShiTex[] = dgMsgKanji85BAHalfwidthKatakanaShiTex; + +#define dgMsgKanji85BBHalfwidthKatakanaSuTex "__OTR__textures/kanji/gMsgKanji85BBHalfwidthKatakanaSuTex" +static const ALIGN_ASSET(2) char gMsgKanji85BBHalfwidthKatakanaSuTex[] = dgMsgKanji85BBHalfwidthKatakanaSuTex; + +#define dgMsgKanji85BCHalfwidthKatakanaSeTex "__OTR__textures/kanji/gMsgKanji85BCHalfwidthKatakanaSeTex" +static const ALIGN_ASSET(2) char gMsgKanji85BCHalfwidthKatakanaSeTex[] = dgMsgKanji85BCHalfwidthKatakanaSeTex; + +#define dgMsgKanji85BDHalfwidthKatakanaSoTex "__OTR__textures/kanji/gMsgKanji85BDHalfwidthKatakanaSoTex" +static const ALIGN_ASSET(2) char gMsgKanji85BDHalfwidthKatakanaSoTex[] = dgMsgKanji85BDHalfwidthKatakanaSoTex; + +#define dgMsgKanji85BEHalfwidthKatakanaTaTex "__OTR__textures/kanji/gMsgKanji85BEHalfwidthKatakanaTaTex" +static const ALIGN_ASSET(2) char gMsgKanji85BEHalfwidthKatakanaTaTex[] = dgMsgKanji85BEHalfwidthKatakanaTaTex; + +#define dgMsgKanji85BFHalfwidthKatakanaChiTex "__OTR__textures/kanji/gMsgKanji85BFHalfwidthKatakanaChiTex" +static const ALIGN_ASSET(2) char gMsgKanji85BFHalfwidthKatakanaChiTex[] = dgMsgKanji85BFHalfwidthKatakanaChiTex; + +#define dgMsgKanji85C0HalfwidthKatakanaTsuTex "__OTR__textures/kanji/gMsgKanji85C0HalfwidthKatakanaTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji85C0HalfwidthKatakanaTsuTex[] = dgMsgKanji85C0HalfwidthKatakanaTsuTex; + +#define dgMsgKanji85C1HalfwidthKatakanaTeTex "__OTR__textures/kanji/gMsgKanji85C1HalfwidthKatakanaTeTex" +static const ALIGN_ASSET(2) char gMsgKanji85C1HalfwidthKatakanaTeTex[] = dgMsgKanji85C1HalfwidthKatakanaTeTex; + +#define dgMsgKanji85DBHalfwidthKatakanaNTex "__OTR__textures/kanji/gMsgKanji85DBHalfwidthKatakanaNTex" +static const ALIGN_ASSET(2) char gMsgKanji85DBHalfwidthKatakanaNTex[] = dgMsgKanji85DBHalfwidthKatakanaNTex; + +#define dgMsgKanji85DCHalfwidthDakutenTex "__OTR__textures/kanji/gMsgKanji85DCHalfwidthDakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji85DCHalfwidthDakutenTex[] = dgMsgKanji85DCHalfwidthDakutenTex; + +#define dgMsgKanji85DDHalfwidthHandakutenTex "__OTR__textures/kanji/gMsgKanji85DDHalfwidthHandakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji85DDHalfwidthHandakutenTex[] = dgMsgKanji85DDHalfwidthHandakutenTex; + +#define dgMsgKanji85DEHalfwidthKatakanaWiTex "__OTR__textures/kanji/gMsgKanji85DEHalfwidthKatakanaWiTex" +static const ALIGN_ASSET(2) char gMsgKanji85DEHalfwidthKatakanaWiTex[] = dgMsgKanji85DEHalfwidthKatakanaWiTex; + +#define dgMsgKanji85DFHalfwidthKatakanaWeTex "__OTR__textures/kanji/gMsgKanji85DFHalfwidthKatakanaWeTex" +static const ALIGN_ASSET(2) char gMsgKanji85DFHalfwidthKatakanaWeTex[] = dgMsgKanji85DFHalfwidthKatakanaWeTex; + +#define dgMsgKanji85E0HalfwidthKatakanaSmallWaTex "__OTR__textures/kanji/gMsgKanji85E0HalfwidthKatakanaSmallWaTex" +static const ALIGN_ASSET(2) char gMsgKanji85E0HalfwidthKatakanaSmallWaTex[] = dgMsgKanji85E0HalfwidthKatakanaSmallWaTex; + +#define dgMsgKanji85E1HalfwidthKatakanaSmallKaTex "__OTR__textures/kanji/gMsgKanji85E1HalfwidthKatakanaSmallKaTex" +static const ALIGN_ASSET(2) char gMsgKanji85E1HalfwidthKatakanaSmallKaTex[] = dgMsgKanji85E1HalfwidthKatakanaSmallKaTex; + +#define dgMsgKanji85E2HalfwidthKatakanaSmallKeTex "__OTR__textures/kanji/gMsgKanji85E2HalfwidthKatakanaSmallKeTex" +static const ALIGN_ASSET(2) char gMsgKanji85E2HalfwidthKatakanaSmallKeTex[] = dgMsgKanji85E2HalfwidthKatakanaSmallKeTex; + +#define dgMsgKanji85E3HalfwidthKatakanaVuTex "__OTR__textures/kanji/gMsgKanji85E3HalfwidthKatakanaVuTex" +static const ALIGN_ASSET(2) char gMsgKanji85E3HalfwidthKatakanaVuTex[] = dgMsgKanji85E3HalfwidthKatakanaVuTex; + +#define dgMsgKanji85E4HalfwidthKatakanaGaTex "__OTR__textures/kanji/gMsgKanji85E4HalfwidthKatakanaGaTex" +static const ALIGN_ASSET(2) char gMsgKanji85E4HalfwidthKatakanaGaTex[] = dgMsgKanji85E4HalfwidthKatakanaGaTex; + +#define dgMsgKanji85E5HalfwidthKatakanaGiTex "__OTR__textures/kanji/gMsgKanji85E5HalfwidthKatakanaGiTex" +static const ALIGN_ASSET(2) char gMsgKanji85E5HalfwidthKatakanaGiTex[] = dgMsgKanji85E5HalfwidthKatakanaGiTex; + +#define dgMsgKanji85E6HalfwidthKatakanaGuTex "__OTR__textures/kanji/gMsgKanji85E6HalfwidthKatakanaGuTex" +static const ALIGN_ASSET(2) char gMsgKanji85E6HalfwidthKatakanaGuTex[] = dgMsgKanji85E6HalfwidthKatakanaGuTex; + +#define dgMsgKanji85E7HalfwidthKatakanaGeTex "__OTR__textures/kanji/gMsgKanji85E7HalfwidthKatakanaGeTex" +static const ALIGN_ASSET(2) char gMsgKanji85E7HalfwidthKatakanaGeTex[] = dgMsgKanji85E7HalfwidthKatakanaGeTex; + +#define dgMsgKanji85E8HalfwidthKatakanaGoTex "__OTR__textures/kanji/gMsgKanji85E8HalfwidthKatakanaGoTex" +static const ALIGN_ASSET(2) char gMsgKanji85E8HalfwidthKatakanaGoTex[] = dgMsgKanji85E8HalfwidthKatakanaGoTex; + +#define dgMsgKanji85E9HalfwidthKatakanaZaTex "__OTR__textures/kanji/gMsgKanji85E9HalfwidthKatakanaZaTex" +static const ALIGN_ASSET(2) char gMsgKanji85E9HalfwidthKatakanaZaTex[] = dgMsgKanji85E9HalfwidthKatakanaZaTex; + +#define dgMsgKanji85EAHalfwidthKatakanaJiTex "__OTR__textures/kanji/gMsgKanji85EAHalfwidthKatakanaJiTex" +static const ALIGN_ASSET(2) char gMsgKanji85EAHalfwidthKatakanaJiTex[] = dgMsgKanji85EAHalfwidthKatakanaJiTex; + +#define dgMsgKanji85EBHalfwidthKatakanaZuTex "__OTR__textures/kanji/gMsgKanji85EBHalfwidthKatakanaZuTex" +static const ALIGN_ASSET(2) char gMsgKanji85EBHalfwidthKatakanaZuTex[] = dgMsgKanji85EBHalfwidthKatakanaZuTex; + +#define dgMsgKanji85ECHalfwidthKatakanaZeTex "__OTR__textures/kanji/gMsgKanji85ECHalfwidthKatakanaZeTex" +static const ALIGN_ASSET(2) char gMsgKanji85ECHalfwidthKatakanaZeTex[] = dgMsgKanji85ECHalfwidthKatakanaZeTex; + +#define dgMsgKanji85EDHalfwidthKatakanaZoTex "__OTR__textures/kanji/gMsgKanji85EDHalfwidthKatakanaZoTex" +static const ALIGN_ASSET(2) char gMsgKanji85EDHalfwidthKatakanaZoTex[] = dgMsgKanji85EDHalfwidthKatakanaZoTex; + +#define dgMsgKanji85EEHalfwidthKatakanaDaTex "__OTR__textures/kanji/gMsgKanji85EEHalfwidthKatakanaDaTex" +static const ALIGN_ASSET(2) char gMsgKanji85EEHalfwidthKatakanaDaTex[] = dgMsgKanji85EEHalfwidthKatakanaDaTex; + +#define dgMsgKanji85EFHalfwidthKatakanaDiTex "__OTR__textures/kanji/gMsgKanji85EFHalfwidthKatakanaDiTex" +static const ALIGN_ASSET(2) char gMsgKanji85EFHalfwidthKatakanaDiTex[] = dgMsgKanji85EFHalfwidthKatakanaDiTex; + +#define dgMsgKanji85F0HalfwidthKatakanaDuTex "__OTR__textures/kanji/gMsgKanji85F0HalfwidthKatakanaDuTex" +static const ALIGN_ASSET(2) char gMsgKanji85F0HalfwidthKatakanaDuTex[] = dgMsgKanji85F0HalfwidthKatakanaDuTex; + +#define dgMsgKanji85F1HalfwidthKatakanaDeTex "__OTR__textures/kanji/gMsgKanji85F1HalfwidthKatakanaDeTex" +static const ALIGN_ASSET(2) char gMsgKanji85F1HalfwidthKatakanaDeTex[] = dgMsgKanji85F1HalfwidthKatakanaDeTex; + +#define dgMsgKanji85F2HalfwidthKatakanaDoTex "__OTR__textures/kanji/gMsgKanji85F2HalfwidthKatakanaDoTex" +static const ALIGN_ASSET(2) char gMsgKanji85F2HalfwidthKatakanaDoTex[] = dgMsgKanji85F2HalfwidthKatakanaDoTex; + +#define dgMsgKanji85F3HalfwidthKatakanaBaTex "__OTR__textures/kanji/gMsgKanji85F3HalfwidthKatakanaBaTex" +static const ALIGN_ASSET(2) char gMsgKanji85F3HalfwidthKatakanaBaTex[] = dgMsgKanji85F3HalfwidthKatakanaBaTex; + +#define dgMsgKanji85F4HalfwidthKatakanaPaTex "__OTR__textures/kanji/gMsgKanji85F4HalfwidthKatakanaPaTex" +static const ALIGN_ASSET(2) char gMsgKanji85F4HalfwidthKatakanaPaTex[] = dgMsgKanji85F4HalfwidthKatakanaPaTex; + +#define dgMsgKanji85F5HalfwidthKatakanaBiTex "__OTR__textures/kanji/gMsgKanji85F5HalfwidthKatakanaBiTex" +static const ALIGN_ASSET(2) char gMsgKanji85F5HalfwidthKatakanaBiTex[] = dgMsgKanji85F5HalfwidthKatakanaBiTex; + +#define dgMsgKanji8640EmptyTex "__OTR__textures/kanji/gMsgKanji8640EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8640EmptyTex[] = dgMsgKanji8640EmptyTex; + +#define dgMsgKanji8641TategakiToutenTex "__OTR__textures/kanji/gMsgKanji8641TategakiToutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8641TategakiToutenTex[] = dgMsgKanji8641TategakiToutenTex; + +#define dgMsgKanji8642TategakiKutenTex "__OTR__textures/kanji/gMsgKanji8642TategakiKutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8642TategakiKutenTex[] = dgMsgKanji8642TategakiKutenTex; + +#define dgMsgKanji8643HalfwidthHorizontalThinTex "__OTR__textures/kanji/gMsgKanji8643HalfwidthHorizontalThinTex" +static const ALIGN_ASSET(2) char gMsgKanji8643HalfwidthHorizontalThinTex[] = dgMsgKanji8643HalfwidthHorizontalThinTex; + +#define dgMsgKanji8644HalfwidthHorizontalThickTex "__OTR__textures/kanji/gMsgKanji8644HalfwidthHorizontalThickTex" +static const ALIGN_ASSET(2) char gMsgKanji8644HalfwidthHorizontalThickTex[] = dgMsgKanji8644HalfwidthHorizontalThickTex; + +#define dgMsgKanji8645HalfwidthVerticalThinTex "__OTR__textures/kanji/gMsgKanji8645HalfwidthVerticalThinTex" +static const ALIGN_ASSET(2) char gMsgKanji8645HalfwidthVerticalThinTex[] = dgMsgKanji8645HalfwidthVerticalThinTex; + +#define dgMsgKanji8646HalfwidthVerticalThickTex "__OTR__textures/kanji/gMsgKanji8646HalfwidthVerticalThickTex" +static const ALIGN_ASSET(2) char gMsgKanji8646HalfwidthVerticalThickTex[] = dgMsgKanji8646HalfwidthVerticalThickTex; + +#define dgMsgKanji8647HalfwidthHorizontalThinDottedTex "__OTR__textures/kanji/gMsgKanji8647HalfwidthHorizontalThinDottedTex" +static const ALIGN_ASSET(2) char gMsgKanji8647HalfwidthHorizontalThinDottedTex[] = dgMsgKanji8647HalfwidthHorizontalThinDottedTex; + +#define dgMsgKanji8648HalfwidthHorizontalThickDottedTex "__OTR__textures/kanji/gMsgKanji8648HalfwidthHorizontalThickDottedTex" +static const ALIGN_ASSET(2) char gMsgKanji8648HalfwidthHorizontalThickDottedTex[] = dgMsgKanji8648HalfwidthHorizontalThickDottedTex; + +#define dgMsgKanji8649HalfwidthVerticalThinDottedTex "__OTR__textures/kanji/gMsgKanji8649HalfwidthVerticalThinDottedTex" +static const ALIGN_ASSET(2) char gMsgKanji8649HalfwidthVerticalThinDottedTex[] = dgMsgKanji8649HalfwidthVerticalThinDottedTex; + +#define dgMsgKanji864AHalfwidthVerticalThickDottedTex "__OTR__textures/kanji/gMsgKanji864AHalfwidthVerticalThickDottedTex" +static const ALIGN_ASSET(2) char gMsgKanji864AHalfwidthVerticalThickDottedTex[] = dgMsgKanji864AHalfwidthVerticalThickDottedTex; + +#define dgMsgKanji864BHalfwidthHorizontalThinDotted2Tex "__OTR__textures/kanji/gMsgKanji864BHalfwidthHorizontalThinDotted2Tex" +static const ALIGN_ASSET(2) char gMsgKanji864BHalfwidthHorizontalThinDotted2Tex[] = dgMsgKanji864BHalfwidthHorizontalThinDotted2Tex; + +#define dgMsgKanji864CHalfwidthHorizontalThickDotted2Tex "__OTR__textures/kanji/gMsgKanji864CHalfwidthHorizontalThickDotted2Tex" +static const ALIGN_ASSET(2) char gMsgKanji864CHalfwidthHorizontalThickDotted2Tex[] = dgMsgKanji864CHalfwidthHorizontalThickDotted2Tex; + +#define dgMsgKanji864DHalfwidthVerticalThinDotted2Tex "__OTR__textures/kanji/gMsgKanji864DHalfwidthVerticalThinDotted2Tex" +static const ALIGN_ASSET(2) char gMsgKanji864DHalfwidthVerticalThinDotted2Tex[] = dgMsgKanji864DHalfwidthVerticalThinDotted2Tex; + +#define dgMsgKanji864EHalfwidthVerticalThickDotted2Tex "__OTR__textures/kanji/gMsgKanji864EHalfwidthVerticalThickDotted2Tex" +static const ALIGN_ASSET(2) char gMsgKanji864EHalfwidthVerticalThickDotted2Tex[] = dgMsgKanji864EHalfwidthVerticalThickDotted2Tex; + +#define dgMsgKanji864FHalfwidthBoxThinTopLeftTex "__OTR__textures/kanji/gMsgKanji864FHalfwidthBoxThinTopLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji864FHalfwidthBoxThinTopLeftTex[] = dgMsgKanji864FHalfwidthBoxThinTopLeftTex; + +#define dgMsgKanji8650VerticalFarRightTex "__OTR__textures/kanji/gMsgKanji8650VerticalFarRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8650VerticalFarRightTex[] = dgMsgKanji8650VerticalFarRightTex; + +#define dgMsgKanji8651VerticalFarLeftTex "__OTR__textures/kanji/gMsgKanji8651VerticalFarLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8651VerticalFarLeftTex[] = dgMsgKanji8651VerticalFarLeftTex; + +#define dgMsgKanji8652HalfwidthBoxThickTopLeftTex "__OTR__textures/kanji/gMsgKanji8652HalfwidthBoxThickTopLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8652HalfwidthBoxThickTopLeftTex[] = dgMsgKanji8652HalfwidthBoxThickTopLeftTex; + +#define dgMsgKanji8653HalfwidthBoxThinTopRightTex "__OTR__textures/kanji/gMsgKanji8653HalfwidthBoxThinTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8653HalfwidthBoxThinTopRightTex[] = dgMsgKanji8653HalfwidthBoxThinTopRightTex; + +#define dgMsgKanji8654HalfwidthBoxVertThinHorizThickTopRightTex "__OTR__textures/kanji/gMsgKanji8654HalfwidthBoxVertThinHorizThickTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8654HalfwidthBoxVertThinHorizThickTopRightTex[] = dgMsgKanji8654HalfwidthBoxVertThinHorizThickTopRightTex; + +#define dgMsgKanji8655HalfwidthBoxVertThickHorizThinTopRightTex "__OTR__textures/kanji/gMsgKanji8655HalfwidthBoxVertThickHorizThinTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8655HalfwidthBoxVertThickHorizThinTopRightTex[] = dgMsgKanji8655HalfwidthBoxVertThickHorizThinTopRightTex; + +#define dgMsgKanji8656HalfwidthBoxThickTopRightTex "__OTR__textures/kanji/gMsgKanji8656HalfwidthBoxThickTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8656HalfwidthBoxThickTopRightTex[] = dgMsgKanji8656HalfwidthBoxThickTopRightTex; + +#define dgMsgKanji8657HalfwidthBoxThinBottomLeftTex "__OTR__textures/kanji/gMsgKanji8657HalfwidthBoxThinBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8657HalfwidthBoxThinBottomLeftTex[] = dgMsgKanji8657HalfwidthBoxThinBottomLeftTex; + +#define dgMsgKanji8658HalfwidthBoxVertThinHorizThickBottomLeftTex "__OTR__textures/kanji/gMsgKanji8658HalfwidthBoxVertThinHorizThickBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8658HalfwidthBoxVertThinHorizThickBottomLeftTex[] = dgMsgKanji8658HalfwidthBoxVertThinHorizThickBottomLeftTex; + +#define dgMsgKanji8659HalfwidthBoxVertThickHorizThinBottomLeftTex "__OTR__textures/kanji/gMsgKanji8659HalfwidthBoxVertThickHorizThinBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8659HalfwidthBoxVertThickHorizThinBottomLeftTex[] = dgMsgKanji8659HalfwidthBoxVertThickHorizThinBottomLeftTex; + +#define dgMsgKanji865AHalfwidthBoxThickBottomLeftTex "__OTR__textures/kanji/gMsgKanji865AHalfwidthBoxThickBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji865AHalfwidthBoxThickBottomLeftTex[] = dgMsgKanji865AHalfwidthBoxThickBottomLeftTex; + +#define dgMsgKanji865BTategakiChouonpuTex "__OTR__textures/kanji/gMsgKanji865BTategakiChouonpuTex" +static const ALIGN_ASSET(2) char gMsgKanji865BTategakiChouonpuTex[] = dgMsgKanji865BTategakiChouonpuTex; + +#define dgMsgKanji865CTategakiDashTex "__OTR__textures/kanji/gMsgKanji865CTategakiDashTex" +static const ALIGN_ASSET(2) char gMsgKanji865CTategakiDashTex[] = dgMsgKanji865CTategakiDashTex; + +#define dgMsgKanji865DTategakiHyphenTex "__OTR__textures/kanji/gMsgKanji865DTategakiHyphenTex" +static const ALIGN_ASSET(2) char gMsgKanji865DTategakiHyphenTex[] = dgMsgKanji865DTategakiHyphenTex; + +#define dgMsgKanji869BHalfwidthNijyuukagikakkoRightTex "__OTR__textures/kanji/gMsgKanji869BHalfwidthNijyuukagikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji869BHalfwidthNijyuukagikakkoRightTex[] = dgMsgKanji869BHalfwidthNijyuukagikakkoRightTex; + +#define dgMsgKanji869CHalfwidthSumitsukikakkoLeftTex "__OTR__textures/kanji/gMsgKanji869CHalfwidthSumitsukikakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji869CHalfwidthSumitsukikakkoLeftTex[] = dgMsgKanji869CHalfwidthSumitsukikakkoLeftTex; + +#define dgMsgKanji869DHalfwidthSumitsukikakkoRightTex "__OTR__textures/kanji/gMsgKanji869DHalfwidthSumitsukikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji869DHalfwidthSumitsukikakkoRightTex[] = dgMsgKanji869DHalfwidthSumitsukikakkoRightTex; + +#define dgMsgKanji869EHalfwidthHyphenTex "__OTR__textures/kanji/gMsgKanji869EHalfwidthHyphenTex" +static const ALIGN_ASSET(2) char gMsgKanji869EHalfwidthHyphenTex[] = dgMsgKanji869EHalfwidthHyphenTex; + +#define dgMsgKanji869FEmptyTex "__OTR__textures/kanji/gMsgKanji869FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji869FEmptyTex[] = dgMsgKanji869FEmptyTex; + +#define dgMsgKanji86A0EmptyTex "__OTR__textures/kanji/gMsgKanji86A0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A0EmptyTex[] = dgMsgKanji86A0EmptyTex; + +#define dgMsgKanji86A1EmptyTex "__OTR__textures/kanji/gMsgKanji86A1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A1EmptyTex[] = dgMsgKanji86A1EmptyTex; + +#define dgMsgKanji86A2EmptyTex "__OTR__textures/kanji/gMsgKanji86A2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A2EmptyTex[] = dgMsgKanji86A2EmptyTex; + +#define dgMsgKanji86A3EmptyTex "__OTR__textures/kanji/gMsgKanji86A3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A3EmptyTex[] = dgMsgKanji86A3EmptyTex; + +#define dgMsgKanji86A4EmptyTex "__OTR__textures/kanji/gMsgKanji86A4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A4EmptyTex[] = dgMsgKanji86A4EmptyTex; + +#define dgMsgKanji86A5EmptyTex "__OTR__textures/kanji/gMsgKanji86A5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A5EmptyTex[] = dgMsgKanji86A5EmptyTex; + +#define dgMsgKanji86A6EmptyTex "__OTR__textures/kanji/gMsgKanji86A6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A6EmptyTex[] = dgMsgKanji86A6EmptyTex; + +#define dgMsgKanji86B3BoxVertThinHorizThickTopRightTex "__OTR__textures/kanji/gMsgKanji86B3BoxVertThinHorizThickTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86B3BoxVertThinHorizThickTopRightTex[] = dgMsgKanji86B3BoxVertThinHorizThickTopRightTex; + +#define dgMsgKanji86B4BoxVertThickHorizThinTopRightTex "__OTR__textures/kanji/gMsgKanji86B4BoxVertThickHorizThinTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86B4BoxVertThickHorizThinTopRightTex[] = dgMsgKanji86B4BoxVertThickHorizThinTopRightTex; + +#define dgMsgKanji86B5BoxThickTopRightTex "__OTR__textures/kanji/gMsgKanji86B5BoxThickTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86B5BoxThickTopRightTex[] = dgMsgKanji86B5BoxThickTopRightTex; + +#define dgMsgKanji86C7BoxVertThinHorizThickRightTex "__OTR__textures/kanji/gMsgKanji86C7BoxVertThinHorizThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86C7BoxVertThinHorizThickRightTex[] = dgMsgKanji86C7BoxVertThinHorizThickRightTex; + +#define dgMsgKanji86C8BoxTopThickBottomThinHorizThinRightTex "__OTR__textures/kanji/gMsgKanji86C8BoxTopThickBottomThinHorizThinRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86C8BoxTopThickBottomThinHorizThinRightTex[] = dgMsgKanji86C8BoxTopThickBottomThinHorizThinRightTex; + +#define dgMsgKanji86C9BoxTopThinBottomThickHorizThinRightTex "__OTR__textures/kanji/gMsgKanji86C9BoxTopThinBottomThickHorizThinRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86C9BoxTopThinBottomThickHorizThinRightTex[] = dgMsgKanji86C9BoxTopThinBottomThickHorizThinRightTex; + +#define dgMsgKanji86CABoxVertThickHorizThinRightTex "__OTR__textures/kanji/gMsgKanji86CABoxVertThickHorizThinRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86CABoxVertThickHorizThinRightTex[] = dgMsgKanji86CABoxVertThickHorizThinRightTex; + +#define dgMsgKanji86CBBoxTopThickBottomThinHorizThickRightTex "__OTR__textures/kanji/gMsgKanji86CBBoxTopThickBottomThinHorizThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86CBBoxTopThickBottomThinHorizThickRightTex[] = dgMsgKanji86CBBoxTopThickBottomThinHorizThickRightTex; + +#define dgMsgKanji86CCBoxTopThinBottomThickHorizThickRightTex "__OTR__textures/kanji/gMsgKanji86CCBoxTopThinBottomThickHorizThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86CCBoxTopThinBottomThickHorizThickRightTex[] = dgMsgKanji86CCBoxTopThinBottomThickHorizThickRightTex; + +#define dgMsgKanji86CDBoxThickRightTex "__OTR__textures/kanji/gMsgKanji86CDBoxThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86CDBoxThickRightTex[] = dgMsgKanji86CDBoxThickRightTex; + +#define dgMsgKanji86CEBoxThinTopTex "__OTR__textures/kanji/gMsgKanji86CEBoxThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86CEBoxThinTopTex[] = dgMsgKanji86CEBoxThinTopTex; + +#define dgMsgKanji86CFBoxVertThinLeftThickRightThinTopTex "__OTR__textures/kanji/gMsgKanji86CFBoxVertThinLeftThickRightThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86CFBoxVertThinLeftThickRightThinTopTex[] = dgMsgKanji86CFBoxVertThinLeftThickRightThinTopTex; + +#define dgMsgKanji86D0BoxVertThinLeftThinRightThickTopTex "__OTR__textures/kanji/gMsgKanji86D0BoxVertThinLeftThinRightThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D0BoxVertThinLeftThinRightThickTopTex[] = dgMsgKanji86D0BoxVertThinLeftThinRightThickTopTex; + +#define dgMsgKanji86D1BoxVertThinHorizThickTopTex "__OTR__textures/kanji/gMsgKanji86D1BoxVertThinHorizThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D1BoxVertThinHorizThickTopTex[] = dgMsgKanji86D1BoxVertThinHorizThickTopTex; + +#define dgMsgKanji86D2BoxVertThickHorizThinTopTex "__OTR__textures/kanji/gMsgKanji86D2BoxVertThickHorizThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D2BoxVertThickHorizThinTopTex[] = dgMsgKanji86D2BoxVertThickHorizThinTopTex; + +#define dgMsgKanji86D3BoxVertThickLeftThickRightThinTopTex "__OTR__textures/kanji/gMsgKanji86D3BoxVertThickLeftThickRightThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D3BoxVertThickLeftThickRightThinTopTex[] = dgMsgKanji86D3BoxVertThickLeftThickRightThinTopTex; + +#define dgMsgKanji86D4BoxVertThickLeftThinRightThickTopTex "__OTR__textures/kanji/gMsgKanji86D4BoxVertThickLeftThinRightThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D4BoxVertThickLeftThinRightThickTopTex[] = dgMsgKanji86D4BoxVertThickLeftThinRightThickTopTex; + +#define dgMsgKanji86D5BoxThickTopTex "__OTR__textures/kanji/gMsgKanji86D5BoxThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D5BoxThickTopTex[] = dgMsgKanji86D5BoxThickTopTex; + +#define dgMsgKanji86D6BoxThinBottomTex "__OTR__textures/kanji/gMsgKanji86D6BoxThinBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji86D6BoxThinBottomTex[] = dgMsgKanji86D6BoxThinBottomTex; + +#define dgMsgKanji86D7BoxVertThinLeftThickRightThinBottomTex "__OTR__textures/kanji/gMsgKanji86D7BoxVertThinLeftThickRightThinBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji86D7BoxVertThinLeftThickRightThinBottomTex[] = dgMsgKanji86D7BoxVertThinLeftThickRightThinBottomTex; + +#define dgMsgKanji8740Circled1Tex "__OTR__textures/kanji/gMsgKanji8740Circled1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8740Circled1Tex[] = dgMsgKanji8740Circled1Tex; + +#define dgMsgKanji8741Circled2Tex "__OTR__textures/kanji/gMsgKanji8741Circled2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8741Circled2Tex[] = dgMsgKanji8741Circled2Tex; + +#define dgMsgKanji8742Circled3Tex "__OTR__textures/kanji/gMsgKanji8742Circled3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8742Circled3Tex[] = dgMsgKanji8742Circled3Tex; + +#define dgMsgKanji8743Circled4Tex "__OTR__textures/kanji/gMsgKanji8743Circled4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8743Circled4Tex[] = dgMsgKanji8743Circled4Tex; + +#define dgMsgKanji8744Circled5Tex "__OTR__textures/kanji/gMsgKanji8744Circled5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8744Circled5Tex[] = dgMsgKanji8744Circled5Tex; + +#define dgMsgKanji8745Circled6Tex "__OTR__textures/kanji/gMsgKanji8745Circled6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8745Circled6Tex[] = dgMsgKanji8745Circled6Tex; + +#define dgMsgKanji8746Circled7Tex "__OTR__textures/kanji/gMsgKanji8746Circled7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8746Circled7Tex[] = dgMsgKanji8746Circled7Tex; + +#define dgMsgKanji8747Circled8Tex "__OTR__textures/kanji/gMsgKanji8747Circled8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8747Circled8Tex[] = dgMsgKanji8747Circled8Tex; + +#define dgMsgKanji8748Circled9Tex "__OTR__textures/kanji/gMsgKanji8748Circled9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8748Circled9Tex[] = dgMsgKanji8748Circled9Tex; + +#define dgMsgKanji8749Circled10Tex "__OTR__textures/kanji/gMsgKanji8749Circled10Tex" +static const ALIGN_ASSET(2) char gMsgKanji8749Circled10Tex[] = dgMsgKanji8749Circled10Tex; + +#define dgMsgKanji874ACircled11Tex "__OTR__textures/kanji/gMsgKanji874ACircled11Tex" +static const ALIGN_ASSET(2) char gMsgKanji874ACircled11Tex[] = dgMsgKanji874ACircled11Tex; + +#define dgMsgKanji874BCircled12Tex "__OTR__textures/kanji/gMsgKanji874BCircled12Tex" +static const ALIGN_ASSET(2) char gMsgKanji874BCircled12Tex[] = dgMsgKanji874BCircled12Tex; + +#define dgMsgKanji874CCircled13Tex "__OTR__textures/kanji/gMsgKanji874CCircled13Tex" +static const ALIGN_ASSET(2) char gMsgKanji874CCircled13Tex[] = dgMsgKanji874CCircled13Tex; + +#define dgMsgKanji874DCircled14Tex "__OTR__textures/kanji/gMsgKanji874DCircled14Tex" +static const ALIGN_ASSET(2) char gMsgKanji874DCircled14Tex[] = dgMsgKanji874DCircled14Tex; + +#define dgMsgKanji874ECircled15Tex "__OTR__textures/kanji/gMsgKanji874ECircled15Tex" +static const ALIGN_ASSET(2) char gMsgKanji874ECircled15Tex[] = dgMsgKanji874ECircled15Tex; + +#define dgMsgKanji874FCircled16Tex "__OTR__textures/kanji/gMsgKanji874FCircled16Tex" +static const ALIGN_ASSET(2) char gMsgKanji874FCircled16Tex[] = dgMsgKanji874FCircled16Tex; + +#define dgMsgKanji8750Circled17Tex "__OTR__textures/kanji/gMsgKanji8750Circled17Tex" +static const ALIGN_ASSET(2) char gMsgKanji8750Circled17Tex[] = dgMsgKanji8750Circled17Tex; + +#define dgMsgKanji8751Circled18Tex "__OTR__textures/kanji/gMsgKanji8751Circled18Tex" +static const ALIGN_ASSET(2) char gMsgKanji8751Circled18Tex[] = dgMsgKanji8751Circled18Tex; + +#define dgMsgKanji8752Circled19Tex "__OTR__textures/kanji/gMsgKanji8752Circled19Tex" +static const ALIGN_ASSET(2) char gMsgKanji8752Circled19Tex[] = dgMsgKanji8752Circled19Tex; + +#define dgMsgKanji8753Circled20Tex "__OTR__textures/kanji/gMsgKanji8753Circled20Tex" +static const ALIGN_ASSET(2) char gMsgKanji8753Circled20Tex[] = dgMsgKanji8753Circled20Tex; + +#define dgMsgKanji8754RomanNumeral1Tex "__OTR__textures/kanji/gMsgKanji8754RomanNumeral1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8754RomanNumeral1Tex[] = dgMsgKanji8754RomanNumeral1Tex; + +#define dgMsgKanji8755RomanNumeral2Tex "__OTR__textures/kanji/gMsgKanji8755RomanNumeral2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8755RomanNumeral2Tex[] = dgMsgKanji8755RomanNumeral2Tex; + +#define dgMsgKanji8756RomanNumeral3Tex "__OTR__textures/kanji/gMsgKanji8756RomanNumeral3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8756RomanNumeral3Tex[] = dgMsgKanji8756RomanNumeral3Tex; + +#define dgMsgKanji8757RomanNumeral4Tex "__OTR__textures/kanji/gMsgKanji8757RomanNumeral4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8757RomanNumeral4Tex[] = dgMsgKanji8757RomanNumeral4Tex; + +#define dgMsgKanji8758RomanNumeral5Tex "__OTR__textures/kanji/gMsgKanji8758RomanNumeral5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8758RomanNumeral5Tex[] = dgMsgKanji8758RomanNumeral5Tex; + +#define dgMsgKanji8791IdenticalToTex "__OTR__textures/kanji/gMsgKanji8791IdenticalToTex" +static const ALIGN_ASSET(2) char gMsgKanji8791IdenticalToTex[] = dgMsgKanji8791IdenticalToTex; + +#define dgMsgKanji8792IntegralTex "__OTR__textures/kanji/gMsgKanji8792IntegralTex" +static const ALIGN_ASSET(2) char gMsgKanji8792IntegralTex[] = dgMsgKanji8792IntegralTex; + +#define dgMsgKanji8793CountourIntegralTex "__OTR__textures/kanji/gMsgKanji8793CountourIntegralTex" +static const ALIGN_ASSET(2) char gMsgKanji8793CountourIntegralTex[] = dgMsgKanji8793CountourIntegralTex; + +#define dgMsgKanji8794SummationTex "__OTR__textures/kanji/gMsgKanji8794SummationTex" +static const ALIGN_ASSET(2) char gMsgKanji8794SummationTex[] = dgMsgKanji8794SummationTex; + +#define dgMsgKanji8795SquareRootTex "__OTR__textures/kanji/gMsgKanji8795SquareRootTex" +static const ALIGN_ASSET(2) char gMsgKanji8795SquareRootTex[] = dgMsgKanji8795SquareRootTex; + +#define dgMsgKanji8796PerpendicularSymbolTex "__OTR__textures/kanji/gMsgKanji8796PerpendicularSymbolTex" +static const ALIGN_ASSET(2) char gMsgKanji8796PerpendicularSymbolTex[] = dgMsgKanji8796PerpendicularSymbolTex; + +#define dgMsgKanji8797AngleTex "__OTR__textures/kanji/gMsgKanji8797AngleTex" +static const ALIGN_ASSET(2) char gMsgKanji8797AngleTex[] = dgMsgKanji8797AngleTex; + +#define dgMsgKanji8798RightAngleTex "__OTR__textures/kanji/gMsgKanji8798RightAngleTex" +static const ALIGN_ASSET(2) char gMsgKanji8798RightAngleTex[] = dgMsgKanji8798RightAngleTex; + +#define dgMsgKanji8799RightTriangleTex "__OTR__textures/kanji/gMsgKanji8799RightTriangleTex" +static const ALIGN_ASSET(2) char gMsgKanji8799RightTriangleTex[] = dgMsgKanji8799RightTriangleTex; + +#define dgMsgKanji879ABecauseTex "__OTR__textures/kanji/gMsgKanji879ABecauseTex" +static const ALIGN_ASSET(2) char gMsgKanji879ABecauseTex[] = dgMsgKanji879ABecauseTex; + +#define dgMsgKanji879BIntersectionTex "__OTR__textures/kanji/gMsgKanji879BIntersectionTex" +static const ALIGN_ASSET(2) char gMsgKanji879BIntersectionTex[] = dgMsgKanji879BIntersectionTex; + +#define dgMsgKanji879CUnionTex "__OTR__textures/kanji/gMsgKanji879CUnionTex" +static const ALIGN_ASSET(2) char gMsgKanji879CUnionTex[] = dgMsgKanji879CUnionTex; + +#define dgMsgKanji879DEmptyTex "__OTR__textures/kanji/gMsgKanji879DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji879DEmptyTex[] = dgMsgKanji879DEmptyTex; + +#define dgMsgKanji879EEmptyTex "__OTR__textures/kanji/gMsgKanji879EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji879EEmptyTex[] = dgMsgKanji879EEmptyTex; + +#define dgMsgKanji879FHiraganaSmallATex "__OTR__textures/kanji/gMsgKanji879FHiraganaSmallATex" +static const ALIGN_ASSET(2) char gMsgKanji879FHiraganaSmallATex[] = dgMsgKanji879FHiraganaSmallATex; + +#define dgMsgKanji87A0EmptyTex "__OTR__textures/kanji/gMsgKanji87A0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A0EmptyTex[] = dgMsgKanji87A0EmptyTex; + +#define dgMsgKanji87A1EmptyTex "__OTR__textures/kanji/gMsgKanji87A1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A1EmptyTex[] = dgMsgKanji87A1EmptyTex; + +#define dgMsgKanji87A2EmptyTex "__OTR__textures/kanji/gMsgKanji87A2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A2EmptyTex[] = dgMsgKanji87A2EmptyTex; + +#define dgMsgKanji87A3EmptyTex "__OTR__textures/kanji/gMsgKanji87A3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A3EmptyTex[] = dgMsgKanji87A3EmptyTex; + +#define dgMsgKanji87A4EmptyTex "__OTR__textures/kanji/gMsgKanji87A4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A4EmptyTex[] = dgMsgKanji87A4EmptyTex; + +#define dgMsgKanji87A5EmptyTex "__OTR__textures/kanji/gMsgKanji87A5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A5EmptyTex[] = dgMsgKanji87A5EmptyTex; + +#define dgMsgKanji87A6EmptyTex "__OTR__textures/kanji/gMsgKanji87A6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A6EmptyTex[] = dgMsgKanji87A6EmptyTex; + +#define dgMsgKanji87A7EmptyTex "__OTR__textures/kanji/gMsgKanji87A7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A7EmptyTex[] = dgMsgKanji87A7EmptyTex; + +#define dgMsgKanji87A8EmptyTex "__OTR__textures/kanji/gMsgKanji87A8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A8EmptyTex[] = dgMsgKanji87A8EmptyTex; + +#define dgMsgKanji87A9EmptyTex "__OTR__textures/kanji/gMsgKanji87A9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A9EmptyTex[] = dgMsgKanji87A9EmptyTex; + +#define dgMsgKanji87AAEmptyTex "__OTR__textures/kanji/gMsgKanji87AAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87AAEmptyTex[] = dgMsgKanji87AAEmptyTex; + +#define dgMsgKanji87ABEmptyTex "__OTR__textures/kanji/gMsgKanji87ABEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87ABEmptyTex[] = dgMsgKanji87ABEmptyTex; + +#define dgMsgKanji87ACEmptyTex "__OTR__textures/kanji/gMsgKanji87ACEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87ACEmptyTex[] = dgMsgKanji87ACEmptyTex; + +#define dgMsgKanji87ADEmptyTex "__OTR__textures/kanji/gMsgKanji87ADEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87ADEmptyTex[] = dgMsgKanji87ADEmptyTex; + +#define dgMsgKanji87AEEmptyTex "__OTR__textures/kanji/gMsgKanji87AEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87AEEmptyTex[] = dgMsgKanji87AEEmptyTex; + +#define dgMsgKanji87AFEmptyTex "__OTR__textures/kanji/gMsgKanji87AFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87AFEmptyTex[] = dgMsgKanji87AFEmptyTex; + +#define dgMsgKanji87B0EmptyTex "__OTR__textures/kanji/gMsgKanji87B0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B0EmptyTex[] = dgMsgKanji87B0EmptyTex; + +#define dgMsgKanji87B1EmptyTex "__OTR__textures/kanji/gMsgKanji87B1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B1EmptyTex[] = dgMsgKanji87B1EmptyTex; + +#define dgMsgKanji87B2EmptyTex "__OTR__textures/kanji/gMsgKanji87B2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B2EmptyTex[] = dgMsgKanji87B2EmptyTex; + +#define dgMsgKanji87B3EmptyTex "__OTR__textures/kanji/gMsgKanji87B3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B3EmptyTex[] = dgMsgKanji87B3EmptyTex; + +#define dgMsgKanji87B4EmptyTex "__OTR__textures/kanji/gMsgKanji87B4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B4EmptyTex[] = dgMsgKanji87B4EmptyTex; + +#define dgMsgKanji87B5EmptyTex "__OTR__textures/kanji/gMsgKanji87B5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B5EmptyTex[] = dgMsgKanji87B5EmptyTex; + +#define dgMsgKanji87BDEmptyTex "__OTR__textures/kanji/gMsgKanji87BDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87BDEmptyTex[] = dgMsgKanji87BDEmptyTex; + +#define dgMsgKanji87BEEmptyTex "__OTR__textures/kanji/gMsgKanji87BEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87BEEmptyTex[] = dgMsgKanji87BEEmptyTex; + +#define dgMsgKanji87BFEmptyTex "__OTR__textures/kanji/gMsgKanji87BFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87BFEmptyTex[] = dgMsgKanji87BFEmptyTex; + +#define dgMsgKanji87C0EmptyTex "__OTR__textures/kanji/gMsgKanji87C0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87C0EmptyTex[] = dgMsgKanji87C0EmptyTex; + +#define dgMsgKanji87C1EmptyTex "__OTR__textures/kanji/gMsgKanji87C1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87C1EmptyTex[] = dgMsgKanji87C1EmptyTex; + +#define dgMsgKanji87E5EmptyTex "__OTR__textures/kanji/gMsgKanji87E5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87E5EmptyTex[] = dgMsgKanji87E5EmptyTex; + +#define dgMsgKanji87E6EmptyTex "__OTR__textures/kanji/gMsgKanji87E6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87E6EmptyTex[] = dgMsgKanji87E6EmptyTex; + +#define dgMsgKanji87E7EmptyTex "__OTR__textures/kanji/gMsgKanji87E7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87E7EmptyTex[] = dgMsgKanji87E7EmptyTex; + +#define dgMsgKanji87E8EmptyTex "__OTR__textures/kanji/gMsgKanji87E8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87E8EmptyTex[] = dgMsgKanji87E8EmptyTex; + +#define dgMsgKanji87FAEmptyTex "__OTR__textures/kanji/gMsgKanji87FAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87FAEmptyTex[] = dgMsgKanji87FAEmptyTex; + +#define dgMsgKanji87FBEmptyTex "__OTR__textures/kanji/gMsgKanji87FBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87FBEmptyTex[] = dgMsgKanji87FBEmptyTex; + +#define dgMsgKanji87FCEmptyTex "__OTR__textures/kanji/gMsgKanji87FCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87FCEmptyTex[] = dgMsgKanji87FCEmptyTex; + +#define dgMsgKanji8840KatakanaSmallATex "__OTR__textures/kanji/gMsgKanji8840KatakanaSmallATex" +static const ALIGN_ASSET(2) char gMsgKanji8840KatakanaSmallATex[] = dgMsgKanji8840KatakanaSmallATex; + +#define dgMsgKanji8841EmptyTex "__OTR__textures/kanji/gMsgKanji8841EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8841EmptyTex[] = dgMsgKanji8841EmptyTex; + +#define dgMsgKanji8842EmptyTex "__OTR__textures/kanji/gMsgKanji8842EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8842EmptyTex[] = dgMsgKanji8842EmptyTex; + +#define dgMsgKanji8843EmptyTex "__OTR__textures/kanji/gMsgKanji8843EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8843EmptyTex[] = dgMsgKanji8843EmptyTex; + +#define dgMsgKanji8844EmptyTex "__OTR__textures/kanji/gMsgKanji8844EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8844EmptyTex[] = dgMsgKanji8844EmptyTex; + +#define dgMsgKanji8845EmptyTex "__OTR__textures/kanji/gMsgKanji8845EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8845EmptyTex[] = dgMsgKanji8845EmptyTex; + +#define dgMsgKanji8846EmptyTex "__OTR__textures/kanji/gMsgKanji8846EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8846EmptyTex[] = dgMsgKanji8846EmptyTex; + +#define dgMsgKanji8847EmptyTex "__OTR__textures/kanji/gMsgKanji8847EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8847EmptyTex[] = dgMsgKanji8847EmptyTex; + +#define dgMsgKanji8848EmptyTex "__OTR__textures/kanji/gMsgKanji8848EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8848EmptyTex[] = dgMsgKanji8848EmptyTex; + +#define dgMsgKanji8849EmptyTex "__OTR__textures/kanji/gMsgKanji8849EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8849EmptyTex[] = dgMsgKanji8849EmptyTex; + +#define dgMsgKanji884AEmptyTex "__OTR__textures/kanji/gMsgKanji884AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884AEmptyTex[] = dgMsgKanji884AEmptyTex; + +#define dgMsgKanji884BEmptyTex "__OTR__textures/kanji/gMsgKanji884BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884BEmptyTex[] = dgMsgKanji884BEmptyTex; + +#define dgMsgKanji884CEmptyTex "__OTR__textures/kanji/gMsgKanji884CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884CEmptyTex[] = dgMsgKanji884CEmptyTex; + +#define dgMsgKanji884DEmptyTex "__OTR__textures/kanji/gMsgKanji884DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884DEmptyTex[] = dgMsgKanji884DEmptyTex; + +#define dgMsgKanji884EEmptyTex "__OTR__textures/kanji/gMsgKanji884EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884EEmptyTex[] = dgMsgKanji884EEmptyTex; + +#define dgMsgKanji884FEmptyTex "__OTR__textures/kanji/gMsgKanji884FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884FEmptyTex[] = dgMsgKanji884FEmptyTex; + +#define dgMsgKanji8850EmptyTex "__OTR__textures/kanji/gMsgKanji8850EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8850EmptyTex[] = dgMsgKanji8850EmptyTex; + +#define dgMsgKanji8851EmptyTex "__OTR__textures/kanji/gMsgKanji8851EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8851EmptyTex[] = dgMsgKanji8851EmptyTex; + +#define dgMsgKanji8852EmptyTex "__OTR__textures/kanji/gMsgKanji8852EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8852EmptyTex[] = dgMsgKanji8852EmptyTex; + +#define dgMsgKanji8853EmptyTex "__OTR__textures/kanji/gMsgKanji8853EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8853EmptyTex[] = dgMsgKanji8853EmptyTex; + +#define dgMsgKanji8854EmptyTex "__OTR__textures/kanji/gMsgKanji8854EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8854EmptyTex[] = dgMsgKanji8854EmptyTex; + +#define dgMsgKanji8855EmptyTex "__OTR__textures/kanji/gMsgKanji8855EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8855EmptyTex[] = dgMsgKanji8855EmptyTex; + +#define dgMsgKanji8856EmptyTex "__OTR__textures/kanji/gMsgKanji8856EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8856EmptyTex[] = dgMsgKanji8856EmptyTex; + +#define dgMsgKanji8857EmptyTex "__OTR__textures/kanji/gMsgKanji8857EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8857EmptyTex[] = dgMsgKanji8857EmptyTex; + +#define dgMsgKanji8858EmptyTex "__OTR__textures/kanji/gMsgKanji8858EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8858EmptyTex[] = dgMsgKanji8858EmptyTex; + +#define dgMsgKanji8859EmptyTex "__OTR__textures/kanji/gMsgKanji8859EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8859EmptyTex[] = dgMsgKanji8859EmptyTex; + +#define dgMsgKanji885AEmptyTex "__OTR__textures/kanji/gMsgKanji885AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885AEmptyTex[] = dgMsgKanji885AEmptyTex; + +#define dgMsgKanji885BEmptyTex "__OTR__textures/kanji/gMsgKanji885BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885BEmptyTex[] = dgMsgKanji885BEmptyTex; + +#define dgMsgKanji885CEmptyTex "__OTR__textures/kanji/gMsgKanji885CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885CEmptyTex[] = dgMsgKanji885CEmptyTex; + +#define dgMsgKanji885DEmptyTex "__OTR__textures/kanji/gMsgKanji885DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885DEmptyTex[] = dgMsgKanji885DEmptyTex; + +#define dgMsgKanji885EEmptyTex "__OTR__textures/kanji/gMsgKanji885EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885EEmptyTex[] = dgMsgKanji885EEmptyTex; + +#define dgMsgKanji885FEmptyTex "__OTR__textures/kanji/gMsgKanji885FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885FEmptyTex[] = dgMsgKanji885FEmptyTex; + +#define dgMsgKanji8860EmptyTex "__OTR__textures/kanji/gMsgKanji8860EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8860EmptyTex[] = dgMsgKanji8860EmptyTex; + +#define dgMsgKanji8861EmptyTex "__OTR__textures/kanji/gMsgKanji8861EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8861EmptyTex[] = dgMsgKanji8861EmptyTex; + +#define dgMsgKanji8862EmptyTex "__OTR__textures/kanji/gMsgKanji8862EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8862EmptyTex[] = dgMsgKanji8862EmptyTex; + +#define dgMsgKanji8863EmptyTex "__OTR__textures/kanji/gMsgKanji8863EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8863EmptyTex[] = dgMsgKanji8863EmptyTex; + +#define dgMsgKanji8864EmptyTex "__OTR__textures/kanji/gMsgKanji8864EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8864EmptyTex[] = dgMsgKanji8864EmptyTex; + +#define dgMsgKanji8865EmptyTex "__OTR__textures/kanji/gMsgKanji8865EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8865EmptyTex[] = dgMsgKanji8865EmptyTex; + +#define dgMsgKanji8866EmptyTex "__OTR__textures/kanji/gMsgKanji8866EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8866EmptyTex[] = dgMsgKanji8866EmptyTex; + +#define dgMsgKanji8867EmptyTex "__OTR__textures/kanji/gMsgKanji8867EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8867EmptyTex[] = dgMsgKanji8867EmptyTex; + +#define dgMsgKanji8868EmptyTex "__OTR__textures/kanji/gMsgKanji8868EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8868EmptyTex[] = dgMsgKanji8868EmptyTex; + +#define dgMsgKanji8869EmptyTex "__OTR__textures/kanji/gMsgKanji8869EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8869EmptyTex[] = dgMsgKanji8869EmptyTex; + +#define dgMsgKanji886AEmptyTex "__OTR__textures/kanji/gMsgKanji886AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886AEmptyTex[] = dgMsgKanji886AEmptyTex; + +#define dgMsgKanji886BEmptyTex "__OTR__textures/kanji/gMsgKanji886BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886BEmptyTex[] = dgMsgKanji886BEmptyTex; + +#define dgMsgKanji886CEmptyTex "__OTR__textures/kanji/gMsgKanji886CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886CEmptyTex[] = dgMsgKanji886CEmptyTex; + +#define dgMsgKanji886DEmptyTex "__OTR__textures/kanji/gMsgKanji886DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886DEmptyTex[] = dgMsgKanji886DEmptyTex; + +#define dgMsgKanji886EEmptyTex "__OTR__textures/kanji/gMsgKanji886EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886EEmptyTex[] = dgMsgKanji886EEmptyTex; + +#define dgMsgKanji886FEmptyTex "__OTR__textures/kanji/gMsgKanji886FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886FEmptyTex[] = dgMsgKanji886FEmptyTex; + +#define dgMsgKanji8870EmptyTex "__OTR__textures/kanji/gMsgKanji8870EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8870EmptyTex[] = dgMsgKanji8870EmptyTex; + +#define dgMsgKanji8871EmptyTex "__OTR__textures/kanji/gMsgKanji8871EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8871EmptyTex[] = dgMsgKanji8871EmptyTex; + +#define dgMsgKanji8872EmptyTex "__OTR__textures/kanji/gMsgKanji8872EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8872EmptyTex[] = dgMsgKanji8872EmptyTex; + +#define dgMsgKanji8873EmptyTex "__OTR__textures/kanji/gMsgKanji8873EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8873EmptyTex[] = dgMsgKanji8873EmptyTex; + +#define dgMsgKanji8874EmptyTex "__OTR__textures/kanji/gMsgKanji8874EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8874EmptyTex[] = dgMsgKanji8874EmptyTex; + +#define dgMsgKanji8875EmptyTex "__OTR__textures/kanji/gMsgKanji8875EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8875EmptyTex[] = dgMsgKanji8875EmptyTex; + +#define dgMsgKanji8876EmptyTex "__OTR__textures/kanji/gMsgKanji8876EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8876EmptyTex[] = dgMsgKanji8876EmptyTex; + +#define dgMsgKanji8877EmptyTex "__OTR__textures/kanji/gMsgKanji8877EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8877EmptyTex[] = dgMsgKanji8877EmptyTex; + +#define dgMsgKanji8878EmptyTex "__OTR__textures/kanji/gMsgKanji8878EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8878EmptyTex[] = dgMsgKanji8878EmptyTex; + +#define dgMsgKanji8879EmptyTex "__OTR__textures/kanji/gMsgKanji8879EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8879EmptyTex[] = dgMsgKanji8879EmptyTex; + +#define dgMsgKanji887AEmptyTex "__OTR__textures/kanji/gMsgKanji887AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji887AEmptyTex[] = dgMsgKanji887AEmptyTex; + +#define dgMsgKanji887BEmptyTex "__OTR__textures/kanji/gMsgKanji887BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji887BEmptyTex[] = dgMsgKanji887BEmptyTex; + +#define dgMsgKanji887CEmptyTex "__OTR__textures/kanji/gMsgKanji887CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji887CEmptyTex[] = dgMsgKanji887CEmptyTex; + +#define dgMsgKanji887DEmptyTex "__OTR__textures/kanji/gMsgKanji887DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji887DEmptyTex[] = dgMsgKanji887DEmptyTex; + +#define dgMsgKanji887EEmptyTex "__OTR__textures/kanji/gMsgKanji887EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji887EEmptyTex[] = dgMsgKanji887EEmptyTex; + +#define dgMsgKanji8880EmptyTex "__OTR__textures/kanji/gMsgKanji8880EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8880EmptyTex[] = dgMsgKanji8880EmptyTex; + +#define dgMsgKanji8881EmptyTex "__OTR__textures/kanji/gMsgKanji8881EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8881EmptyTex[] = dgMsgKanji8881EmptyTex; + +#define dgMsgKanji8882EmptyTex "__OTR__textures/kanji/gMsgKanji8882EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8882EmptyTex[] = dgMsgKanji8882EmptyTex; + +#define dgMsgKanji8883EmptyTex "__OTR__textures/kanji/gMsgKanji8883EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8883EmptyTex[] = dgMsgKanji8883EmptyTex; + +#define dgMsgKanji8884EmptyTex "__OTR__textures/kanji/gMsgKanji8884EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8884EmptyTex[] = dgMsgKanji8884EmptyTex; + +#define dgMsgKanji8885EmptyTex "__OTR__textures/kanji/gMsgKanji8885EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8885EmptyTex[] = dgMsgKanji8885EmptyTex; + +#define dgMsgKanji8886EmptyTex "__OTR__textures/kanji/gMsgKanji8886EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8886EmptyTex[] = dgMsgKanji8886EmptyTex; + +#define dgMsgKanji8887EmptyTex "__OTR__textures/kanji/gMsgKanji8887EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8887EmptyTex[] = dgMsgKanji8887EmptyTex; + +#define dgMsgKanji8888EmptyTex "__OTR__textures/kanji/gMsgKanji8888EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8888EmptyTex[] = dgMsgKanji8888EmptyTex; + +#define dgMsgKanji8889EmptyTex "__OTR__textures/kanji/gMsgKanji8889EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8889EmptyTex[] = dgMsgKanji8889EmptyTex; + +#define dgMsgKanji888AEmptyTex "__OTR__textures/kanji/gMsgKanji888AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888AEmptyTex[] = dgMsgKanji888AEmptyTex; + +#define dgMsgKanji888BEmptyTex "__OTR__textures/kanji/gMsgKanji888BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888BEmptyTex[] = dgMsgKanji888BEmptyTex; + +#define dgMsgKanji888CEmptyTex "__OTR__textures/kanji/gMsgKanji888CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888CEmptyTex[] = dgMsgKanji888CEmptyTex; + +#define dgMsgKanji888DEmptyTex "__OTR__textures/kanji/gMsgKanji888DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888DEmptyTex[] = dgMsgKanji888DEmptyTex; + +#define dgMsgKanji888EEmptyTex "__OTR__textures/kanji/gMsgKanji888EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888EEmptyTex[] = dgMsgKanji888EEmptyTex; + +#define dgMsgKanji888FEmptyTex "__OTR__textures/kanji/gMsgKanji888FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888FEmptyTex[] = dgMsgKanji888FEmptyTex; + +#define dgMsgKanji8890EmptyTex "__OTR__textures/kanji/gMsgKanji8890EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8890EmptyTex[] = dgMsgKanji8890EmptyTex; + +#define dgMsgKanji8891EmptyTex "__OTR__textures/kanji/gMsgKanji8891EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8891EmptyTex[] = dgMsgKanji8891EmptyTex; + +#define dgMsgKanji8892EmptyTex "__OTR__textures/kanji/gMsgKanji8892EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8892EmptyTex[] = dgMsgKanji8892EmptyTex; + +#define dgMsgKanji8893EmptyTex "__OTR__textures/kanji/gMsgKanji8893EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8893EmptyTex[] = dgMsgKanji8893EmptyTex; + +#define dgMsgKanji8894EmptyTex "__OTR__textures/kanji/gMsgKanji8894EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8894EmptyTex[] = dgMsgKanji8894EmptyTex; + +#define dgMsgKanji8895EmptyTex "__OTR__textures/kanji/gMsgKanji8895EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8895EmptyTex[] = dgMsgKanji8895EmptyTex; + +#define dgMsgKanji8896EmptyTex "__OTR__textures/kanji/gMsgKanji8896EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8896EmptyTex[] = dgMsgKanji8896EmptyTex; + +#define dgMsgKanji8897EmptyTex "__OTR__textures/kanji/gMsgKanji8897EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8897EmptyTex[] = dgMsgKanji8897EmptyTex; + +#define dgMsgKanji8898EmptyTex "__OTR__textures/kanji/gMsgKanji8898EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8898EmptyTex[] = dgMsgKanji8898EmptyTex; + +#define dgMsgKanji8899EmptyTex "__OTR__textures/kanji/gMsgKanji8899EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8899EmptyTex[] = dgMsgKanji8899EmptyTex; + +#define dgMsgKanji889AEmptyTex "__OTR__textures/kanji/gMsgKanji889AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji889AEmptyTex[] = dgMsgKanji889AEmptyTex; + +#define dgMsgKanji889BEmptyTex "__OTR__textures/kanji/gMsgKanji889BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji889BEmptyTex[] = dgMsgKanji889BEmptyTex; + +#define dgMsgKanji889CEmptyTex "__OTR__textures/kanji/gMsgKanji889CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji889CEmptyTex[] = dgMsgKanji889CEmptyTex; + +#define dgMsgKanji889DEmptyTex "__OTR__textures/kanji/gMsgKanji889DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji889DEmptyTex[] = dgMsgKanji889DEmptyTex; + +#define dgMsgKanji889EEmptyTex "__OTR__textures/kanji/gMsgKanji889EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji889EEmptyTex[] = dgMsgKanji889EEmptyTex; + +#define dgMsgKanji889FTex "__OTR__textures/kanji/gMsgKanji889FTex" +static const ALIGN_ASSET(2) char gMsgKanji889FTex[] = dgMsgKanji889FTex; + +#define dgMsgKanji88A0Tex "__OTR__textures/kanji/gMsgKanji88A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A0Tex[] = dgMsgKanji88A0Tex; + +#define dgMsgKanji88A1Tex "__OTR__textures/kanji/gMsgKanji88A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A1Tex[] = dgMsgKanji88A1Tex; + +#define dgMsgKanji88A2Tex "__OTR__textures/kanji/gMsgKanji88A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A2Tex[] = dgMsgKanji88A2Tex; + +#define dgMsgKanji88A3Tex "__OTR__textures/kanji/gMsgKanji88A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A3Tex[] = dgMsgKanji88A3Tex; + +#define dgMsgKanji88A4Tex "__OTR__textures/kanji/gMsgKanji88A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A4Tex[] = dgMsgKanji88A4Tex; + +#define dgMsgKanji88A5Tex "__OTR__textures/kanji/gMsgKanji88A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A5Tex[] = dgMsgKanji88A5Tex; + +#define dgMsgKanji88A6Tex "__OTR__textures/kanji/gMsgKanji88A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A6Tex[] = dgMsgKanji88A6Tex; + +#define dgMsgKanji88A7Tex "__OTR__textures/kanji/gMsgKanji88A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A7Tex[] = dgMsgKanji88A7Tex; + +#define dgMsgKanji88A8Tex "__OTR__textures/kanji/gMsgKanji88A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A8Tex[] = dgMsgKanji88A8Tex; + +#define dgMsgKanji88A9Tex "__OTR__textures/kanji/gMsgKanji88A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A9Tex[] = dgMsgKanji88A9Tex; + +#define dgMsgKanji88AATex "__OTR__textures/kanji/gMsgKanji88AATex" +static const ALIGN_ASSET(2) char gMsgKanji88AATex[] = dgMsgKanji88AATex; + +#define dgMsgKanji88ABTex "__OTR__textures/kanji/gMsgKanji88ABTex" +static const ALIGN_ASSET(2) char gMsgKanji88ABTex[] = dgMsgKanji88ABTex; + +#define dgMsgKanji88ACTex "__OTR__textures/kanji/gMsgKanji88ACTex" +static const ALIGN_ASSET(2) char gMsgKanji88ACTex[] = dgMsgKanji88ACTex; + +#define dgMsgKanji88ADTex "__OTR__textures/kanji/gMsgKanji88ADTex" +static const ALIGN_ASSET(2) char gMsgKanji88ADTex[] = dgMsgKanji88ADTex; + +#define dgMsgKanji88AETex "__OTR__textures/kanji/gMsgKanji88AETex" +static const ALIGN_ASSET(2) char gMsgKanji88AETex[] = dgMsgKanji88AETex; + +#define dgMsgKanji88AFTex "__OTR__textures/kanji/gMsgKanji88AFTex" +static const ALIGN_ASSET(2) char gMsgKanji88AFTex[] = dgMsgKanji88AFTex; + +#define dgMsgKanji88B0Tex "__OTR__textures/kanji/gMsgKanji88B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B0Tex[] = dgMsgKanji88B0Tex; + +#define dgMsgKanji88B1Tex "__OTR__textures/kanji/gMsgKanji88B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B1Tex[] = dgMsgKanji88B1Tex; + +#define dgMsgKanji88B2Tex "__OTR__textures/kanji/gMsgKanji88B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B2Tex[] = dgMsgKanji88B2Tex; + +#define dgMsgKanji88B3Tex "__OTR__textures/kanji/gMsgKanji88B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B3Tex[] = dgMsgKanji88B3Tex; + +#define dgMsgKanji88B4Tex "__OTR__textures/kanji/gMsgKanji88B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B4Tex[] = dgMsgKanji88B4Tex; + +#define dgMsgKanji88B5Tex "__OTR__textures/kanji/gMsgKanji88B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B5Tex[] = dgMsgKanji88B5Tex; + +#define dgMsgKanji88B6Tex "__OTR__textures/kanji/gMsgKanji88B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B6Tex[] = dgMsgKanji88B6Tex; + +#define dgMsgKanji88B7Tex "__OTR__textures/kanji/gMsgKanji88B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B7Tex[] = dgMsgKanji88B7Tex; + +#define dgMsgKanji88B8Tex "__OTR__textures/kanji/gMsgKanji88B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B8Tex[] = dgMsgKanji88B8Tex; + +#define dgMsgKanji88B9Tex "__OTR__textures/kanji/gMsgKanji88B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B9Tex[] = dgMsgKanji88B9Tex; + +#define dgMsgKanji88BATex "__OTR__textures/kanji/gMsgKanji88BATex" +static const ALIGN_ASSET(2) char gMsgKanji88BATex[] = dgMsgKanji88BATex; + +#define dgMsgKanji88BBTex "__OTR__textures/kanji/gMsgKanji88BBTex" +static const ALIGN_ASSET(2) char gMsgKanji88BBTex[] = dgMsgKanji88BBTex; + +#define dgMsgKanji88BCTex "__OTR__textures/kanji/gMsgKanji88BCTex" +static const ALIGN_ASSET(2) char gMsgKanji88BCTex[] = dgMsgKanji88BCTex; + +#define dgMsgKanji88BDTex "__OTR__textures/kanji/gMsgKanji88BDTex" +static const ALIGN_ASSET(2) char gMsgKanji88BDTex[] = dgMsgKanji88BDTex; + +#define dgMsgKanji88BETex "__OTR__textures/kanji/gMsgKanji88BETex" +static const ALIGN_ASSET(2) char gMsgKanji88BETex[] = dgMsgKanji88BETex; + +#define dgMsgKanji88BFTex "__OTR__textures/kanji/gMsgKanji88BFTex" +static const ALIGN_ASSET(2) char gMsgKanji88BFTex[] = dgMsgKanji88BFTex; + +#define dgMsgKanji88C0Tex "__OTR__textures/kanji/gMsgKanji88C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C0Tex[] = dgMsgKanji88C0Tex; + +#define dgMsgKanji88C1Tex "__OTR__textures/kanji/gMsgKanji88C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C1Tex[] = dgMsgKanji88C1Tex; + +#define dgMsgKanji88C2Tex "__OTR__textures/kanji/gMsgKanji88C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C2Tex[] = dgMsgKanji88C2Tex; + +#define dgMsgKanji88C3Tex "__OTR__textures/kanji/gMsgKanji88C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C3Tex[] = dgMsgKanji88C3Tex; + +#define dgMsgKanji88C4Tex "__OTR__textures/kanji/gMsgKanji88C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C4Tex[] = dgMsgKanji88C4Tex; + +#define dgMsgKanji88C5Tex "__OTR__textures/kanji/gMsgKanji88C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C5Tex[] = dgMsgKanji88C5Tex; + +#define dgMsgKanji88C6Tex "__OTR__textures/kanji/gMsgKanji88C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C6Tex[] = dgMsgKanji88C6Tex; + +#define dgMsgKanji88C7Tex "__OTR__textures/kanji/gMsgKanji88C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C7Tex[] = dgMsgKanji88C7Tex; + +#define dgMsgKanji88C8Tex "__OTR__textures/kanji/gMsgKanji88C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C8Tex[] = dgMsgKanji88C8Tex; + +#define dgMsgKanji88C9Tex "__OTR__textures/kanji/gMsgKanji88C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C9Tex[] = dgMsgKanji88C9Tex; + +#define dgMsgKanji88CATex "__OTR__textures/kanji/gMsgKanji88CATex" +static const ALIGN_ASSET(2) char gMsgKanji88CATex[] = dgMsgKanji88CATex; + +#define dgMsgKanji88CBTex "__OTR__textures/kanji/gMsgKanji88CBTex" +static const ALIGN_ASSET(2) char gMsgKanji88CBTex[] = dgMsgKanji88CBTex; + +#define dgMsgKanji88CCTex "__OTR__textures/kanji/gMsgKanji88CCTex" +static const ALIGN_ASSET(2) char gMsgKanji88CCTex[] = dgMsgKanji88CCTex; + +#define dgMsgKanji88CDTex "__OTR__textures/kanji/gMsgKanji88CDTex" +static const ALIGN_ASSET(2) char gMsgKanji88CDTex[] = dgMsgKanji88CDTex; + +#define dgMsgKanji88CETex "__OTR__textures/kanji/gMsgKanji88CETex" +static const ALIGN_ASSET(2) char gMsgKanji88CETex[] = dgMsgKanji88CETex; + +#define dgMsgKanji88CFTex "__OTR__textures/kanji/gMsgKanji88CFTex" +static const ALIGN_ASSET(2) char gMsgKanji88CFTex[] = dgMsgKanji88CFTex; + +#define dgMsgKanji88D0Tex "__OTR__textures/kanji/gMsgKanji88D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D0Tex[] = dgMsgKanji88D0Tex; + +#define dgMsgKanji88D1Tex "__OTR__textures/kanji/gMsgKanji88D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D1Tex[] = dgMsgKanji88D1Tex; + +#define dgMsgKanji88D2Tex "__OTR__textures/kanji/gMsgKanji88D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D2Tex[] = dgMsgKanji88D2Tex; + +#define dgMsgKanji88D3Tex "__OTR__textures/kanji/gMsgKanji88D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D3Tex[] = dgMsgKanji88D3Tex; + +#define dgMsgKanji88D4Tex "__OTR__textures/kanji/gMsgKanji88D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D4Tex[] = dgMsgKanji88D4Tex; + +#define dgMsgKanji88D5Tex "__OTR__textures/kanji/gMsgKanji88D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D5Tex[] = dgMsgKanji88D5Tex; + +#define dgMsgKanji88D6Tex "__OTR__textures/kanji/gMsgKanji88D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D6Tex[] = dgMsgKanji88D6Tex; + +#define dgMsgKanji88D7Tex "__OTR__textures/kanji/gMsgKanji88D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D7Tex[] = dgMsgKanji88D7Tex; + +#define dgMsgKanji88D8Tex "__OTR__textures/kanji/gMsgKanji88D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D8Tex[] = dgMsgKanji88D8Tex; + +#define dgMsgKanji88D9Tex "__OTR__textures/kanji/gMsgKanji88D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D9Tex[] = dgMsgKanji88D9Tex; + +#define dgMsgKanji88DATex "__OTR__textures/kanji/gMsgKanji88DATex" +static const ALIGN_ASSET(2) char gMsgKanji88DATex[] = dgMsgKanji88DATex; + +#define dgMsgKanji88DBTex "__OTR__textures/kanji/gMsgKanji88DBTex" +static const ALIGN_ASSET(2) char gMsgKanji88DBTex[] = dgMsgKanji88DBTex; + +#define dgMsgKanji88DCTex "__OTR__textures/kanji/gMsgKanji88DCTex" +static const ALIGN_ASSET(2) char gMsgKanji88DCTex[] = dgMsgKanji88DCTex; + +#define dgMsgKanji88DDTex "__OTR__textures/kanji/gMsgKanji88DDTex" +static const ALIGN_ASSET(2) char gMsgKanji88DDTex[] = dgMsgKanji88DDTex; + +#define dgMsgKanji88DETex "__OTR__textures/kanji/gMsgKanji88DETex" +static const ALIGN_ASSET(2) char gMsgKanji88DETex[] = dgMsgKanji88DETex; + +#define dgMsgKanji88DFTex "__OTR__textures/kanji/gMsgKanji88DFTex" +static const ALIGN_ASSET(2) char gMsgKanji88DFTex[] = dgMsgKanji88DFTex; + +#define dgMsgKanji88E0Tex "__OTR__textures/kanji/gMsgKanji88E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E0Tex[] = dgMsgKanji88E0Tex; + +#define dgMsgKanji88E1Tex "__OTR__textures/kanji/gMsgKanji88E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E1Tex[] = dgMsgKanji88E1Tex; + +#define dgMsgKanji88E2Tex "__OTR__textures/kanji/gMsgKanji88E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E2Tex[] = dgMsgKanji88E2Tex; + +#define dgMsgKanji88E3Tex "__OTR__textures/kanji/gMsgKanji88E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E3Tex[] = dgMsgKanji88E3Tex; + +#define dgMsgKanji88E4Tex "__OTR__textures/kanji/gMsgKanji88E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E4Tex[] = dgMsgKanji88E4Tex; + +#define dgMsgKanji88E5Tex "__OTR__textures/kanji/gMsgKanji88E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E5Tex[] = dgMsgKanji88E5Tex; + +#define dgMsgKanji88E6Tex "__OTR__textures/kanji/gMsgKanji88E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E6Tex[] = dgMsgKanji88E6Tex; + +#define dgMsgKanji88E7Tex "__OTR__textures/kanji/gMsgKanji88E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E7Tex[] = dgMsgKanji88E7Tex; + +#define dgMsgKanji88E8Tex "__OTR__textures/kanji/gMsgKanji88E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E8Tex[] = dgMsgKanji88E8Tex; + +#define dgMsgKanji88E9Tex "__OTR__textures/kanji/gMsgKanji88E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E9Tex[] = dgMsgKanji88E9Tex; + +#define dgMsgKanji88EATex "__OTR__textures/kanji/gMsgKanji88EATex" +static const ALIGN_ASSET(2) char gMsgKanji88EATex[] = dgMsgKanji88EATex; + +#define dgMsgKanji88EBTex "__OTR__textures/kanji/gMsgKanji88EBTex" +static const ALIGN_ASSET(2) char gMsgKanji88EBTex[] = dgMsgKanji88EBTex; + +#define dgMsgKanji88ECTex "__OTR__textures/kanji/gMsgKanji88ECTex" +static const ALIGN_ASSET(2) char gMsgKanji88ECTex[] = dgMsgKanji88ECTex; + +#define dgMsgKanji88EDTex "__OTR__textures/kanji/gMsgKanji88EDTex" +static const ALIGN_ASSET(2) char gMsgKanji88EDTex[] = dgMsgKanji88EDTex; + +#define dgMsgKanji88EETex "__OTR__textures/kanji/gMsgKanji88EETex" +static const ALIGN_ASSET(2) char gMsgKanji88EETex[] = dgMsgKanji88EETex; + +#define dgMsgKanji88EFTex "__OTR__textures/kanji/gMsgKanji88EFTex" +static const ALIGN_ASSET(2) char gMsgKanji88EFTex[] = dgMsgKanji88EFTex; + +#define dgMsgKanji88F0Tex "__OTR__textures/kanji/gMsgKanji88F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F0Tex[] = dgMsgKanji88F0Tex; + +#define dgMsgKanji88F1Tex "__OTR__textures/kanji/gMsgKanji88F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F1Tex[] = dgMsgKanji88F1Tex; + +#define dgMsgKanji88F2Tex "__OTR__textures/kanji/gMsgKanji88F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F2Tex[] = dgMsgKanji88F2Tex; + +#define dgMsgKanji88F3Tex "__OTR__textures/kanji/gMsgKanji88F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F3Tex[] = dgMsgKanji88F3Tex; + +#define dgMsgKanji88F4Tex "__OTR__textures/kanji/gMsgKanji88F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F4Tex[] = dgMsgKanji88F4Tex; + +#define dgMsgKanji88F5Tex "__OTR__textures/kanji/gMsgKanji88F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F5Tex[] = dgMsgKanji88F5Tex; + +#define dgMsgKanji88F6Tex "__OTR__textures/kanji/gMsgKanji88F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F6Tex[] = dgMsgKanji88F6Tex; + +#define dgMsgKanji88F7Tex "__OTR__textures/kanji/gMsgKanji88F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F7Tex[] = dgMsgKanji88F7Tex; + +#define dgMsgKanji88F8Tex "__OTR__textures/kanji/gMsgKanji88F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F8Tex[] = dgMsgKanji88F8Tex; + +#define dgMsgKanji88F9Tex "__OTR__textures/kanji/gMsgKanji88F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F9Tex[] = dgMsgKanji88F9Tex; + +#define dgMsgKanji88FATex "__OTR__textures/kanji/gMsgKanji88FATex" +static const ALIGN_ASSET(2) char gMsgKanji88FATex[] = dgMsgKanji88FATex; + +#define dgMsgKanji88FBTex "__OTR__textures/kanji/gMsgKanji88FBTex" +static const ALIGN_ASSET(2) char gMsgKanji88FBTex[] = dgMsgKanji88FBTex; + +#define dgMsgKanji88FCTex "__OTR__textures/kanji/gMsgKanji88FCTex" +static const ALIGN_ASSET(2) char gMsgKanji88FCTex[] = dgMsgKanji88FCTex; + +#define dgMsgKanji8940Tex "__OTR__textures/kanji/gMsgKanji8940Tex" +static const ALIGN_ASSET(2) char gMsgKanji8940Tex[] = dgMsgKanji8940Tex; + +#define dgMsgKanji8941Tex "__OTR__textures/kanji/gMsgKanji8941Tex" +static const ALIGN_ASSET(2) char gMsgKanji8941Tex[] = dgMsgKanji8941Tex; + +#define dgMsgKanji8942Tex "__OTR__textures/kanji/gMsgKanji8942Tex" +static const ALIGN_ASSET(2) char gMsgKanji8942Tex[] = dgMsgKanji8942Tex; + +#define dgMsgKanji8943Tex "__OTR__textures/kanji/gMsgKanji8943Tex" +static const ALIGN_ASSET(2) char gMsgKanji8943Tex[] = dgMsgKanji8943Tex; + +#define dgMsgKanji8944Tex "__OTR__textures/kanji/gMsgKanji8944Tex" +static const ALIGN_ASSET(2) char gMsgKanji8944Tex[] = dgMsgKanji8944Tex; + +#define dgMsgKanji8945Tex "__OTR__textures/kanji/gMsgKanji8945Tex" +static const ALIGN_ASSET(2) char gMsgKanji8945Tex[] = dgMsgKanji8945Tex; + +#define dgMsgKanji8946Tex "__OTR__textures/kanji/gMsgKanji8946Tex" +static const ALIGN_ASSET(2) char gMsgKanji8946Tex[] = dgMsgKanji8946Tex; + +#define dgMsgKanji8947Tex "__OTR__textures/kanji/gMsgKanji8947Tex" +static const ALIGN_ASSET(2) char gMsgKanji8947Tex[] = dgMsgKanji8947Tex; + +#define dgMsgKanji8948Tex "__OTR__textures/kanji/gMsgKanji8948Tex" +static const ALIGN_ASSET(2) char gMsgKanji8948Tex[] = dgMsgKanji8948Tex; + +#define dgMsgKanji8949Tex "__OTR__textures/kanji/gMsgKanji8949Tex" +static const ALIGN_ASSET(2) char gMsgKanji8949Tex[] = dgMsgKanji8949Tex; + +#define dgMsgKanji894ATex "__OTR__textures/kanji/gMsgKanji894ATex" +static const ALIGN_ASSET(2) char gMsgKanji894ATex[] = dgMsgKanji894ATex; + +#define dgMsgKanji894BTex "__OTR__textures/kanji/gMsgKanji894BTex" +static const ALIGN_ASSET(2) char gMsgKanji894BTex[] = dgMsgKanji894BTex; + +#define dgMsgKanji894CTex "__OTR__textures/kanji/gMsgKanji894CTex" +static const ALIGN_ASSET(2) char gMsgKanji894CTex[] = dgMsgKanji894CTex; + +#define dgMsgKanji894DTex "__OTR__textures/kanji/gMsgKanji894DTex" +static const ALIGN_ASSET(2) char gMsgKanji894DTex[] = dgMsgKanji894DTex; + +#define dgMsgKanji894ETex "__OTR__textures/kanji/gMsgKanji894ETex" +static const ALIGN_ASSET(2) char gMsgKanji894ETex[] = dgMsgKanji894ETex; + +#define dgMsgKanji894FTex "__OTR__textures/kanji/gMsgKanji894FTex" +static const ALIGN_ASSET(2) char gMsgKanji894FTex[] = dgMsgKanji894FTex; + +#define dgMsgKanji8950Tex "__OTR__textures/kanji/gMsgKanji8950Tex" +static const ALIGN_ASSET(2) char gMsgKanji8950Tex[] = dgMsgKanji8950Tex; + +#define dgMsgKanji8951Tex "__OTR__textures/kanji/gMsgKanji8951Tex" +static const ALIGN_ASSET(2) char gMsgKanji8951Tex[] = dgMsgKanji8951Tex; + +#define dgMsgKanji8952Tex "__OTR__textures/kanji/gMsgKanji8952Tex" +static const ALIGN_ASSET(2) char gMsgKanji8952Tex[] = dgMsgKanji8952Tex; + +#define dgMsgKanji8953Tex "__OTR__textures/kanji/gMsgKanji8953Tex" +static const ALIGN_ASSET(2) char gMsgKanji8953Tex[] = dgMsgKanji8953Tex; + +#define dgMsgKanji8954Tex "__OTR__textures/kanji/gMsgKanji8954Tex" +static const ALIGN_ASSET(2) char gMsgKanji8954Tex[] = dgMsgKanji8954Tex; + +#define dgMsgKanji8955Tex "__OTR__textures/kanji/gMsgKanji8955Tex" +static const ALIGN_ASSET(2) char gMsgKanji8955Tex[] = dgMsgKanji8955Tex; + +#define dgMsgKanji8956Tex "__OTR__textures/kanji/gMsgKanji8956Tex" +static const ALIGN_ASSET(2) char gMsgKanji8956Tex[] = dgMsgKanji8956Tex; + +#define dgMsgKanji8957Tex "__OTR__textures/kanji/gMsgKanji8957Tex" +static const ALIGN_ASSET(2) char gMsgKanji8957Tex[] = dgMsgKanji8957Tex; + +#define dgMsgKanji8958Tex "__OTR__textures/kanji/gMsgKanji8958Tex" +static const ALIGN_ASSET(2) char gMsgKanji8958Tex[] = dgMsgKanji8958Tex; + +#define dgMsgKanji8959Tex "__OTR__textures/kanji/gMsgKanji8959Tex" +static const ALIGN_ASSET(2) char gMsgKanji8959Tex[] = dgMsgKanji8959Tex; + +#define dgMsgKanji895ATex "__OTR__textures/kanji/gMsgKanji895ATex" +static const ALIGN_ASSET(2) char gMsgKanji895ATex[] = dgMsgKanji895ATex; + +#define dgMsgKanji895BTex "__OTR__textures/kanji/gMsgKanji895BTex" +static const ALIGN_ASSET(2) char gMsgKanji895BTex[] = dgMsgKanji895BTex; + +#define dgMsgKanji895CTex "__OTR__textures/kanji/gMsgKanji895CTex" +static const ALIGN_ASSET(2) char gMsgKanji895CTex[] = dgMsgKanji895CTex; + +#define dgMsgKanji895DTex "__OTR__textures/kanji/gMsgKanji895DTex" +static const ALIGN_ASSET(2) char gMsgKanji895DTex[] = dgMsgKanji895DTex; + +#define dgMsgKanji895ETex "__OTR__textures/kanji/gMsgKanji895ETex" +static const ALIGN_ASSET(2) char gMsgKanji895ETex[] = dgMsgKanji895ETex; + +#define dgMsgKanji895FTex "__OTR__textures/kanji/gMsgKanji895FTex" +static const ALIGN_ASSET(2) char gMsgKanji895FTex[] = dgMsgKanji895FTex; + +#define dgMsgKanji8960Tex "__OTR__textures/kanji/gMsgKanji8960Tex" +static const ALIGN_ASSET(2) char gMsgKanji8960Tex[] = dgMsgKanji8960Tex; + +#define dgMsgKanji8961Tex "__OTR__textures/kanji/gMsgKanji8961Tex" +static const ALIGN_ASSET(2) char gMsgKanji8961Tex[] = dgMsgKanji8961Tex; + +#define dgMsgKanji8962Tex "__OTR__textures/kanji/gMsgKanji8962Tex" +static const ALIGN_ASSET(2) char gMsgKanji8962Tex[] = dgMsgKanji8962Tex; + +#define dgMsgKanji8963Tex "__OTR__textures/kanji/gMsgKanji8963Tex" +static const ALIGN_ASSET(2) char gMsgKanji8963Tex[] = dgMsgKanji8963Tex; + +#define dgMsgKanji8964Tex "__OTR__textures/kanji/gMsgKanji8964Tex" +static const ALIGN_ASSET(2) char gMsgKanji8964Tex[] = dgMsgKanji8964Tex; + +#define dgMsgKanji8965Tex "__OTR__textures/kanji/gMsgKanji8965Tex" +static const ALIGN_ASSET(2) char gMsgKanji8965Tex[] = dgMsgKanji8965Tex; + +#define dgMsgKanji8966Tex "__OTR__textures/kanji/gMsgKanji8966Tex" +static const ALIGN_ASSET(2) char gMsgKanji8966Tex[] = dgMsgKanji8966Tex; + +#define dgMsgKanji8967Tex "__OTR__textures/kanji/gMsgKanji8967Tex" +static const ALIGN_ASSET(2) char gMsgKanji8967Tex[] = dgMsgKanji8967Tex; + +#define dgMsgKanji8968Tex "__OTR__textures/kanji/gMsgKanji8968Tex" +static const ALIGN_ASSET(2) char gMsgKanji8968Tex[] = dgMsgKanji8968Tex; + +#define dgMsgKanji8969Tex "__OTR__textures/kanji/gMsgKanji8969Tex" +static const ALIGN_ASSET(2) char gMsgKanji8969Tex[] = dgMsgKanji8969Tex; + +#define dgMsgKanji896ATex "__OTR__textures/kanji/gMsgKanji896ATex" +static const ALIGN_ASSET(2) char gMsgKanji896ATex[] = dgMsgKanji896ATex; + +#define dgMsgKanji896BTex "__OTR__textures/kanji/gMsgKanji896BTex" +static const ALIGN_ASSET(2) char gMsgKanji896BTex[] = dgMsgKanji896BTex; + +#define dgMsgKanji896CTex "__OTR__textures/kanji/gMsgKanji896CTex" +static const ALIGN_ASSET(2) char gMsgKanji896CTex[] = dgMsgKanji896CTex; + +#define dgMsgKanji896DTex "__OTR__textures/kanji/gMsgKanji896DTex" +static const ALIGN_ASSET(2) char gMsgKanji896DTex[] = dgMsgKanji896DTex; + +#define dgMsgKanji896ETex "__OTR__textures/kanji/gMsgKanji896ETex" +static const ALIGN_ASSET(2) char gMsgKanji896ETex[] = dgMsgKanji896ETex; + +#define dgMsgKanji896FTex "__OTR__textures/kanji/gMsgKanji896FTex" +static const ALIGN_ASSET(2) char gMsgKanji896FTex[] = dgMsgKanji896FTex; + +#define dgMsgKanji8970Tex "__OTR__textures/kanji/gMsgKanji8970Tex" +static const ALIGN_ASSET(2) char gMsgKanji8970Tex[] = dgMsgKanji8970Tex; + +#define dgMsgKanji8971Tex "__OTR__textures/kanji/gMsgKanji8971Tex" +static const ALIGN_ASSET(2) char gMsgKanji8971Tex[] = dgMsgKanji8971Tex; + +#define dgMsgKanji8972Tex "__OTR__textures/kanji/gMsgKanji8972Tex" +static const ALIGN_ASSET(2) char gMsgKanji8972Tex[] = dgMsgKanji8972Tex; + +#define dgMsgKanji8973Tex "__OTR__textures/kanji/gMsgKanji8973Tex" +static const ALIGN_ASSET(2) char gMsgKanji8973Tex[] = dgMsgKanji8973Tex; + +#define dgMsgKanji8974Tex "__OTR__textures/kanji/gMsgKanji8974Tex" +static const ALIGN_ASSET(2) char gMsgKanji8974Tex[] = dgMsgKanji8974Tex; + +#define dgMsgKanji8975Tex "__OTR__textures/kanji/gMsgKanji8975Tex" +static const ALIGN_ASSET(2) char gMsgKanji8975Tex[] = dgMsgKanji8975Tex; + +#define dgMsgKanji8976Tex "__OTR__textures/kanji/gMsgKanji8976Tex" +static const ALIGN_ASSET(2) char gMsgKanji8976Tex[] = dgMsgKanji8976Tex; + +#define dgMsgKanji8977Tex "__OTR__textures/kanji/gMsgKanji8977Tex" +static const ALIGN_ASSET(2) char gMsgKanji8977Tex[] = dgMsgKanji8977Tex; + +#define dgMsgKanji8978Tex "__OTR__textures/kanji/gMsgKanji8978Tex" +static const ALIGN_ASSET(2) char gMsgKanji8978Tex[] = dgMsgKanji8978Tex; + +#define dgMsgKanji8979Tex "__OTR__textures/kanji/gMsgKanji8979Tex" +static const ALIGN_ASSET(2) char gMsgKanji8979Tex[] = dgMsgKanji8979Tex; + +#define dgMsgKanji897ATex "__OTR__textures/kanji/gMsgKanji897ATex" +static const ALIGN_ASSET(2) char gMsgKanji897ATex[] = dgMsgKanji897ATex; + +#define dgMsgKanji897BTex "__OTR__textures/kanji/gMsgKanji897BTex" +static const ALIGN_ASSET(2) char gMsgKanji897BTex[] = dgMsgKanji897BTex; + +#define dgMsgKanji897CTex "__OTR__textures/kanji/gMsgKanji897CTex" +static const ALIGN_ASSET(2) char gMsgKanji897CTex[] = dgMsgKanji897CTex; + +#define dgMsgKanji897DTex "__OTR__textures/kanji/gMsgKanji897DTex" +static const ALIGN_ASSET(2) char gMsgKanji897DTex[] = dgMsgKanji897DTex; + +#define dgMsgKanji897ETex "__OTR__textures/kanji/gMsgKanji897ETex" +static const ALIGN_ASSET(2) char gMsgKanji897ETex[] = dgMsgKanji897ETex; + +#define dgMsgKanji8980Tex "__OTR__textures/kanji/gMsgKanji8980Tex" +static const ALIGN_ASSET(2) char gMsgKanji8980Tex[] = dgMsgKanji8980Tex; + +#define dgMsgKanji8981Tex "__OTR__textures/kanji/gMsgKanji8981Tex" +static const ALIGN_ASSET(2) char gMsgKanji8981Tex[] = dgMsgKanji8981Tex; + +#define dgMsgKanji8982Tex "__OTR__textures/kanji/gMsgKanji8982Tex" +static const ALIGN_ASSET(2) char gMsgKanji8982Tex[] = dgMsgKanji8982Tex; + +#define dgMsgKanji8983Tex "__OTR__textures/kanji/gMsgKanji8983Tex" +static const ALIGN_ASSET(2) char gMsgKanji8983Tex[] = dgMsgKanji8983Tex; + +#define dgMsgKanji8984Tex "__OTR__textures/kanji/gMsgKanji8984Tex" +static const ALIGN_ASSET(2) char gMsgKanji8984Tex[] = dgMsgKanji8984Tex; + +#define dgMsgKanji8985Tex "__OTR__textures/kanji/gMsgKanji8985Tex" +static const ALIGN_ASSET(2) char gMsgKanji8985Tex[] = dgMsgKanji8985Tex; + +#define dgMsgKanji8986Tex "__OTR__textures/kanji/gMsgKanji8986Tex" +static const ALIGN_ASSET(2) char gMsgKanji8986Tex[] = dgMsgKanji8986Tex; + +#define dgMsgKanji8987Tex "__OTR__textures/kanji/gMsgKanji8987Tex" +static const ALIGN_ASSET(2) char gMsgKanji8987Tex[] = dgMsgKanji8987Tex; + +#define dgMsgKanji8988Tex "__OTR__textures/kanji/gMsgKanji8988Tex" +static const ALIGN_ASSET(2) char gMsgKanji8988Tex[] = dgMsgKanji8988Tex; + +#define dgMsgKanji8989Tex "__OTR__textures/kanji/gMsgKanji8989Tex" +static const ALIGN_ASSET(2) char gMsgKanji8989Tex[] = dgMsgKanji8989Tex; + +#define dgMsgKanji898ATex "__OTR__textures/kanji/gMsgKanji898ATex" +static const ALIGN_ASSET(2) char gMsgKanji898ATex[] = dgMsgKanji898ATex; + +#define dgMsgKanji898BTex "__OTR__textures/kanji/gMsgKanji898BTex" +static const ALIGN_ASSET(2) char gMsgKanji898BTex[] = dgMsgKanji898BTex; + +#define dgMsgKanji898CTex "__OTR__textures/kanji/gMsgKanji898CTex" +static const ALIGN_ASSET(2) char gMsgKanji898CTex[] = dgMsgKanji898CTex; + +#define dgMsgKanji898DTex "__OTR__textures/kanji/gMsgKanji898DTex" +static const ALIGN_ASSET(2) char gMsgKanji898DTex[] = dgMsgKanji898DTex; + +#define dgMsgKanji898ETex "__OTR__textures/kanji/gMsgKanji898ETex" +static const ALIGN_ASSET(2) char gMsgKanji898ETex[] = dgMsgKanji898ETex; + +#define dgMsgKanji898FTex "__OTR__textures/kanji/gMsgKanji898FTex" +static const ALIGN_ASSET(2) char gMsgKanji898FTex[] = dgMsgKanji898FTex; + +#define dgMsgKanji8990Tex "__OTR__textures/kanji/gMsgKanji8990Tex" +static const ALIGN_ASSET(2) char gMsgKanji8990Tex[] = dgMsgKanji8990Tex; + +#define dgMsgKanji8991Tex "__OTR__textures/kanji/gMsgKanji8991Tex" +static const ALIGN_ASSET(2) char gMsgKanji8991Tex[] = dgMsgKanji8991Tex; + +#define dgMsgKanji8992Tex "__OTR__textures/kanji/gMsgKanji8992Tex" +static const ALIGN_ASSET(2) char gMsgKanji8992Tex[] = dgMsgKanji8992Tex; + +#define dgMsgKanji8993Tex "__OTR__textures/kanji/gMsgKanji8993Tex" +static const ALIGN_ASSET(2) char gMsgKanji8993Tex[] = dgMsgKanji8993Tex; + +#define dgMsgKanji8994Tex "__OTR__textures/kanji/gMsgKanji8994Tex" +static const ALIGN_ASSET(2) char gMsgKanji8994Tex[] = dgMsgKanji8994Tex; + +#define dgMsgKanji8995Tex "__OTR__textures/kanji/gMsgKanji8995Tex" +static const ALIGN_ASSET(2) char gMsgKanji8995Tex[] = dgMsgKanji8995Tex; + +#define dgMsgKanji8996Tex "__OTR__textures/kanji/gMsgKanji8996Tex" +static const ALIGN_ASSET(2) char gMsgKanji8996Tex[] = dgMsgKanji8996Tex; + +#define dgMsgKanji8997Tex "__OTR__textures/kanji/gMsgKanji8997Tex" +static const ALIGN_ASSET(2) char gMsgKanji8997Tex[] = dgMsgKanji8997Tex; + +#define dgMsgKanji8998Tex "__OTR__textures/kanji/gMsgKanji8998Tex" +static const ALIGN_ASSET(2) char gMsgKanji8998Tex[] = dgMsgKanji8998Tex; + +#define dgMsgKanji8999Tex "__OTR__textures/kanji/gMsgKanji8999Tex" +static const ALIGN_ASSET(2) char gMsgKanji8999Tex[] = dgMsgKanji8999Tex; + +#define dgMsgKanji899ATex "__OTR__textures/kanji/gMsgKanji899ATex" +static const ALIGN_ASSET(2) char gMsgKanji899ATex[] = dgMsgKanji899ATex; + +#define dgMsgKanji899BTex "__OTR__textures/kanji/gMsgKanji899BTex" +static const ALIGN_ASSET(2) char gMsgKanji899BTex[] = dgMsgKanji899BTex; + +#define dgMsgKanji899CTex "__OTR__textures/kanji/gMsgKanji899CTex" +static const ALIGN_ASSET(2) char gMsgKanji899CTex[] = dgMsgKanji899CTex; + +#define dgMsgKanji899DTex "__OTR__textures/kanji/gMsgKanji899DTex" +static const ALIGN_ASSET(2) char gMsgKanji899DTex[] = dgMsgKanji899DTex; + +#define dgMsgKanji899ETex "__OTR__textures/kanji/gMsgKanji899ETex" +static const ALIGN_ASSET(2) char gMsgKanji899ETex[] = dgMsgKanji899ETex; + +#define dgMsgKanji899FTex "__OTR__textures/kanji/gMsgKanji899FTex" +static const ALIGN_ASSET(2) char gMsgKanji899FTex[] = dgMsgKanji899FTex; + +#define dgMsgKanji89A0Tex "__OTR__textures/kanji/gMsgKanji89A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A0Tex[] = dgMsgKanji89A0Tex; + +#define dgMsgKanji89A1Tex "__OTR__textures/kanji/gMsgKanji89A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A1Tex[] = dgMsgKanji89A1Tex; + +#define dgMsgKanji89A2Tex "__OTR__textures/kanji/gMsgKanji89A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A2Tex[] = dgMsgKanji89A2Tex; + +#define dgMsgKanji89A3Tex "__OTR__textures/kanji/gMsgKanji89A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A3Tex[] = dgMsgKanji89A3Tex; + +#define dgMsgKanji89A4Tex "__OTR__textures/kanji/gMsgKanji89A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A4Tex[] = dgMsgKanji89A4Tex; + +#define dgMsgKanji89A5Tex "__OTR__textures/kanji/gMsgKanji89A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A5Tex[] = dgMsgKanji89A5Tex; + +#define dgMsgKanji89A6Tex "__OTR__textures/kanji/gMsgKanji89A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A6Tex[] = dgMsgKanji89A6Tex; + +#define dgMsgKanji89A7Tex "__OTR__textures/kanji/gMsgKanji89A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A7Tex[] = dgMsgKanji89A7Tex; + +#define dgMsgKanji89A8Tex "__OTR__textures/kanji/gMsgKanji89A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A8Tex[] = dgMsgKanji89A8Tex; + +#define dgMsgKanji89A9Tex "__OTR__textures/kanji/gMsgKanji89A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A9Tex[] = dgMsgKanji89A9Tex; + +#define dgMsgKanji89AATex "__OTR__textures/kanji/gMsgKanji89AATex" +static const ALIGN_ASSET(2) char gMsgKanji89AATex[] = dgMsgKanji89AATex; + +#define dgMsgKanji89ABTex "__OTR__textures/kanji/gMsgKanji89ABTex" +static const ALIGN_ASSET(2) char gMsgKanji89ABTex[] = dgMsgKanji89ABTex; + +#define dgMsgKanji89ACTex "__OTR__textures/kanji/gMsgKanji89ACTex" +static const ALIGN_ASSET(2) char gMsgKanji89ACTex[] = dgMsgKanji89ACTex; + +#define dgMsgKanji89ADTex "__OTR__textures/kanji/gMsgKanji89ADTex" +static const ALIGN_ASSET(2) char gMsgKanji89ADTex[] = dgMsgKanji89ADTex; + +#define dgMsgKanji89AETex "__OTR__textures/kanji/gMsgKanji89AETex" +static const ALIGN_ASSET(2) char gMsgKanji89AETex[] = dgMsgKanji89AETex; + +#define dgMsgKanji89AFTex "__OTR__textures/kanji/gMsgKanji89AFTex" +static const ALIGN_ASSET(2) char gMsgKanji89AFTex[] = dgMsgKanji89AFTex; + +#define dgMsgKanji89B0Tex "__OTR__textures/kanji/gMsgKanji89B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B0Tex[] = dgMsgKanji89B0Tex; + +#define dgMsgKanji89B1Tex "__OTR__textures/kanji/gMsgKanji89B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B1Tex[] = dgMsgKanji89B1Tex; + +#define dgMsgKanji89B2Tex "__OTR__textures/kanji/gMsgKanji89B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B2Tex[] = dgMsgKanji89B2Tex; + +#define dgMsgKanji89B3Tex "__OTR__textures/kanji/gMsgKanji89B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B3Tex[] = dgMsgKanji89B3Tex; + +#define dgMsgKanji89B4Tex "__OTR__textures/kanji/gMsgKanji89B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B4Tex[] = dgMsgKanji89B4Tex; + +#define dgMsgKanji89B5Tex "__OTR__textures/kanji/gMsgKanji89B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B5Tex[] = dgMsgKanji89B5Tex; + +#define dgMsgKanji89B6Tex "__OTR__textures/kanji/gMsgKanji89B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B6Tex[] = dgMsgKanji89B6Tex; + +#define dgMsgKanji89B7Tex "__OTR__textures/kanji/gMsgKanji89B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B7Tex[] = dgMsgKanji89B7Tex; + +#define dgMsgKanji89B8Tex "__OTR__textures/kanji/gMsgKanji89B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B8Tex[] = dgMsgKanji89B8Tex; + +#define dgMsgKanji89B9Tex "__OTR__textures/kanji/gMsgKanji89B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B9Tex[] = dgMsgKanji89B9Tex; + +#define dgMsgKanji89BATex "__OTR__textures/kanji/gMsgKanji89BATex" +static const ALIGN_ASSET(2) char gMsgKanji89BATex[] = dgMsgKanji89BATex; + +#define dgMsgKanji89BBTex "__OTR__textures/kanji/gMsgKanji89BBTex" +static const ALIGN_ASSET(2) char gMsgKanji89BBTex[] = dgMsgKanji89BBTex; + +#define dgMsgKanji89BCTex "__OTR__textures/kanji/gMsgKanji89BCTex" +static const ALIGN_ASSET(2) char gMsgKanji89BCTex[] = dgMsgKanji89BCTex; + +#define dgMsgKanji89BDTex "__OTR__textures/kanji/gMsgKanji89BDTex" +static const ALIGN_ASSET(2) char gMsgKanji89BDTex[] = dgMsgKanji89BDTex; + +#define dgMsgKanji89BETex "__OTR__textures/kanji/gMsgKanji89BETex" +static const ALIGN_ASSET(2) char gMsgKanji89BETex[] = dgMsgKanji89BETex; + +#define dgMsgKanji89BFTex "__OTR__textures/kanji/gMsgKanji89BFTex" +static const ALIGN_ASSET(2) char gMsgKanji89BFTex[] = dgMsgKanji89BFTex; + +#define dgMsgKanji89C0Tex "__OTR__textures/kanji/gMsgKanji89C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C0Tex[] = dgMsgKanji89C0Tex; + +#define dgMsgKanji89C1Tex "__OTR__textures/kanji/gMsgKanji89C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C1Tex[] = dgMsgKanji89C1Tex; + +#define dgMsgKanji89C2Tex "__OTR__textures/kanji/gMsgKanji89C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C2Tex[] = dgMsgKanji89C2Tex; + +#define dgMsgKanji89C3Tex "__OTR__textures/kanji/gMsgKanji89C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C3Tex[] = dgMsgKanji89C3Tex; + +#define dgMsgKanji89C4Tex "__OTR__textures/kanji/gMsgKanji89C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C4Tex[] = dgMsgKanji89C4Tex; + +#define dgMsgKanji89C5Tex "__OTR__textures/kanji/gMsgKanji89C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C5Tex[] = dgMsgKanji89C5Tex; + +#define dgMsgKanji89C6Tex "__OTR__textures/kanji/gMsgKanji89C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C6Tex[] = dgMsgKanji89C6Tex; + +#define dgMsgKanji89C7Tex "__OTR__textures/kanji/gMsgKanji89C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C7Tex[] = dgMsgKanji89C7Tex; + +#define dgMsgKanji89C8Tex "__OTR__textures/kanji/gMsgKanji89C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C8Tex[] = dgMsgKanji89C8Tex; + +#define dgMsgKanji89C9Tex "__OTR__textures/kanji/gMsgKanji89C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C9Tex[] = dgMsgKanji89C9Tex; + +#define dgMsgKanji89CATex "__OTR__textures/kanji/gMsgKanji89CATex" +static const ALIGN_ASSET(2) char gMsgKanji89CATex[] = dgMsgKanji89CATex; + +#define dgMsgKanji89CBTex "__OTR__textures/kanji/gMsgKanji89CBTex" +static const ALIGN_ASSET(2) char gMsgKanji89CBTex[] = dgMsgKanji89CBTex; + +#define dgMsgKanji89CCTex "__OTR__textures/kanji/gMsgKanji89CCTex" +static const ALIGN_ASSET(2) char gMsgKanji89CCTex[] = dgMsgKanji89CCTex; + +#define dgMsgKanji89CDTex "__OTR__textures/kanji/gMsgKanji89CDTex" +static const ALIGN_ASSET(2) char gMsgKanji89CDTex[] = dgMsgKanji89CDTex; + +#define dgMsgKanji89CETex "__OTR__textures/kanji/gMsgKanji89CETex" +static const ALIGN_ASSET(2) char gMsgKanji89CETex[] = dgMsgKanji89CETex; + +#define dgMsgKanji89CFTex "__OTR__textures/kanji/gMsgKanji89CFTex" +static const ALIGN_ASSET(2) char gMsgKanji89CFTex[] = dgMsgKanji89CFTex; + +#define dgMsgKanji89D0Tex "__OTR__textures/kanji/gMsgKanji89D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D0Tex[] = dgMsgKanji89D0Tex; + +#define dgMsgKanji89D1Tex "__OTR__textures/kanji/gMsgKanji89D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D1Tex[] = dgMsgKanji89D1Tex; + +#define dgMsgKanji89D2Tex "__OTR__textures/kanji/gMsgKanji89D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D2Tex[] = dgMsgKanji89D2Tex; + +#define dgMsgKanji89D3Tex "__OTR__textures/kanji/gMsgKanji89D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D3Tex[] = dgMsgKanji89D3Tex; + +#define dgMsgKanji89D4Tex "__OTR__textures/kanji/gMsgKanji89D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D4Tex[] = dgMsgKanji89D4Tex; + +#define dgMsgKanji89D5Tex "__OTR__textures/kanji/gMsgKanji89D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D5Tex[] = dgMsgKanji89D5Tex; + +#define dgMsgKanji89D6Tex "__OTR__textures/kanji/gMsgKanji89D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D6Tex[] = dgMsgKanji89D6Tex; + +#define dgMsgKanji89D7Tex "__OTR__textures/kanji/gMsgKanji89D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D7Tex[] = dgMsgKanji89D7Tex; + +#define dgMsgKanji89D8Tex "__OTR__textures/kanji/gMsgKanji89D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D8Tex[] = dgMsgKanji89D8Tex; + +#define dgMsgKanji89D9Tex "__OTR__textures/kanji/gMsgKanji89D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D9Tex[] = dgMsgKanji89D9Tex; + +#define dgMsgKanji89DATex "__OTR__textures/kanji/gMsgKanji89DATex" +static const ALIGN_ASSET(2) char gMsgKanji89DATex[] = dgMsgKanji89DATex; + +#define dgMsgKanji89DBTex "__OTR__textures/kanji/gMsgKanji89DBTex" +static const ALIGN_ASSET(2) char gMsgKanji89DBTex[] = dgMsgKanji89DBTex; + +#define dgMsgKanji89DCTex "__OTR__textures/kanji/gMsgKanji89DCTex" +static const ALIGN_ASSET(2) char gMsgKanji89DCTex[] = dgMsgKanji89DCTex; + +#define dgMsgKanji89DDTex "__OTR__textures/kanji/gMsgKanji89DDTex" +static const ALIGN_ASSET(2) char gMsgKanji89DDTex[] = dgMsgKanji89DDTex; + +#define dgMsgKanji89DETex "__OTR__textures/kanji/gMsgKanji89DETex" +static const ALIGN_ASSET(2) char gMsgKanji89DETex[] = dgMsgKanji89DETex; + +#define dgMsgKanji89DFTex "__OTR__textures/kanji/gMsgKanji89DFTex" +static const ALIGN_ASSET(2) char gMsgKanji89DFTex[] = dgMsgKanji89DFTex; + +#define dgMsgKanji89E0Tex "__OTR__textures/kanji/gMsgKanji89E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E0Tex[] = dgMsgKanji89E0Tex; + +#define dgMsgKanji89E1Tex "__OTR__textures/kanji/gMsgKanji89E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E1Tex[] = dgMsgKanji89E1Tex; + +#define dgMsgKanji89E2Tex "__OTR__textures/kanji/gMsgKanji89E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E2Tex[] = dgMsgKanji89E2Tex; + +#define dgMsgKanji89E3Tex "__OTR__textures/kanji/gMsgKanji89E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E3Tex[] = dgMsgKanji89E3Tex; + +#define dgMsgKanji89E4Tex "__OTR__textures/kanji/gMsgKanji89E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E4Tex[] = dgMsgKanji89E4Tex; + +#define dgMsgKanji89E5Tex "__OTR__textures/kanji/gMsgKanji89E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E5Tex[] = dgMsgKanji89E5Tex; + +#define dgMsgKanji89E6Tex "__OTR__textures/kanji/gMsgKanji89E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E6Tex[] = dgMsgKanji89E6Tex; + +#define dgMsgKanji89E7Tex "__OTR__textures/kanji/gMsgKanji89E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E7Tex[] = dgMsgKanji89E7Tex; + +#define dgMsgKanji89E8Tex "__OTR__textures/kanji/gMsgKanji89E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E8Tex[] = dgMsgKanji89E8Tex; + +#define dgMsgKanji89E9Tex "__OTR__textures/kanji/gMsgKanji89E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E9Tex[] = dgMsgKanji89E9Tex; + +#define dgMsgKanji89EATex "__OTR__textures/kanji/gMsgKanji89EATex" +static const ALIGN_ASSET(2) char gMsgKanji89EATex[] = dgMsgKanji89EATex; + +#define dgMsgKanji89EBTex "__OTR__textures/kanji/gMsgKanji89EBTex" +static const ALIGN_ASSET(2) char gMsgKanji89EBTex[] = dgMsgKanji89EBTex; + +#define dgMsgKanji89ECTex "__OTR__textures/kanji/gMsgKanji89ECTex" +static const ALIGN_ASSET(2) char gMsgKanji89ECTex[] = dgMsgKanji89ECTex; + +#define dgMsgKanji89EDTex "__OTR__textures/kanji/gMsgKanji89EDTex" +static const ALIGN_ASSET(2) char gMsgKanji89EDTex[] = dgMsgKanji89EDTex; + +#define dgMsgKanji89EETex "__OTR__textures/kanji/gMsgKanji89EETex" +static const ALIGN_ASSET(2) char gMsgKanji89EETex[] = dgMsgKanji89EETex; + +#define dgMsgKanji89EFTex "__OTR__textures/kanji/gMsgKanji89EFTex" +static const ALIGN_ASSET(2) char gMsgKanji89EFTex[] = dgMsgKanji89EFTex; + +#define dgMsgKanji89F0Tex "__OTR__textures/kanji/gMsgKanji89F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F0Tex[] = dgMsgKanji89F0Tex; + +#define dgMsgKanji89F1Tex "__OTR__textures/kanji/gMsgKanji89F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F1Tex[] = dgMsgKanji89F1Tex; + +#define dgMsgKanji89F2Tex "__OTR__textures/kanji/gMsgKanji89F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F2Tex[] = dgMsgKanji89F2Tex; + +#define dgMsgKanji89F3Tex "__OTR__textures/kanji/gMsgKanji89F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F3Tex[] = dgMsgKanji89F3Tex; + +#define dgMsgKanji89F4Tex "__OTR__textures/kanji/gMsgKanji89F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F4Tex[] = dgMsgKanji89F4Tex; + +#define dgMsgKanji89F5Tex "__OTR__textures/kanji/gMsgKanji89F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F5Tex[] = dgMsgKanji89F5Tex; + +#define dgMsgKanji89F6Tex "__OTR__textures/kanji/gMsgKanji89F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F6Tex[] = dgMsgKanji89F6Tex; + +#define dgMsgKanji89F7Tex "__OTR__textures/kanji/gMsgKanji89F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F7Tex[] = dgMsgKanji89F7Tex; + +#define dgMsgKanji89F8Tex "__OTR__textures/kanji/gMsgKanji89F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F8Tex[] = dgMsgKanji89F8Tex; + +#define dgMsgKanji89F9Tex "__OTR__textures/kanji/gMsgKanji89F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F9Tex[] = dgMsgKanji89F9Tex; + +#define dgMsgKanji89FATex "__OTR__textures/kanji/gMsgKanji89FATex" +static const ALIGN_ASSET(2) char gMsgKanji89FATex[] = dgMsgKanji89FATex; + +#define dgMsgKanji89FBTex "__OTR__textures/kanji/gMsgKanji89FBTex" +static const ALIGN_ASSET(2) char gMsgKanji89FBTex[] = dgMsgKanji89FBTex; + +#define dgMsgKanji89FCTex "__OTR__textures/kanji/gMsgKanji89FCTex" +static const ALIGN_ASSET(2) char gMsgKanji89FCTex[] = dgMsgKanji89FCTex; + +#define dgMsgKanji8A40Tex "__OTR__textures/kanji/gMsgKanji8A40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A40Tex[] = dgMsgKanji8A40Tex; + +#define dgMsgKanji8A41Tex "__OTR__textures/kanji/gMsgKanji8A41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A41Tex[] = dgMsgKanji8A41Tex; + +#define dgMsgKanji8A42Tex "__OTR__textures/kanji/gMsgKanji8A42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A42Tex[] = dgMsgKanji8A42Tex; + +#define dgMsgKanji8A43Tex "__OTR__textures/kanji/gMsgKanji8A43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A43Tex[] = dgMsgKanji8A43Tex; + +#define dgMsgKanji8A44Tex "__OTR__textures/kanji/gMsgKanji8A44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A44Tex[] = dgMsgKanji8A44Tex; + +#define dgMsgKanji8A45Tex "__OTR__textures/kanji/gMsgKanji8A45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A45Tex[] = dgMsgKanji8A45Tex; + +#define dgMsgKanji8A46Tex "__OTR__textures/kanji/gMsgKanji8A46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A46Tex[] = dgMsgKanji8A46Tex; + +#define dgMsgKanji8A47Tex "__OTR__textures/kanji/gMsgKanji8A47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A47Tex[] = dgMsgKanji8A47Tex; + +#define dgMsgKanji8A48Tex "__OTR__textures/kanji/gMsgKanji8A48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A48Tex[] = dgMsgKanji8A48Tex; + +#define dgMsgKanji8A49Tex "__OTR__textures/kanji/gMsgKanji8A49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A49Tex[] = dgMsgKanji8A49Tex; + +#define dgMsgKanji8A4ATex "__OTR__textures/kanji/gMsgKanji8A4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A4ATex[] = dgMsgKanji8A4ATex; + +#define dgMsgKanji8A4BTex "__OTR__textures/kanji/gMsgKanji8A4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A4BTex[] = dgMsgKanji8A4BTex; + +#define dgMsgKanji8A4CTex "__OTR__textures/kanji/gMsgKanji8A4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A4CTex[] = dgMsgKanji8A4CTex; + +#define dgMsgKanji8A4DTex "__OTR__textures/kanji/gMsgKanji8A4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A4DTex[] = dgMsgKanji8A4DTex; + +#define dgMsgKanji8A4ETex "__OTR__textures/kanji/gMsgKanji8A4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A4ETex[] = dgMsgKanji8A4ETex; + +#define dgMsgKanji8A4FTex "__OTR__textures/kanji/gMsgKanji8A4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8A4FTex[] = dgMsgKanji8A4FTex; + +#define dgMsgKanji8A50Tex "__OTR__textures/kanji/gMsgKanji8A50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A50Tex[] = dgMsgKanji8A50Tex; + +#define dgMsgKanji8A51Tex "__OTR__textures/kanji/gMsgKanji8A51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A51Tex[] = dgMsgKanji8A51Tex; + +#define dgMsgKanji8A52Tex "__OTR__textures/kanji/gMsgKanji8A52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A52Tex[] = dgMsgKanji8A52Tex; + +#define dgMsgKanji8A53Tex "__OTR__textures/kanji/gMsgKanji8A53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A53Tex[] = dgMsgKanji8A53Tex; + +#define dgMsgKanji8A54Tex "__OTR__textures/kanji/gMsgKanji8A54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A54Tex[] = dgMsgKanji8A54Tex; + +#define dgMsgKanji8A55Tex "__OTR__textures/kanji/gMsgKanji8A55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A55Tex[] = dgMsgKanji8A55Tex; + +#define dgMsgKanji8A56Tex "__OTR__textures/kanji/gMsgKanji8A56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A56Tex[] = dgMsgKanji8A56Tex; + +#define dgMsgKanji8A57Tex "__OTR__textures/kanji/gMsgKanji8A57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A57Tex[] = dgMsgKanji8A57Tex; + +#define dgMsgKanji8A58Tex "__OTR__textures/kanji/gMsgKanji8A58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A58Tex[] = dgMsgKanji8A58Tex; + +#define dgMsgKanji8A59Tex "__OTR__textures/kanji/gMsgKanji8A59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A59Tex[] = dgMsgKanji8A59Tex; + +#define dgMsgKanji8A5ATex "__OTR__textures/kanji/gMsgKanji8A5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A5ATex[] = dgMsgKanji8A5ATex; + +#define dgMsgKanji8A5BTex "__OTR__textures/kanji/gMsgKanji8A5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A5BTex[] = dgMsgKanji8A5BTex; + +#define dgMsgKanji8A5CTex "__OTR__textures/kanji/gMsgKanji8A5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A5CTex[] = dgMsgKanji8A5CTex; + +#define dgMsgKanji8A5DTex "__OTR__textures/kanji/gMsgKanji8A5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A5DTex[] = dgMsgKanji8A5DTex; + +#define dgMsgKanji8A5ETex "__OTR__textures/kanji/gMsgKanji8A5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A5ETex[] = dgMsgKanji8A5ETex; + +#define dgMsgKanji8A5FTex "__OTR__textures/kanji/gMsgKanji8A5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8A5FTex[] = dgMsgKanji8A5FTex; + +#define dgMsgKanji8A60Tex "__OTR__textures/kanji/gMsgKanji8A60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A60Tex[] = dgMsgKanji8A60Tex; + +#define dgMsgKanji8A61Tex "__OTR__textures/kanji/gMsgKanji8A61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A61Tex[] = dgMsgKanji8A61Tex; + +#define dgMsgKanji8A62Tex "__OTR__textures/kanji/gMsgKanji8A62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A62Tex[] = dgMsgKanji8A62Tex; + +#define dgMsgKanji8A63Tex "__OTR__textures/kanji/gMsgKanji8A63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A63Tex[] = dgMsgKanji8A63Tex; + +#define dgMsgKanji8A64Tex "__OTR__textures/kanji/gMsgKanji8A64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A64Tex[] = dgMsgKanji8A64Tex; + +#define dgMsgKanji8A65Tex "__OTR__textures/kanji/gMsgKanji8A65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A65Tex[] = dgMsgKanji8A65Tex; + +#define dgMsgKanji8A66Tex "__OTR__textures/kanji/gMsgKanji8A66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A66Tex[] = dgMsgKanji8A66Tex; + +#define dgMsgKanji8A67Tex "__OTR__textures/kanji/gMsgKanji8A67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A67Tex[] = dgMsgKanji8A67Tex; + +#define dgMsgKanji8A68Tex "__OTR__textures/kanji/gMsgKanji8A68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A68Tex[] = dgMsgKanji8A68Tex; + +#define dgMsgKanji8A69Tex "__OTR__textures/kanji/gMsgKanji8A69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A69Tex[] = dgMsgKanji8A69Tex; + +#define dgMsgKanji8A6ATex "__OTR__textures/kanji/gMsgKanji8A6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A6ATex[] = dgMsgKanji8A6ATex; + +#define dgMsgKanji8A6BTex "__OTR__textures/kanji/gMsgKanji8A6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A6BTex[] = dgMsgKanji8A6BTex; + +#define dgMsgKanji8A6CTex "__OTR__textures/kanji/gMsgKanji8A6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A6CTex[] = dgMsgKanji8A6CTex; + +#define dgMsgKanji8A6DTex "__OTR__textures/kanji/gMsgKanji8A6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A6DTex[] = dgMsgKanji8A6DTex; + +#define dgMsgKanji8A6ETex "__OTR__textures/kanji/gMsgKanji8A6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A6ETex[] = dgMsgKanji8A6ETex; + +#define dgMsgKanji8A6FTex "__OTR__textures/kanji/gMsgKanji8A6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8A6FTex[] = dgMsgKanji8A6FTex; + +#define dgMsgKanji8A70Tex "__OTR__textures/kanji/gMsgKanji8A70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A70Tex[] = dgMsgKanji8A70Tex; + +#define dgMsgKanji8A71Tex "__OTR__textures/kanji/gMsgKanji8A71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A71Tex[] = dgMsgKanji8A71Tex; + +#define dgMsgKanji8A72Tex "__OTR__textures/kanji/gMsgKanji8A72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A72Tex[] = dgMsgKanji8A72Tex; + +#define dgMsgKanji8A73Tex "__OTR__textures/kanji/gMsgKanji8A73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A73Tex[] = dgMsgKanji8A73Tex; + +#define dgMsgKanji8A74Tex "__OTR__textures/kanji/gMsgKanji8A74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A74Tex[] = dgMsgKanji8A74Tex; + +#define dgMsgKanji8A75Tex "__OTR__textures/kanji/gMsgKanji8A75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A75Tex[] = dgMsgKanji8A75Tex; + +#define dgMsgKanji8A76Tex "__OTR__textures/kanji/gMsgKanji8A76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A76Tex[] = dgMsgKanji8A76Tex; + +#define dgMsgKanji8A77Tex "__OTR__textures/kanji/gMsgKanji8A77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A77Tex[] = dgMsgKanji8A77Tex; + +#define dgMsgKanji8A78Tex "__OTR__textures/kanji/gMsgKanji8A78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A78Tex[] = dgMsgKanji8A78Tex; + +#define dgMsgKanji8A79Tex "__OTR__textures/kanji/gMsgKanji8A79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A79Tex[] = dgMsgKanji8A79Tex; + +#define dgMsgKanji8A7ATex "__OTR__textures/kanji/gMsgKanji8A7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A7ATex[] = dgMsgKanji8A7ATex; + +#define dgMsgKanji8A7BTex "__OTR__textures/kanji/gMsgKanji8A7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A7BTex[] = dgMsgKanji8A7BTex; + +#define dgMsgKanji8A7CTex "__OTR__textures/kanji/gMsgKanji8A7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A7CTex[] = dgMsgKanji8A7CTex; + +#define dgMsgKanji8A7DTex "__OTR__textures/kanji/gMsgKanji8A7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A7DTex[] = dgMsgKanji8A7DTex; + +#define dgMsgKanji8A7ETex "__OTR__textures/kanji/gMsgKanji8A7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A7ETex[] = dgMsgKanji8A7ETex; + +#define dgMsgKanji8A80Tex "__OTR__textures/kanji/gMsgKanji8A80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A80Tex[] = dgMsgKanji8A80Tex; + +#define dgMsgKanji8A81Tex "__OTR__textures/kanji/gMsgKanji8A81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A81Tex[] = dgMsgKanji8A81Tex; + +#define dgMsgKanji8A82Tex "__OTR__textures/kanji/gMsgKanji8A82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A82Tex[] = dgMsgKanji8A82Tex; + +#define dgMsgKanji8A83Tex "__OTR__textures/kanji/gMsgKanji8A83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A83Tex[] = dgMsgKanji8A83Tex; + +#define dgMsgKanji8A84Tex "__OTR__textures/kanji/gMsgKanji8A84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A84Tex[] = dgMsgKanji8A84Tex; + +#define dgMsgKanji8A85Tex "__OTR__textures/kanji/gMsgKanji8A85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A85Tex[] = dgMsgKanji8A85Tex; + +#define dgMsgKanji8A86Tex "__OTR__textures/kanji/gMsgKanji8A86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A86Tex[] = dgMsgKanji8A86Tex; + +#define dgMsgKanji8A87Tex "__OTR__textures/kanji/gMsgKanji8A87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A87Tex[] = dgMsgKanji8A87Tex; + +#define dgMsgKanji8A88Tex "__OTR__textures/kanji/gMsgKanji8A88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A88Tex[] = dgMsgKanji8A88Tex; + +#define dgMsgKanji8A89Tex "__OTR__textures/kanji/gMsgKanji8A89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A89Tex[] = dgMsgKanji8A89Tex; + +#define dgMsgKanji8A8ATex "__OTR__textures/kanji/gMsgKanji8A8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A8ATex[] = dgMsgKanji8A8ATex; + +#define dgMsgKanji8A8BTex "__OTR__textures/kanji/gMsgKanji8A8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A8BTex[] = dgMsgKanji8A8BTex; + +#define dgMsgKanji8A8CTex "__OTR__textures/kanji/gMsgKanji8A8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A8CTex[] = dgMsgKanji8A8CTex; + +#define dgMsgKanji8A8DTex "__OTR__textures/kanji/gMsgKanji8A8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A8DTex[] = dgMsgKanji8A8DTex; + +#define dgMsgKanji8A8ETex "__OTR__textures/kanji/gMsgKanji8A8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A8ETex[] = dgMsgKanji8A8ETex; + +#define dgMsgKanji8A8FTex "__OTR__textures/kanji/gMsgKanji8A8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8A8FTex[] = dgMsgKanji8A8FTex; + +#define dgMsgKanji8A90Tex "__OTR__textures/kanji/gMsgKanji8A90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A90Tex[] = dgMsgKanji8A90Tex; + +#define dgMsgKanji8A91Tex "__OTR__textures/kanji/gMsgKanji8A91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A91Tex[] = dgMsgKanji8A91Tex; + +#define dgMsgKanji8A92Tex "__OTR__textures/kanji/gMsgKanji8A92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A92Tex[] = dgMsgKanji8A92Tex; + +#define dgMsgKanji8A93Tex "__OTR__textures/kanji/gMsgKanji8A93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A93Tex[] = dgMsgKanji8A93Tex; + +#define dgMsgKanji8A94Tex "__OTR__textures/kanji/gMsgKanji8A94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A94Tex[] = dgMsgKanji8A94Tex; + +#define dgMsgKanji8A95Tex "__OTR__textures/kanji/gMsgKanji8A95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A95Tex[] = dgMsgKanji8A95Tex; + +#define dgMsgKanji8A96Tex "__OTR__textures/kanji/gMsgKanji8A96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A96Tex[] = dgMsgKanji8A96Tex; + +#define dgMsgKanji8A97Tex "__OTR__textures/kanji/gMsgKanji8A97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A97Tex[] = dgMsgKanji8A97Tex; + +#define dgMsgKanji8A98Tex "__OTR__textures/kanji/gMsgKanji8A98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A98Tex[] = dgMsgKanji8A98Tex; + +#define dgMsgKanji8A99Tex "__OTR__textures/kanji/gMsgKanji8A99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A99Tex[] = dgMsgKanji8A99Tex; + +#define dgMsgKanji8A9ATex "__OTR__textures/kanji/gMsgKanji8A9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A9ATex[] = dgMsgKanji8A9ATex; + +#define dgMsgKanji8A9BTex "__OTR__textures/kanji/gMsgKanji8A9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A9BTex[] = dgMsgKanji8A9BTex; + +#define dgMsgKanji8A9CTex "__OTR__textures/kanji/gMsgKanji8A9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A9CTex[] = dgMsgKanji8A9CTex; + +#define dgMsgKanji8A9DTex "__OTR__textures/kanji/gMsgKanji8A9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A9DTex[] = dgMsgKanji8A9DTex; + +#define dgMsgKanji8A9ETex "__OTR__textures/kanji/gMsgKanji8A9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A9ETex[] = dgMsgKanji8A9ETex; + +#define dgMsgKanji8A9FTex "__OTR__textures/kanji/gMsgKanji8A9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8A9FTex[] = dgMsgKanji8A9FTex; + +#define dgMsgKanji8AA0Tex "__OTR__textures/kanji/gMsgKanji8AA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA0Tex[] = dgMsgKanji8AA0Tex; + +#define dgMsgKanji8AA1Tex "__OTR__textures/kanji/gMsgKanji8AA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA1Tex[] = dgMsgKanji8AA1Tex; + +#define dgMsgKanji8AA2Tex "__OTR__textures/kanji/gMsgKanji8AA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA2Tex[] = dgMsgKanji8AA2Tex; + +#define dgMsgKanji8AA3Tex "__OTR__textures/kanji/gMsgKanji8AA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA3Tex[] = dgMsgKanji8AA3Tex; + +#define dgMsgKanji8AA4Tex "__OTR__textures/kanji/gMsgKanji8AA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA4Tex[] = dgMsgKanji8AA4Tex; + +#define dgMsgKanji8AA5Tex "__OTR__textures/kanji/gMsgKanji8AA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA5Tex[] = dgMsgKanji8AA5Tex; + +#define dgMsgKanji8AA6Tex "__OTR__textures/kanji/gMsgKanji8AA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA6Tex[] = dgMsgKanji8AA6Tex; + +#define dgMsgKanji8AA7Tex "__OTR__textures/kanji/gMsgKanji8AA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA7Tex[] = dgMsgKanji8AA7Tex; + +#define dgMsgKanji8AA8Tex "__OTR__textures/kanji/gMsgKanji8AA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA8Tex[] = dgMsgKanji8AA8Tex; + +#define dgMsgKanji8AA9Tex "__OTR__textures/kanji/gMsgKanji8AA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA9Tex[] = dgMsgKanji8AA9Tex; + +#define dgMsgKanji8AAATex "__OTR__textures/kanji/gMsgKanji8AAATex" +static const ALIGN_ASSET(2) char gMsgKanji8AAATex[] = dgMsgKanji8AAATex; + +#define dgMsgKanji8AABTex "__OTR__textures/kanji/gMsgKanji8AABTex" +static const ALIGN_ASSET(2) char gMsgKanji8AABTex[] = dgMsgKanji8AABTex; + +#define dgMsgKanji8AACTex "__OTR__textures/kanji/gMsgKanji8AACTex" +static const ALIGN_ASSET(2) char gMsgKanji8AACTex[] = dgMsgKanji8AACTex; + +#define dgMsgKanji8AADTex "__OTR__textures/kanji/gMsgKanji8AADTex" +static const ALIGN_ASSET(2) char gMsgKanji8AADTex[] = dgMsgKanji8AADTex; + +#define dgMsgKanji8AAETex "__OTR__textures/kanji/gMsgKanji8AAETex" +static const ALIGN_ASSET(2) char gMsgKanji8AAETex[] = dgMsgKanji8AAETex; + +#define dgMsgKanji8AAFTex "__OTR__textures/kanji/gMsgKanji8AAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8AAFTex[] = dgMsgKanji8AAFTex; + +#define dgMsgKanji8AB0Tex "__OTR__textures/kanji/gMsgKanji8AB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB0Tex[] = dgMsgKanji8AB0Tex; + +#define dgMsgKanji8AB1Tex "__OTR__textures/kanji/gMsgKanji8AB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB1Tex[] = dgMsgKanji8AB1Tex; + +#define dgMsgKanji8AB2Tex "__OTR__textures/kanji/gMsgKanji8AB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB2Tex[] = dgMsgKanji8AB2Tex; + +#define dgMsgKanji8AB3Tex "__OTR__textures/kanji/gMsgKanji8AB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB3Tex[] = dgMsgKanji8AB3Tex; + +#define dgMsgKanji8AB4Tex "__OTR__textures/kanji/gMsgKanji8AB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB4Tex[] = dgMsgKanji8AB4Tex; + +#define dgMsgKanji8AB5Tex "__OTR__textures/kanji/gMsgKanji8AB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB5Tex[] = dgMsgKanji8AB5Tex; + +#define dgMsgKanji8AB6Tex "__OTR__textures/kanji/gMsgKanji8AB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB6Tex[] = dgMsgKanji8AB6Tex; + +#define dgMsgKanji8AB7Tex "__OTR__textures/kanji/gMsgKanji8AB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB7Tex[] = dgMsgKanji8AB7Tex; + +#define dgMsgKanji8AB8Tex "__OTR__textures/kanji/gMsgKanji8AB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB8Tex[] = dgMsgKanji8AB8Tex; + +#define dgMsgKanji8AB9Tex "__OTR__textures/kanji/gMsgKanji8AB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB9Tex[] = dgMsgKanji8AB9Tex; + +#define dgMsgKanji8ABATex "__OTR__textures/kanji/gMsgKanji8ABATex" +static const ALIGN_ASSET(2) char gMsgKanji8ABATex[] = dgMsgKanji8ABATex; + +#define dgMsgKanji8ABBTex "__OTR__textures/kanji/gMsgKanji8ABBTex" +static const ALIGN_ASSET(2) char gMsgKanji8ABBTex[] = dgMsgKanji8ABBTex; + +#define dgMsgKanji8ABCTex "__OTR__textures/kanji/gMsgKanji8ABCTex" +static const ALIGN_ASSET(2) char gMsgKanji8ABCTex[] = dgMsgKanji8ABCTex; + +#define dgMsgKanji8ABDTex "__OTR__textures/kanji/gMsgKanji8ABDTex" +static const ALIGN_ASSET(2) char gMsgKanji8ABDTex[] = dgMsgKanji8ABDTex; + +#define dgMsgKanji8ABETex "__OTR__textures/kanji/gMsgKanji8ABETex" +static const ALIGN_ASSET(2) char gMsgKanji8ABETex[] = dgMsgKanji8ABETex; + +#define dgMsgKanji8ABFTex "__OTR__textures/kanji/gMsgKanji8ABFTex" +static const ALIGN_ASSET(2) char gMsgKanji8ABFTex[] = dgMsgKanji8ABFTex; + +#define dgMsgKanji8AC0Tex "__OTR__textures/kanji/gMsgKanji8AC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC0Tex[] = dgMsgKanji8AC0Tex; + +#define dgMsgKanji8AC1Tex "__OTR__textures/kanji/gMsgKanji8AC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC1Tex[] = dgMsgKanji8AC1Tex; + +#define dgMsgKanji8AC2Tex "__OTR__textures/kanji/gMsgKanji8AC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC2Tex[] = dgMsgKanji8AC2Tex; + +#define dgMsgKanji8AC3Tex "__OTR__textures/kanji/gMsgKanji8AC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC3Tex[] = dgMsgKanji8AC3Tex; + +#define dgMsgKanji8AC4Tex "__OTR__textures/kanji/gMsgKanji8AC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC4Tex[] = dgMsgKanji8AC4Tex; + +#define dgMsgKanji8AC5Tex "__OTR__textures/kanji/gMsgKanji8AC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC5Tex[] = dgMsgKanji8AC5Tex; + +#define dgMsgKanji8AC6Tex "__OTR__textures/kanji/gMsgKanji8AC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC6Tex[] = dgMsgKanji8AC6Tex; + +#define dgMsgKanji8AC7Tex "__OTR__textures/kanji/gMsgKanji8AC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC7Tex[] = dgMsgKanji8AC7Tex; + +#define dgMsgKanji8AC8Tex "__OTR__textures/kanji/gMsgKanji8AC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC8Tex[] = dgMsgKanji8AC8Tex; + +#define dgMsgKanji8AC9Tex "__OTR__textures/kanji/gMsgKanji8AC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC9Tex[] = dgMsgKanji8AC9Tex; + +#define dgMsgKanji8ACATex "__OTR__textures/kanji/gMsgKanji8ACATex" +static const ALIGN_ASSET(2) char gMsgKanji8ACATex[] = dgMsgKanji8ACATex; + +#define dgMsgKanji8ACBTex "__OTR__textures/kanji/gMsgKanji8ACBTex" +static const ALIGN_ASSET(2) char gMsgKanji8ACBTex[] = dgMsgKanji8ACBTex; + +#define dgMsgKanji8ACCTex "__OTR__textures/kanji/gMsgKanji8ACCTex" +static const ALIGN_ASSET(2) char gMsgKanji8ACCTex[] = dgMsgKanji8ACCTex; + +#define dgMsgKanji8ACDTex "__OTR__textures/kanji/gMsgKanji8ACDTex" +static const ALIGN_ASSET(2) char gMsgKanji8ACDTex[] = dgMsgKanji8ACDTex; + +#define dgMsgKanji8ACETex "__OTR__textures/kanji/gMsgKanji8ACETex" +static const ALIGN_ASSET(2) char gMsgKanji8ACETex[] = dgMsgKanji8ACETex; + +#define dgMsgKanji8ACFTex "__OTR__textures/kanji/gMsgKanji8ACFTex" +static const ALIGN_ASSET(2) char gMsgKanji8ACFTex[] = dgMsgKanji8ACFTex; + +#define dgMsgKanji8AD0Tex "__OTR__textures/kanji/gMsgKanji8AD0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD0Tex[] = dgMsgKanji8AD0Tex; + +#define dgMsgKanji8AD1Tex "__OTR__textures/kanji/gMsgKanji8AD1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD1Tex[] = dgMsgKanji8AD1Tex; + +#define dgMsgKanji8AD2Tex "__OTR__textures/kanji/gMsgKanji8AD2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD2Tex[] = dgMsgKanji8AD2Tex; + +#define dgMsgKanji8AD3Tex "__OTR__textures/kanji/gMsgKanji8AD3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD3Tex[] = dgMsgKanji8AD3Tex; + +#define dgMsgKanji8AD4Tex "__OTR__textures/kanji/gMsgKanji8AD4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD4Tex[] = dgMsgKanji8AD4Tex; + +#define dgMsgKanji8AD5Tex "__OTR__textures/kanji/gMsgKanji8AD5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD5Tex[] = dgMsgKanji8AD5Tex; + +#define dgMsgKanji8AD6Tex "__OTR__textures/kanji/gMsgKanji8AD6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD6Tex[] = dgMsgKanji8AD6Tex; + +#define dgMsgKanji8AD7Tex "__OTR__textures/kanji/gMsgKanji8AD7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD7Tex[] = dgMsgKanji8AD7Tex; + +#define dgMsgKanji8AD8Tex "__OTR__textures/kanji/gMsgKanji8AD8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD8Tex[] = dgMsgKanji8AD8Tex; + +#define dgMsgKanji8AD9Tex "__OTR__textures/kanji/gMsgKanji8AD9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD9Tex[] = dgMsgKanji8AD9Tex; + +#define dgMsgKanji8ADATex "__OTR__textures/kanji/gMsgKanji8ADATex" +static const ALIGN_ASSET(2) char gMsgKanji8ADATex[] = dgMsgKanji8ADATex; + +#define dgMsgKanji8ADBTex "__OTR__textures/kanji/gMsgKanji8ADBTex" +static const ALIGN_ASSET(2) char gMsgKanji8ADBTex[] = dgMsgKanji8ADBTex; + +#define dgMsgKanji8ADCTex "__OTR__textures/kanji/gMsgKanji8ADCTex" +static const ALIGN_ASSET(2) char gMsgKanji8ADCTex[] = dgMsgKanji8ADCTex; + +#define dgMsgKanji8ADDTex "__OTR__textures/kanji/gMsgKanji8ADDTex" +static const ALIGN_ASSET(2) char gMsgKanji8ADDTex[] = dgMsgKanji8ADDTex; + +#define dgMsgKanji8ADETex "__OTR__textures/kanji/gMsgKanji8ADETex" +static const ALIGN_ASSET(2) char gMsgKanji8ADETex[] = dgMsgKanji8ADETex; + +#define dgMsgKanji8ADFTex "__OTR__textures/kanji/gMsgKanji8ADFTex" +static const ALIGN_ASSET(2) char gMsgKanji8ADFTex[] = dgMsgKanji8ADFTex; + +#define dgMsgKanji8AE0Tex "__OTR__textures/kanji/gMsgKanji8AE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE0Tex[] = dgMsgKanji8AE0Tex; + +#define dgMsgKanji8AE1Tex "__OTR__textures/kanji/gMsgKanji8AE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE1Tex[] = dgMsgKanji8AE1Tex; + +#define dgMsgKanji8AE2Tex "__OTR__textures/kanji/gMsgKanji8AE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE2Tex[] = dgMsgKanji8AE2Tex; + +#define dgMsgKanji8AE3Tex "__OTR__textures/kanji/gMsgKanji8AE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE3Tex[] = dgMsgKanji8AE3Tex; + +#define dgMsgKanji8AE4Tex "__OTR__textures/kanji/gMsgKanji8AE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE4Tex[] = dgMsgKanji8AE4Tex; + +#define dgMsgKanji8AE5Tex "__OTR__textures/kanji/gMsgKanji8AE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE5Tex[] = dgMsgKanji8AE5Tex; + +#define dgMsgKanji8AE6Tex "__OTR__textures/kanji/gMsgKanji8AE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE6Tex[] = dgMsgKanji8AE6Tex; + +#define dgMsgKanji8AE7Tex "__OTR__textures/kanji/gMsgKanji8AE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE7Tex[] = dgMsgKanji8AE7Tex; + +#define dgMsgKanji8AE8Tex "__OTR__textures/kanji/gMsgKanji8AE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE8Tex[] = dgMsgKanji8AE8Tex; + +#define dgMsgKanji8AE9Tex "__OTR__textures/kanji/gMsgKanji8AE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE9Tex[] = dgMsgKanji8AE9Tex; + +#define dgMsgKanji8AEATex "__OTR__textures/kanji/gMsgKanji8AEATex" +static const ALIGN_ASSET(2) char gMsgKanji8AEATex[] = dgMsgKanji8AEATex; + +#define dgMsgKanji8AEBTex "__OTR__textures/kanji/gMsgKanji8AEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8AEBTex[] = dgMsgKanji8AEBTex; + +#define dgMsgKanji8AECTex "__OTR__textures/kanji/gMsgKanji8AECTex" +static const ALIGN_ASSET(2) char gMsgKanji8AECTex[] = dgMsgKanji8AECTex; + +#define dgMsgKanji8AEDTex "__OTR__textures/kanji/gMsgKanji8AEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8AEDTex[] = dgMsgKanji8AEDTex; + +#define dgMsgKanji8AEETex "__OTR__textures/kanji/gMsgKanji8AEETex" +static const ALIGN_ASSET(2) char gMsgKanji8AEETex[] = dgMsgKanji8AEETex; + +#define dgMsgKanji8AEFTex "__OTR__textures/kanji/gMsgKanji8AEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8AEFTex[] = dgMsgKanji8AEFTex; + +#define dgMsgKanji8AF0Tex "__OTR__textures/kanji/gMsgKanji8AF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF0Tex[] = dgMsgKanji8AF0Tex; + +#define dgMsgKanji8AF1Tex "__OTR__textures/kanji/gMsgKanji8AF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF1Tex[] = dgMsgKanji8AF1Tex; + +#define dgMsgKanji8AF2Tex "__OTR__textures/kanji/gMsgKanji8AF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF2Tex[] = dgMsgKanji8AF2Tex; + +#define dgMsgKanji8AF3Tex "__OTR__textures/kanji/gMsgKanji8AF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF3Tex[] = dgMsgKanji8AF3Tex; + +#define dgMsgKanji8AF4Tex "__OTR__textures/kanji/gMsgKanji8AF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF4Tex[] = dgMsgKanji8AF4Tex; + +#define dgMsgKanji8AF5Tex "__OTR__textures/kanji/gMsgKanji8AF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF5Tex[] = dgMsgKanji8AF5Tex; + +#define dgMsgKanji8AF6Tex "__OTR__textures/kanji/gMsgKanji8AF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF6Tex[] = dgMsgKanji8AF6Tex; + +#define dgMsgKanji8AF7Tex "__OTR__textures/kanji/gMsgKanji8AF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF7Tex[] = dgMsgKanji8AF7Tex; + +#define dgMsgKanji8AF8Tex "__OTR__textures/kanji/gMsgKanji8AF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF8Tex[] = dgMsgKanji8AF8Tex; + +#define dgMsgKanji8AF9Tex "__OTR__textures/kanji/gMsgKanji8AF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF9Tex[] = dgMsgKanji8AF9Tex; + +#define dgMsgKanji8AFATex "__OTR__textures/kanji/gMsgKanji8AFATex" +static const ALIGN_ASSET(2) char gMsgKanji8AFATex[] = dgMsgKanji8AFATex; + +#define dgMsgKanji8AFBTex "__OTR__textures/kanji/gMsgKanji8AFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8AFBTex[] = dgMsgKanji8AFBTex; + +#define dgMsgKanji8AFCTex "__OTR__textures/kanji/gMsgKanji8AFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8AFCTex[] = dgMsgKanji8AFCTex; + +#define dgMsgKanji8B40Tex "__OTR__textures/kanji/gMsgKanji8B40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B40Tex[] = dgMsgKanji8B40Tex; + +#define dgMsgKanji8B41Tex "__OTR__textures/kanji/gMsgKanji8B41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B41Tex[] = dgMsgKanji8B41Tex; + +#define dgMsgKanji8B42Tex "__OTR__textures/kanji/gMsgKanji8B42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B42Tex[] = dgMsgKanji8B42Tex; + +#define dgMsgKanji8B43Tex "__OTR__textures/kanji/gMsgKanji8B43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B43Tex[] = dgMsgKanji8B43Tex; + +#define dgMsgKanji8B44Tex "__OTR__textures/kanji/gMsgKanji8B44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B44Tex[] = dgMsgKanji8B44Tex; + +#define dgMsgKanji8B45Tex "__OTR__textures/kanji/gMsgKanji8B45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B45Tex[] = dgMsgKanji8B45Tex; + +#define dgMsgKanji8B46Tex "__OTR__textures/kanji/gMsgKanji8B46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B46Tex[] = dgMsgKanji8B46Tex; + +#define dgMsgKanji8B47Tex "__OTR__textures/kanji/gMsgKanji8B47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B47Tex[] = dgMsgKanji8B47Tex; + +#define dgMsgKanji8B48Tex "__OTR__textures/kanji/gMsgKanji8B48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B48Tex[] = dgMsgKanji8B48Tex; + +#define dgMsgKanji8B49Tex "__OTR__textures/kanji/gMsgKanji8B49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B49Tex[] = dgMsgKanji8B49Tex; + +#define dgMsgKanji8B4ATex "__OTR__textures/kanji/gMsgKanji8B4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B4ATex[] = dgMsgKanji8B4ATex; + +#define dgMsgKanji8B4BTex "__OTR__textures/kanji/gMsgKanji8B4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B4BTex[] = dgMsgKanji8B4BTex; + +#define dgMsgKanji8B4CTex "__OTR__textures/kanji/gMsgKanji8B4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B4CTex[] = dgMsgKanji8B4CTex; + +#define dgMsgKanji8B4DTex "__OTR__textures/kanji/gMsgKanji8B4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B4DTex[] = dgMsgKanji8B4DTex; + +#define dgMsgKanji8B4ETex "__OTR__textures/kanji/gMsgKanji8B4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B4ETex[] = dgMsgKanji8B4ETex; + +#define dgMsgKanji8B4FTex "__OTR__textures/kanji/gMsgKanji8B4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8B4FTex[] = dgMsgKanji8B4FTex; + +#define dgMsgKanji8B50Tex "__OTR__textures/kanji/gMsgKanji8B50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B50Tex[] = dgMsgKanji8B50Tex; + +#define dgMsgKanji8B51Tex "__OTR__textures/kanji/gMsgKanji8B51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B51Tex[] = dgMsgKanji8B51Tex; + +#define dgMsgKanji8B52Tex "__OTR__textures/kanji/gMsgKanji8B52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B52Tex[] = dgMsgKanji8B52Tex; + +#define dgMsgKanji8B53Tex "__OTR__textures/kanji/gMsgKanji8B53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B53Tex[] = dgMsgKanji8B53Tex; + +#define dgMsgKanji8B54Tex "__OTR__textures/kanji/gMsgKanji8B54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B54Tex[] = dgMsgKanji8B54Tex; + +#define dgMsgKanji8B55Tex "__OTR__textures/kanji/gMsgKanji8B55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B55Tex[] = dgMsgKanji8B55Tex; + +#define dgMsgKanji8B56Tex "__OTR__textures/kanji/gMsgKanji8B56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B56Tex[] = dgMsgKanji8B56Tex; + +#define dgMsgKanji8B57Tex "__OTR__textures/kanji/gMsgKanji8B57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B57Tex[] = dgMsgKanji8B57Tex; + +#define dgMsgKanji8B58Tex "__OTR__textures/kanji/gMsgKanji8B58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B58Tex[] = dgMsgKanji8B58Tex; + +#define dgMsgKanji8B59Tex "__OTR__textures/kanji/gMsgKanji8B59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B59Tex[] = dgMsgKanji8B59Tex; + +#define dgMsgKanji8B5ATex "__OTR__textures/kanji/gMsgKanji8B5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B5ATex[] = dgMsgKanji8B5ATex; + +#define dgMsgKanji8B5BTex "__OTR__textures/kanji/gMsgKanji8B5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B5BTex[] = dgMsgKanji8B5BTex; + +#define dgMsgKanji8B5CTex "__OTR__textures/kanji/gMsgKanji8B5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B5CTex[] = dgMsgKanji8B5CTex; + +#define dgMsgKanji8B5DTex "__OTR__textures/kanji/gMsgKanji8B5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B5DTex[] = dgMsgKanji8B5DTex; + +#define dgMsgKanji8B5ETex "__OTR__textures/kanji/gMsgKanji8B5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B5ETex[] = dgMsgKanji8B5ETex; + +#define dgMsgKanji8B5FTex "__OTR__textures/kanji/gMsgKanji8B5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8B5FTex[] = dgMsgKanji8B5FTex; + +#define dgMsgKanji8B60Tex "__OTR__textures/kanji/gMsgKanji8B60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B60Tex[] = dgMsgKanji8B60Tex; + +#define dgMsgKanji8B61Tex "__OTR__textures/kanji/gMsgKanji8B61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B61Tex[] = dgMsgKanji8B61Tex; + +#define dgMsgKanji8B62Tex "__OTR__textures/kanji/gMsgKanji8B62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B62Tex[] = dgMsgKanji8B62Tex; + +#define dgMsgKanji8B63Tex "__OTR__textures/kanji/gMsgKanji8B63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B63Tex[] = dgMsgKanji8B63Tex; + +#define dgMsgKanji8B64Tex "__OTR__textures/kanji/gMsgKanji8B64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B64Tex[] = dgMsgKanji8B64Tex; + +#define dgMsgKanji8B65Tex "__OTR__textures/kanji/gMsgKanji8B65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B65Tex[] = dgMsgKanji8B65Tex; + +#define dgMsgKanji8B66Tex "__OTR__textures/kanji/gMsgKanji8B66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B66Tex[] = dgMsgKanji8B66Tex; + +#define dgMsgKanji8B67Tex "__OTR__textures/kanji/gMsgKanji8B67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B67Tex[] = dgMsgKanji8B67Tex; + +#define dgMsgKanji8B68Tex "__OTR__textures/kanji/gMsgKanji8B68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B68Tex[] = dgMsgKanji8B68Tex; + +#define dgMsgKanji8B69Tex "__OTR__textures/kanji/gMsgKanji8B69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B69Tex[] = dgMsgKanji8B69Tex; + +#define dgMsgKanji8B6ATex "__OTR__textures/kanji/gMsgKanji8B6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B6ATex[] = dgMsgKanji8B6ATex; + +#define dgMsgKanji8B6BTex "__OTR__textures/kanji/gMsgKanji8B6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B6BTex[] = dgMsgKanji8B6BTex; + +#define dgMsgKanji8B6CTex "__OTR__textures/kanji/gMsgKanji8B6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B6CTex[] = dgMsgKanji8B6CTex; + +#define dgMsgKanji8B6DTex "__OTR__textures/kanji/gMsgKanji8B6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B6DTex[] = dgMsgKanji8B6DTex; + +#define dgMsgKanji8B6ETex "__OTR__textures/kanji/gMsgKanji8B6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B6ETex[] = dgMsgKanji8B6ETex; + +#define dgMsgKanji8B6FTex "__OTR__textures/kanji/gMsgKanji8B6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8B6FTex[] = dgMsgKanji8B6FTex; + +#define dgMsgKanji8B70Tex "__OTR__textures/kanji/gMsgKanji8B70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B70Tex[] = dgMsgKanji8B70Tex; + +#define dgMsgKanji8B71Tex "__OTR__textures/kanji/gMsgKanji8B71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B71Tex[] = dgMsgKanji8B71Tex; + +#define dgMsgKanji8B72Tex "__OTR__textures/kanji/gMsgKanji8B72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B72Tex[] = dgMsgKanji8B72Tex; + +#define dgMsgKanji8B73Tex "__OTR__textures/kanji/gMsgKanji8B73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B73Tex[] = dgMsgKanji8B73Tex; + +#define dgMsgKanji8B74Tex "__OTR__textures/kanji/gMsgKanji8B74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B74Tex[] = dgMsgKanji8B74Tex; + +#define dgMsgKanji8B75Tex "__OTR__textures/kanji/gMsgKanji8B75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B75Tex[] = dgMsgKanji8B75Tex; + +#define dgMsgKanji8B76Tex "__OTR__textures/kanji/gMsgKanji8B76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B76Tex[] = dgMsgKanji8B76Tex; + +#define dgMsgKanji8B77Tex "__OTR__textures/kanji/gMsgKanji8B77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B77Tex[] = dgMsgKanji8B77Tex; + +#define dgMsgKanji8B78Tex "__OTR__textures/kanji/gMsgKanji8B78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B78Tex[] = dgMsgKanji8B78Tex; + +#define dgMsgKanji8B79Tex "__OTR__textures/kanji/gMsgKanji8B79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B79Tex[] = dgMsgKanji8B79Tex; + +#define dgMsgKanji8B7ATex "__OTR__textures/kanji/gMsgKanji8B7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B7ATex[] = dgMsgKanji8B7ATex; + +#define dgMsgKanji8B7BTex "__OTR__textures/kanji/gMsgKanji8B7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B7BTex[] = dgMsgKanji8B7BTex; + +#define dgMsgKanji8B7CTex "__OTR__textures/kanji/gMsgKanji8B7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B7CTex[] = dgMsgKanji8B7CTex; + +#define dgMsgKanji8B7DTex "__OTR__textures/kanji/gMsgKanji8B7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B7DTex[] = dgMsgKanji8B7DTex; + +#define dgMsgKanji8B7ETex "__OTR__textures/kanji/gMsgKanji8B7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B7ETex[] = dgMsgKanji8B7ETex; + +#define dgMsgKanji8B80Tex "__OTR__textures/kanji/gMsgKanji8B80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B80Tex[] = dgMsgKanji8B80Tex; + +#define dgMsgKanji8B81Tex "__OTR__textures/kanji/gMsgKanji8B81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B81Tex[] = dgMsgKanji8B81Tex; + +#define dgMsgKanji8B82Tex "__OTR__textures/kanji/gMsgKanji8B82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B82Tex[] = dgMsgKanji8B82Tex; + +#define dgMsgKanji8B83Tex "__OTR__textures/kanji/gMsgKanji8B83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B83Tex[] = dgMsgKanji8B83Tex; + +#define dgMsgKanji8B84Tex "__OTR__textures/kanji/gMsgKanji8B84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B84Tex[] = dgMsgKanji8B84Tex; + +#define dgMsgKanji8B85Tex "__OTR__textures/kanji/gMsgKanji8B85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B85Tex[] = dgMsgKanji8B85Tex; + +#define dgMsgKanji8B86Tex "__OTR__textures/kanji/gMsgKanji8B86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B86Tex[] = dgMsgKanji8B86Tex; + +#define dgMsgKanji8B87Tex "__OTR__textures/kanji/gMsgKanji8B87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B87Tex[] = dgMsgKanji8B87Tex; + +#define dgMsgKanji8B88Tex "__OTR__textures/kanji/gMsgKanji8B88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B88Tex[] = dgMsgKanji8B88Tex; + +#define dgMsgKanji8B89Tex "__OTR__textures/kanji/gMsgKanji8B89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B89Tex[] = dgMsgKanji8B89Tex; + +#define dgMsgKanji8B8ATex "__OTR__textures/kanji/gMsgKanji8B8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B8ATex[] = dgMsgKanji8B8ATex; + +#define dgMsgKanji8B8BTex "__OTR__textures/kanji/gMsgKanji8B8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B8BTex[] = dgMsgKanji8B8BTex; + +#define dgMsgKanji8B8CTex "__OTR__textures/kanji/gMsgKanji8B8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B8CTex[] = dgMsgKanji8B8CTex; + +#define dgMsgKanji8B8DTex "__OTR__textures/kanji/gMsgKanji8B8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B8DTex[] = dgMsgKanji8B8DTex; + +#define dgMsgKanji8B8ETex "__OTR__textures/kanji/gMsgKanji8B8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B8ETex[] = dgMsgKanji8B8ETex; + +#define dgMsgKanji8B8FTex "__OTR__textures/kanji/gMsgKanji8B8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8B8FTex[] = dgMsgKanji8B8FTex; + +#define dgMsgKanji8B90Tex "__OTR__textures/kanji/gMsgKanji8B90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B90Tex[] = dgMsgKanji8B90Tex; + +#define dgMsgKanji8B91Tex "__OTR__textures/kanji/gMsgKanji8B91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B91Tex[] = dgMsgKanji8B91Tex; + +#define dgMsgKanji8B92Tex "__OTR__textures/kanji/gMsgKanji8B92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B92Tex[] = dgMsgKanji8B92Tex; + +#define dgMsgKanji8B93Tex "__OTR__textures/kanji/gMsgKanji8B93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B93Tex[] = dgMsgKanji8B93Tex; + +#define dgMsgKanji8B94Tex "__OTR__textures/kanji/gMsgKanji8B94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B94Tex[] = dgMsgKanji8B94Tex; + +#define dgMsgKanji8B95Tex "__OTR__textures/kanji/gMsgKanji8B95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B95Tex[] = dgMsgKanji8B95Tex; + +#define dgMsgKanji8B96Tex "__OTR__textures/kanji/gMsgKanji8B96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B96Tex[] = dgMsgKanji8B96Tex; + +#define dgMsgKanji8B97Tex "__OTR__textures/kanji/gMsgKanji8B97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B97Tex[] = dgMsgKanji8B97Tex; + +#define dgMsgKanji8B98Tex "__OTR__textures/kanji/gMsgKanji8B98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B98Tex[] = dgMsgKanji8B98Tex; + +#define dgMsgKanji8B99Tex "__OTR__textures/kanji/gMsgKanji8B99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B99Tex[] = dgMsgKanji8B99Tex; + +#define dgMsgKanji8B9ATex "__OTR__textures/kanji/gMsgKanji8B9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B9ATex[] = dgMsgKanji8B9ATex; + +#define dgMsgKanji8B9BTex "__OTR__textures/kanji/gMsgKanji8B9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B9BTex[] = dgMsgKanji8B9BTex; + +#define dgMsgKanji8B9CTex "__OTR__textures/kanji/gMsgKanji8B9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B9CTex[] = dgMsgKanji8B9CTex; + +#define dgMsgKanji8B9DTex "__OTR__textures/kanji/gMsgKanji8B9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B9DTex[] = dgMsgKanji8B9DTex; + +#define dgMsgKanji8B9ETex "__OTR__textures/kanji/gMsgKanji8B9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B9ETex[] = dgMsgKanji8B9ETex; + +#define dgMsgKanji8B9FTex "__OTR__textures/kanji/gMsgKanji8B9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8B9FTex[] = dgMsgKanji8B9FTex; + +#define dgMsgKanji8BA0Tex "__OTR__textures/kanji/gMsgKanji8BA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA0Tex[] = dgMsgKanji8BA0Tex; + +#define dgMsgKanji8BA1Tex "__OTR__textures/kanji/gMsgKanji8BA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA1Tex[] = dgMsgKanji8BA1Tex; + +#define dgMsgKanji8BA2Tex "__OTR__textures/kanji/gMsgKanji8BA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA2Tex[] = dgMsgKanji8BA2Tex; + +#define dgMsgKanji8BA3Tex "__OTR__textures/kanji/gMsgKanji8BA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA3Tex[] = dgMsgKanji8BA3Tex; + +#define dgMsgKanji8BA4Tex "__OTR__textures/kanji/gMsgKanji8BA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA4Tex[] = dgMsgKanji8BA4Tex; + +#define dgMsgKanji8BA5Tex "__OTR__textures/kanji/gMsgKanji8BA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA5Tex[] = dgMsgKanji8BA5Tex; + +#define dgMsgKanji8BA6Tex "__OTR__textures/kanji/gMsgKanji8BA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA6Tex[] = dgMsgKanji8BA6Tex; + +#define dgMsgKanji8BA7Tex "__OTR__textures/kanji/gMsgKanji8BA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA7Tex[] = dgMsgKanji8BA7Tex; + +#define dgMsgKanji8BA8Tex "__OTR__textures/kanji/gMsgKanji8BA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA8Tex[] = dgMsgKanji8BA8Tex; + +#define dgMsgKanji8BA9Tex "__OTR__textures/kanji/gMsgKanji8BA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA9Tex[] = dgMsgKanji8BA9Tex; + +#define dgMsgKanji8BAATex "__OTR__textures/kanji/gMsgKanji8BAATex" +static const ALIGN_ASSET(2) char gMsgKanji8BAATex[] = dgMsgKanji8BAATex; + +#define dgMsgKanji8BABTex "__OTR__textures/kanji/gMsgKanji8BABTex" +static const ALIGN_ASSET(2) char gMsgKanji8BABTex[] = dgMsgKanji8BABTex; + +#define dgMsgKanji8BACTex "__OTR__textures/kanji/gMsgKanji8BACTex" +static const ALIGN_ASSET(2) char gMsgKanji8BACTex[] = dgMsgKanji8BACTex; + +#define dgMsgKanji8BADTex "__OTR__textures/kanji/gMsgKanji8BADTex" +static const ALIGN_ASSET(2) char gMsgKanji8BADTex[] = dgMsgKanji8BADTex; + +#define dgMsgKanji8BAETex "__OTR__textures/kanji/gMsgKanji8BAETex" +static const ALIGN_ASSET(2) char gMsgKanji8BAETex[] = dgMsgKanji8BAETex; + +#define dgMsgKanji8BAFTex "__OTR__textures/kanji/gMsgKanji8BAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8BAFTex[] = dgMsgKanji8BAFTex; + +#define dgMsgKanji8BB0Tex "__OTR__textures/kanji/gMsgKanji8BB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB0Tex[] = dgMsgKanji8BB0Tex; + +#define dgMsgKanji8BB1Tex "__OTR__textures/kanji/gMsgKanji8BB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB1Tex[] = dgMsgKanji8BB1Tex; + +#define dgMsgKanji8BB2Tex "__OTR__textures/kanji/gMsgKanji8BB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB2Tex[] = dgMsgKanji8BB2Tex; + +#define dgMsgKanji8BB3Tex "__OTR__textures/kanji/gMsgKanji8BB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB3Tex[] = dgMsgKanji8BB3Tex; + +#define dgMsgKanji8BB4Tex "__OTR__textures/kanji/gMsgKanji8BB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB4Tex[] = dgMsgKanji8BB4Tex; + +#define dgMsgKanji8BB5Tex "__OTR__textures/kanji/gMsgKanji8BB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB5Tex[] = dgMsgKanji8BB5Tex; + +#define dgMsgKanji8BB6Tex "__OTR__textures/kanji/gMsgKanji8BB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB6Tex[] = dgMsgKanji8BB6Tex; + +#define dgMsgKanji8BB7Tex "__OTR__textures/kanji/gMsgKanji8BB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB7Tex[] = dgMsgKanji8BB7Tex; + +#define dgMsgKanji8BB8Tex "__OTR__textures/kanji/gMsgKanji8BB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB8Tex[] = dgMsgKanji8BB8Tex; + +#define dgMsgKanji8BB9Tex "__OTR__textures/kanji/gMsgKanji8BB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB9Tex[] = dgMsgKanji8BB9Tex; + +#define dgMsgKanji8BBATex "__OTR__textures/kanji/gMsgKanji8BBATex" +static const ALIGN_ASSET(2) char gMsgKanji8BBATex[] = dgMsgKanji8BBATex; + +#define dgMsgKanji8BBBTex "__OTR__textures/kanji/gMsgKanji8BBBTex" +static const ALIGN_ASSET(2) char gMsgKanji8BBBTex[] = dgMsgKanji8BBBTex; + +#define dgMsgKanji8BBCTex "__OTR__textures/kanji/gMsgKanji8BBCTex" +static const ALIGN_ASSET(2) char gMsgKanji8BBCTex[] = dgMsgKanji8BBCTex; + +#define dgMsgKanji8BBDTex "__OTR__textures/kanji/gMsgKanji8BBDTex" +static const ALIGN_ASSET(2) char gMsgKanji8BBDTex[] = dgMsgKanji8BBDTex; + +#define dgMsgKanji8BBETex "__OTR__textures/kanji/gMsgKanji8BBETex" +static const ALIGN_ASSET(2) char gMsgKanji8BBETex[] = dgMsgKanji8BBETex; + +#define dgMsgKanji8BBFTex "__OTR__textures/kanji/gMsgKanji8BBFTex" +static const ALIGN_ASSET(2) char gMsgKanji8BBFTex[] = dgMsgKanji8BBFTex; + +#define dgMsgKanji8BC0Tex "__OTR__textures/kanji/gMsgKanji8BC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC0Tex[] = dgMsgKanji8BC0Tex; + +#define dgMsgKanji8BC1Tex "__OTR__textures/kanji/gMsgKanji8BC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC1Tex[] = dgMsgKanji8BC1Tex; + +#define dgMsgKanji8BC2Tex "__OTR__textures/kanji/gMsgKanji8BC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC2Tex[] = dgMsgKanji8BC2Tex; + +#define dgMsgKanji8BC3Tex "__OTR__textures/kanji/gMsgKanji8BC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC3Tex[] = dgMsgKanji8BC3Tex; + +#define dgMsgKanji8BC4Tex "__OTR__textures/kanji/gMsgKanji8BC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC4Tex[] = dgMsgKanji8BC4Tex; + +#define dgMsgKanji8BC5Tex "__OTR__textures/kanji/gMsgKanji8BC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC5Tex[] = dgMsgKanji8BC5Tex; + +#define dgMsgKanji8BC6Tex "__OTR__textures/kanji/gMsgKanji8BC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC6Tex[] = dgMsgKanji8BC6Tex; + +#define dgMsgKanji8BC7Tex "__OTR__textures/kanji/gMsgKanji8BC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC7Tex[] = dgMsgKanji8BC7Tex; + +#define dgMsgKanji8BC8Tex "__OTR__textures/kanji/gMsgKanji8BC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC8Tex[] = dgMsgKanji8BC8Tex; + +#define dgMsgKanji8BC9Tex "__OTR__textures/kanji/gMsgKanji8BC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC9Tex[] = dgMsgKanji8BC9Tex; + +#define dgMsgKanji8BCATex "__OTR__textures/kanji/gMsgKanji8BCATex" +static const ALIGN_ASSET(2) char gMsgKanji8BCATex[] = dgMsgKanji8BCATex; + +#define dgMsgKanji8BCBTex "__OTR__textures/kanji/gMsgKanji8BCBTex" +static const ALIGN_ASSET(2) char gMsgKanji8BCBTex[] = dgMsgKanji8BCBTex; + +#define dgMsgKanji8BCCTex "__OTR__textures/kanji/gMsgKanji8BCCTex" +static const ALIGN_ASSET(2) char gMsgKanji8BCCTex[] = dgMsgKanji8BCCTex; + +#define dgMsgKanji8BCDTex "__OTR__textures/kanji/gMsgKanji8BCDTex" +static const ALIGN_ASSET(2) char gMsgKanji8BCDTex[] = dgMsgKanji8BCDTex; + +#define dgMsgKanji8BCETex "__OTR__textures/kanji/gMsgKanji8BCETex" +static const ALIGN_ASSET(2) char gMsgKanji8BCETex[] = dgMsgKanji8BCETex; + +#define dgMsgKanji8BCFTex "__OTR__textures/kanji/gMsgKanji8BCFTex" +static const ALIGN_ASSET(2) char gMsgKanji8BCFTex[] = dgMsgKanji8BCFTex; + +#define dgMsgKanji8BD0Tex "__OTR__textures/kanji/gMsgKanji8BD0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD0Tex[] = dgMsgKanji8BD0Tex; + +#define dgMsgKanji8BD1Tex "__OTR__textures/kanji/gMsgKanji8BD1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD1Tex[] = dgMsgKanji8BD1Tex; + +#define dgMsgKanji8BD2Tex "__OTR__textures/kanji/gMsgKanji8BD2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD2Tex[] = dgMsgKanji8BD2Tex; + +#define dgMsgKanji8BD3Tex "__OTR__textures/kanji/gMsgKanji8BD3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD3Tex[] = dgMsgKanji8BD3Tex; + +#define dgMsgKanji8BD4Tex "__OTR__textures/kanji/gMsgKanji8BD4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD4Tex[] = dgMsgKanji8BD4Tex; + +#define dgMsgKanji8BD5Tex "__OTR__textures/kanji/gMsgKanji8BD5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD5Tex[] = dgMsgKanji8BD5Tex; + +#define dgMsgKanji8BD6Tex "__OTR__textures/kanji/gMsgKanji8BD6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD6Tex[] = dgMsgKanji8BD6Tex; + +#define dgMsgKanji8BD7Tex "__OTR__textures/kanji/gMsgKanji8BD7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD7Tex[] = dgMsgKanji8BD7Tex; + +#define dgMsgKanji8BD8Tex "__OTR__textures/kanji/gMsgKanji8BD8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD8Tex[] = dgMsgKanji8BD8Tex; + +#define dgMsgKanji8BD9Tex "__OTR__textures/kanji/gMsgKanji8BD9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD9Tex[] = dgMsgKanji8BD9Tex; + +#define dgMsgKanji8BDATex "__OTR__textures/kanji/gMsgKanji8BDATex" +static const ALIGN_ASSET(2) char gMsgKanji8BDATex[] = dgMsgKanji8BDATex; + +#define dgMsgKanji8BDBTex "__OTR__textures/kanji/gMsgKanji8BDBTex" +static const ALIGN_ASSET(2) char gMsgKanji8BDBTex[] = dgMsgKanji8BDBTex; + +#define dgMsgKanji8BDCTex "__OTR__textures/kanji/gMsgKanji8BDCTex" +static const ALIGN_ASSET(2) char gMsgKanji8BDCTex[] = dgMsgKanji8BDCTex; + +#define dgMsgKanji8BDDTex "__OTR__textures/kanji/gMsgKanji8BDDTex" +static const ALIGN_ASSET(2) char gMsgKanji8BDDTex[] = dgMsgKanji8BDDTex; + +#define dgMsgKanji8BDETex "__OTR__textures/kanji/gMsgKanji8BDETex" +static const ALIGN_ASSET(2) char gMsgKanji8BDETex[] = dgMsgKanji8BDETex; + +#define dgMsgKanji8BDFTex "__OTR__textures/kanji/gMsgKanji8BDFTex" +static const ALIGN_ASSET(2) char gMsgKanji8BDFTex[] = dgMsgKanji8BDFTex; + +#define dgMsgKanji8BE0Tex "__OTR__textures/kanji/gMsgKanji8BE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE0Tex[] = dgMsgKanji8BE0Tex; + +#define dgMsgKanji8BE1Tex "__OTR__textures/kanji/gMsgKanji8BE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE1Tex[] = dgMsgKanji8BE1Tex; + +#define dgMsgKanji8BE2Tex "__OTR__textures/kanji/gMsgKanji8BE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE2Tex[] = dgMsgKanji8BE2Tex; + +#define dgMsgKanji8BE3Tex "__OTR__textures/kanji/gMsgKanji8BE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE3Tex[] = dgMsgKanji8BE3Tex; + +#define dgMsgKanji8BE4Tex "__OTR__textures/kanji/gMsgKanji8BE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE4Tex[] = dgMsgKanji8BE4Tex; + +#define dgMsgKanji8BE5Tex "__OTR__textures/kanji/gMsgKanji8BE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE5Tex[] = dgMsgKanji8BE5Tex; + +#define dgMsgKanji8BE6Tex "__OTR__textures/kanji/gMsgKanji8BE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE6Tex[] = dgMsgKanji8BE6Tex; + +#define dgMsgKanji8BE7Tex "__OTR__textures/kanji/gMsgKanji8BE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE7Tex[] = dgMsgKanji8BE7Tex; + +#define dgMsgKanji8BE8Tex "__OTR__textures/kanji/gMsgKanji8BE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE8Tex[] = dgMsgKanji8BE8Tex; + +#define dgMsgKanji8BE9Tex "__OTR__textures/kanji/gMsgKanji8BE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE9Tex[] = dgMsgKanji8BE9Tex; + +#define dgMsgKanji8BEATex "__OTR__textures/kanji/gMsgKanji8BEATex" +static const ALIGN_ASSET(2) char gMsgKanji8BEATex[] = dgMsgKanji8BEATex; + +#define dgMsgKanji8BEBTex "__OTR__textures/kanji/gMsgKanji8BEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8BEBTex[] = dgMsgKanji8BEBTex; + +#define dgMsgKanji8BECTex "__OTR__textures/kanji/gMsgKanji8BECTex" +static const ALIGN_ASSET(2) char gMsgKanji8BECTex[] = dgMsgKanji8BECTex; + +#define dgMsgKanji8BEDTex "__OTR__textures/kanji/gMsgKanji8BEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8BEDTex[] = dgMsgKanji8BEDTex; + +#define dgMsgKanji8BEETex "__OTR__textures/kanji/gMsgKanji8BEETex" +static const ALIGN_ASSET(2) char gMsgKanji8BEETex[] = dgMsgKanji8BEETex; + +#define dgMsgKanji8BEFTex "__OTR__textures/kanji/gMsgKanji8BEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8BEFTex[] = dgMsgKanji8BEFTex; + +#define dgMsgKanji8BF0Tex "__OTR__textures/kanji/gMsgKanji8BF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF0Tex[] = dgMsgKanji8BF0Tex; + +#define dgMsgKanji8BF1Tex "__OTR__textures/kanji/gMsgKanji8BF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF1Tex[] = dgMsgKanji8BF1Tex; + +#define dgMsgKanji8BF2Tex "__OTR__textures/kanji/gMsgKanji8BF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF2Tex[] = dgMsgKanji8BF2Tex; + +#define dgMsgKanji8BF3Tex "__OTR__textures/kanji/gMsgKanji8BF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF3Tex[] = dgMsgKanji8BF3Tex; + +#define dgMsgKanji8BF4Tex "__OTR__textures/kanji/gMsgKanji8BF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF4Tex[] = dgMsgKanji8BF4Tex; + +#define dgMsgKanji8BF5Tex "__OTR__textures/kanji/gMsgKanji8BF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF5Tex[] = dgMsgKanji8BF5Tex; + +#define dgMsgKanji8BF6Tex "__OTR__textures/kanji/gMsgKanji8BF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF6Tex[] = dgMsgKanji8BF6Tex; + +#define dgMsgKanji8BF7Tex "__OTR__textures/kanji/gMsgKanji8BF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF7Tex[] = dgMsgKanji8BF7Tex; + +#define dgMsgKanji8BF8Tex "__OTR__textures/kanji/gMsgKanji8BF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF8Tex[] = dgMsgKanji8BF8Tex; + +#define dgMsgKanji8BF9Tex "__OTR__textures/kanji/gMsgKanji8BF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF9Tex[] = dgMsgKanji8BF9Tex; + +#define dgMsgKanji8BFATex "__OTR__textures/kanji/gMsgKanji8BFATex" +static const ALIGN_ASSET(2) char gMsgKanji8BFATex[] = dgMsgKanji8BFATex; + +#define dgMsgKanji8BFBTex "__OTR__textures/kanji/gMsgKanji8BFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8BFBTex[] = dgMsgKanji8BFBTex; + +#define dgMsgKanji8BFCTex "__OTR__textures/kanji/gMsgKanji8BFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8BFCTex[] = dgMsgKanji8BFCTex; + +#define dgMsgKanji8C40Tex "__OTR__textures/kanji/gMsgKanji8C40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C40Tex[] = dgMsgKanji8C40Tex; + +#define dgMsgKanji8C41Tex "__OTR__textures/kanji/gMsgKanji8C41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C41Tex[] = dgMsgKanji8C41Tex; + +#define dgMsgKanji8C42Tex "__OTR__textures/kanji/gMsgKanji8C42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C42Tex[] = dgMsgKanji8C42Tex; + +#define dgMsgKanji8C43Tex "__OTR__textures/kanji/gMsgKanji8C43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C43Tex[] = dgMsgKanji8C43Tex; + +#define dgMsgKanji8C44Tex "__OTR__textures/kanji/gMsgKanji8C44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C44Tex[] = dgMsgKanji8C44Tex; + +#define dgMsgKanji8C45Tex "__OTR__textures/kanji/gMsgKanji8C45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C45Tex[] = dgMsgKanji8C45Tex; + +#define dgMsgKanji8C46Tex "__OTR__textures/kanji/gMsgKanji8C46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C46Tex[] = dgMsgKanji8C46Tex; + +#define dgMsgKanji8C47Tex "__OTR__textures/kanji/gMsgKanji8C47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C47Tex[] = dgMsgKanji8C47Tex; + +#define dgMsgKanji8C48Tex "__OTR__textures/kanji/gMsgKanji8C48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C48Tex[] = dgMsgKanji8C48Tex; + +#define dgMsgKanji8C49Tex "__OTR__textures/kanji/gMsgKanji8C49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C49Tex[] = dgMsgKanji8C49Tex; + +#define dgMsgKanji8C4ATex "__OTR__textures/kanji/gMsgKanji8C4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C4ATex[] = dgMsgKanji8C4ATex; + +#define dgMsgKanji8C4BTex "__OTR__textures/kanji/gMsgKanji8C4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C4BTex[] = dgMsgKanji8C4BTex; + +#define dgMsgKanji8C4CTex "__OTR__textures/kanji/gMsgKanji8C4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C4CTex[] = dgMsgKanji8C4CTex; + +#define dgMsgKanji8C4DTex "__OTR__textures/kanji/gMsgKanji8C4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C4DTex[] = dgMsgKanji8C4DTex; + +#define dgMsgKanji8C4ETex "__OTR__textures/kanji/gMsgKanji8C4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C4ETex[] = dgMsgKanji8C4ETex; + +#define dgMsgKanji8C4FTex "__OTR__textures/kanji/gMsgKanji8C4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8C4FTex[] = dgMsgKanji8C4FTex; + +#define dgMsgKanji8C50Tex "__OTR__textures/kanji/gMsgKanji8C50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C50Tex[] = dgMsgKanji8C50Tex; + +#define dgMsgKanji8C51Tex "__OTR__textures/kanji/gMsgKanji8C51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C51Tex[] = dgMsgKanji8C51Tex; + +#define dgMsgKanji8C52Tex "__OTR__textures/kanji/gMsgKanji8C52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C52Tex[] = dgMsgKanji8C52Tex; + +#define dgMsgKanji8C53Tex "__OTR__textures/kanji/gMsgKanji8C53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C53Tex[] = dgMsgKanji8C53Tex; + +#define dgMsgKanji8C54Tex "__OTR__textures/kanji/gMsgKanji8C54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C54Tex[] = dgMsgKanji8C54Tex; + +#define dgMsgKanji8C55Tex "__OTR__textures/kanji/gMsgKanji8C55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C55Tex[] = dgMsgKanji8C55Tex; + +#define dgMsgKanji8C56Tex "__OTR__textures/kanji/gMsgKanji8C56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C56Tex[] = dgMsgKanji8C56Tex; + +#define dgMsgKanji8C57Tex "__OTR__textures/kanji/gMsgKanji8C57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C57Tex[] = dgMsgKanji8C57Tex; + +#define dgMsgKanji8C58Tex "__OTR__textures/kanji/gMsgKanji8C58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C58Tex[] = dgMsgKanji8C58Tex; + +#define dgMsgKanji8C59Tex "__OTR__textures/kanji/gMsgKanji8C59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C59Tex[] = dgMsgKanji8C59Tex; + +#define dgMsgKanji8C5ATex "__OTR__textures/kanji/gMsgKanji8C5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C5ATex[] = dgMsgKanji8C5ATex; + +#define dgMsgKanji8C5BTex "__OTR__textures/kanji/gMsgKanji8C5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C5BTex[] = dgMsgKanji8C5BTex; + +#define dgMsgKanji8C5CTex "__OTR__textures/kanji/gMsgKanji8C5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C5CTex[] = dgMsgKanji8C5CTex; + +#define dgMsgKanji8C5DTex "__OTR__textures/kanji/gMsgKanji8C5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C5DTex[] = dgMsgKanji8C5DTex; + +#define dgMsgKanji8C5ETex "__OTR__textures/kanji/gMsgKanji8C5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C5ETex[] = dgMsgKanji8C5ETex; + +#define dgMsgKanji8C5FTex "__OTR__textures/kanji/gMsgKanji8C5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8C5FTex[] = dgMsgKanji8C5FTex; + +#define dgMsgKanji8C60Tex "__OTR__textures/kanji/gMsgKanji8C60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C60Tex[] = dgMsgKanji8C60Tex; + +#define dgMsgKanji8C61Tex "__OTR__textures/kanji/gMsgKanji8C61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C61Tex[] = dgMsgKanji8C61Tex; + +#define dgMsgKanji8C62Tex "__OTR__textures/kanji/gMsgKanji8C62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C62Tex[] = dgMsgKanji8C62Tex; + +#define dgMsgKanji8C63Tex "__OTR__textures/kanji/gMsgKanji8C63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C63Tex[] = dgMsgKanji8C63Tex; + +#define dgMsgKanji8C64Tex "__OTR__textures/kanji/gMsgKanji8C64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C64Tex[] = dgMsgKanji8C64Tex; + +#define dgMsgKanji8C65Tex "__OTR__textures/kanji/gMsgKanji8C65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C65Tex[] = dgMsgKanji8C65Tex; + +#define dgMsgKanji8C66Tex "__OTR__textures/kanji/gMsgKanji8C66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C66Tex[] = dgMsgKanji8C66Tex; + +#define dgMsgKanji8C67Tex "__OTR__textures/kanji/gMsgKanji8C67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C67Tex[] = dgMsgKanji8C67Tex; + +#define dgMsgKanji8C68Tex "__OTR__textures/kanji/gMsgKanji8C68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C68Tex[] = dgMsgKanji8C68Tex; + +#define dgMsgKanji8C69Tex "__OTR__textures/kanji/gMsgKanji8C69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C69Tex[] = dgMsgKanji8C69Tex; + +#define dgMsgKanji8C6ATex "__OTR__textures/kanji/gMsgKanji8C6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C6ATex[] = dgMsgKanji8C6ATex; + +#define dgMsgKanji8C6BTex "__OTR__textures/kanji/gMsgKanji8C6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C6BTex[] = dgMsgKanji8C6BTex; + +#define dgMsgKanji8C6CTex "__OTR__textures/kanji/gMsgKanji8C6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C6CTex[] = dgMsgKanji8C6CTex; + +#define dgMsgKanji8C6DTex "__OTR__textures/kanji/gMsgKanji8C6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C6DTex[] = dgMsgKanji8C6DTex; + +#define dgMsgKanji8C6ETex "__OTR__textures/kanji/gMsgKanji8C6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C6ETex[] = dgMsgKanji8C6ETex; + +#define dgMsgKanji8C6FTex "__OTR__textures/kanji/gMsgKanji8C6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8C6FTex[] = dgMsgKanji8C6FTex; + +#define dgMsgKanji8C70Tex "__OTR__textures/kanji/gMsgKanji8C70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C70Tex[] = dgMsgKanji8C70Tex; + +#define dgMsgKanji8C71Tex "__OTR__textures/kanji/gMsgKanji8C71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C71Tex[] = dgMsgKanji8C71Tex; + +#define dgMsgKanji8C72Tex "__OTR__textures/kanji/gMsgKanji8C72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C72Tex[] = dgMsgKanji8C72Tex; + +#define dgMsgKanji8C73Tex "__OTR__textures/kanji/gMsgKanji8C73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C73Tex[] = dgMsgKanji8C73Tex; + +#define dgMsgKanji8C74Tex "__OTR__textures/kanji/gMsgKanji8C74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C74Tex[] = dgMsgKanji8C74Tex; + +#define dgMsgKanji8C75Tex "__OTR__textures/kanji/gMsgKanji8C75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C75Tex[] = dgMsgKanji8C75Tex; + +#define dgMsgKanji8C76Tex "__OTR__textures/kanji/gMsgKanji8C76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C76Tex[] = dgMsgKanji8C76Tex; + +#define dgMsgKanji8C77Tex "__OTR__textures/kanji/gMsgKanji8C77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C77Tex[] = dgMsgKanji8C77Tex; + +#define dgMsgKanji8C78Tex "__OTR__textures/kanji/gMsgKanji8C78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C78Tex[] = dgMsgKanji8C78Tex; + +#define dgMsgKanji8C79Tex "__OTR__textures/kanji/gMsgKanji8C79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C79Tex[] = dgMsgKanji8C79Tex; + +#define dgMsgKanji8C7ATex "__OTR__textures/kanji/gMsgKanji8C7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C7ATex[] = dgMsgKanji8C7ATex; + +#define dgMsgKanji8C7BTex "__OTR__textures/kanji/gMsgKanji8C7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C7BTex[] = dgMsgKanji8C7BTex; + +#define dgMsgKanji8C7CTex "__OTR__textures/kanji/gMsgKanji8C7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C7CTex[] = dgMsgKanji8C7CTex; + +#define dgMsgKanji8C7DTex "__OTR__textures/kanji/gMsgKanji8C7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C7DTex[] = dgMsgKanji8C7DTex; + +#define dgMsgKanji8C7ETex "__OTR__textures/kanji/gMsgKanji8C7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C7ETex[] = dgMsgKanji8C7ETex; + +#define dgMsgKanji8C80Tex "__OTR__textures/kanji/gMsgKanji8C80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C80Tex[] = dgMsgKanji8C80Tex; + +#define dgMsgKanji8C81Tex "__OTR__textures/kanji/gMsgKanji8C81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C81Tex[] = dgMsgKanji8C81Tex; + +#define dgMsgKanji8C82Tex "__OTR__textures/kanji/gMsgKanji8C82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C82Tex[] = dgMsgKanji8C82Tex; + +#define dgMsgKanji8C83Tex "__OTR__textures/kanji/gMsgKanji8C83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C83Tex[] = dgMsgKanji8C83Tex; + +#define dgMsgKanji8C84Tex "__OTR__textures/kanji/gMsgKanji8C84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C84Tex[] = dgMsgKanji8C84Tex; + +#define dgMsgKanji8C85Tex "__OTR__textures/kanji/gMsgKanji8C85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C85Tex[] = dgMsgKanji8C85Tex; + +#define dgMsgKanji8C86Tex "__OTR__textures/kanji/gMsgKanji8C86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C86Tex[] = dgMsgKanji8C86Tex; + +#define dgMsgKanji8C87Tex "__OTR__textures/kanji/gMsgKanji8C87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C87Tex[] = dgMsgKanji8C87Tex; + +#define dgMsgKanji8C88Tex "__OTR__textures/kanji/gMsgKanji8C88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C88Tex[] = dgMsgKanji8C88Tex; + +#define dgMsgKanji8C89Tex "__OTR__textures/kanji/gMsgKanji8C89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C89Tex[] = dgMsgKanji8C89Tex; + +#define dgMsgKanji8C8ATex "__OTR__textures/kanji/gMsgKanji8C8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C8ATex[] = dgMsgKanji8C8ATex; + +#define dgMsgKanji8C8BTex "__OTR__textures/kanji/gMsgKanji8C8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C8BTex[] = dgMsgKanji8C8BTex; + +#define dgMsgKanji8C8CTex "__OTR__textures/kanji/gMsgKanji8C8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C8CTex[] = dgMsgKanji8C8CTex; + +#define dgMsgKanji8C8DTex "__OTR__textures/kanji/gMsgKanji8C8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C8DTex[] = dgMsgKanji8C8DTex; + +#define dgMsgKanji8C8ETex "__OTR__textures/kanji/gMsgKanji8C8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C8ETex[] = dgMsgKanji8C8ETex; + +#define dgMsgKanji8C8FTex "__OTR__textures/kanji/gMsgKanji8C8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8C8FTex[] = dgMsgKanji8C8FTex; + +#define dgMsgKanji8C90Tex "__OTR__textures/kanji/gMsgKanji8C90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C90Tex[] = dgMsgKanji8C90Tex; + +#define dgMsgKanji8C91Tex "__OTR__textures/kanji/gMsgKanji8C91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C91Tex[] = dgMsgKanji8C91Tex; + +#define dgMsgKanji8C92Tex "__OTR__textures/kanji/gMsgKanji8C92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C92Tex[] = dgMsgKanji8C92Tex; + +#define dgMsgKanji8C93Tex "__OTR__textures/kanji/gMsgKanji8C93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C93Tex[] = dgMsgKanji8C93Tex; + +#define dgMsgKanji8C94Tex "__OTR__textures/kanji/gMsgKanji8C94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C94Tex[] = dgMsgKanji8C94Tex; + +#define dgMsgKanji8C95Tex "__OTR__textures/kanji/gMsgKanji8C95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C95Tex[] = dgMsgKanji8C95Tex; + +#define dgMsgKanji8C96Tex "__OTR__textures/kanji/gMsgKanji8C96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C96Tex[] = dgMsgKanji8C96Tex; + +#define dgMsgKanji8C97Tex "__OTR__textures/kanji/gMsgKanji8C97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C97Tex[] = dgMsgKanji8C97Tex; + +#define dgMsgKanji8C98Tex "__OTR__textures/kanji/gMsgKanji8C98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C98Tex[] = dgMsgKanji8C98Tex; + +#define dgMsgKanji8C99Tex "__OTR__textures/kanji/gMsgKanji8C99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C99Tex[] = dgMsgKanji8C99Tex; + +#define dgMsgKanji8C9ATex "__OTR__textures/kanji/gMsgKanji8C9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C9ATex[] = dgMsgKanji8C9ATex; + +#define dgMsgKanji8C9BTex "__OTR__textures/kanji/gMsgKanji8C9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C9BTex[] = dgMsgKanji8C9BTex; + +#define dgMsgKanji8C9CTex "__OTR__textures/kanji/gMsgKanji8C9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C9CTex[] = dgMsgKanji8C9CTex; + +#define dgMsgKanji8C9DTex "__OTR__textures/kanji/gMsgKanji8C9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C9DTex[] = dgMsgKanji8C9DTex; + +#define dgMsgKanji8C9ETex "__OTR__textures/kanji/gMsgKanji8C9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C9ETex[] = dgMsgKanji8C9ETex; + +#define dgMsgKanji8C9FTex "__OTR__textures/kanji/gMsgKanji8C9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8C9FTex[] = dgMsgKanji8C9FTex; + +#define dgMsgKanji8CA0Tex "__OTR__textures/kanji/gMsgKanji8CA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA0Tex[] = dgMsgKanji8CA0Tex; + +#define dgMsgKanji8CA1Tex "__OTR__textures/kanji/gMsgKanji8CA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA1Tex[] = dgMsgKanji8CA1Tex; + +#define dgMsgKanji8CA2Tex "__OTR__textures/kanji/gMsgKanji8CA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA2Tex[] = dgMsgKanji8CA2Tex; + +#define dgMsgKanji8CA3Tex "__OTR__textures/kanji/gMsgKanji8CA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA3Tex[] = dgMsgKanji8CA3Tex; + +#define dgMsgKanji8CA4Tex "__OTR__textures/kanji/gMsgKanji8CA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA4Tex[] = dgMsgKanji8CA4Tex; + +#define dgMsgKanji8CA5Tex "__OTR__textures/kanji/gMsgKanji8CA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA5Tex[] = dgMsgKanji8CA5Tex; + +#define dgMsgKanji8CA6Tex "__OTR__textures/kanji/gMsgKanji8CA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA6Tex[] = dgMsgKanji8CA6Tex; + +#define dgMsgKanji8CA7Tex "__OTR__textures/kanji/gMsgKanji8CA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA7Tex[] = dgMsgKanji8CA7Tex; + +#define dgMsgKanji8CA8Tex "__OTR__textures/kanji/gMsgKanji8CA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA8Tex[] = dgMsgKanji8CA8Tex; + +#define dgMsgKanji8CA9Tex "__OTR__textures/kanji/gMsgKanji8CA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA9Tex[] = dgMsgKanji8CA9Tex; + +#define dgMsgKanji8CAATex "__OTR__textures/kanji/gMsgKanji8CAATex" +static const ALIGN_ASSET(2) char gMsgKanji8CAATex[] = dgMsgKanji8CAATex; + +#define dgMsgKanji8CABTex "__OTR__textures/kanji/gMsgKanji8CABTex" +static const ALIGN_ASSET(2) char gMsgKanji8CABTex[] = dgMsgKanji8CABTex; + +#define dgMsgKanji8CACTex "__OTR__textures/kanji/gMsgKanji8CACTex" +static const ALIGN_ASSET(2) char gMsgKanji8CACTex[] = dgMsgKanji8CACTex; + +#define dgMsgKanji8CADTex "__OTR__textures/kanji/gMsgKanji8CADTex" +static const ALIGN_ASSET(2) char gMsgKanji8CADTex[] = dgMsgKanji8CADTex; + +#define dgMsgKanji8CAETex "__OTR__textures/kanji/gMsgKanji8CAETex" +static const ALIGN_ASSET(2) char gMsgKanji8CAETex[] = dgMsgKanji8CAETex; + +#define dgMsgKanji8CAFTex "__OTR__textures/kanji/gMsgKanji8CAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8CAFTex[] = dgMsgKanji8CAFTex; + +#define dgMsgKanji8CB0Tex "__OTR__textures/kanji/gMsgKanji8CB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB0Tex[] = dgMsgKanji8CB0Tex; + +#define dgMsgKanji8CB1Tex "__OTR__textures/kanji/gMsgKanji8CB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB1Tex[] = dgMsgKanji8CB1Tex; + +#define dgMsgKanji8CB2Tex "__OTR__textures/kanji/gMsgKanji8CB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB2Tex[] = dgMsgKanji8CB2Tex; + +#define dgMsgKanji8CB3Tex "__OTR__textures/kanji/gMsgKanji8CB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB3Tex[] = dgMsgKanji8CB3Tex; + +#define dgMsgKanji8CB4Tex "__OTR__textures/kanji/gMsgKanji8CB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB4Tex[] = dgMsgKanji8CB4Tex; + +#define dgMsgKanji8CB5Tex "__OTR__textures/kanji/gMsgKanji8CB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB5Tex[] = dgMsgKanji8CB5Tex; + +#define dgMsgKanji8CB6Tex "__OTR__textures/kanji/gMsgKanji8CB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB6Tex[] = dgMsgKanji8CB6Tex; + +#define dgMsgKanji8CB7Tex "__OTR__textures/kanji/gMsgKanji8CB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB7Tex[] = dgMsgKanji8CB7Tex; + +#define dgMsgKanji8CB8Tex "__OTR__textures/kanji/gMsgKanji8CB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB8Tex[] = dgMsgKanji8CB8Tex; + +#define dgMsgKanji8CB9Tex "__OTR__textures/kanji/gMsgKanji8CB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB9Tex[] = dgMsgKanji8CB9Tex; + +#define dgMsgKanji8CBATex "__OTR__textures/kanji/gMsgKanji8CBATex" +static const ALIGN_ASSET(2) char gMsgKanji8CBATex[] = dgMsgKanji8CBATex; + +#define dgMsgKanji8CBBTex "__OTR__textures/kanji/gMsgKanji8CBBTex" +static const ALIGN_ASSET(2) char gMsgKanji8CBBTex[] = dgMsgKanji8CBBTex; + +#define dgMsgKanji8CBCTex "__OTR__textures/kanji/gMsgKanji8CBCTex" +static const ALIGN_ASSET(2) char gMsgKanji8CBCTex[] = dgMsgKanji8CBCTex; + +#define dgMsgKanji8CBDTex "__OTR__textures/kanji/gMsgKanji8CBDTex" +static const ALIGN_ASSET(2) char gMsgKanji8CBDTex[] = dgMsgKanji8CBDTex; + +#define dgMsgKanji8CBETex "__OTR__textures/kanji/gMsgKanji8CBETex" +static const ALIGN_ASSET(2) char gMsgKanji8CBETex[] = dgMsgKanji8CBETex; + +#define dgMsgKanji8CBFTex "__OTR__textures/kanji/gMsgKanji8CBFTex" +static const ALIGN_ASSET(2) char gMsgKanji8CBFTex[] = dgMsgKanji8CBFTex; + +#define dgMsgKanji8CC0Tex "__OTR__textures/kanji/gMsgKanji8CC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC0Tex[] = dgMsgKanji8CC0Tex; + +#define dgMsgKanji8CC1Tex "__OTR__textures/kanji/gMsgKanji8CC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC1Tex[] = dgMsgKanji8CC1Tex; + +#define dgMsgKanji8CC2Tex "__OTR__textures/kanji/gMsgKanji8CC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC2Tex[] = dgMsgKanji8CC2Tex; + +#define dgMsgKanji8CC3Tex "__OTR__textures/kanji/gMsgKanji8CC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC3Tex[] = dgMsgKanji8CC3Tex; + +#define dgMsgKanji8CC4Tex "__OTR__textures/kanji/gMsgKanji8CC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC4Tex[] = dgMsgKanji8CC4Tex; + +#define dgMsgKanji8CC5Tex "__OTR__textures/kanji/gMsgKanji8CC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC5Tex[] = dgMsgKanji8CC5Tex; + +#define dgMsgKanji8CC6Tex "__OTR__textures/kanji/gMsgKanji8CC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC6Tex[] = dgMsgKanji8CC6Tex; + +#define dgMsgKanji8CC7Tex "__OTR__textures/kanji/gMsgKanji8CC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC7Tex[] = dgMsgKanji8CC7Tex; + +#define dgMsgKanji8CC8Tex "__OTR__textures/kanji/gMsgKanji8CC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC8Tex[] = dgMsgKanji8CC8Tex; + +#define dgMsgKanji8CC9Tex "__OTR__textures/kanji/gMsgKanji8CC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC9Tex[] = dgMsgKanji8CC9Tex; + +#define dgMsgKanji8CCATex "__OTR__textures/kanji/gMsgKanji8CCATex" +static const ALIGN_ASSET(2) char gMsgKanji8CCATex[] = dgMsgKanji8CCATex; + +#define dgMsgKanji8CCBTex "__OTR__textures/kanji/gMsgKanji8CCBTex" +static const ALIGN_ASSET(2) char gMsgKanji8CCBTex[] = dgMsgKanji8CCBTex; + +#define dgMsgKanji8CCCTex "__OTR__textures/kanji/gMsgKanji8CCCTex" +static const ALIGN_ASSET(2) char gMsgKanji8CCCTex[] = dgMsgKanji8CCCTex; + +#define dgMsgKanji8CCDTex "__OTR__textures/kanji/gMsgKanji8CCDTex" +static const ALIGN_ASSET(2) char gMsgKanji8CCDTex[] = dgMsgKanji8CCDTex; + +#define dgMsgKanji8CCETex "__OTR__textures/kanji/gMsgKanji8CCETex" +static const ALIGN_ASSET(2) char gMsgKanji8CCETex[] = dgMsgKanji8CCETex; + +#define dgMsgKanji8CCFTex "__OTR__textures/kanji/gMsgKanji8CCFTex" +static const ALIGN_ASSET(2) char gMsgKanji8CCFTex[] = dgMsgKanji8CCFTex; + +#define dgMsgKanji8CD0Tex "__OTR__textures/kanji/gMsgKanji8CD0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD0Tex[] = dgMsgKanji8CD0Tex; + +#define dgMsgKanji8CD1Tex "__OTR__textures/kanji/gMsgKanji8CD1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD1Tex[] = dgMsgKanji8CD1Tex; + +#define dgMsgKanji8CD2Tex "__OTR__textures/kanji/gMsgKanji8CD2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD2Tex[] = dgMsgKanji8CD2Tex; + +#define dgMsgKanji8CD3Tex "__OTR__textures/kanji/gMsgKanji8CD3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD3Tex[] = dgMsgKanji8CD3Tex; + +#define dgMsgKanji8CD4Tex "__OTR__textures/kanji/gMsgKanji8CD4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD4Tex[] = dgMsgKanji8CD4Tex; + +#define dgMsgKanji8CD5Tex "__OTR__textures/kanji/gMsgKanji8CD5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD5Tex[] = dgMsgKanji8CD5Tex; + +#define dgMsgKanji8CD6Tex "__OTR__textures/kanji/gMsgKanji8CD6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD6Tex[] = dgMsgKanji8CD6Tex; + +#define dgMsgKanji8CD7Tex "__OTR__textures/kanji/gMsgKanji8CD7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD7Tex[] = dgMsgKanji8CD7Tex; + +#define dgMsgKanji8CD8Tex "__OTR__textures/kanji/gMsgKanji8CD8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD8Tex[] = dgMsgKanji8CD8Tex; + +#define dgMsgKanji8CD9Tex "__OTR__textures/kanji/gMsgKanji8CD9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD9Tex[] = dgMsgKanji8CD9Tex; + +#define dgMsgKanji8CDATex "__OTR__textures/kanji/gMsgKanji8CDATex" +static const ALIGN_ASSET(2) char gMsgKanji8CDATex[] = dgMsgKanji8CDATex; + +#define dgMsgKanji8CDBTex "__OTR__textures/kanji/gMsgKanji8CDBTex" +static const ALIGN_ASSET(2) char gMsgKanji8CDBTex[] = dgMsgKanji8CDBTex; + +#define dgMsgKanji8CDCTex "__OTR__textures/kanji/gMsgKanji8CDCTex" +static const ALIGN_ASSET(2) char gMsgKanji8CDCTex[] = dgMsgKanji8CDCTex; + +#define dgMsgKanji8CDDTex "__OTR__textures/kanji/gMsgKanji8CDDTex" +static const ALIGN_ASSET(2) char gMsgKanji8CDDTex[] = dgMsgKanji8CDDTex; + +#define dgMsgKanji8CDETex "__OTR__textures/kanji/gMsgKanji8CDETex" +static const ALIGN_ASSET(2) char gMsgKanji8CDETex[] = dgMsgKanji8CDETex; + +#define dgMsgKanji8CDFTex "__OTR__textures/kanji/gMsgKanji8CDFTex" +static const ALIGN_ASSET(2) char gMsgKanji8CDFTex[] = dgMsgKanji8CDFTex; + +#define dgMsgKanji8CE0Tex "__OTR__textures/kanji/gMsgKanji8CE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE0Tex[] = dgMsgKanji8CE0Tex; + +#define dgMsgKanji8CE1Tex "__OTR__textures/kanji/gMsgKanji8CE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE1Tex[] = dgMsgKanji8CE1Tex; + +#define dgMsgKanji8CE2Tex "__OTR__textures/kanji/gMsgKanji8CE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE2Tex[] = dgMsgKanji8CE2Tex; + +#define dgMsgKanji8CE3Tex "__OTR__textures/kanji/gMsgKanji8CE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE3Tex[] = dgMsgKanji8CE3Tex; + +#define dgMsgKanji8CE4Tex "__OTR__textures/kanji/gMsgKanji8CE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE4Tex[] = dgMsgKanji8CE4Tex; + +#define dgMsgKanji8CE5Tex "__OTR__textures/kanji/gMsgKanji8CE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE5Tex[] = dgMsgKanji8CE5Tex; + +#define dgMsgKanji8CE6Tex "__OTR__textures/kanji/gMsgKanji8CE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE6Tex[] = dgMsgKanji8CE6Tex; + +#define dgMsgKanji8CE7Tex "__OTR__textures/kanji/gMsgKanji8CE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE7Tex[] = dgMsgKanji8CE7Tex; + +#define dgMsgKanji8CE8Tex "__OTR__textures/kanji/gMsgKanji8CE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE8Tex[] = dgMsgKanji8CE8Tex; + +#define dgMsgKanji8CE9Tex "__OTR__textures/kanji/gMsgKanji8CE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE9Tex[] = dgMsgKanji8CE9Tex; + +#define dgMsgKanji8CEATex "__OTR__textures/kanji/gMsgKanji8CEATex" +static const ALIGN_ASSET(2) char gMsgKanji8CEATex[] = dgMsgKanji8CEATex; + +#define dgMsgKanji8CEBTex "__OTR__textures/kanji/gMsgKanji8CEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8CEBTex[] = dgMsgKanji8CEBTex; + +#define dgMsgKanji8CECTex "__OTR__textures/kanji/gMsgKanji8CECTex" +static const ALIGN_ASSET(2) char gMsgKanji8CECTex[] = dgMsgKanji8CECTex; + +#define dgMsgKanji8CEDTex "__OTR__textures/kanji/gMsgKanji8CEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8CEDTex[] = dgMsgKanji8CEDTex; + +#define dgMsgKanji8CEETex "__OTR__textures/kanji/gMsgKanji8CEETex" +static const ALIGN_ASSET(2) char gMsgKanji8CEETex[] = dgMsgKanji8CEETex; + +#define dgMsgKanji8CEFTex "__OTR__textures/kanji/gMsgKanji8CEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8CEFTex[] = dgMsgKanji8CEFTex; + +#define dgMsgKanji8CF0Tex "__OTR__textures/kanji/gMsgKanji8CF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF0Tex[] = dgMsgKanji8CF0Tex; + +#define dgMsgKanji8CF1Tex "__OTR__textures/kanji/gMsgKanji8CF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF1Tex[] = dgMsgKanji8CF1Tex; + +#define dgMsgKanji8CF2Tex "__OTR__textures/kanji/gMsgKanji8CF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF2Tex[] = dgMsgKanji8CF2Tex; + +#define dgMsgKanji8CF3Tex "__OTR__textures/kanji/gMsgKanji8CF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF3Tex[] = dgMsgKanji8CF3Tex; + +#define dgMsgKanji8CF4Tex "__OTR__textures/kanji/gMsgKanji8CF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF4Tex[] = dgMsgKanji8CF4Tex; + +#define dgMsgKanji8CF5Tex "__OTR__textures/kanji/gMsgKanji8CF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF5Tex[] = dgMsgKanji8CF5Tex; + +#define dgMsgKanji8CF6Tex "__OTR__textures/kanji/gMsgKanji8CF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF6Tex[] = dgMsgKanji8CF6Tex; + +#define dgMsgKanji8CF7Tex "__OTR__textures/kanji/gMsgKanji8CF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF7Tex[] = dgMsgKanji8CF7Tex; + +#define dgMsgKanji8CF8Tex "__OTR__textures/kanji/gMsgKanji8CF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF8Tex[] = dgMsgKanji8CF8Tex; + +#define dgMsgKanji8CF9Tex "__OTR__textures/kanji/gMsgKanji8CF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF9Tex[] = dgMsgKanji8CF9Tex; + +#define dgMsgKanji8CFATex "__OTR__textures/kanji/gMsgKanji8CFATex" +static const ALIGN_ASSET(2) char gMsgKanji8CFATex[] = dgMsgKanji8CFATex; + +#define dgMsgKanji8CFBTex "__OTR__textures/kanji/gMsgKanji8CFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8CFBTex[] = dgMsgKanji8CFBTex; + +#define dgMsgKanji8CFCTex "__OTR__textures/kanji/gMsgKanji8CFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8CFCTex[] = dgMsgKanji8CFCTex; + +#define dgMsgKanji8D40Tex "__OTR__textures/kanji/gMsgKanji8D40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D40Tex[] = dgMsgKanji8D40Tex; + +#define dgMsgKanji8D41Tex "__OTR__textures/kanji/gMsgKanji8D41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D41Tex[] = dgMsgKanji8D41Tex; + +#define dgMsgKanji8D42Tex "__OTR__textures/kanji/gMsgKanji8D42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D42Tex[] = dgMsgKanji8D42Tex; + +#define dgMsgKanji8D43Tex "__OTR__textures/kanji/gMsgKanji8D43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D43Tex[] = dgMsgKanji8D43Tex; + +#define dgMsgKanji8D44Tex "__OTR__textures/kanji/gMsgKanji8D44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D44Tex[] = dgMsgKanji8D44Tex; + +#define dgMsgKanji8D45Tex "__OTR__textures/kanji/gMsgKanji8D45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D45Tex[] = dgMsgKanji8D45Tex; + +#define dgMsgKanji8D46Tex "__OTR__textures/kanji/gMsgKanji8D46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D46Tex[] = dgMsgKanji8D46Tex; + +#define dgMsgKanji8D47Tex "__OTR__textures/kanji/gMsgKanji8D47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D47Tex[] = dgMsgKanji8D47Tex; + +#define dgMsgKanji8D48Tex "__OTR__textures/kanji/gMsgKanji8D48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D48Tex[] = dgMsgKanji8D48Tex; + +#define dgMsgKanji8D49Tex "__OTR__textures/kanji/gMsgKanji8D49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D49Tex[] = dgMsgKanji8D49Tex; + +#define dgMsgKanji8D4ATex "__OTR__textures/kanji/gMsgKanji8D4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D4ATex[] = dgMsgKanji8D4ATex; + +#define dgMsgKanji8D4BTex "__OTR__textures/kanji/gMsgKanji8D4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D4BTex[] = dgMsgKanji8D4BTex; + +#define dgMsgKanji8D4CTex "__OTR__textures/kanji/gMsgKanji8D4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D4CTex[] = dgMsgKanji8D4CTex; + +#define dgMsgKanji8D4DTex "__OTR__textures/kanji/gMsgKanji8D4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D4DTex[] = dgMsgKanji8D4DTex; + +#define dgMsgKanji8D4ETex "__OTR__textures/kanji/gMsgKanji8D4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D4ETex[] = dgMsgKanji8D4ETex; + +#define dgMsgKanji8D4FTex "__OTR__textures/kanji/gMsgKanji8D4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8D4FTex[] = dgMsgKanji8D4FTex; + +#define dgMsgKanji8D50Tex "__OTR__textures/kanji/gMsgKanji8D50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D50Tex[] = dgMsgKanji8D50Tex; + +#define dgMsgKanji8D51Tex "__OTR__textures/kanji/gMsgKanji8D51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D51Tex[] = dgMsgKanji8D51Tex; + +#define dgMsgKanji8D52Tex "__OTR__textures/kanji/gMsgKanji8D52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D52Tex[] = dgMsgKanji8D52Tex; + +#define dgMsgKanji8D53Tex "__OTR__textures/kanji/gMsgKanji8D53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D53Tex[] = dgMsgKanji8D53Tex; + +#define dgMsgKanji8D54Tex "__OTR__textures/kanji/gMsgKanji8D54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D54Tex[] = dgMsgKanji8D54Tex; + +#define dgMsgKanji8D55Tex "__OTR__textures/kanji/gMsgKanji8D55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D55Tex[] = dgMsgKanji8D55Tex; + +#define dgMsgKanji8D56Tex "__OTR__textures/kanji/gMsgKanji8D56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D56Tex[] = dgMsgKanji8D56Tex; + +#define dgMsgKanji8D57Tex "__OTR__textures/kanji/gMsgKanji8D57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D57Tex[] = dgMsgKanji8D57Tex; + +#define dgMsgKanji8D58Tex "__OTR__textures/kanji/gMsgKanji8D58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D58Tex[] = dgMsgKanji8D58Tex; + +#define dgMsgKanji8D59Tex "__OTR__textures/kanji/gMsgKanji8D59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D59Tex[] = dgMsgKanji8D59Tex; + +#define dgMsgKanji8D5ATex "__OTR__textures/kanji/gMsgKanji8D5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D5ATex[] = dgMsgKanji8D5ATex; + +#define dgMsgKanji8D5BTex "__OTR__textures/kanji/gMsgKanji8D5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D5BTex[] = dgMsgKanji8D5BTex; + +#define dgMsgKanji8D5CTex "__OTR__textures/kanji/gMsgKanji8D5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D5CTex[] = dgMsgKanji8D5CTex; + +#define dgMsgKanji8D5DTex "__OTR__textures/kanji/gMsgKanji8D5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D5DTex[] = dgMsgKanji8D5DTex; + +#define dgMsgKanji8D5ETex "__OTR__textures/kanji/gMsgKanji8D5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D5ETex[] = dgMsgKanji8D5ETex; + +#define dgMsgKanji8D5FTex "__OTR__textures/kanji/gMsgKanji8D5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8D5FTex[] = dgMsgKanji8D5FTex; + +#define dgMsgKanji8D60Tex "__OTR__textures/kanji/gMsgKanji8D60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D60Tex[] = dgMsgKanji8D60Tex; + +#define dgMsgKanji8D61Tex "__OTR__textures/kanji/gMsgKanji8D61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D61Tex[] = dgMsgKanji8D61Tex; + +#define dgMsgKanji8D62Tex "__OTR__textures/kanji/gMsgKanji8D62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D62Tex[] = dgMsgKanji8D62Tex; + +#define dgMsgKanji8D63Tex "__OTR__textures/kanji/gMsgKanji8D63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D63Tex[] = dgMsgKanji8D63Tex; + +#define dgMsgKanji8D64Tex "__OTR__textures/kanji/gMsgKanji8D64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D64Tex[] = dgMsgKanji8D64Tex; + +#define dgMsgKanji8D65Tex "__OTR__textures/kanji/gMsgKanji8D65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D65Tex[] = dgMsgKanji8D65Tex; + +#define dgMsgKanji8D66Tex "__OTR__textures/kanji/gMsgKanji8D66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D66Tex[] = dgMsgKanji8D66Tex; + +#define dgMsgKanji8D67Tex "__OTR__textures/kanji/gMsgKanji8D67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D67Tex[] = dgMsgKanji8D67Tex; + +#define dgMsgKanji8D68Tex "__OTR__textures/kanji/gMsgKanji8D68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D68Tex[] = dgMsgKanji8D68Tex; + +#define dgMsgKanji8D69Tex "__OTR__textures/kanji/gMsgKanji8D69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D69Tex[] = dgMsgKanji8D69Tex; + +#define dgMsgKanji8D6ATex "__OTR__textures/kanji/gMsgKanji8D6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D6ATex[] = dgMsgKanji8D6ATex; + +#define dgMsgKanji8D6BTex "__OTR__textures/kanji/gMsgKanji8D6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D6BTex[] = dgMsgKanji8D6BTex; + +#define dgMsgKanji8D6CTex "__OTR__textures/kanji/gMsgKanji8D6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D6CTex[] = dgMsgKanji8D6CTex; + +#define dgMsgKanji8D6DTex "__OTR__textures/kanji/gMsgKanji8D6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D6DTex[] = dgMsgKanji8D6DTex; + +#define dgMsgKanji8D6ETex "__OTR__textures/kanji/gMsgKanji8D6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D6ETex[] = dgMsgKanji8D6ETex; + +#define dgMsgKanji8D6FTex "__OTR__textures/kanji/gMsgKanji8D6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8D6FTex[] = dgMsgKanji8D6FTex; + +#define dgMsgKanji8D70Tex "__OTR__textures/kanji/gMsgKanji8D70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D70Tex[] = dgMsgKanji8D70Tex; + +#define dgMsgKanji8D71Tex "__OTR__textures/kanji/gMsgKanji8D71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D71Tex[] = dgMsgKanji8D71Tex; + +#define dgMsgKanji8D72Tex "__OTR__textures/kanji/gMsgKanji8D72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D72Tex[] = dgMsgKanji8D72Tex; + +#define dgMsgKanji8D73Tex "__OTR__textures/kanji/gMsgKanji8D73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D73Tex[] = dgMsgKanji8D73Tex; + +#define dgMsgKanji8D74Tex "__OTR__textures/kanji/gMsgKanji8D74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D74Tex[] = dgMsgKanji8D74Tex; + +#define dgMsgKanji8D75Tex "__OTR__textures/kanji/gMsgKanji8D75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D75Tex[] = dgMsgKanji8D75Tex; + +#define dgMsgKanji8D76Tex "__OTR__textures/kanji/gMsgKanji8D76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D76Tex[] = dgMsgKanji8D76Tex; + +#define dgMsgKanji8D77Tex "__OTR__textures/kanji/gMsgKanji8D77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D77Tex[] = dgMsgKanji8D77Tex; + +#define dgMsgKanji8D78Tex "__OTR__textures/kanji/gMsgKanji8D78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D78Tex[] = dgMsgKanji8D78Tex; + +#define dgMsgKanji8D79Tex "__OTR__textures/kanji/gMsgKanji8D79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D79Tex[] = dgMsgKanji8D79Tex; + +#define dgMsgKanji8D7ATex "__OTR__textures/kanji/gMsgKanji8D7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D7ATex[] = dgMsgKanji8D7ATex; + +#define dgMsgKanji8D7BTex "__OTR__textures/kanji/gMsgKanji8D7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D7BTex[] = dgMsgKanji8D7BTex; + +#define dgMsgKanji8D7CTex "__OTR__textures/kanji/gMsgKanji8D7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D7CTex[] = dgMsgKanji8D7CTex; + +#define dgMsgKanji8D7DTex "__OTR__textures/kanji/gMsgKanji8D7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D7DTex[] = dgMsgKanji8D7DTex; + +#define dgMsgKanji8D7ETex "__OTR__textures/kanji/gMsgKanji8D7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D7ETex[] = dgMsgKanji8D7ETex; + +#define dgMsgKanji8D80Tex "__OTR__textures/kanji/gMsgKanji8D80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D80Tex[] = dgMsgKanji8D80Tex; + +#define dgMsgKanji8D81Tex "__OTR__textures/kanji/gMsgKanji8D81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D81Tex[] = dgMsgKanji8D81Tex; + +#define dgMsgKanji8D82Tex "__OTR__textures/kanji/gMsgKanji8D82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D82Tex[] = dgMsgKanji8D82Tex; + +#define dgMsgKanji8D83Tex "__OTR__textures/kanji/gMsgKanji8D83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D83Tex[] = dgMsgKanji8D83Tex; + +#define dgMsgKanji8D84Tex "__OTR__textures/kanji/gMsgKanji8D84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D84Tex[] = dgMsgKanji8D84Tex; + +#define dgMsgKanji8D85Tex "__OTR__textures/kanji/gMsgKanji8D85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D85Tex[] = dgMsgKanji8D85Tex; + +#define dgMsgKanji8D86Tex "__OTR__textures/kanji/gMsgKanji8D86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D86Tex[] = dgMsgKanji8D86Tex; + +#define dgMsgKanji8D87Tex "__OTR__textures/kanji/gMsgKanji8D87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D87Tex[] = dgMsgKanji8D87Tex; + +#define dgMsgKanji8D88Tex "__OTR__textures/kanji/gMsgKanji8D88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D88Tex[] = dgMsgKanji8D88Tex; + +#define dgMsgKanji8D89Tex "__OTR__textures/kanji/gMsgKanji8D89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D89Tex[] = dgMsgKanji8D89Tex; + +#define dgMsgKanji8D8ATex "__OTR__textures/kanji/gMsgKanji8D8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D8ATex[] = dgMsgKanji8D8ATex; + +#define dgMsgKanji8D8BTex "__OTR__textures/kanji/gMsgKanji8D8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D8BTex[] = dgMsgKanji8D8BTex; + +#define dgMsgKanji8D8CTex "__OTR__textures/kanji/gMsgKanji8D8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D8CTex[] = dgMsgKanji8D8CTex; + +#define dgMsgKanji8D8DTex "__OTR__textures/kanji/gMsgKanji8D8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D8DTex[] = dgMsgKanji8D8DTex; + +#define dgMsgKanji8D8ETex "__OTR__textures/kanji/gMsgKanji8D8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D8ETex[] = dgMsgKanji8D8ETex; + +#define dgMsgKanji8D8FTex "__OTR__textures/kanji/gMsgKanji8D8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8D8FTex[] = dgMsgKanji8D8FTex; + +#define dgMsgKanji8D90Tex "__OTR__textures/kanji/gMsgKanji8D90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D90Tex[] = dgMsgKanji8D90Tex; + +#define dgMsgKanji8D91Tex "__OTR__textures/kanji/gMsgKanji8D91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D91Tex[] = dgMsgKanji8D91Tex; + +#define dgMsgKanji8D92Tex "__OTR__textures/kanji/gMsgKanji8D92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D92Tex[] = dgMsgKanji8D92Tex; + +#define dgMsgKanji8D93Tex "__OTR__textures/kanji/gMsgKanji8D93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D93Tex[] = dgMsgKanji8D93Tex; + +#define dgMsgKanji8D94Tex "__OTR__textures/kanji/gMsgKanji8D94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D94Tex[] = dgMsgKanji8D94Tex; + +#define dgMsgKanji8D95Tex "__OTR__textures/kanji/gMsgKanji8D95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D95Tex[] = dgMsgKanji8D95Tex; + +#define dgMsgKanji8D96Tex "__OTR__textures/kanji/gMsgKanji8D96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D96Tex[] = dgMsgKanji8D96Tex; + +#define dgMsgKanji8D97Tex "__OTR__textures/kanji/gMsgKanji8D97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D97Tex[] = dgMsgKanji8D97Tex; + +#define dgMsgKanji8D98Tex "__OTR__textures/kanji/gMsgKanji8D98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D98Tex[] = dgMsgKanji8D98Tex; + +#define dgMsgKanji8D99Tex "__OTR__textures/kanji/gMsgKanji8D99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D99Tex[] = dgMsgKanji8D99Tex; + +#define dgMsgKanji8D9ATex "__OTR__textures/kanji/gMsgKanji8D9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D9ATex[] = dgMsgKanji8D9ATex; + +#define dgMsgKanji8D9BTex "__OTR__textures/kanji/gMsgKanji8D9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D9BTex[] = dgMsgKanji8D9BTex; + +#define dgMsgKanji8D9CTex "__OTR__textures/kanji/gMsgKanji8D9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D9CTex[] = dgMsgKanji8D9CTex; + +#define dgMsgKanji8D9DTex "__OTR__textures/kanji/gMsgKanji8D9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D9DTex[] = dgMsgKanji8D9DTex; + +#define dgMsgKanji8D9ETex "__OTR__textures/kanji/gMsgKanji8D9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D9ETex[] = dgMsgKanji8D9ETex; + +#define dgMsgKanji8D9FTex "__OTR__textures/kanji/gMsgKanji8D9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8D9FTex[] = dgMsgKanji8D9FTex; + +#define dgMsgKanji8DA0Tex "__OTR__textures/kanji/gMsgKanji8DA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA0Tex[] = dgMsgKanji8DA0Tex; + +#define dgMsgKanji8DA1Tex "__OTR__textures/kanji/gMsgKanji8DA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA1Tex[] = dgMsgKanji8DA1Tex; + +#define dgMsgKanji8DA2Tex "__OTR__textures/kanji/gMsgKanji8DA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA2Tex[] = dgMsgKanji8DA2Tex; + +#define dgMsgKanji8DA3Tex "__OTR__textures/kanji/gMsgKanji8DA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA3Tex[] = dgMsgKanji8DA3Tex; + +#define dgMsgKanji8DA4Tex "__OTR__textures/kanji/gMsgKanji8DA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA4Tex[] = dgMsgKanji8DA4Tex; + +#define dgMsgKanji8DA5Tex "__OTR__textures/kanji/gMsgKanji8DA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA5Tex[] = dgMsgKanji8DA5Tex; + +#define dgMsgKanji8DA6Tex "__OTR__textures/kanji/gMsgKanji8DA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA6Tex[] = dgMsgKanji8DA6Tex; + +#define dgMsgKanji8DA7Tex "__OTR__textures/kanji/gMsgKanji8DA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA7Tex[] = dgMsgKanji8DA7Tex; + +#define dgMsgKanji8DA8Tex "__OTR__textures/kanji/gMsgKanji8DA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA8Tex[] = dgMsgKanji8DA8Tex; + +#define dgMsgKanji8DA9Tex "__OTR__textures/kanji/gMsgKanji8DA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA9Tex[] = dgMsgKanji8DA9Tex; + +#define dgMsgKanji8DAATex "__OTR__textures/kanji/gMsgKanji8DAATex" +static const ALIGN_ASSET(2) char gMsgKanji8DAATex[] = dgMsgKanji8DAATex; + +#define dgMsgKanji8DABTex "__OTR__textures/kanji/gMsgKanji8DABTex" +static const ALIGN_ASSET(2) char gMsgKanji8DABTex[] = dgMsgKanji8DABTex; + +#define dgMsgKanji8DACTex "__OTR__textures/kanji/gMsgKanji8DACTex" +static const ALIGN_ASSET(2) char gMsgKanji8DACTex[] = dgMsgKanji8DACTex; + +#define dgMsgKanji8DADTex "__OTR__textures/kanji/gMsgKanji8DADTex" +static const ALIGN_ASSET(2) char gMsgKanji8DADTex[] = dgMsgKanji8DADTex; + +#define dgMsgKanji8DAETex "__OTR__textures/kanji/gMsgKanji8DAETex" +static const ALIGN_ASSET(2) char gMsgKanji8DAETex[] = dgMsgKanji8DAETex; + +#define dgMsgKanji8DAFTex "__OTR__textures/kanji/gMsgKanji8DAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8DAFTex[] = dgMsgKanji8DAFTex; + +#define dgMsgKanji8DB0Tex "__OTR__textures/kanji/gMsgKanji8DB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB0Tex[] = dgMsgKanji8DB0Tex; + +#define dgMsgKanji8DB1Tex "__OTR__textures/kanji/gMsgKanji8DB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB1Tex[] = dgMsgKanji8DB1Tex; + +#define dgMsgKanji8DB2Tex "__OTR__textures/kanji/gMsgKanji8DB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB2Tex[] = dgMsgKanji8DB2Tex; + +#define dgMsgKanji8DB3Tex "__OTR__textures/kanji/gMsgKanji8DB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB3Tex[] = dgMsgKanji8DB3Tex; + +#define dgMsgKanji8DB4Tex "__OTR__textures/kanji/gMsgKanji8DB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB4Tex[] = dgMsgKanji8DB4Tex; + +#define dgMsgKanji8DB5Tex "__OTR__textures/kanji/gMsgKanji8DB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB5Tex[] = dgMsgKanji8DB5Tex; + +#define dgMsgKanji8DB6Tex "__OTR__textures/kanji/gMsgKanji8DB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB6Tex[] = dgMsgKanji8DB6Tex; + +#define dgMsgKanji8DB7Tex "__OTR__textures/kanji/gMsgKanji8DB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB7Tex[] = dgMsgKanji8DB7Tex; + +#define dgMsgKanji8DB8Tex "__OTR__textures/kanji/gMsgKanji8DB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB8Tex[] = dgMsgKanji8DB8Tex; + +#define dgMsgKanji8DB9Tex "__OTR__textures/kanji/gMsgKanji8DB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB9Tex[] = dgMsgKanji8DB9Tex; + +#define dgMsgKanji8DBATex "__OTR__textures/kanji/gMsgKanji8DBATex" +static const ALIGN_ASSET(2) char gMsgKanji8DBATex[] = dgMsgKanji8DBATex; + +#define dgMsgKanji8DBBTex "__OTR__textures/kanji/gMsgKanji8DBBTex" +static const ALIGN_ASSET(2) char gMsgKanji8DBBTex[] = dgMsgKanji8DBBTex; + +#define dgMsgKanji8DBCTex "__OTR__textures/kanji/gMsgKanji8DBCTex" +static const ALIGN_ASSET(2) char gMsgKanji8DBCTex[] = dgMsgKanji8DBCTex; + +#define dgMsgKanji8DBDTex "__OTR__textures/kanji/gMsgKanji8DBDTex" +static const ALIGN_ASSET(2) char gMsgKanji8DBDTex[] = dgMsgKanji8DBDTex; + +#define dgMsgKanji8DBETex "__OTR__textures/kanji/gMsgKanji8DBETex" +static const ALIGN_ASSET(2) char gMsgKanji8DBETex[] = dgMsgKanji8DBETex; + +#define dgMsgKanji8DBFTex "__OTR__textures/kanji/gMsgKanji8DBFTex" +static const ALIGN_ASSET(2) char gMsgKanji8DBFTex[] = dgMsgKanji8DBFTex; + +#define dgMsgKanji8DC0Tex "__OTR__textures/kanji/gMsgKanji8DC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC0Tex[] = dgMsgKanji8DC0Tex; + +#define dgMsgKanji8DC1Tex "__OTR__textures/kanji/gMsgKanji8DC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC1Tex[] = dgMsgKanji8DC1Tex; + +#define dgMsgKanji8DC2Tex "__OTR__textures/kanji/gMsgKanji8DC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC2Tex[] = dgMsgKanji8DC2Tex; + +#define dgMsgKanji8DC3Tex "__OTR__textures/kanji/gMsgKanji8DC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC3Tex[] = dgMsgKanji8DC3Tex; + +#define dgMsgKanji8DC4Tex "__OTR__textures/kanji/gMsgKanji8DC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC4Tex[] = dgMsgKanji8DC4Tex; + +#define dgMsgKanji8DC5Tex "__OTR__textures/kanji/gMsgKanji8DC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC5Tex[] = dgMsgKanji8DC5Tex; + +#define dgMsgKanji8DC6Tex "__OTR__textures/kanji/gMsgKanji8DC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC6Tex[] = dgMsgKanji8DC6Tex; + +#define dgMsgKanji8DC7Tex "__OTR__textures/kanji/gMsgKanji8DC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC7Tex[] = dgMsgKanji8DC7Tex; + +#define dgMsgKanji8DC8Tex "__OTR__textures/kanji/gMsgKanji8DC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC8Tex[] = dgMsgKanji8DC8Tex; + +#define dgMsgKanji8DC9Tex "__OTR__textures/kanji/gMsgKanji8DC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC9Tex[] = dgMsgKanji8DC9Tex; + +#define dgMsgKanji8DCATex "__OTR__textures/kanji/gMsgKanji8DCATex" +static const ALIGN_ASSET(2) char gMsgKanji8DCATex[] = dgMsgKanji8DCATex; + +#define dgMsgKanji8DCBTex "__OTR__textures/kanji/gMsgKanji8DCBTex" +static const ALIGN_ASSET(2) char gMsgKanji8DCBTex[] = dgMsgKanji8DCBTex; + +#define dgMsgKanji8DCCTex "__OTR__textures/kanji/gMsgKanji8DCCTex" +static const ALIGN_ASSET(2) char gMsgKanji8DCCTex[] = dgMsgKanji8DCCTex; + +#define dgMsgKanji8DCDTex "__OTR__textures/kanji/gMsgKanji8DCDTex" +static const ALIGN_ASSET(2) char gMsgKanji8DCDTex[] = dgMsgKanji8DCDTex; + +#define dgMsgKanji8DCETex "__OTR__textures/kanji/gMsgKanji8DCETex" +static const ALIGN_ASSET(2) char gMsgKanji8DCETex[] = dgMsgKanji8DCETex; + +#define dgMsgKanji8DCFTex "__OTR__textures/kanji/gMsgKanji8DCFTex" +static const ALIGN_ASSET(2) char gMsgKanji8DCFTex[] = dgMsgKanji8DCFTex; + +#define dgMsgKanji8DD0Tex "__OTR__textures/kanji/gMsgKanji8DD0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD0Tex[] = dgMsgKanji8DD0Tex; + +#define dgMsgKanji8DD1Tex "__OTR__textures/kanji/gMsgKanji8DD1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD1Tex[] = dgMsgKanji8DD1Tex; + +#define dgMsgKanji8DD2Tex "__OTR__textures/kanji/gMsgKanji8DD2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD2Tex[] = dgMsgKanji8DD2Tex; + +#define dgMsgKanji8DD3Tex "__OTR__textures/kanji/gMsgKanji8DD3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD3Tex[] = dgMsgKanji8DD3Tex; + +#define dgMsgKanji8DD4Tex "__OTR__textures/kanji/gMsgKanji8DD4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD4Tex[] = dgMsgKanji8DD4Tex; + +#define dgMsgKanji8DD5Tex "__OTR__textures/kanji/gMsgKanji8DD5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD5Tex[] = dgMsgKanji8DD5Tex; + +#define dgMsgKanji8DD6Tex "__OTR__textures/kanji/gMsgKanji8DD6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD6Tex[] = dgMsgKanji8DD6Tex; + +#define dgMsgKanji8DD7Tex "__OTR__textures/kanji/gMsgKanji8DD7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD7Tex[] = dgMsgKanji8DD7Tex; + +#define dgMsgKanji8DD8Tex "__OTR__textures/kanji/gMsgKanji8DD8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD8Tex[] = dgMsgKanji8DD8Tex; + +#define dgMsgKanji8DD9Tex "__OTR__textures/kanji/gMsgKanji8DD9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD9Tex[] = dgMsgKanji8DD9Tex; + +#define dgMsgKanji8DDATex "__OTR__textures/kanji/gMsgKanji8DDATex" +static const ALIGN_ASSET(2) char gMsgKanji8DDATex[] = dgMsgKanji8DDATex; + +#define dgMsgKanji8DDBTex "__OTR__textures/kanji/gMsgKanji8DDBTex" +static const ALIGN_ASSET(2) char gMsgKanji8DDBTex[] = dgMsgKanji8DDBTex; + +#define dgMsgKanji8DDCTex "__OTR__textures/kanji/gMsgKanji8DDCTex" +static const ALIGN_ASSET(2) char gMsgKanji8DDCTex[] = dgMsgKanji8DDCTex; + +#define dgMsgKanji8DDDTex "__OTR__textures/kanji/gMsgKanji8DDDTex" +static const ALIGN_ASSET(2) char gMsgKanji8DDDTex[] = dgMsgKanji8DDDTex; + +#define dgMsgKanji8DDETex "__OTR__textures/kanji/gMsgKanji8DDETex" +static const ALIGN_ASSET(2) char gMsgKanji8DDETex[] = dgMsgKanji8DDETex; + +#define dgMsgKanji8DDFTex "__OTR__textures/kanji/gMsgKanji8DDFTex" +static const ALIGN_ASSET(2) char gMsgKanji8DDFTex[] = dgMsgKanji8DDFTex; + +#define dgMsgKanji8DE0Tex "__OTR__textures/kanji/gMsgKanji8DE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE0Tex[] = dgMsgKanji8DE0Tex; + +#define dgMsgKanji8DE1Tex "__OTR__textures/kanji/gMsgKanji8DE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE1Tex[] = dgMsgKanji8DE1Tex; + +#define dgMsgKanji8DE2Tex "__OTR__textures/kanji/gMsgKanji8DE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE2Tex[] = dgMsgKanji8DE2Tex; + +#define dgMsgKanji8DE3Tex "__OTR__textures/kanji/gMsgKanji8DE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE3Tex[] = dgMsgKanji8DE3Tex; + +#define dgMsgKanji8DE4Tex "__OTR__textures/kanji/gMsgKanji8DE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE4Tex[] = dgMsgKanji8DE4Tex; + +#define dgMsgKanji8DE5Tex "__OTR__textures/kanji/gMsgKanji8DE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE5Tex[] = dgMsgKanji8DE5Tex; + +#define dgMsgKanji8DE6Tex "__OTR__textures/kanji/gMsgKanji8DE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE6Tex[] = dgMsgKanji8DE6Tex; + +#define dgMsgKanji8DE7Tex "__OTR__textures/kanji/gMsgKanji8DE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE7Tex[] = dgMsgKanji8DE7Tex; + +#define dgMsgKanji8DE8Tex "__OTR__textures/kanji/gMsgKanji8DE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE8Tex[] = dgMsgKanji8DE8Tex; + +#define dgMsgKanji8DE9Tex "__OTR__textures/kanji/gMsgKanji8DE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE9Tex[] = dgMsgKanji8DE9Tex; + +#define dgMsgKanji8DEATex "__OTR__textures/kanji/gMsgKanji8DEATex" +static const ALIGN_ASSET(2) char gMsgKanji8DEATex[] = dgMsgKanji8DEATex; + +#define dgMsgKanji8DEBTex "__OTR__textures/kanji/gMsgKanji8DEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8DEBTex[] = dgMsgKanji8DEBTex; + +#define dgMsgKanji8DECTex "__OTR__textures/kanji/gMsgKanji8DECTex" +static const ALIGN_ASSET(2) char gMsgKanji8DECTex[] = dgMsgKanji8DECTex; + +#define dgMsgKanji8DEDTex "__OTR__textures/kanji/gMsgKanji8DEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8DEDTex[] = dgMsgKanji8DEDTex; + +#define dgMsgKanji8DEETex "__OTR__textures/kanji/gMsgKanji8DEETex" +static const ALIGN_ASSET(2) char gMsgKanji8DEETex[] = dgMsgKanji8DEETex; + +#define dgMsgKanji8DEFTex "__OTR__textures/kanji/gMsgKanji8DEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8DEFTex[] = dgMsgKanji8DEFTex; + +#define dgMsgKanji8DF0Tex "__OTR__textures/kanji/gMsgKanji8DF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF0Tex[] = dgMsgKanji8DF0Tex; + +#define dgMsgKanji8DF1Tex "__OTR__textures/kanji/gMsgKanji8DF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF1Tex[] = dgMsgKanji8DF1Tex; + +#define dgMsgKanji8DF2Tex "__OTR__textures/kanji/gMsgKanji8DF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF2Tex[] = dgMsgKanji8DF2Tex; + +#define dgMsgKanji8DF3Tex "__OTR__textures/kanji/gMsgKanji8DF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF3Tex[] = dgMsgKanji8DF3Tex; + +#define dgMsgKanji8DF4Tex "__OTR__textures/kanji/gMsgKanji8DF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF4Tex[] = dgMsgKanji8DF4Tex; + +#define dgMsgKanji8DF5Tex "__OTR__textures/kanji/gMsgKanji8DF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF5Tex[] = dgMsgKanji8DF5Tex; + +#define dgMsgKanji8DF6Tex "__OTR__textures/kanji/gMsgKanji8DF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF6Tex[] = dgMsgKanji8DF6Tex; + +#define dgMsgKanji8DF7Tex "__OTR__textures/kanji/gMsgKanji8DF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF7Tex[] = dgMsgKanji8DF7Tex; + +#define dgMsgKanji8DF8Tex "__OTR__textures/kanji/gMsgKanji8DF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF8Tex[] = dgMsgKanji8DF8Tex; + +#define dgMsgKanji8DF9Tex "__OTR__textures/kanji/gMsgKanji8DF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF9Tex[] = dgMsgKanji8DF9Tex; + +#define dgMsgKanji8DFATex "__OTR__textures/kanji/gMsgKanji8DFATex" +static const ALIGN_ASSET(2) char gMsgKanji8DFATex[] = dgMsgKanji8DFATex; + +#define dgMsgKanji8DFBTex "__OTR__textures/kanji/gMsgKanji8DFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8DFBTex[] = dgMsgKanji8DFBTex; + +#define dgMsgKanji8DFCTex "__OTR__textures/kanji/gMsgKanji8DFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8DFCTex[] = dgMsgKanji8DFCTex; + +#define dgMsgKanji8E40Tex "__OTR__textures/kanji/gMsgKanji8E40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E40Tex[] = dgMsgKanji8E40Tex; + +#define dgMsgKanji8E41Tex "__OTR__textures/kanji/gMsgKanji8E41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E41Tex[] = dgMsgKanji8E41Tex; + +#define dgMsgKanji8E42Tex "__OTR__textures/kanji/gMsgKanji8E42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E42Tex[] = dgMsgKanji8E42Tex; + +#define dgMsgKanji8E43Tex "__OTR__textures/kanji/gMsgKanji8E43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E43Tex[] = dgMsgKanji8E43Tex; + +#define dgMsgKanji8E44Tex "__OTR__textures/kanji/gMsgKanji8E44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E44Tex[] = dgMsgKanji8E44Tex; + +#define dgMsgKanji8E45Tex "__OTR__textures/kanji/gMsgKanji8E45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E45Tex[] = dgMsgKanji8E45Tex; + +#define dgMsgKanji8E46Tex "__OTR__textures/kanji/gMsgKanji8E46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E46Tex[] = dgMsgKanji8E46Tex; + +#define dgMsgKanji8E47Tex "__OTR__textures/kanji/gMsgKanji8E47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E47Tex[] = dgMsgKanji8E47Tex; + +#define dgMsgKanji8E48Tex "__OTR__textures/kanji/gMsgKanji8E48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E48Tex[] = dgMsgKanji8E48Tex; + +#define dgMsgKanji8E49Tex "__OTR__textures/kanji/gMsgKanji8E49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E49Tex[] = dgMsgKanji8E49Tex; + +#define dgMsgKanji8E4ATex "__OTR__textures/kanji/gMsgKanji8E4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E4ATex[] = dgMsgKanji8E4ATex; + +#define dgMsgKanji8E4BTex "__OTR__textures/kanji/gMsgKanji8E4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E4BTex[] = dgMsgKanji8E4BTex; + +#define dgMsgKanji8E4CTex "__OTR__textures/kanji/gMsgKanji8E4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E4CTex[] = dgMsgKanji8E4CTex; + +#define dgMsgKanji8E4DTex "__OTR__textures/kanji/gMsgKanji8E4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E4DTex[] = dgMsgKanji8E4DTex; + +#define dgMsgKanji8E4ETex "__OTR__textures/kanji/gMsgKanji8E4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E4ETex[] = dgMsgKanji8E4ETex; + +#define dgMsgKanji8E4FTex "__OTR__textures/kanji/gMsgKanji8E4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8E4FTex[] = dgMsgKanji8E4FTex; + +#define dgMsgKanji8E50Tex "__OTR__textures/kanji/gMsgKanji8E50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E50Tex[] = dgMsgKanji8E50Tex; + +#define dgMsgKanji8E51Tex "__OTR__textures/kanji/gMsgKanji8E51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E51Tex[] = dgMsgKanji8E51Tex; + +#define dgMsgKanji8E52Tex "__OTR__textures/kanji/gMsgKanji8E52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E52Tex[] = dgMsgKanji8E52Tex; + +#define dgMsgKanji8E53Tex "__OTR__textures/kanji/gMsgKanji8E53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E53Tex[] = dgMsgKanji8E53Tex; + +#define dgMsgKanji8E54Tex "__OTR__textures/kanji/gMsgKanji8E54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E54Tex[] = dgMsgKanji8E54Tex; + +#define dgMsgKanji8E55Tex "__OTR__textures/kanji/gMsgKanji8E55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E55Tex[] = dgMsgKanji8E55Tex; + +#define dgMsgKanji8E56Tex "__OTR__textures/kanji/gMsgKanji8E56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E56Tex[] = dgMsgKanji8E56Tex; + +#define dgMsgKanji8E57Tex "__OTR__textures/kanji/gMsgKanji8E57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E57Tex[] = dgMsgKanji8E57Tex; + +#define dgMsgKanji8E58Tex "__OTR__textures/kanji/gMsgKanji8E58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E58Tex[] = dgMsgKanji8E58Tex; + +#define dgMsgKanji8E59Tex "__OTR__textures/kanji/gMsgKanji8E59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E59Tex[] = dgMsgKanji8E59Tex; + +#define dgMsgKanji8E5ATex "__OTR__textures/kanji/gMsgKanji8E5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E5ATex[] = dgMsgKanji8E5ATex; + +#define dgMsgKanji8E5BTex "__OTR__textures/kanji/gMsgKanji8E5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E5BTex[] = dgMsgKanji8E5BTex; + +#define dgMsgKanji8E5CTex "__OTR__textures/kanji/gMsgKanji8E5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E5CTex[] = dgMsgKanji8E5CTex; + +#define dgMsgKanji8E5DTex "__OTR__textures/kanji/gMsgKanji8E5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E5DTex[] = dgMsgKanji8E5DTex; + +#define dgMsgKanji8E5ETex "__OTR__textures/kanji/gMsgKanji8E5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E5ETex[] = dgMsgKanji8E5ETex; + +#define dgMsgKanji8E5FTex "__OTR__textures/kanji/gMsgKanji8E5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8E5FTex[] = dgMsgKanji8E5FTex; + +#define dgMsgKanji8E60Tex "__OTR__textures/kanji/gMsgKanji8E60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E60Tex[] = dgMsgKanji8E60Tex; + +#define dgMsgKanji8E61Tex "__OTR__textures/kanji/gMsgKanji8E61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E61Tex[] = dgMsgKanji8E61Tex; + +#define dgMsgKanji8E62Tex "__OTR__textures/kanji/gMsgKanji8E62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E62Tex[] = dgMsgKanji8E62Tex; + +#define dgMsgKanji8E63Tex "__OTR__textures/kanji/gMsgKanji8E63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E63Tex[] = dgMsgKanji8E63Tex; + +#define dgMsgKanji8E64Tex "__OTR__textures/kanji/gMsgKanji8E64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E64Tex[] = dgMsgKanji8E64Tex; + +#define dgMsgKanji8E65Tex "__OTR__textures/kanji/gMsgKanji8E65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E65Tex[] = dgMsgKanji8E65Tex; + +#define dgMsgKanji8E66Tex "__OTR__textures/kanji/gMsgKanji8E66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E66Tex[] = dgMsgKanji8E66Tex; + +#define dgMsgKanji8E67Tex "__OTR__textures/kanji/gMsgKanji8E67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E67Tex[] = dgMsgKanji8E67Tex; + +#define dgMsgKanji8E68Tex "__OTR__textures/kanji/gMsgKanji8E68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E68Tex[] = dgMsgKanji8E68Tex; + +#define dgMsgKanji8E69Tex "__OTR__textures/kanji/gMsgKanji8E69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E69Tex[] = dgMsgKanji8E69Tex; + +#define dgMsgKanji8E6ATex "__OTR__textures/kanji/gMsgKanji8E6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E6ATex[] = dgMsgKanji8E6ATex; + +#define dgMsgKanji8E6BTex "__OTR__textures/kanji/gMsgKanji8E6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E6BTex[] = dgMsgKanji8E6BTex; + +#define dgMsgKanji8E6CTex "__OTR__textures/kanji/gMsgKanji8E6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E6CTex[] = dgMsgKanji8E6CTex; + +#define dgMsgKanji8E6DTex "__OTR__textures/kanji/gMsgKanji8E6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E6DTex[] = dgMsgKanji8E6DTex; + +#define dgMsgKanji8E6ETex "__OTR__textures/kanji/gMsgKanji8E6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E6ETex[] = dgMsgKanji8E6ETex; + +#define dgMsgKanji8E6FTex "__OTR__textures/kanji/gMsgKanji8E6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8E6FTex[] = dgMsgKanji8E6FTex; + +#define dgMsgKanji8E70Tex "__OTR__textures/kanji/gMsgKanji8E70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E70Tex[] = dgMsgKanji8E70Tex; + +#define dgMsgKanji8E71Tex "__OTR__textures/kanji/gMsgKanji8E71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E71Tex[] = dgMsgKanji8E71Tex; + +#define dgMsgKanji8E72Tex "__OTR__textures/kanji/gMsgKanji8E72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E72Tex[] = dgMsgKanji8E72Tex; + +#define dgMsgKanji8E73Tex "__OTR__textures/kanji/gMsgKanji8E73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E73Tex[] = dgMsgKanji8E73Tex; + +#define dgMsgKanji8E74Tex "__OTR__textures/kanji/gMsgKanji8E74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E74Tex[] = dgMsgKanji8E74Tex; + +#define dgMsgKanji8E75Tex "__OTR__textures/kanji/gMsgKanji8E75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E75Tex[] = dgMsgKanji8E75Tex; + +#define dgMsgKanji8E76Tex "__OTR__textures/kanji/gMsgKanji8E76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E76Tex[] = dgMsgKanji8E76Tex; + +#define dgMsgKanji8E77Tex "__OTR__textures/kanji/gMsgKanji8E77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E77Tex[] = dgMsgKanji8E77Tex; + +#define dgMsgKanji8E78Tex "__OTR__textures/kanji/gMsgKanji8E78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E78Tex[] = dgMsgKanji8E78Tex; + +#define dgMsgKanji8E79Tex "__OTR__textures/kanji/gMsgKanji8E79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E79Tex[] = dgMsgKanji8E79Tex; + +#define dgMsgKanji8E7ATex "__OTR__textures/kanji/gMsgKanji8E7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E7ATex[] = dgMsgKanji8E7ATex; + +#define dgMsgKanji8E7BTex "__OTR__textures/kanji/gMsgKanji8E7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E7BTex[] = dgMsgKanji8E7BTex; + +#define dgMsgKanji8E7CTex "__OTR__textures/kanji/gMsgKanji8E7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E7CTex[] = dgMsgKanji8E7CTex; + +#define dgMsgKanji8E7DTex "__OTR__textures/kanji/gMsgKanji8E7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E7DTex[] = dgMsgKanji8E7DTex; + +#define dgMsgKanji8E7ETex "__OTR__textures/kanji/gMsgKanji8E7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E7ETex[] = dgMsgKanji8E7ETex; + +#define dgMsgKanji8E80Tex "__OTR__textures/kanji/gMsgKanji8E80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E80Tex[] = dgMsgKanji8E80Tex; + +#define dgMsgKanji8E81Tex "__OTR__textures/kanji/gMsgKanji8E81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E81Tex[] = dgMsgKanji8E81Tex; + +#define dgMsgKanji8E82Tex "__OTR__textures/kanji/gMsgKanji8E82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E82Tex[] = dgMsgKanji8E82Tex; + +#define dgMsgKanji8E83Tex "__OTR__textures/kanji/gMsgKanji8E83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E83Tex[] = dgMsgKanji8E83Tex; + +#define dgMsgKanji8E84Tex "__OTR__textures/kanji/gMsgKanji8E84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E84Tex[] = dgMsgKanji8E84Tex; + +#define dgMsgKanji8E85Tex "__OTR__textures/kanji/gMsgKanji8E85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E85Tex[] = dgMsgKanji8E85Tex; + +#define dgMsgKanji8E86Tex "__OTR__textures/kanji/gMsgKanji8E86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E86Tex[] = dgMsgKanji8E86Tex; + +#define dgMsgKanji8E87Tex "__OTR__textures/kanji/gMsgKanji8E87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E87Tex[] = dgMsgKanji8E87Tex; + +#define dgMsgKanji8E88Tex "__OTR__textures/kanji/gMsgKanji8E88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E88Tex[] = dgMsgKanji8E88Tex; + +#define dgMsgKanji8E89Tex "__OTR__textures/kanji/gMsgKanji8E89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E89Tex[] = dgMsgKanji8E89Tex; + +#define dgMsgKanji8E8ATex "__OTR__textures/kanji/gMsgKanji8E8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E8ATex[] = dgMsgKanji8E8ATex; + +#define dgMsgKanji8E8BTex "__OTR__textures/kanji/gMsgKanji8E8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E8BTex[] = dgMsgKanji8E8BTex; + +#define dgMsgKanji8E8CTex "__OTR__textures/kanji/gMsgKanji8E8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E8CTex[] = dgMsgKanji8E8CTex; + +#define dgMsgKanji8E8DTex "__OTR__textures/kanji/gMsgKanji8E8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E8DTex[] = dgMsgKanji8E8DTex; + +#define dgMsgKanji8E8ETex "__OTR__textures/kanji/gMsgKanji8E8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E8ETex[] = dgMsgKanji8E8ETex; + +#define dgMsgKanji8E8FTex "__OTR__textures/kanji/gMsgKanji8E8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8E8FTex[] = dgMsgKanji8E8FTex; + +#define dgMsgKanji8E90Tex "__OTR__textures/kanji/gMsgKanji8E90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E90Tex[] = dgMsgKanji8E90Tex; + +#define dgMsgKanji8E91Tex "__OTR__textures/kanji/gMsgKanji8E91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E91Tex[] = dgMsgKanji8E91Tex; + +#define dgMsgKanji8E92Tex "__OTR__textures/kanji/gMsgKanji8E92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E92Tex[] = dgMsgKanji8E92Tex; + +#define dgMsgKanji8E93Tex "__OTR__textures/kanji/gMsgKanji8E93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E93Tex[] = dgMsgKanji8E93Tex; + +#define dgMsgKanji8E94Tex "__OTR__textures/kanji/gMsgKanji8E94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E94Tex[] = dgMsgKanji8E94Tex; + +#define dgMsgKanji8E95Tex "__OTR__textures/kanji/gMsgKanji8E95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E95Tex[] = dgMsgKanji8E95Tex; + +#define dgMsgKanji8E96Tex "__OTR__textures/kanji/gMsgKanji8E96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E96Tex[] = dgMsgKanji8E96Tex; + +#define dgMsgKanji8E97Tex "__OTR__textures/kanji/gMsgKanji8E97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E97Tex[] = dgMsgKanji8E97Tex; + +#define dgMsgKanji8E98Tex "__OTR__textures/kanji/gMsgKanji8E98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E98Tex[] = dgMsgKanji8E98Tex; + +#define dgMsgKanji8E99Tex "__OTR__textures/kanji/gMsgKanji8E99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E99Tex[] = dgMsgKanji8E99Tex; + +#define dgMsgKanji8E9ATex "__OTR__textures/kanji/gMsgKanji8E9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E9ATex[] = dgMsgKanji8E9ATex; + +#define dgMsgKanji8E9BTex "__OTR__textures/kanji/gMsgKanji8E9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E9BTex[] = dgMsgKanji8E9BTex; + +#define dgMsgKanji8E9CTex "__OTR__textures/kanji/gMsgKanji8E9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E9CTex[] = dgMsgKanji8E9CTex; + +#define dgMsgKanji8E9DTex "__OTR__textures/kanji/gMsgKanji8E9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E9DTex[] = dgMsgKanji8E9DTex; + +#define dgMsgKanji8E9ETex "__OTR__textures/kanji/gMsgKanji8E9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E9ETex[] = dgMsgKanji8E9ETex; + +#define dgMsgKanji8E9FTex "__OTR__textures/kanji/gMsgKanji8E9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8E9FTex[] = dgMsgKanji8E9FTex; + +#define dgMsgKanji8EA0Tex "__OTR__textures/kanji/gMsgKanji8EA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA0Tex[] = dgMsgKanji8EA0Tex; + +#define dgMsgKanji8EA1Tex "__OTR__textures/kanji/gMsgKanji8EA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA1Tex[] = dgMsgKanji8EA1Tex; + +#define dgMsgKanji8EA2Tex "__OTR__textures/kanji/gMsgKanji8EA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA2Tex[] = dgMsgKanji8EA2Tex; + +#define dgMsgKanji8EA3Tex "__OTR__textures/kanji/gMsgKanji8EA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA3Tex[] = dgMsgKanji8EA3Tex; + +#define dgMsgKanji8EA4Tex "__OTR__textures/kanji/gMsgKanji8EA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA4Tex[] = dgMsgKanji8EA4Tex; + +#define dgMsgKanji8EA5Tex "__OTR__textures/kanji/gMsgKanji8EA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA5Tex[] = dgMsgKanji8EA5Tex; + +#define dgMsgKanji8EA6Tex "__OTR__textures/kanji/gMsgKanji8EA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA6Tex[] = dgMsgKanji8EA6Tex; + +#define dgMsgKanji8EA7Tex "__OTR__textures/kanji/gMsgKanji8EA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA7Tex[] = dgMsgKanji8EA7Tex; + +#define dgMsgKanji8EA8Tex "__OTR__textures/kanji/gMsgKanji8EA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA8Tex[] = dgMsgKanji8EA8Tex; + +#define dgMsgKanji8EA9Tex "__OTR__textures/kanji/gMsgKanji8EA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA9Tex[] = dgMsgKanji8EA9Tex; + +#define dgMsgKanji8EAATex "__OTR__textures/kanji/gMsgKanji8EAATex" +static const ALIGN_ASSET(2) char gMsgKanji8EAATex[] = dgMsgKanji8EAATex; + +#define dgMsgKanji8EABTex "__OTR__textures/kanji/gMsgKanji8EABTex" +static const ALIGN_ASSET(2) char gMsgKanji8EABTex[] = dgMsgKanji8EABTex; + +#define dgMsgKanji8EACTex "__OTR__textures/kanji/gMsgKanji8EACTex" +static const ALIGN_ASSET(2) char gMsgKanji8EACTex[] = dgMsgKanji8EACTex; + +#define dgMsgKanji8EADTex "__OTR__textures/kanji/gMsgKanji8EADTex" +static const ALIGN_ASSET(2) char gMsgKanji8EADTex[] = dgMsgKanji8EADTex; + +#define dgMsgKanji8EAETex "__OTR__textures/kanji/gMsgKanji8EAETex" +static const ALIGN_ASSET(2) char gMsgKanji8EAETex[] = dgMsgKanji8EAETex; + +#define dgMsgKanji8EAFTex "__OTR__textures/kanji/gMsgKanji8EAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8EAFTex[] = dgMsgKanji8EAFTex; + +#define dgMsgKanji8EB0Tex "__OTR__textures/kanji/gMsgKanji8EB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB0Tex[] = dgMsgKanji8EB0Tex; + +#define dgMsgKanji8EB1Tex "__OTR__textures/kanji/gMsgKanji8EB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB1Tex[] = dgMsgKanji8EB1Tex; + +#define dgMsgKanji8EB2Tex "__OTR__textures/kanji/gMsgKanji8EB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB2Tex[] = dgMsgKanji8EB2Tex; + +#define dgMsgKanji8EB3Tex "__OTR__textures/kanji/gMsgKanji8EB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB3Tex[] = dgMsgKanji8EB3Tex; + +#define dgMsgKanji8EB4Tex "__OTR__textures/kanji/gMsgKanji8EB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB4Tex[] = dgMsgKanji8EB4Tex; + +#define dgMsgKanji8EB5Tex "__OTR__textures/kanji/gMsgKanji8EB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB5Tex[] = dgMsgKanji8EB5Tex; + +#define dgMsgKanji8EB6Tex "__OTR__textures/kanji/gMsgKanji8EB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB6Tex[] = dgMsgKanji8EB6Tex; + +#define dgMsgKanji8EB7Tex "__OTR__textures/kanji/gMsgKanji8EB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB7Tex[] = dgMsgKanji8EB7Tex; + +#define dgMsgKanji8EB8Tex "__OTR__textures/kanji/gMsgKanji8EB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB8Tex[] = dgMsgKanji8EB8Tex; + +#define dgMsgKanji8EB9Tex "__OTR__textures/kanji/gMsgKanji8EB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB9Tex[] = dgMsgKanji8EB9Tex; + +#define dgMsgKanji8EBATex "__OTR__textures/kanji/gMsgKanji8EBATex" +static const ALIGN_ASSET(2) char gMsgKanji8EBATex[] = dgMsgKanji8EBATex; + +#define dgMsgKanji8EBBTex "__OTR__textures/kanji/gMsgKanji8EBBTex" +static const ALIGN_ASSET(2) char gMsgKanji8EBBTex[] = dgMsgKanji8EBBTex; + +#define dgMsgKanji8EBCTex "__OTR__textures/kanji/gMsgKanji8EBCTex" +static const ALIGN_ASSET(2) char gMsgKanji8EBCTex[] = dgMsgKanji8EBCTex; + +#define dgMsgKanji8EBDTex "__OTR__textures/kanji/gMsgKanji8EBDTex" +static const ALIGN_ASSET(2) char gMsgKanji8EBDTex[] = dgMsgKanji8EBDTex; + +#define dgMsgKanji8EBETex "__OTR__textures/kanji/gMsgKanji8EBETex" +static const ALIGN_ASSET(2) char gMsgKanji8EBETex[] = dgMsgKanji8EBETex; + +#define dgMsgKanji8EBFTex "__OTR__textures/kanji/gMsgKanji8EBFTex" +static const ALIGN_ASSET(2) char gMsgKanji8EBFTex[] = dgMsgKanji8EBFTex; + +#define dgMsgKanji8EC0Tex "__OTR__textures/kanji/gMsgKanji8EC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC0Tex[] = dgMsgKanji8EC0Tex; + +#define dgMsgKanji8EC1Tex "__OTR__textures/kanji/gMsgKanji8EC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC1Tex[] = dgMsgKanji8EC1Tex; + +#define dgMsgKanji8EC2Tex "__OTR__textures/kanji/gMsgKanji8EC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC2Tex[] = dgMsgKanji8EC2Tex; + +#define dgMsgKanji8EC3Tex "__OTR__textures/kanji/gMsgKanji8EC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC3Tex[] = dgMsgKanji8EC3Tex; + +#define dgMsgKanji8EC4Tex "__OTR__textures/kanji/gMsgKanji8EC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC4Tex[] = dgMsgKanji8EC4Tex; + +#define dgMsgKanji8EC5Tex "__OTR__textures/kanji/gMsgKanji8EC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC5Tex[] = dgMsgKanji8EC5Tex; + +#define dgMsgKanji8EC6Tex "__OTR__textures/kanji/gMsgKanji8EC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC6Tex[] = dgMsgKanji8EC6Tex; + +#define dgMsgKanji8EC7Tex "__OTR__textures/kanji/gMsgKanji8EC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC7Tex[] = dgMsgKanji8EC7Tex; + +#define dgMsgKanji8EC8Tex "__OTR__textures/kanji/gMsgKanji8EC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC8Tex[] = dgMsgKanji8EC8Tex; + +#define dgMsgKanji8EC9Tex "__OTR__textures/kanji/gMsgKanji8EC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC9Tex[] = dgMsgKanji8EC9Tex; + +#define dgMsgKanji8ECATex "__OTR__textures/kanji/gMsgKanji8ECATex" +static const ALIGN_ASSET(2) char gMsgKanji8ECATex[] = dgMsgKanji8ECATex; + +#define dgMsgKanji8ECBTex "__OTR__textures/kanji/gMsgKanji8ECBTex" +static const ALIGN_ASSET(2) char gMsgKanji8ECBTex[] = dgMsgKanji8ECBTex; + +#define dgMsgKanji8ECCTex "__OTR__textures/kanji/gMsgKanji8ECCTex" +static const ALIGN_ASSET(2) char gMsgKanji8ECCTex[] = dgMsgKanji8ECCTex; + +#define dgMsgKanji8ECDTex "__OTR__textures/kanji/gMsgKanji8ECDTex" +static const ALIGN_ASSET(2) char gMsgKanji8ECDTex[] = dgMsgKanji8ECDTex; + +#define dgMsgKanji8ECETex "__OTR__textures/kanji/gMsgKanji8ECETex" +static const ALIGN_ASSET(2) char gMsgKanji8ECETex[] = dgMsgKanji8ECETex; + +#define dgMsgKanji8ECFTex "__OTR__textures/kanji/gMsgKanji8ECFTex" +static const ALIGN_ASSET(2) char gMsgKanji8ECFTex[] = dgMsgKanji8ECFTex; + +#define dgMsgKanji8ED0Tex "__OTR__textures/kanji/gMsgKanji8ED0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED0Tex[] = dgMsgKanji8ED0Tex; + +#define dgMsgKanji8ED1Tex "__OTR__textures/kanji/gMsgKanji8ED1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED1Tex[] = dgMsgKanji8ED1Tex; + +#define dgMsgKanji8ED2Tex "__OTR__textures/kanji/gMsgKanji8ED2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED2Tex[] = dgMsgKanji8ED2Tex; + +#define dgMsgKanji8ED3Tex "__OTR__textures/kanji/gMsgKanji8ED3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED3Tex[] = dgMsgKanji8ED3Tex; + +#define dgMsgKanji8ED4Tex "__OTR__textures/kanji/gMsgKanji8ED4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED4Tex[] = dgMsgKanji8ED4Tex; + +#define dgMsgKanji8ED5Tex "__OTR__textures/kanji/gMsgKanji8ED5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED5Tex[] = dgMsgKanji8ED5Tex; + +#define dgMsgKanji8ED6Tex "__OTR__textures/kanji/gMsgKanji8ED6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED6Tex[] = dgMsgKanji8ED6Tex; + +#define dgMsgKanji8ED7Tex "__OTR__textures/kanji/gMsgKanji8ED7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED7Tex[] = dgMsgKanji8ED7Tex; + +#define dgMsgKanji8ED8Tex "__OTR__textures/kanji/gMsgKanji8ED8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED8Tex[] = dgMsgKanji8ED8Tex; + +#define dgMsgKanji8ED9Tex "__OTR__textures/kanji/gMsgKanji8ED9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED9Tex[] = dgMsgKanji8ED9Tex; + +#define dgMsgKanji8EDATex "__OTR__textures/kanji/gMsgKanji8EDATex" +static const ALIGN_ASSET(2) char gMsgKanji8EDATex[] = dgMsgKanji8EDATex; + +#define dgMsgKanji8EDBTex "__OTR__textures/kanji/gMsgKanji8EDBTex" +static const ALIGN_ASSET(2) char gMsgKanji8EDBTex[] = dgMsgKanji8EDBTex; + +#define dgMsgKanji8EDCTex "__OTR__textures/kanji/gMsgKanji8EDCTex" +static const ALIGN_ASSET(2) char gMsgKanji8EDCTex[] = dgMsgKanji8EDCTex; + +#define dgMsgKanji8EDDTex "__OTR__textures/kanji/gMsgKanji8EDDTex" +static const ALIGN_ASSET(2) char gMsgKanji8EDDTex[] = dgMsgKanji8EDDTex; + +#define dgMsgKanji8EDETex "__OTR__textures/kanji/gMsgKanji8EDETex" +static const ALIGN_ASSET(2) char gMsgKanji8EDETex[] = dgMsgKanji8EDETex; + +#define dgMsgKanji8EDFTex "__OTR__textures/kanji/gMsgKanji8EDFTex" +static const ALIGN_ASSET(2) char gMsgKanji8EDFTex[] = dgMsgKanji8EDFTex; + +#define dgMsgKanji8EE0Tex "__OTR__textures/kanji/gMsgKanji8EE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE0Tex[] = dgMsgKanji8EE0Tex; + +#define dgMsgKanji8EE1Tex "__OTR__textures/kanji/gMsgKanji8EE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE1Tex[] = dgMsgKanji8EE1Tex; + +#define dgMsgKanji8EE2Tex "__OTR__textures/kanji/gMsgKanji8EE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE2Tex[] = dgMsgKanji8EE2Tex; + +#define dgMsgKanji8EE3Tex "__OTR__textures/kanji/gMsgKanji8EE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE3Tex[] = dgMsgKanji8EE3Tex; + +#define dgMsgKanji8EE4Tex "__OTR__textures/kanji/gMsgKanji8EE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE4Tex[] = dgMsgKanji8EE4Tex; + +#define dgMsgKanji8EE5Tex "__OTR__textures/kanji/gMsgKanji8EE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE5Tex[] = dgMsgKanji8EE5Tex; + +#define dgMsgKanji8EE6Tex "__OTR__textures/kanji/gMsgKanji8EE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE6Tex[] = dgMsgKanji8EE6Tex; + +#define dgMsgKanji8EE7Tex "__OTR__textures/kanji/gMsgKanji8EE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE7Tex[] = dgMsgKanji8EE7Tex; + +#define dgMsgKanji8EE8Tex "__OTR__textures/kanji/gMsgKanji8EE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE8Tex[] = dgMsgKanji8EE8Tex; + +#define dgMsgKanji8EE9Tex "__OTR__textures/kanji/gMsgKanji8EE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE9Tex[] = dgMsgKanji8EE9Tex; + +#define dgMsgKanji8EEATex "__OTR__textures/kanji/gMsgKanji8EEATex" +static const ALIGN_ASSET(2) char gMsgKanji8EEATex[] = dgMsgKanji8EEATex; + +#define dgMsgKanji8EEBTex "__OTR__textures/kanji/gMsgKanji8EEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8EEBTex[] = dgMsgKanji8EEBTex; + +#define dgMsgKanji8EECTex "__OTR__textures/kanji/gMsgKanji8EECTex" +static const ALIGN_ASSET(2) char gMsgKanji8EECTex[] = dgMsgKanji8EECTex; + +#define dgMsgKanji8EEDTex "__OTR__textures/kanji/gMsgKanji8EEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8EEDTex[] = dgMsgKanji8EEDTex; + +#define dgMsgKanji8EEETex "__OTR__textures/kanji/gMsgKanji8EEETex" +static const ALIGN_ASSET(2) char gMsgKanji8EEETex[] = dgMsgKanji8EEETex; + +#define dgMsgKanji8EEFTex "__OTR__textures/kanji/gMsgKanji8EEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8EEFTex[] = dgMsgKanji8EEFTex; + +#define dgMsgKanji8EF0Tex "__OTR__textures/kanji/gMsgKanji8EF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF0Tex[] = dgMsgKanji8EF0Tex; + +#define dgMsgKanji8EF1Tex "__OTR__textures/kanji/gMsgKanji8EF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF1Tex[] = dgMsgKanji8EF1Tex; + +#define dgMsgKanji8EF2Tex "__OTR__textures/kanji/gMsgKanji8EF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF2Tex[] = dgMsgKanji8EF2Tex; + +#define dgMsgKanji8EF3Tex "__OTR__textures/kanji/gMsgKanji8EF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF3Tex[] = dgMsgKanji8EF3Tex; + +#define dgMsgKanji8EF4Tex "__OTR__textures/kanji/gMsgKanji8EF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF4Tex[] = dgMsgKanji8EF4Tex; + +#define dgMsgKanji8EF5Tex "__OTR__textures/kanji/gMsgKanji8EF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF5Tex[] = dgMsgKanji8EF5Tex; + +#define dgMsgKanji8EF6Tex "__OTR__textures/kanji/gMsgKanji8EF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF6Tex[] = dgMsgKanji8EF6Tex; + +#define dgMsgKanji8EF7Tex "__OTR__textures/kanji/gMsgKanji8EF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF7Tex[] = dgMsgKanji8EF7Tex; + +#define dgMsgKanji8EF8Tex "__OTR__textures/kanji/gMsgKanji8EF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF8Tex[] = dgMsgKanji8EF8Tex; + +#define dgMsgKanji8EF9Tex "__OTR__textures/kanji/gMsgKanji8EF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF9Tex[] = dgMsgKanji8EF9Tex; + +#define dgMsgKanji8EFATex "__OTR__textures/kanji/gMsgKanji8EFATex" +static const ALIGN_ASSET(2) char gMsgKanji8EFATex[] = dgMsgKanji8EFATex; + +#define dgMsgKanji8EFBTex "__OTR__textures/kanji/gMsgKanji8EFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8EFBTex[] = dgMsgKanji8EFBTex; + +#define dgMsgKanji8EFCTex "__OTR__textures/kanji/gMsgKanji8EFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8EFCTex[] = dgMsgKanji8EFCTex; + +#define dgMsgKanji8F40Tex "__OTR__textures/kanji/gMsgKanji8F40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F40Tex[] = dgMsgKanji8F40Tex; + +#define dgMsgKanji8F41Tex "__OTR__textures/kanji/gMsgKanji8F41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F41Tex[] = dgMsgKanji8F41Tex; + +#define dgMsgKanji8F42Tex "__OTR__textures/kanji/gMsgKanji8F42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F42Tex[] = dgMsgKanji8F42Tex; + +#define dgMsgKanji8F43Tex "__OTR__textures/kanji/gMsgKanji8F43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F43Tex[] = dgMsgKanji8F43Tex; + +#define dgMsgKanji8F44Tex "__OTR__textures/kanji/gMsgKanji8F44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F44Tex[] = dgMsgKanji8F44Tex; + +#define dgMsgKanji8F45Tex "__OTR__textures/kanji/gMsgKanji8F45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F45Tex[] = dgMsgKanji8F45Tex; + +#define dgMsgKanji8F46Tex "__OTR__textures/kanji/gMsgKanji8F46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F46Tex[] = dgMsgKanji8F46Tex; + +#define dgMsgKanji8F47Tex "__OTR__textures/kanji/gMsgKanji8F47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F47Tex[] = dgMsgKanji8F47Tex; + +#define dgMsgKanji8F48Tex "__OTR__textures/kanji/gMsgKanji8F48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F48Tex[] = dgMsgKanji8F48Tex; + +#define dgMsgKanji8F49Tex "__OTR__textures/kanji/gMsgKanji8F49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F49Tex[] = dgMsgKanji8F49Tex; + +#define dgMsgKanji8F4ATex "__OTR__textures/kanji/gMsgKanji8F4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F4ATex[] = dgMsgKanji8F4ATex; + +#define dgMsgKanji8F4BTex "__OTR__textures/kanji/gMsgKanji8F4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F4BTex[] = dgMsgKanji8F4BTex; + +#define dgMsgKanji8F4CTex "__OTR__textures/kanji/gMsgKanji8F4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F4CTex[] = dgMsgKanji8F4CTex; + +#define dgMsgKanji8F4DTex "__OTR__textures/kanji/gMsgKanji8F4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F4DTex[] = dgMsgKanji8F4DTex; + +#define dgMsgKanji8F4ETex "__OTR__textures/kanji/gMsgKanji8F4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F4ETex[] = dgMsgKanji8F4ETex; + +#define dgMsgKanji8F4FTex "__OTR__textures/kanji/gMsgKanji8F4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8F4FTex[] = dgMsgKanji8F4FTex; + +#define dgMsgKanji8F50Tex "__OTR__textures/kanji/gMsgKanji8F50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F50Tex[] = dgMsgKanji8F50Tex; + +#define dgMsgKanji8F51Tex "__OTR__textures/kanji/gMsgKanji8F51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F51Tex[] = dgMsgKanji8F51Tex; + +#define dgMsgKanji8F52Tex "__OTR__textures/kanji/gMsgKanji8F52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F52Tex[] = dgMsgKanji8F52Tex; + +#define dgMsgKanji8F53Tex "__OTR__textures/kanji/gMsgKanji8F53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F53Tex[] = dgMsgKanji8F53Tex; + +#define dgMsgKanji8F54Tex "__OTR__textures/kanji/gMsgKanji8F54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F54Tex[] = dgMsgKanji8F54Tex; + +#define dgMsgKanji8F55Tex "__OTR__textures/kanji/gMsgKanji8F55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F55Tex[] = dgMsgKanji8F55Tex; + +#define dgMsgKanji8F56Tex "__OTR__textures/kanji/gMsgKanji8F56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F56Tex[] = dgMsgKanji8F56Tex; + +#define dgMsgKanji8F57Tex "__OTR__textures/kanji/gMsgKanji8F57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F57Tex[] = dgMsgKanji8F57Tex; + +#define dgMsgKanji8F58Tex "__OTR__textures/kanji/gMsgKanji8F58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F58Tex[] = dgMsgKanji8F58Tex; + +#define dgMsgKanji8F59Tex "__OTR__textures/kanji/gMsgKanji8F59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F59Tex[] = dgMsgKanji8F59Tex; + +#define dgMsgKanji8F5ATex "__OTR__textures/kanji/gMsgKanji8F5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F5ATex[] = dgMsgKanji8F5ATex; + +#define dgMsgKanji8F5BTex "__OTR__textures/kanji/gMsgKanji8F5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F5BTex[] = dgMsgKanji8F5BTex; + +#define dgMsgKanji8F5CTex "__OTR__textures/kanji/gMsgKanji8F5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F5CTex[] = dgMsgKanji8F5CTex; + +#define dgMsgKanji8F5DTex "__OTR__textures/kanji/gMsgKanji8F5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F5DTex[] = dgMsgKanji8F5DTex; + +#define dgMsgKanji8F5ETex "__OTR__textures/kanji/gMsgKanji8F5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F5ETex[] = dgMsgKanji8F5ETex; + +#define dgMsgKanji8F5FTex "__OTR__textures/kanji/gMsgKanji8F5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8F5FTex[] = dgMsgKanji8F5FTex; + +#define dgMsgKanji8F60Tex "__OTR__textures/kanji/gMsgKanji8F60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F60Tex[] = dgMsgKanji8F60Tex; + +#define dgMsgKanji8F61Tex "__OTR__textures/kanji/gMsgKanji8F61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F61Tex[] = dgMsgKanji8F61Tex; + +#define dgMsgKanji8F62Tex "__OTR__textures/kanji/gMsgKanji8F62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F62Tex[] = dgMsgKanji8F62Tex; + +#define dgMsgKanji8F63Tex "__OTR__textures/kanji/gMsgKanji8F63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F63Tex[] = dgMsgKanji8F63Tex; + +#define dgMsgKanji8F64Tex "__OTR__textures/kanji/gMsgKanji8F64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F64Tex[] = dgMsgKanji8F64Tex; + +#define dgMsgKanji8F65Tex "__OTR__textures/kanji/gMsgKanji8F65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F65Tex[] = dgMsgKanji8F65Tex; + +#define dgMsgKanji8F66Tex "__OTR__textures/kanji/gMsgKanji8F66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F66Tex[] = dgMsgKanji8F66Tex; + +#define dgMsgKanji8F67Tex "__OTR__textures/kanji/gMsgKanji8F67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F67Tex[] = dgMsgKanji8F67Tex; + +#define dgMsgKanji8F68Tex "__OTR__textures/kanji/gMsgKanji8F68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F68Tex[] = dgMsgKanji8F68Tex; + +#define dgMsgKanji8F69Tex "__OTR__textures/kanji/gMsgKanji8F69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F69Tex[] = dgMsgKanji8F69Tex; + +#define dgMsgKanji8F6ATex "__OTR__textures/kanji/gMsgKanji8F6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F6ATex[] = dgMsgKanji8F6ATex; + +#define dgMsgKanji8F6BTex "__OTR__textures/kanji/gMsgKanji8F6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F6BTex[] = dgMsgKanji8F6BTex; + +#define dgMsgKanji8F6CTex "__OTR__textures/kanji/gMsgKanji8F6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F6CTex[] = dgMsgKanji8F6CTex; + +#define dgMsgKanji8F6DTex "__OTR__textures/kanji/gMsgKanji8F6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F6DTex[] = dgMsgKanji8F6DTex; + +#define dgMsgKanji8F6ETex "__OTR__textures/kanji/gMsgKanji8F6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F6ETex[] = dgMsgKanji8F6ETex; + +#define dgMsgKanji8F6FTex "__OTR__textures/kanji/gMsgKanji8F6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8F6FTex[] = dgMsgKanji8F6FTex; + +#define dgMsgKanji8F70Tex "__OTR__textures/kanji/gMsgKanji8F70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F70Tex[] = dgMsgKanji8F70Tex; + +#define dgMsgKanji8F71Tex "__OTR__textures/kanji/gMsgKanji8F71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F71Tex[] = dgMsgKanji8F71Tex; + +#define dgMsgKanji8F72Tex "__OTR__textures/kanji/gMsgKanji8F72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F72Tex[] = dgMsgKanji8F72Tex; + +#define dgMsgKanji8F73Tex "__OTR__textures/kanji/gMsgKanji8F73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F73Tex[] = dgMsgKanji8F73Tex; + +#define dgMsgKanji8F74Tex "__OTR__textures/kanji/gMsgKanji8F74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F74Tex[] = dgMsgKanji8F74Tex; + +#define dgMsgKanji8F75Tex "__OTR__textures/kanji/gMsgKanji8F75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F75Tex[] = dgMsgKanji8F75Tex; + +#define dgMsgKanji8F76Tex "__OTR__textures/kanji/gMsgKanji8F76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F76Tex[] = dgMsgKanji8F76Tex; + +#define dgMsgKanji8F77Tex "__OTR__textures/kanji/gMsgKanji8F77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F77Tex[] = dgMsgKanji8F77Tex; + +#define dgMsgKanji8F78Tex "__OTR__textures/kanji/gMsgKanji8F78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F78Tex[] = dgMsgKanji8F78Tex; + +#define dgMsgKanji8F79Tex "__OTR__textures/kanji/gMsgKanji8F79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F79Tex[] = dgMsgKanji8F79Tex; + +#define dgMsgKanji8F7ATex "__OTR__textures/kanji/gMsgKanji8F7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F7ATex[] = dgMsgKanji8F7ATex; + +#define dgMsgKanji8F7BTex "__OTR__textures/kanji/gMsgKanji8F7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F7BTex[] = dgMsgKanji8F7BTex; + +#define dgMsgKanji8F7CTex "__OTR__textures/kanji/gMsgKanji8F7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F7CTex[] = dgMsgKanji8F7CTex; + +#define dgMsgKanji8F7DTex "__OTR__textures/kanji/gMsgKanji8F7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F7DTex[] = dgMsgKanji8F7DTex; + +#define dgMsgKanji8F7ETex "__OTR__textures/kanji/gMsgKanji8F7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F7ETex[] = dgMsgKanji8F7ETex; + +#define dgMsgKanji8F80Tex "__OTR__textures/kanji/gMsgKanji8F80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F80Tex[] = dgMsgKanji8F80Tex; + +#define dgMsgKanji8F81Tex "__OTR__textures/kanji/gMsgKanji8F81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F81Tex[] = dgMsgKanji8F81Tex; + +#define dgMsgKanji8F82Tex "__OTR__textures/kanji/gMsgKanji8F82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F82Tex[] = dgMsgKanji8F82Tex; + +#define dgMsgKanji8F83Tex "__OTR__textures/kanji/gMsgKanji8F83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F83Tex[] = dgMsgKanji8F83Tex; + +#define dgMsgKanji8F84Tex "__OTR__textures/kanji/gMsgKanji8F84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F84Tex[] = dgMsgKanji8F84Tex; + +#define dgMsgKanji8F85Tex "__OTR__textures/kanji/gMsgKanji8F85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F85Tex[] = dgMsgKanji8F85Tex; + +#define dgMsgKanji8F86Tex "__OTR__textures/kanji/gMsgKanji8F86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F86Tex[] = dgMsgKanji8F86Tex; + +#define dgMsgKanji8F87Tex "__OTR__textures/kanji/gMsgKanji8F87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F87Tex[] = dgMsgKanji8F87Tex; + +#define dgMsgKanji8F88Tex "__OTR__textures/kanji/gMsgKanji8F88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F88Tex[] = dgMsgKanji8F88Tex; + +#define dgMsgKanji8F89Tex "__OTR__textures/kanji/gMsgKanji8F89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F89Tex[] = dgMsgKanji8F89Tex; + +#define dgMsgKanji8F8ATex "__OTR__textures/kanji/gMsgKanji8F8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F8ATex[] = dgMsgKanji8F8ATex; + +#define dgMsgKanji8F8BTex "__OTR__textures/kanji/gMsgKanji8F8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F8BTex[] = dgMsgKanji8F8BTex; + +#define dgMsgKanji8F8CTex "__OTR__textures/kanji/gMsgKanji8F8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F8CTex[] = dgMsgKanji8F8CTex; + +#define dgMsgKanji8F8DTex "__OTR__textures/kanji/gMsgKanji8F8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F8DTex[] = dgMsgKanji8F8DTex; + +#define dgMsgKanji8F8ETex "__OTR__textures/kanji/gMsgKanji8F8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F8ETex[] = dgMsgKanji8F8ETex; + +#define dgMsgKanji8F8FTex "__OTR__textures/kanji/gMsgKanji8F8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8F8FTex[] = dgMsgKanji8F8FTex; + +#define dgMsgKanji8F90Tex "__OTR__textures/kanji/gMsgKanji8F90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F90Tex[] = dgMsgKanji8F90Tex; + +#define dgMsgKanji8F91Tex "__OTR__textures/kanji/gMsgKanji8F91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F91Tex[] = dgMsgKanji8F91Tex; + +#define dgMsgKanji8F92Tex "__OTR__textures/kanji/gMsgKanji8F92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F92Tex[] = dgMsgKanji8F92Tex; + +#define dgMsgKanji8F93Tex "__OTR__textures/kanji/gMsgKanji8F93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F93Tex[] = dgMsgKanji8F93Tex; + +#define dgMsgKanji8F94Tex "__OTR__textures/kanji/gMsgKanji8F94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F94Tex[] = dgMsgKanji8F94Tex; + +#define dgMsgKanji8F95Tex "__OTR__textures/kanji/gMsgKanji8F95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F95Tex[] = dgMsgKanji8F95Tex; + +#define dgMsgKanji8F96Tex "__OTR__textures/kanji/gMsgKanji8F96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F96Tex[] = dgMsgKanji8F96Tex; + +#define dgMsgKanji8F97Tex "__OTR__textures/kanji/gMsgKanji8F97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F97Tex[] = dgMsgKanji8F97Tex; + +#define dgMsgKanji8F98Tex "__OTR__textures/kanji/gMsgKanji8F98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F98Tex[] = dgMsgKanji8F98Tex; + +#define dgMsgKanji8F99Tex "__OTR__textures/kanji/gMsgKanji8F99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F99Tex[] = dgMsgKanji8F99Tex; + +#define dgMsgKanji8F9ATex "__OTR__textures/kanji/gMsgKanji8F9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F9ATex[] = dgMsgKanji8F9ATex; + +#define dgMsgKanji8F9BTex "__OTR__textures/kanji/gMsgKanji8F9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F9BTex[] = dgMsgKanji8F9BTex; + +#define dgMsgKanji8F9CTex "__OTR__textures/kanji/gMsgKanji8F9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F9CTex[] = dgMsgKanji8F9CTex; + +#define dgMsgKanji8F9DTex "__OTR__textures/kanji/gMsgKanji8F9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F9DTex[] = dgMsgKanji8F9DTex; + +#define dgMsgKanji8F9ETex "__OTR__textures/kanji/gMsgKanji8F9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F9ETex[] = dgMsgKanji8F9ETex; + +#define dgMsgKanji8F9FTex "__OTR__textures/kanji/gMsgKanji8F9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8F9FTex[] = dgMsgKanji8F9FTex; + +#define dgMsgKanji8FA0Tex "__OTR__textures/kanji/gMsgKanji8FA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA0Tex[] = dgMsgKanji8FA0Tex; + +#define dgMsgKanji8FA1Tex "__OTR__textures/kanji/gMsgKanji8FA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA1Tex[] = dgMsgKanji8FA1Tex; + +#define dgMsgKanji8FA2Tex "__OTR__textures/kanji/gMsgKanji8FA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA2Tex[] = dgMsgKanji8FA2Tex; + +#define dgMsgKanji8FA3Tex "__OTR__textures/kanji/gMsgKanji8FA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA3Tex[] = dgMsgKanji8FA3Tex; + +#define dgMsgKanji8FA4Tex "__OTR__textures/kanji/gMsgKanji8FA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA4Tex[] = dgMsgKanji8FA4Tex; + +#define dgMsgKanji8FA5Tex "__OTR__textures/kanji/gMsgKanji8FA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA5Tex[] = dgMsgKanji8FA5Tex; + +#define dgMsgKanji8FA6Tex "__OTR__textures/kanji/gMsgKanji8FA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA6Tex[] = dgMsgKanji8FA6Tex; + +#define dgMsgKanji8FA7Tex "__OTR__textures/kanji/gMsgKanji8FA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA7Tex[] = dgMsgKanji8FA7Tex; + +#define dgMsgKanji8FA8Tex "__OTR__textures/kanji/gMsgKanji8FA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA8Tex[] = dgMsgKanji8FA8Tex; + +#define dgMsgKanji8FA9Tex "__OTR__textures/kanji/gMsgKanji8FA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA9Tex[] = dgMsgKanji8FA9Tex; + +#define dgMsgKanji8FAATex "__OTR__textures/kanji/gMsgKanji8FAATex" +static const ALIGN_ASSET(2) char gMsgKanji8FAATex[] = dgMsgKanji8FAATex; + +#define dgMsgKanji8FABTex "__OTR__textures/kanji/gMsgKanji8FABTex" +static const ALIGN_ASSET(2) char gMsgKanji8FABTex[] = dgMsgKanji8FABTex; + +#define dgMsgKanji8FACTex "__OTR__textures/kanji/gMsgKanji8FACTex" +static const ALIGN_ASSET(2) char gMsgKanji8FACTex[] = dgMsgKanji8FACTex; + +#define dgMsgKanji8FADTex "__OTR__textures/kanji/gMsgKanji8FADTex" +static const ALIGN_ASSET(2) char gMsgKanji8FADTex[] = dgMsgKanji8FADTex; + +#define dgMsgKanji8FAETex "__OTR__textures/kanji/gMsgKanji8FAETex" +static const ALIGN_ASSET(2) char gMsgKanji8FAETex[] = dgMsgKanji8FAETex; + +#define dgMsgKanji8FAFTex "__OTR__textures/kanji/gMsgKanji8FAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8FAFTex[] = dgMsgKanji8FAFTex; + +#define dgMsgKanji8FB0Tex "__OTR__textures/kanji/gMsgKanji8FB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB0Tex[] = dgMsgKanji8FB0Tex; + +#define dgMsgKanji8FB1Tex "__OTR__textures/kanji/gMsgKanji8FB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB1Tex[] = dgMsgKanji8FB1Tex; + +#define dgMsgKanji8FB2Tex "__OTR__textures/kanji/gMsgKanji8FB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB2Tex[] = dgMsgKanji8FB2Tex; + +#define dgMsgKanji8FB3Tex "__OTR__textures/kanji/gMsgKanji8FB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB3Tex[] = dgMsgKanji8FB3Tex; + +#define dgMsgKanji8FB4Tex "__OTR__textures/kanji/gMsgKanji8FB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB4Tex[] = dgMsgKanji8FB4Tex; + +#define dgMsgKanji8FB5Tex "__OTR__textures/kanji/gMsgKanji8FB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB5Tex[] = dgMsgKanji8FB5Tex; + +#define dgMsgKanji8FB6Tex "__OTR__textures/kanji/gMsgKanji8FB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB6Tex[] = dgMsgKanji8FB6Tex; + +#define dgMsgKanji8FB7Tex "__OTR__textures/kanji/gMsgKanji8FB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB7Tex[] = dgMsgKanji8FB7Tex; + +#define dgMsgKanji8FB8Tex "__OTR__textures/kanji/gMsgKanji8FB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB8Tex[] = dgMsgKanji8FB8Tex; + +#define dgMsgKanji8FB9Tex "__OTR__textures/kanji/gMsgKanji8FB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB9Tex[] = dgMsgKanji8FB9Tex; + +#define dgMsgKanji8FBATex "__OTR__textures/kanji/gMsgKanji8FBATex" +static const ALIGN_ASSET(2) char gMsgKanji8FBATex[] = dgMsgKanji8FBATex; + +#define dgMsgKanji8FBBTex "__OTR__textures/kanji/gMsgKanji8FBBTex" +static const ALIGN_ASSET(2) char gMsgKanji8FBBTex[] = dgMsgKanji8FBBTex; + +#define dgMsgKanji8FBCTex "__OTR__textures/kanji/gMsgKanji8FBCTex" +static const ALIGN_ASSET(2) char gMsgKanji8FBCTex[] = dgMsgKanji8FBCTex; + +#define dgMsgKanji8FBDTex "__OTR__textures/kanji/gMsgKanji8FBDTex" +static const ALIGN_ASSET(2) char gMsgKanji8FBDTex[] = dgMsgKanji8FBDTex; + +#define dgMsgKanji8FBETex "__OTR__textures/kanji/gMsgKanji8FBETex" +static const ALIGN_ASSET(2) char gMsgKanji8FBETex[] = dgMsgKanji8FBETex; + +#define dgMsgKanji8FBFTex "__OTR__textures/kanji/gMsgKanji8FBFTex" +static const ALIGN_ASSET(2) char gMsgKanji8FBFTex[] = dgMsgKanji8FBFTex; + +#define dgMsgKanji8FC0Tex "__OTR__textures/kanji/gMsgKanji8FC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC0Tex[] = dgMsgKanji8FC0Tex; + +#define dgMsgKanji8FC1Tex "__OTR__textures/kanji/gMsgKanji8FC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC1Tex[] = dgMsgKanji8FC1Tex; + +#define dgMsgKanji8FC2Tex "__OTR__textures/kanji/gMsgKanji8FC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC2Tex[] = dgMsgKanji8FC2Tex; + +#define dgMsgKanji8FC3Tex "__OTR__textures/kanji/gMsgKanji8FC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC3Tex[] = dgMsgKanji8FC3Tex; + +#define dgMsgKanji8FC4Tex "__OTR__textures/kanji/gMsgKanji8FC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC4Tex[] = dgMsgKanji8FC4Tex; + +#define dgMsgKanji8FC5Tex "__OTR__textures/kanji/gMsgKanji8FC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC5Tex[] = dgMsgKanji8FC5Tex; + +#define dgMsgKanji8FC6Tex "__OTR__textures/kanji/gMsgKanji8FC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC6Tex[] = dgMsgKanji8FC6Tex; + +#define dgMsgKanji8FC7Tex "__OTR__textures/kanji/gMsgKanji8FC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC7Tex[] = dgMsgKanji8FC7Tex; + +#define dgMsgKanji8FC8Tex "__OTR__textures/kanji/gMsgKanji8FC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC8Tex[] = dgMsgKanji8FC8Tex; + +#define dgMsgKanji8FC9Tex "__OTR__textures/kanji/gMsgKanji8FC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC9Tex[] = dgMsgKanji8FC9Tex; + +#define dgMsgKanji8FCATex "__OTR__textures/kanji/gMsgKanji8FCATex" +static const ALIGN_ASSET(2) char gMsgKanji8FCATex[] = dgMsgKanji8FCATex; + +#define dgMsgKanji8FCBTex "__OTR__textures/kanji/gMsgKanji8FCBTex" +static const ALIGN_ASSET(2) char gMsgKanji8FCBTex[] = dgMsgKanji8FCBTex; + +#define dgMsgKanji8FCCTex "__OTR__textures/kanji/gMsgKanji8FCCTex" +static const ALIGN_ASSET(2) char gMsgKanji8FCCTex[] = dgMsgKanji8FCCTex; + +#define dgMsgKanji8FCDTex "__OTR__textures/kanji/gMsgKanji8FCDTex" +static const ALIGN_ASSET(2) char gMsgKanji8FCDTex[] = dgMsgKanji8FCDTex; + +#define dgMsgKanji8FCETex "__OTR__textures/kanji/gMsgKanji8FCETex" +static const ALIGN_ASSET(2) char gMsgKanji8FCETex[] = dgMsgKanji8FCETex; + +#define dgMsgKanji8FCFTex "__OTR__textures/kanji/gMsgKanji8FCFTex" +static const ALIGN_ASSET(2) char gMsgKanji8FCFTex[] = dgMsgKanji8FCFTex; + +#define dgMsgKanji8FD0Tex "__OTR__textures/kanji/gMsgKanji8FD0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD0Tex[] = dgMsgKanji8FD0Tex; + +#define dgMsgKanji8FD1Tex "__OTR__textures/kanji/gMsgKanji8FD1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD1Tex[] = dgMsgKanji8FD1Tex; + +#define dgMsgKanji8FD2Tex "__OTR__textures/kanji/gMsgKanji8FD2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD2Tex[] = dgMsgKanji8FD2Tex; + +#define dgMsgKanji8FD3Tex "__OTR__textures/kanji/gMsgKanji8FD3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD3Tex[] = dgMsgKanji8FD3Tex; + +#define dgMsgKanji8FD4Tex "__OTR__textures/kanji/gMsgKanji8FD4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD4Tex[] = dgMsgKanji8FD4Tex; + +#define dgMsgKanji8FD5Tex "__OTR__textures/kanji/gMsgKanji8FD5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD5Tex[] = dgMsgKanji8FD5Tex; + +#define dgMsgKanji8FD6Tex "__OTR__textures/kanji/gMsgKanji8FD6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD6Tex[] = dgMsgKanji8FD6Tex; + +#define dgMsgKanji8FD7Tex "__OTR__textures/kanji/gMsgKanji8FD7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD7Tex[] = dgMsgKanji8FD7Tex; + +#define dgMsgKanji8FD8Tex "__OTR__textures/kanji/gMsgKanji8FD8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD8Tex[] = dgMsgKanji8FD8Tex; + +#define dgMsgKanji8FD9Tex "__OTR__textures/kanji/gMsgKanji8FD9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD9Tex[] = dgMsgKanji8FD9Tex; + +#define dgMsgKanji8FDATex "__OTR__textures/kanji/gMsgKanji8FDATex" +static const ALIGN_ASSET(2) char gMsgKanji8FDATex[] = dgMsgKanji8FDATex; + +#define dgMsgKanji8FDBTex "__OTR__textures/kanji/gMsgKanji8FDBTex" +static const ALIGN_ASSET(2) char gMsgKanji8FDBTex[] = dgMsgKanji8FDBTex; + +#define dgMsgKanji8FDCTex "__OTR__textures/kanji/gMsgKanji8FDCTex" +static const ALIGN_ASSET(2) char gMsgKanji8FDCTex[] = dgMsgKanji8FDCTex; + +#define dgMsgKanji8FDDTex "__OTR__textures/kanji/gMsgKanji8FDDTex" +static const ALIGN_ASSET(2) char gMsgKanji8FDDTex[] = dgMsgKanji8FDDTex; + +#define dgMsgKanji8FDETex "__OTR__textures/kanji/gMsgKanji8FDETex" +static const ALIGN_ASSET(2) char gMsgKanji8FDETex[] = dgMsgKanji8FDETex; + +#define dgMsgKanji8FDFTex "__OTR__textures/kanji/gMsgKanji8FDFTex" +static const ALIGN_ASSET(2) char gMsgKanji8FDFTex[] = dgMsgKanji8FDFTex; + +#define dgMsgKanji8FE0Tex "__OTR__textures/kanji/gMsgKanji8FE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE0Tex[] = dgMsgKanji8FE0Tex; + +#define dgMsgKanji8FE1Tex "__OTR__textures/kanji/gMsgKanji8FE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE1Tex[] = dgMsgKanji8FE1Tex; + +#define dgMsgKanji8FE2Tex "__OTR__textures/kanji/gMsgKanji8FE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE2Tex[] = dgMsgKanji8FE2Tex; + +#define dgMsgKanji8FE3Tex "__OTR__textures/kanji/gMsgKanji8FE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE3Tex[] = dgMsgKanji8FE3Tex; + +#define dgMsgKanji8FE4Tex "__OTR__textures/kanji/gMsgKanji8FE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE4Tex[] = dgMsgKanji8FE4Tex; + +#define dgMsgKanji8FE5Tex "__OTR__textures/kanji/gMsgKanji8FE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE5Tex[] = dgMsgKanji8FE5Tex; + +#define dgMsgKanji8FE6Tex "__OTR__textures/kanji/gMsgKanji8FE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE6Tex[] = dgMsgKanji8FE6Tex; + +#define dgMsgKanji8FE7Tex "__OTR__textures/kanji/gMsgKanji8FE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE7Tex[] = dgMsgKanji8FE7Tex; + +#define dgMsgKanji8FE8Tex "__OTR__textures/kanji/gMsgKanji8FE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE8Tex[] = dgMsgKanji8FE8Tex; + +#define dgMsgKanji8FE9Tex "__OTR__textures/kanji/gMsgKanji8FE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE9Tex[] = dgMsgKanji8FE9Tex; + +#define dgMsgKanji8FEATex "__OTR__textures/kanji/gMsgKanji8FEATex" +static const ALIGN_ASSET(2) char gMsgKanji8FEATex[] = dgMsgKanji8FEATex; + +#define dgMsgKanji8FEBTex "__OTR__textures/kanji/gMsgKanji8FEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8FEBTex[] = dgMsgKanji8FEBTex; + +#define dgMsgKanji8FECTex "__OTR__textures/kanji/gMsgKanji8FECTex" +static const ALIGN_ASSET(2) char gMsgKanji8FECTex[] = dgMsgKanji8FECTex; + +#define dgMsgKanji8FEDTex "__OTR__textures/kanji/gMsgKanji8FEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8FEDTex[] = dgMsgKanji8FEDTex; + +#define dgMsgKanji8FEETex "__OTR__textures/kanji/gMsgKanji8FEETex" +static const ALIGN_ASSET(2) char gMsgKanji8FEETex[] = dgMsgKanji8FEETex; + +#define dgMsgKanji8FEFTex "__OTR__textures/kanji/gMsgKanji8FEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8FEFTex[] = dgMsgKanji8FEFTex; + +#define dgMsgKanji8FF0Tex "__OTR__textures/kanji/gMsgKanji8FF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF0Tex[] = dgMsgKanji8FF0Tex; + +#define dgMsgKanji8FF1Tex "__OTR__textures/kanji/gMsgKanji8FF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF1Tex[] = dgMsgKanji8FF1Tex; + +#define dgMsgKanji8FF2Tex "__OTR__textures/kanji/gMsgKanji8FF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF2Tex[] = dgMsgKanji8FF2Tex; + +#define dgMsgKanji8FF3Tex "__OTR__textures/kanji/gMsgKanji8FF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF3Tex[] = dgMsgKanji8FF3Tex; + +#define dgMsgKanji8FF4Tex "__OTR__textures/kanji/gMsgKanji8FF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF4Tex[] = dgMsgKanji8FF4Tex; + +#define dgMsgKanji8FF5Tex "__OTR__textures/kanji/gMsgKanji8FF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF5Tex[] = dgMsgKanji8FF5Tex; + +#define dgMsgKanji8FF6Tex "__OTR__textures/kanji/gMsgKanji8FF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF6Tex[] = dgMsgKanji8FF6Tex; + +#define dgMsgKanji8FF7Tex "__OTR__textures/kanji/gMsgKanji8FF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF7Tex[] = dgMsgKanji8FF7Tex; + +#define dgMsgKanji8FF8Tex "__OTR__textures/kanji/gMsgKanji8FF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF8Tex[] = dgMsgKanji8FF8Tex; + +#define dgMsgKanji8FF9Tex "__OTR__textures/kanji/gMsgKanji8FF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF9Tex[] = dgMsgKanji8FF9Tex; + +#define dgMsgKanji8FFATex "__OTR__textures/kanji/gMsgKanji8FFATex" +static const ALIGN_ASSET(2) char gMsgKanji8FFATex[] = dgMsgKanji8FFATex; + +#define dgMsgKanji8FFBTex "__OTR__textures/kanji/gMsgKanji8FFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8FFBTex[] = dgMsgKanji8FFBTex; + +#define dgMsgKanji8FFCTex "__OTR__textures/kanji/gMsgKanji8FFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8FFCTex[] = dgMsgKanji8FFCTex; + +#define dgMsgKanji9040Tex "__OTR__textures/kanji/gMsgKanji9040Tex" +static const ALIGN_ASSET(2) char gMsgKanji9040Tex[] = dgMsgKanji9040Tex; + +#define dgMsgKanji9041Tex "__OTR__textures/kanji/gMsgKanji9041Tex" +static const ALIGN_ASSET(2) char gMsgKanji9041Tex[] = dgMsgKanji9041Tex; + +#define dgMsgKanji9042Tex "__OTR__textures/kanji/gMsgKanji9042Tex" +static const ALIGN_ASSET(2) char gMsgKanji9042Tex[] = dgMsgKanji9042Tex; + +#define dgMsgKanji9043Tex "__OTR__textures/kanji/gMsgKanji9043Tex" +static const ALIGN_ASSET(2) char gMsgKanji9043Tex[] = dgMsgKanji9043Tex; + +#define dgMsgKanji9044Tex "__OTR__textures/kanji/gMsgKanji9044Tex" +static const ALIGN_ASSET(2) char gMsgKanji9044Tex[] = dgMsgKanji9044Tex; + +#define dgMsgKanji9045Tex "__OTR__textures/kanji/gMsgKanji9045Tex" +static const ALIGN_ASSET(2) char gMsgKanji9045Tex[] = dgMsgKanji9045Tex; + +#define dgMsgKanji9046Tex "__OTR__textures/kanji/gMsgKanji9046Tex" +static const ALIGN_ASSET(2) char gMsgKanji9046Tex[] = dgMsgKanji9046Tex; + +#define dgMsgKanji9047Tex "__OTR__textures/kanji/gMsgKanji9047Tex" +static const ALIGN_ASSET(2) char gMsgKanji9047Tex[] = dgMsgKanji9047Tex; + +#define dgMsgKanji9048Tex "__OTR__textures/kanji/gMsgKanji9048Tex" +static const ALIGN_ASSET(2) char gMsgKanji9048Tex[] = dgMsgKanji9048Tex; + +#define dgMsgKanji9049Tex "__OTR__textures/kanji/gMsgKanji9049Tex" +static const ALIGN_ASSET(2) char gMsgKanji9049Tex[] = dgMsgKanji9049Tex; + +#define dgMsgKanji904ATex "__OTR__textures/kanji/gMsgKanji904ATex" +static const ALIGN_ASSET(2) char gMsgKanji904ATex[] = dgMsgKanji904ATex; + +#define dgMsgKanji904BTex "__OTR__textures/kanji/gMsgKanji904BTex" +static const ALIGN_ASSET(2) char gMsgKanji904BTex[] = dgMsgKanji904BTex; + +#define dgMsgKanji904CTex "__OTR__textures/kanji/gMsgKanji904CTex" +static const ALIGN_ASSET(2) char gMsgKanji904CTex[] = dgMsgKanji904CTex; + +#define dgMsgKanji904DTex "__OTR__textures/kanji/gMsgKanji904DTex" +static const ALIGN_ASSET(2) char gMsgKanji904DTex[] = dgMsgKanji904DTex; + +#define dgMsgKanji904ETex "__OTR__textures/kanji/gMsgKanji904ETex" +static const ALIGN_ASSET(2) char gMsgKanji904ETex[] = dgMsgKanji904ETex; + +#define dgMsgKanji904FTex "__OTR__textures/kanji/gMsgKanji904FTex" +static const ALIGN_ASSET(2) char gMsgKanji904FTex[] = dgMsgKanji904FTex; + +#define dgMsgKanji9050Tex "__OTR__textures/kanji/gMsgKanji9050Tex" +static const ALIGN_ASSET(2) char gMsgKanji9050Tex[] = dgMsgKanji9050Tex; + +#define dgMsgKanji9051Tex "__OTR__textures/kanji/gMsgKanji9051Tex" +static const ALIGN_ASSET(2) char gMsgKanji9051Tex[] = dgMsgKanji9051Tex; + +#define dgMsgKanji9052Tex "__OTR__textures/kanji/gMsgKanji9052Tex" +static const ALIGN_ASSET(2) char gMsgKanji9052Tex[] = dgMsgKanji9052Tex; + +#define dgMsgKanji9053Tex "__OTR__textures/kanji/gMsgKanji9053Tex" +static const ALIGN_ASSET(2) char gMsgKanji9053Tex[] = dgMsgKanji9053Tex; + +#define dgMsgKanji9054Tex "__OTR__textures/kanji/gMsgKanji9054Tex" +static const ALIGN_ASSET(2) char gMsgKanji9054Tex[] = dgMsgKanji9054Tex; + +#define dgMsgKanji9055Tex "__OTR__textures/kanji/gMsgKanji9055Tex" +static const ALIGN_ASSET(2) char gMsgKanji9055Tex[] = dgMsgKanji9055Tex; + +#define dgMsgKanji9056Tex "__OTR__textures/kanji/gMsgKanji9056Tex" +static const ALIGN_ASSET(2) char gMsgKanji9056Tex[] = dgMsgKanji9056Tex; + +#define dgMsgKanji9057Tex "__OTR__textures/kanji/gMsgKanji9057Tex" +static const ALIGN_ASSET(2) char gMsgKanji9057Tex[] = dgMsgKanji9057Tex; + +#define dgMsgKanji9058Tex "__OTR__textures/kanji/gMsgKanji9058Tex" +static const ALIGN_ASSET(2) char gMsgKanji9058Tex[] = dgMsgKanji9058Tex; + +#define dgMsgKanji9059Tex "__OTR__textures/kanji/gMsgKanji9059Tex" +static const ALIGN_ASSET(2) char gMsgKanji9059Tex[] = dgMsgKanji9059Tex; + +#define dgMsgKanji905ATex "__OTR__textures/kanji/gMsgKanji905ATex" +static const ALIGN_ASSET(2) char gMsgKanji905ATex[] = dgMsgKanji905ATex; + +#define dgMsgKanji905BTex "__OTR__textures/kanji/gMsgKanji905BTex" +static const ALIGN_ASSET(2) char gMsgKanji905BTex[] = dgMsgKanji905BTex; + +#define dgMsgKanji905CTex "__OTR__textures/kanji/gMsgKanji905CTex" +static const ALIGN_ASSET(2) char gMsgKanji905CTex[] = dgMsgKanji905CTex; + +#define dgMsgKanji905DTex "__OTR__textures/kanji/gMsgKanji905DTex" +static const ALIGN_ASSET(2) char gMsgKanji905DTex[] = dgMsgKanji905DTex; + +#define dgMsgKanji905ETex "__OTR__textures/kanji/gMsgKanji905ETex" +static const ALIGN_ASSET(2) char gMsgKanji905ETex[] = dgMsgKanji905ETex; + +#define dgMsgKanji905FTex "__OTR__textures/kanji/gMsgKanji905FTex" +static const ALIGN_ASSET(2) char gMsgKanji905FTex[] = dgMsgKanji905FTex; + +#define dgMsgKanji9060Tex "__OTR__textures/kanji/gMsgKanji9060Tex" +static const ALIGN_ASSET(2) char gMsgKanji9060Tex[] = dgMsgKanji9060Tex; + +#define dgMsgKanji9061Tex "__OTR__textures/kanji/gMsgKanji9061Tex" +static const ALIGN_ASSET(2) char gMsgKanji9061Tex[] = dgMsgKanji9061Tex; + +#define dgMsgKanji9062Tex "__OTR__textures/kanji/gMsgKanji9062Tex" +static const ALIGN_ASSET(2) char gMsgKanji9062Tex[] = dgMsgKanji9062Tex; + +#define dgMsgKanji9063Tex "__OTR__textures/kanji/gMsgKanji9063Tex" +static const ALIGN_ASSET(2) char gMsgKanji9063Tex[] = dgMsgKanji9063Tex; + +#define dgMsgKanji9064Tex "__OTR__textures/kanji/gMsgKanji9064Tex" +static const ALIGN_ASSET(2) char gMsgKanji9064Tex[] = dgMsgKanji9064Tex; + +#define dgMsgKanji9065Tex "__OTR__textures/kanji/gMsgKanji9065Tex" +static const ALIGN_ASSET(2) char gMsgKanji9065Tex[] = dgMsgKanji9065Tex; + +#define dgMsgKanji9066Tex "__OTR__textures/kanji/gMsgKanji9066Tex" +static const ALIGN_ASSET(2) char gMsgKanji9066Tex[] = dgMsgKanji9066Tex; + +#define dgMsgKanji9067Tex "__OTR__textures/kanji/gMsgKanji9067Tex" +static const ALIGN_ASSET(2) char gMsgKanji9067Tex[] = dgMsgKanji9067Tex; + +#define dgMsgKanji9068Tex "__OTR__textures/kanji/gMsgKanji9068Tex" +static const ALIGN_ASSET(2) char gMsgKanji9068Tex[] = dgMsgKanji9068Tex; + +#define dgMsgKanji9069Tex "__OTR__textures/kanji/gMsgKanji9069Tex" +static const ALIGN_ASSET(2) char gMsgKanji9069Tex[] = dgMsgKanji9069Tex; + +#define dgMsgKanji906ATex "__OTR__textures/kanji/gMsgKanji906ATex" +static const ALIGN_ASSET(2) char gMsgKanji906ATex[] = dgMsgKanji906ATex; + +#define dgMsgKanji906BTex "__OTR__textures/kanji/gMsgKanji906BTex" +static const ALIGN_ASSET(2) char gMsgKanji906BTex[] = dgMsgKanji906BTex; + +#define dgMsgKanji906CTex "__OTR__textures/kanji/gMsgKanji906CTex" +static const ALIGN_ASSET(2) char gMsgKanji906CTex[] = dgMsgKanji906CTex; + +#define dgMsgKanji906DTex "__OTR__textures/kanji/gMsgKanji906DTex" +static const ALIGN_ASSET(2) char gMsgKanji906DTex[] = dgMsgKanji906DTex; + +#define dgMsgKanji906ETex "__OTR__textures/kanji/gMsgKanji906ETex" +static const ALIGN_ASSET(2) char gMsgKanji906ETex[] = dgMsgKanji906ETex; + +#define dgMsgKanji906FTex "__OTR__textures/kanji/gMsgKanji906FTex" +static const ALIGN_ASSET(2) char gMsgKanji906FTex[] = dgMsgKanji906FTex; + +#define dgMsgKanji9070Tex "__OTR__textures/kanji/gMsgKanji9070Tex" +static const ALIGN_ASSET(2) char gMsgKanji9070Tex[] = dgMsgKanji9070Tex; + +#define dgMsgKanji9071Tex "__OTR__textures/kanji/gMsgKanji9071Tex" +static const ALIGN_ASSET(2) char gMsgKanji9071Tex[] = dgMsgKanji9071Tex; + +#define dgMsgKanji9072Tex "__OTR__textures/kanji/gMsgKanji9072Tex" +static const ALIGN_ASSET(2) char gMsgKanji9072Tex[] = dgMsgKanji9072Tex; + +#define dgMsgKanji9073Tex "__OTR__textures/kanji/gMsgKanji9073Tex" +static const ALIGN_ASSET(2) char gMsgKanji9073Tex[] = dgMsgKanji9073Tex; + +#define dgMsgKanji9074Tex "__OTR__textures/kanji/gMsgKanji9074Tex" +static const ALIGN_ASSET(2) char gMsgKanji9074Tex[] = dgMsgKanji9074Tex; + +#define dgMsgKanji9075Tex "__OTR__textures/kanji/gMsgKanji9075Tex" +static const ALIGN_ASSET(2) char gMsgKanji9075Tex[] = dgMsgKanji9075Tex; + +#define dgMsgKanji9076Tex "__OTR__textures/kanji/gMsgKanji9076Tex" +static const ALIGN_ASSET(2) char gMsgKanji9076Tex[] = dgMsgKanji9076Tex; + +#define dgMsgKanji9077Tex "__OTR__textures/kanji/gMsgKanji9077Tex" +static const ALIGN_ASSET(2) char gMsgKanji9077Tex[] = dgMsgKanji9077Tex; + +#define dgMsgKanji9078Tex "__OTR__textures/kanji/gMsgKanji9078Tex" +static const ALIGN_ASSET(2) char gMsgKanji9078Tex[] = dgMsgKanji9078Tex; + +#define dgMsgKanji9079Tex "__OTR__textures/kanji/gMsgKanji9079Tex" +static const ALIGN_ASSET(2) char gMsgKanji9079Tex[] = dgMsgKanji9079Tex; + +#define dgMsgKanji907ATex "__OTR__textures/kanji/gMsgKanji907ATex" +static const ALIGN_ASSET(2) char gMsgKanji907ATex[] = dgMsgKanji907ATex; + +#define dgMsgKanji907BTex "__OTR__textures/kanji/gMsgKanji907BTex" +static const ALIGN_ASSET(2) char gMsgKanji907BTex[] = dgMsgKanji907BTex; + +#define dgMsgKanji907CTex "__OTR__textures/kanji/gMsgKanji907CTex" +static const ALIGN_ASSET(2) char gMsgKanji907CTex[] = dgMsgKanji907CTex; + +#define dgMsgKanji907DTex "__OTR__textures/kanji/gMsgKanji907DTex" +static const ALIGN_ASSET(2) char gMsgKanji907DTex[] = dgMsgKanji907DTex; + +#define dgMsgKanji907ETex "__OTR__textures/kanji/gMsgKanji907ETex" +static const ALIGN_ASSET(2) char gMsgKanji907ETex[] = dgMsgKanji907ETex; + +#define dgMsgKanji9080Tex "__OTR__textures/kanji/gMsgKanji9080Tex" +static const ALIGN_ASSET(2) char gMsgKanji9080Tex[] = dgMsgKanji9080Tex; + +#define dgMsgKanji9081Tex "__OTR__textures/kanji/gMsgKanji9081Tex" +static const ALIGN_ASSET(2) char gMsgKanji9081Tex[] = dgMsgKanji9081Tex; + +#define dgMsgKanji9082Tex "__OTR__textures/kanji/gMsgKanji9082Tex" +static const ALIGN_ASSET(2) char gMsgKanji9082Tex[] = dgMsgKanji9082Tex; + +#define dgMsgKanji9083Tex "__OTR__textures/kanji/gMsgKanji9083Tex" +static const ALIGN_ASSET(2) char gMsgKanji9083Tex[] = dgMsgKanji9083Tex; + +#define dgMsgKanji9084Tex "__OTR__textures/kanji/gMsgKanji9084Tex" +static const ALIGN_ASSET(2) char gMsgKanji9084Tex[] = dgMsgKanji9084Tex; + +#define dgMsgKanji9085Tex "__OTR__textures/kanji/gMsgKanji9085Tex" +static const ALIGN_ASSET(2) char gMsgKanji9085Tex[] = dgMsgKanji9085Tex; + +#define dgMsgKanji9086Tex "__OTR__textures/kanji/gMsgKanji9086Tex" +static const ALIGN_ASSET(2) char gMsgKanji9086Tex[] = dgMsgKanji9086Tex; + +#define dgMsgKanji9087Tex "__OTR__textures/kanji/gMsgKanji9087Tex" +static const ALIGN_ASSET(2) char gMsgKanji9087Tex[] = dgMsgKanji9087Tex; + +#define dgMsgKanji9088Tex "__OTR__textures/kanji/gMsgKanji9088Tex" +static const ALIGN_ASSET(2) char gMsgKanji9088Tex[] = dgMsgKanji9088Tex; + +#define dgMsgKanji9089Tex "__OTR__textures/kanji/gMsgKanji9089Tex" +static const ALIGN_ASSET(2) char gMsgKanji9089Tex[] = dgMsgKanji9089Tex; + +#define dgMsgKanji908ATex "__OTR__textures/kanji/gMsgKanji908ATex" +static const ALIGN_ASSET(2) char gMsgKanji908ATex[] = dgMsgKanji908ATex; + +#define dgMsgKanji908BTex "__OTR__textures/kanji/gMsgKanji908BTex" +static const ALIGN_ASSET(2) char gMsgKanji908BTex[] = dgMsgKanji908BTex; + +#define dgMsgKanji908CTex "__OTR__textures/kanji/gMsgKanji908CTex" +static const ALIGN_ASSET(2) char gMsgKanji908CTex[] = dgMsgKanji908CTex; + +#define dgMsgKanji908DTex "__OTR__textures/kanji/gMsgKanji908DTex" +static const ALIGN_ASSET(2) char gMsgKanji908DTex[] = dgMsgKanji908DTex; + +#define dgMsgKanji908ETex "__OTR__textures/kanji/gMsgKanji908ETex" +static const ALIGN_ASSET(2) char gMsgKanji908ETex[] = dgMsgKanji908ETex; + +#define dgMsgKanji908FTex "__OTR__textures/kanji/gMsgKanji908FTex" +static const ALIGN_ASSET(2) char gMsgKanji908FTex[] = dgMsgKanji908FTex; + +#define dgMsgKanji9090Tex "__OTR__textures/kanji/gMsgKanji9090Tex" +static const ALIGN_ASSET(2) char gMsgKanji9090Tex[] = dgMsgKanji9090Tex; + +#define dgMsgKanji9091Tex "__OTR__textures/kanji/gMsgKanji9091Tex" +static const ALIGN_ASSET(2) char gMsgKanji9091Tex[] = dgMsgKanji9091Tex; + +#define dgMsgKanji9092Tex "__OTR__textures/kanji/gMsgKanji9092Tex" +static const ALIGN_ASSET(2) char gMsgKanji9092Tex[] = dgMsgKanji9092Tex; + +#define dgMsgKanji9093Tex "__OTR__textures/kanji/gMsgKanji9093Tex" +static const ALIGN_ASSET(2) char gMsgKanji9093Tex[] = dgMsgKanji9093Tex; + +#define dgMsgKanji9094Tex "__OTR__textures/kanji/gMsgKanji9094Tex" +static const ALIGN_ASSET(2) char gMsgKanji9094Tex[] = dgMsgKanji9094Tex; + +#define dgMsgKanji9095Tex "__OTR__textures/kanji/gMsgKanji9095Tex" +static const ALIGN_ASSET(2) char gMsgKanji9095Tex[] = dgMsgKanji9095Tex; + +#define dgMsgKanji9096Tex "__OTR__textures/kanji/gMsgKanji9096Tex" +static const ALIGN_ASSET(2) char gMsgKanji9096Tex[] = dgMsgKanji9096Tex; + +#define dgMsgKanji9097Tex "__OTR__textures/kanji/gMsgKanji9097Tex" +static const ALIGN_ASSET(2) char gMsgKanji9097Tex[] = dgMsgKanji9097Tex; + +#define dgMsgKanji9098Tex "__OTR__textures/kanji/gMsgKanji9098Tex" +static const ALIGN_ASSET(2) char gMsgKanji9098Tex[] = dgMsgKanji9098Tex; + +#define dgMsgKanji9099Tex "__OTR__textures/kanji/gMsgKanji9099Tex" +static const ALIGN_ASSET(2) char gMsgKanji9099Tex[] = dgMsgKanji9099Tex; + +#define dgMsgKanji909ATex "__OTR__textures/kanji/gMsgKanji909ATex" +static const ALIGN_ASSET(2) char gMsgKanji909ATex[] = dgMsgKanji909ATex; + +#define dgMsgKanji909BTex "__OTR__textures/kanji/gMsgKanji909BTex" +static const ALIGN_ASSET(2) char gMsgKanji909BTex[] = dgMsgKanji909BTex; + +#define dgMsgKanji909CTex "__OTR__textures/kanji/gMsgKanji909CTex" +static const ALIGN_ASSET(2) char gMsgKanji909CTex[] = dgMsgKanji909CTex; + +#define dgMsgKanji909DTex "__OTR__textures/kanji/gMsgKanji909DTex" +static const ALIGN_ASSET(2) char gMsgKanji909DTex[] = dgMsgKanji909DTex; + +#define dgMsgKanji909ETex "__OTR__textures/kanji/gMsgKanji909ETex" +static const ALIGN_ASSET(2) char gMsgKanji909ETex[] = dgMsgKanji909ETex; + +#define dgMsgKanji909FTex "__OTR__textures/kanji/gMsgKanji909FTex" +static const ALIGN_ASSET(2) char gMsgKanji909FTex[] = dgMsgKanji909FTex; + +#define dgMsgKanji90A0Tex "__OTR__textures/kanji/gMsgKanji90A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A0Tex[] = dgMsgKanji90A0Tex; + +#define dgMsgKanji90A1Tex "__OTR__textures/kanji/gMsgKanji90A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A1Tex[] = dgMsgKanji90A1Tex; + +#define dgMsgKanji90A2Tex "__OTR__textures/kanji/gMsgKanji90A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A2Tex[] = dgMsgKanji90A2Tex; + +#define dgMsgKanji90A3Tex "__OTR__textures/kanji/gMsgKanji90A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A3Tex[] = dgMsgKanji90A3Tex; + +#define dgMsgKanji90A4Tex "__OTR__textures/kanji/gMsgKanji90A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A4Tex[] = dgMsgKanji90A4Tex; + +#define dgMsgKanji90A5Tex "__OTR__textures/kanji/gMsgKanji90A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A5Tex[] = dgMsgKanji90A5Tex; + +#define dgMsgKanji90A6Tex "__OTR__textures/kanji/gMsgKanji90A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A6Tex[] = dgMsgKanji90A6Tex; + +#define dgMsgKanji90A7Tex "__OTR__textures/kanji/gMsgKanji90A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A7Tex[] = dgMsgKanji90A7Tex; + +#define dgMsgKanji90A8Tex "__OTR__textures/kanji/gMsgKanji90A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A8Tex[] = dgMsgKanji90A8Tex; + +#define dgMsgKanji90A9Tex "__OTR__textures/kanji/gMsgKanji90A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A9Tex[] = dgMsgKanji90A9Tex; + +#define dgMsgKanji90AATex "__OTR__textures/kanji/gMsgKanji90AATex" +static const ALIGN_ASSET(2) char gMsgKanji90AATex[] = dgMsgKanji90AATex; + +#define dgMsgKanji90ABTex "__OTR__textures/kanji/gMsgKanji90ABTex" +static const ALIGN_ASSET(2) char gMsgKanji90ABTex[] = dgMsgKanji90ABTex; + +#define dgMsgKanji90ACTex "__OTR__textures/kanji/gMsgKanji90ACTex" +static const ALIGN_ASSET(2) char gMsgKanji90ACTex[] = dgMsgKanji90ACTex; + +#define dgMsgKanji90ADTex "__OTR__textures/kanji/gMsgKanji90ADTex" +static const ALIGN_ASSET(2) char gMsgKanji90ADTex[] = dgMsgKanji90ADTex; + +#define dgMsgKanji90AETex "__OTR__textures/kanji/gMsgKanji90AETex" +static const ALIGN_ASSET(2) char gMsgKanji90AETex[] = dgMsgKanji90AETex; + +#define dgMsgKanji90AFTex "__OTR__textures/kanji/gMsgKanji90AFTex" +static const ALIGN_ASSET(2) char gMsgKanji90AFTex[] = dgMsgKanji90AFTex; + +#define dgMsgKanji90B0Tex "__OTR__textures/kanji/gMsgKanji90B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B0Tex[] = dgMsgKanji90B0Tex; + +#define dgMsgKanji90B1Tex "__OTR__textures/kanji/gMsgKanji90B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B1Tex[] = dgMsgKanji90B1Tex; + +#define dgMsgKanji90B2Tex "__OTR__textures/kanji/gMsgKanji90B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B2Tex[] = dgMsgKanji90B2Tex; + +#define dgMsgKanji90B3Tex "__OTR__textures/kanji/gMsgKanji90B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B3Tex[] = dgMsgKanji90B3Tex; + +#define dgMsgKanji90B4Tex "__OTR__textures/kanji/gMsgKanji90B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B4Tex[] = dgMsgKanji90B4Tex; + +#define dgMsgKanji90B5Tex "__OTR__textures/kanji/gMsgKanji90B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B5Tex[] = dgMsgKanji90B5Tex; + +#define dgMsgKanji90B6Tex "__OTR__textures/kanji/gMsgKanji90B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B6Tex[] = dgMsgKanji90B6Tex; + +#define dgMsgKanji90B7Tex "__OTR__textures/kanji/gMsgKanji90B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B7Tex[] = dgMsgKanji90B7Tex; + +#define dgMsgKanji90B8Tex "__OTR__textures/kanji/gMsgKanji90B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B8Tex[] = dgMsgKanji90B8Tex; + +#define dgMsgKanji90B9Tex "__OTR__textures/kanji/gMsgKanji90B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B9Tex[] = dgMsgKanji90B9Tex; + +#define dgMsgKanji90BATex "__OTR__textures/kanji/gMsgKanji90BATex" +static const ALIGN_ASSET(2) char gMsgKanji90BATex[] = dgMsgKanji90BATex; + +#define dgMsgKanji90BBTex "__OTR__textures/kanji/gMsgKanji90BBTex" +static const ALIGN_ASSET(2) char gMsgKanji90BBTex[] = dgMsgKanji90BBTex; + +#define dgMsgKanji90BCTex "__OTR__textures/kanji/gMsgKanji90BCTex" +static const ALIGN_ASSET(2) char gMsgKanji90BCTex[] = dgMsgKanji90BCTex; + +#define dgMsgKanji90BDTex "__OTR__textures/kanji/gMsgKanji90BDTex" +static const ALIGN_ASSET(2) char gMsgKanji90BDTex[] = dgMsgKanji90BDTex; + +#define dgMsgKanji90BETex "__OTR__textures/kanji/gMsgKanji90BETex" +static const ALIGN_ASSET(2) char gMsgKanji90BETex[] = dgMsgKanji90BETex; + +#define dgMsgKanji90BFTex "__OTR__textures/kanji/gMsgKanji90BFTex" +static const ALIGN_ASSET(2) char gMsgKanji90BFTex[] = dgMsgKanji90BFTex; + +#define dgMsgKanji90C0Tex "__OTR__textures/kanji/gMsgKanji90C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C0Tex[] = dgMsgKanji90C0Tex; + +#define dgMsgKanji90C1Tex "__OTR__textures/kanji/gMsgKanji90C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C1Tex[] = dgMsgKanji90C1Tex; + +#define dgMsgKanji90C2Tex "__OTR__textures/kanji/gMsgKanji90C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C2Tex[] = dgMsgKanji90C2Tex; + +#define dgMsgKanji90C3Tex "__OTR__textures/kanji/gMsgKanji90C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C3Tex[] = dgMsgKanji90C3Tex; + +#define dgMsgKanji90C4Tex "__OTR__textures/kanji/gMsgKanji90C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C4Tex[] = dgMsgKanji90C4Tex; + +#define dgMsgKanji90C5Tex "__OTR__textures/kanji/gMsgKanji90C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C5Tex[] = dgMsgKanji90C5Tex; + +#define dgMsgKanji90C6Tex "__OTR__textures/kanji/gMsgKanji90C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C6Tex[] = dgMsgKanji90C6Tex; + +#define dgMsgKanji90C7Tex "__OTR__textures/kanji/gMsgKanji90C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C7Tex[] = dgMsgKanji90C7Tex; + +#define dgMsgKanji90C8Tex "__OTR__textures/kanji/gMsgKanji90C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C8Tex[] = dgMsgKanji90C8Tex; + +#define dgMsgKanji90C9Tex "__OTR__textures/kanji/gMsgKanji90C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C9Tex[] = dgMsgKanji90C9Tex; + +#define dgMsgKanji90CATex "__OTR__textures/kanji/gMsgKanji90CATex" +static const ALIGN_ASSET(2) char gMsgKanji90CATex[] = dgMsgKanji90CATex; + +#define dgMsgKanji90CBTex "__OTR__textures/kanji/gMsgKanji90CBTex" +static const ALIGN_ASSET(2) char gMsgKanji90CBTex[] = dgMsgKanji90CBTex; + +#define dgMsgKanji90CCTex "__OTR__textures/kanji/gMsgKanji90CCTex" +static const ALIGN_ASSET(2) char gMsgKanji90CCTex[] = dgMsgKanji90CCTex; + +#define dgMsgKanji90CDTex "__OTR__textures/kanji/gMsgKanji90CDTex" +static const ALIGN_ASSET(2) char gMsgKanji90CDTex[] = dgMsgKanji90CDTex; + +#define dgMsgKanji90CETex "__OTR__textures/kanji/gMsgKanji90CETex" +static const ALIGN_ASSET(2) char gMsgKanji90CETex[] = dgMsgKanji90CETex; + +#define dgMsgKanji90CFTex "__OTR__textures/kanji/gMsgKanji90CFTex" +static const ALIGN_ASSET(2) char gMsgKanji90CFTex[] = dgMsgKanji90CFTex; + +#define dgMsgKanji90D0Tex "__OTR__textures/kanji/gMsgKanji90D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D0Tex[] = dgMsgKanji90D0Tex; + +#define dgMsgKanji90D1Tex "__OTR__textures/kanji/gMsgKanji90D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D1Tex[] = dgMsgKanji90D1Tex; + +#define dgMsgKanji90D2Tex "__OTR__textures/kanji/gMsgKanji90D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D2Tex[] = dgMsgKanji90D2Tex; + +#define dgMsgKanji90D3Tex "__OTR__textures/kanji/gMsgKanji90D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D3Tex[] = dgMsgKanji90D3Tex; + +#define dgMsgKanji90D4Tex "__OTR__textures/kanji/gMsgKanji90D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D4Tex[] = dgMsgKanji90D4Tex; + +#define dgMsgKanji90D5Tex "__OTR__textures/kanji/gMsgKanji90D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D5Tex[] = dgMsgKanji90D5Tex; + +#define dgMsgKanji90D6Tex "__OTR__textures/kanji/gMsgKanji90D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D6Tex[] = dgMsgKanji90D6Tex; + +#define dgMsgKanji90D7Tex "__OTR__textures/kanji/gMsgKanji90D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D7Tex[] = dgMsgKanji90D7Tex; + +#define dgMsgKanji90D8Tex "__OTR__textures/kanji/gMsgKanji90D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D8Tex[] = dgMsgKanji90D8Tex; + +#define dgMsgKanji90D9Tex "__OTR__textures/kanji/gMsgKanji90D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D9Tex[] = dgMsgKanji90D9Tex; + +#define dgMsgKanji90DATex "__OTR__textures/kanji/gMsgKanji90DATex" +static const ALIGN_ASSET(2) char gMsgKanji90DATex[] = dgMsgKanji90DATex; + +#define dgMsgKanji90DBTex "__OTR__textures/kanji/gMsgKanji90DBTex" +static const ALIGN_ASSET(2) char gMsgKanji90DBTex[] = dgMsgKanji90DBTex; + +#define dgMsgKanji90DCTex "__OTR__textures/kanji/gMsgKanji90DCTex" +static const ALIGN_ASSET(2) char gMsgKanji90DCTex[] = dgMsgKanji90DCTex; + +#define dgMsgKanji90DDTex "__OTR__textures/kanji/gMsgKanji90DDTex" +static const ALIGN_ASSET(2) char gMsgKanji90DDTex[] = dgMsgKanji90DDTex; + +#define dgMsgKanji90DETex "__OTR__textures/kanji/gMsgKanji90DETex" +static const ALIGN_ASSET(2) char gMsgKanji90DETex[] = dgMsgKanji90DETex; + +#define dgMsgKanji90DFTex "__OTR__textures/kanji/gMsgKanji90DFTex" +static const ALIGN_ASSET(2) char gMsgKanji90DFTex[] = dgMsgKanji90DFTex; + +#define dgMsgKanji90E0Tex "__OTR__textures/kanji/gMsgKanji90E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E0Tex[] = dgMsgKanji90E0Tex; + +#define dgMsgKanji90E1Tex "__OTR__textures/kanji/gMsgKanji90E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E1Tex[] = dgMsgKanji90E1Tex; + +#define dgMsgKanji90E2Tex "__OTR__textures/kanji/gMsgKanji90E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E2Tex[] = dgMsgKanji90E2Tex; + +#define dgMsgKanji90E3Tex "__OTR__textures/kanji/gMsgKanji90E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E3Tex[] = dgMsgKanji90E3Tex; + +#define dgMsgKanji90E4Tex "__OTR__textures/kanji/gMsgKanji90E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E4Tex[] = dgMsgKanji90E4Tex; + +#define dgMsgKanji90E5Tex "__OTR__textures/kanji/gMsgKanji90E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E5Tex[] = dgMsgKanji90E5Tex; + +#define dgMsgKanji90E6Tex "__OTR__textures/kanji/gMsgKanji90E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E6Tex[] = dgMsgKanji90E6Tex; + +#define dgMsgKanji90E7Tex "__OTR__textures/kanji/gMsgKanji90E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E7Tex[] = dgMsgKanji90E7Tex; + +#define dgMsgKanji90E8Tex "__OTR__textures/kanji/gMsgKanji90E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E8Tex[] = dgMsgKanji90E8Tex; + +#define dgMsgKanji90E9Tex "__OTR__textures/kanji/gMsgKanji90E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E9Tex[] = dgMsgKanji90E9Tex; + +#define dgMsgKanji90EATex "__OTR__textures/kanji/gMsgKanji90EATex" +static const ALIGN_ASSET(2) char gMsgKanji90EATex[] = dgMsgKanji90EATex; + +#define dgMsgKanji90EBTex "__OTR__textures/kanji/gMsgKanji90EBTex" +static const ALIGN_ASSET(2) char gMsgKanji90EBTex[] = dgMsgKanji90EBTex; + +#define dgMsgKanji90ECTex "__OTR__textures/kanji/gMsgKanji90ECTex" +static const ALIGN_ASSET(2) char gMsgKanji90ECTex[] = dgMsgKanji90ECTex; + +#define dgMsgKanji90EDTex "__OTR__textures/kanji/gMsgKanji90EDTex" +static const ALIGN_ASSET(2) char gMsgKanji90EDTex[] = dgMsgKanji90EDTex; + +#define dgMsgKanji90EETex "__OTR__textures/kanji/gMsgKanji90EETex" +static const ALIGN_ASSET(2) char gMsgKanji90EETex[] = dgMsgKanji90EETex; + +#define dgMsgKanji90EFTex "__OTR__textures/kanji/gMsgKanji90EFTex" +static const ALIGN_ASSET(2) char gMsgKanji90EFTex[] = dgMsgKanji90EFTex; + +#define dgMsgKanji90F0Tex "__OTR__textures/kanji/gMsgKanji90F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F0Tex[] = dgMsgKanji90F0Tex; + +#define dgMsgKanji90F1Tex "__OTR__textures/kanji/gMsgKanji90F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F1Tex[] = dgMsgKanji90F1Tex; + +#define dgMsgKanji90F2Tex "__OTR__textures/kanji/gMsgKanji90F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F2Tex[] = dgMsgKanji90F2Tex; + +#define dgMsgKanji90F3Tex "__OTR__textures/kanji/gMsgKanji90F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F3Tex[] = dgMsgKanji90F3Tex; + +#define dgMsgKanji90F4Tex "__OTR__textures/kanji/gMsgKanji90F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F4Tex[] = dgMsgKanji90F4Tex; + +#define dgMsgKanji90F5Tex "__OTR__textures/kanji/gMsgKanji90F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F5Tex[] = dgMsgKanji90F5Tex; + +#define dgMsgKanji90F6Tex "__OTR__textures/kanji/gMsgKanji90F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F6Tex[] = dgMsgKanji90F6Tex; + +#define dgMsgKanji90F7Tex "__OTR__textures/kanji/gMsgKanji90F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F7Tex[] = dgMsgKanji90F7Tex; + +#define dgMsgKanji90F8Tex "__OTR__textures/kanji/gMsgKanji90F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F8Tex[] = dgMsgKanji90F8Tex; + +#define dgMsgKanji90F9Tex "__OTR__textures/kanji/gMsgKanji90F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F9Tex[] = dgMsgKanji90F9Tex; + +#define dgMsgKanji90FATex "__OTR__textures/kanji/gMsgKanji90FATex" +static const ALIGN_ASSET(2) char gMsgKanji90FATex[] = dgMsgKanji90FATex; + +#define dgMsgKanji90FBTex "__OTR__textures/kanji/gMsgKanji90FBTex" +static const ALIGN_ASSET(2) char gMsgKanji90FBTex[] = dgMsgKanji90FBTex; + +#define dgMsgKanji90FCTex "__OTR__textures/kanji/gMsgKanji90FCTex" +static const ALIGN_ASSET(2) char gMsgKanji90FCTex[] = dgMsgKanji90FCTex; + +#define dgMsgKanji9140Tex "__OTR__textures/kanji/gMsgKanji9140Tex" +static const ALIGN_ASSET(2) char gMsgKanji9140Tex[] = dgMsgKanji9140Tex; + +#define dgMsgKanji9141Tex "__OTR__textures/kanji/gMsgKanji9141Tex" +static const ALIGN_ASSET(2) char gMsgKanji9141Tex[] = dgMsgKanji9141Tex; + +#define dgMsgKanji9142Tex "__OTR__textures/kanji/gMsgKanji9142Tex" +static const ALIGN_ASSET(2) char gMsgKanji9142Tex[] = dgMsgKanji9142Tex; + +#define dgMsgKanji9143Tex "__OTR__textures/kanji/gMsgKanji9143Tex" +static const ALIGN_ASSET(2) char gMsgKanji9143Tex[] = dgMsgKanji9143Tex; + +#define dgMsgKanji9144Tex "__OTR__textures/kanji/gMsgKanji9144Tex" +static const ALIGN_ASSET(2) char gMsgKanji9144Tex[] = dgMsgKanji9144Tex; + +#define dgMsgKanji9145Tex "__OTR__textures/kanji/gMsgKanji9145Tex" +static const ALIGN_ASSET(2) char gMsgKanji9145Tex[] = dgMsgKanji9145Tex; + +#define dgMsgKanji9146Tex "__OTR__textures/kanji/gMsgKanji9146Tex" +static const ALIGN_ASSET(2) char gMsgKanji9146Tex[] = dgMsgKanji9146Tex; + +#define dgMsgKanji9147Tex "__OTR__textures/kanji/gMsgKanji9147Tex" +static const ALIGN_ASSET(2) char gMsgKanji9147Tex[] = dgMsgKanji9147Tex; + +#define dgMsgKanji9148Tex "__OTR__textures/kanji/gMsgKanji9148Tex" +static const ALIGN_ASSET(2) char gMsgKanji9148Tex[] = dgMsgKanji9148Tex; + +#define dgMsgKanji9149Tex "__OTR__textures/kanji/gMsgKanji9149Tex" +static const ALIGN_ASSET(2) char gMsgKanji9149Tex[] = dgMsgKanji9149Tex; + +#define dgMsgKanji914ATex "__OTR__textures/kanji/gMsgKanji914ATex" +static const ALIGN_ASSET(2) char gMsgKanji914ATex[] = dgMsgKanji914ATex; + +#define dgMsgKanji914BTex "__OTR__textures/kanji/gMsgKanji914BTex" +static const ALIGN_ASSET(2) char gMsgKanji914BTex[] = dgMsgKanji914BTex; + +#define dgMsgKanji914CTex "__OTR__textures/kanji/gMsgKanji914CTex" +static const ALIGN_ASSET(2) char gMsgKanji914CTex[] = dgMsgKanji914CTex; + +#define dgMsgKanji914DTex "__OTR__textures/kanji/gMsgKanji914DTex" +static const ALIGN_ASSET(2) char gMsgKanji914DTex[] = dgMsgKanji914DTex; + +#define dgMsgKanji914ETex "__OTR__textures/kanji/gMsgKanji914ETex" +static const ALIGN_ASSET(2) char gMsgKanji914ETex[] = dgMsgKanji914ETex; + +#define dgMsgKanji914FTex "__OTR__textures/kanji/gMsgKanji914FTex" +static const ALIGN_ASSET(2) char gMsgKanji914FTex[] = dgMsgKanji914FTex; + +#define dgMsgKanji9150Tex "__OTR__textures/kanji/gMsgKanji9150Tex" +static const ALIGN_ASSET(2) char gMsgKanji9150Tex[] = dgMsgKanji9150Tex; + +#define dgMsgKanji9151Tex "__OTR__textures/kanji/gMsgKanji9151Tex" +static const ALIGN_ASSET(2) char gMsgKanji9151Tex[] = dgMsgKanji9151Tex; + +#define dgMsgKanji9152Tex "__OTR__textures/kanji/gMsgKanji9152Tex" +static const ALIGN_ASSET(2) char gMsgKanji9152Tex[] = dgMsgKanji9152Tex; + +#define dgMsgKanji9153Tex "__OTR__textures/kanji/gMsgKanji9153Tex" +static const ALIGN_ASSET(2) char gMsgKanji9153Tex[] = dgMsgKanji9153Tex; + +#define dgMsgKanji9154Tex "__OTR__textures/kanji/gMsgKanji9154Tex" +static const ALIGN_ASSET(2) char gMsgKanji9154Tex[] = dgMsgKanji9154Tex; + +#define dgMsgKanji9155Tex "__OTR__textures/kanji/gMsgKanji9155Tex" +static const ALIGN_ASSET(2) char gMsgKanji9155Tex[] = dgMsgKanji9155Tex; + +#define dgMsgKanji9156Tex "__OTR__textures/kanji/gMsgKanji9156Tex" +static const ALIGN_ASSET(2) char gMsgKanji9156Tex[] = dgMsgKanji9156Tex; + +#define dgMsgKanji9157Tex "__OTR__textures/kanji/gMsgKanji9157Tex" +static const ALIGN_ASSET(2) char gMsgKanji9157Tex[] = dgMsgKanji9157Tex; + +#define dgMsgKanji9158Tex "__OTR__textures/kanji/gMsgKanji9158Tex" +static const ALIGN_ASSET(2) char gMsgKanji9158Tex[] = dgMsgKanji9158Tex; + +#define dgMsgKanji9159Tex "__OTR__textures/kanji/gMsgKanji9159Tex" +static const ALIGN_ASSET(2) char gMsgKanji9159Tex[] = dgMsgKanji9159Tex; + +#define dgMsgKanji915ATex "__OTR__textures/kanji/gMsgKanji915ATex" +static const ALIGN_ASSET(2) char gMsgKanji915ATex[] = dgMsgKanji915ATex; + +#define dgMsgKanji915BTex "__OTR__textures/kanji/gMsgKanji915BTex" +static const ALIGN_ASSET(2) char gMsgKanji915BTex[] = dgMsgKanji915BTex; + +#define dgMsgKanji915CTex "__OTR__textures/kanji/gMsgKanji915CTex" +static const ALIGN_ASSET(2) char gMsgKanji915CTex[] = dgMsgKanji915CTex; + +#define dgMsgKanji915DTex "__OTR__textures/kanji/gMsgKanji915DTex" +static const ALIGN_ASSET(2) char gMsgKanji915DTex[] = dgMsgKanji915DTex; + +#define dgMsgKanji915ETex "__OTR__textures/kanji/gMsgKanji915ETex" +static const ALIGN_ASSET(2) char gMsgKanji915ETex[] = dgMsgKanji915ETex; + +#define dgMsgKanji915FTex "__OTR__textures/kanji/gMsgKanji915FTex" +static const ALIGN_ASSET(2) char gMsgKanji915FTex[] = dgMsgKanji915FTex; + +#define dgMsgKanji9160Tex "__OTR__textures/kanji/gMsgKanji9160Tex" +static const ALIGN_ASSET(2) char gMsgKanji9160Tex[] = dgMsgKanji9160Tex; + +#define dgMsgKanji9161Tex "__OTR__textures/kanji/gMsgKanji9161Tex" +static const ALIGN_ASSET(2) char gMsgKanji9161Tex[] = dgMsgKanji9161Tex; + +#define dgMsgKanji9162Tex "__OTR__textures/kanji/gMsgKanji9162Tex" +static const ALIGN_ASSET(2) char gMsgKanji9162Tex[] = dgMsgKanji9162Tex; + +#define dgMsgKanji9163Tex "__OTR__textures/kanji/gMsgKanji9163Tex" +static const ALIGN_ASSET(2) char gMsgKanji9163Tex[] = dgMsgKanji9163Tex; + +#define dgMsgKanji9164Tex "__OTR__textures/kanji/gMsgKanji9164Tex" +static const ALIGN_ASSET(2) char gMsgKanji9164Tex[] = dgMsgKanji9164Tex; + +#define dgMsgKanji9165Tex "__OTR__textures/kanji/gMsgKanji9165Tex" +static const ALIGN_ASSET(2) char gMsgKanji9165Tex[] = dgMsgKanji9165Tex; + +#define dgMsgKanji9166Tex "__OTR__textures/kanji/gMsgKanji9166Tex" +static const ALIGN_ASSET(2) char gMsgKanji9166Tex[] = dgMsgKanji9166Tex; + +#define dgMsgKanji9167Tex "__OTR__textures/kanji/gMsgKanji9167Tex" +static const ALIGN_ASSET(2) char gMsgKanji9167Tex[] = dgMsgKanji9167Tex; + +#define dgMsgKanji9168Tex "__OTR__textures/kanji/gMsgKanji9168Tex" +static const ALIGN_ASSET(2) char gMsgKanji9168Tex[] = dgMsgKanji9168Tex; + +#define dgMsgKanji9169Tex "__OTR__textures/kanji/gMsgKanji9169Tex" +static const ALIGN_ASSET(2) char gMsgKanji9169Tex[] = dgMsgKanji9169Tex; + +#define dgMsgKanji916ATex "__OTR__textures/kanji/gMsgKanji916ATex" +static const ALIGN_ASSET(2) char gMsgKanji916ATex[] = dgMsgKanji916ATex; + +#define dgMsgKanji916BTex "__OTR__textures/kanji/gMsgKanji916BTex" +static const ALIGN_ASSET(2) char gMsgKanji916BTex[] = dgMsgKanji916BTex; + +#define dgMsgKanji916CTex "__OTR__textures/kanji/gMsgKanji916CTex" +static const ALIGN_ASSET(2) char gMsgKanji916CTex[] = dgMsgKanji916CTex; + +#define dgMsgKanji916DTex "__OTR__textures/kanji/gMsgKanji916DTex" +static const ALIGN_ASSET(2) char gMsgKanji916DTex[] = dgMsgKanji916DTex; + +#define dgMsgKanji916ETex "__OTR__textures/kanji/gMsgKanji916ETex" +static const ALIGN_ASSET(2) char gMsgKanji916ETex[] = dgMsgKanji916ETex; + +#define dgMsgKanji916FTex "__OTR__textures/kanji/gMsgKanji916FTex" +static const ALIGN_ASSET(2) char gMsgKanji916FTex[] = dgMsgKanji916FTex; + +#define dgMsgKanji9170Tex "__OTR__textures/kanji/gMsgKanji9170Tex" +static const ALIGN_ASSET(2) char gMsgKanji9170Tex[] = dgMsgKanji9170Tex; + +#define dgMsgKanji9171Tex "__OTR__textures/kanji/gMsgKanji9171Tex" +static const ALIGN_ASSET(2) char gMsgKanji9171Tex[] = dgMsgKanji9171Tex; + +#define dgMsgKanji9172Tex "__OTR__textures/kanji/gMsgKanji9172Tex" +static const ALIGN_ASSET(2) char gMsgKanji9172Tex[] = dgMsgKanji9172Tex; + +#define dgMsgKanji9173Tex "__OTR__textures/kanji/gMsgKanji9173Tex" +static const ALIGN_ASSET(2) char gMsgKanji9173Tex[] = dgMsgKanji9173Tex; + +#define dgMsgKanji9174Tex "__OTR__textures/kanji/gMsgKanji9174Tex" +static const ALIGN_ASSET(2) char gMsgKanji9174Tex[] = dgMsgKanji9174Tex; + +#define dgMsgKanji9175Tex "__OTR__textures/kanji/gMsgKanji9175Tex" +static const ALIGN_ASSET(2) char gMsgKanji9175Tex[] = dgMsgKanji9175Tex; + +#define dgMsgKanji9176Tex "__OTR__textures/kanji/gMsgKanji9176Tex" +static const ALIGN_ASSET(2) char gMsgKanji9176Tex[] = dgMsgKanji9176Tex; + +#define dgMsgKanji9177Tex "__OTR__textures/kanji/gMsgKanji9177Tex" +static const ALIGN_ASSET(2) char gMsgKanji9177Tex[] = dgMsgKanji9177Tex; + +#define dgMsgKanji9178Tex "__OTR__textures/kanji/gMsgKanji9178Tex" +static const ALIGN_ASSET(2) char gMsgKanji9178Tex[] = dgMsgKanji9178Tex; + +#define dgMsgKanji9179Tex "__OTR__textures/kanji/gMsgKanji9179Tex" +static const ALIGN_ASSET(2) char gMsgKanji9179Tex[] = dgMsgKanji9179Tex; + +#define dgMsgKanji917ATex "__OTR__textures/kanji/gMsgKanji917ATex" +static const ALIGN_ASSET(2) char gMsgKanji917ATex[] = dgMsgKanji917ATex; + +#define dgMsgKanji917BTex "__OTR__textures/kanji/gMsgKanji917BTex" +static const ALIGN_ASSET(2) char gMsgKanji917BTex[] = dgMsgKanji917BTex; + +#define dgMsgKanji917CTex "__OTR__textures/kanji/gMsgKanji917CTex" +static const ALIGN_ASSET(2) char gMsgKanji917CTex[] = dgMsgKanji917CTex; + +#define dgMsgKanji917DTex "__OTR__textures/kanji/gMsgKanji917DTex" +static const ALIGN_ASSET(2) char gMsgKanji917DTex[] = dgMsgKanji917DTex; + +#define dgMsgKanji917ETex "__OTR__textures/kanji/gMsgKanji917ETex" +static const ALIGN_ASSET(2) char gMsgKanji917ETex[] = dgMsgKanji917ETex; + +#define dgMsgKanji9180Tex "__OTR__textures/kanji/gMsgKanji9180Tex" +static const ALIGN_ASSET(2) char gMsgKanji9180Tex[] = dgMsgKanji9180Tex; + +#define dgMsgKanji9181Tex "__OTR__textures/kanji/gMsgKanji9181Tex" +static const ALIGN_ASSET(2) char gMsgKanji9181Tex[] = dgMsgKanji9181Tex; + +#define dgMsgKanji9182Tex "__OTR__textures/kanji/gMsgKanji9182Tex" +static const ALIGN_ASSET(2) char gMsgKanji9182Tex[] = dgMsgKanji9182Tex; + +#define dgMsgKanji9183Tex "__OTR__textures/kanji/gMsgKanji9183Tex" +static const ALIGN_ASSET(2) char gMsgKanji9183Tex[] = dgMsgKanji9183Tex; + +#define dgMsgKanji9184Tex "__OTR__textures/kanji/gMsgKanji9184Tex" +static const ALIGN_ASSET(2) char gMsgKanji9184Tex[] = dgMsgKanji9184Tex; + +#define dgMsgKanji9185Tex "__OTR__textures/kanji/gMsgKanji9185Tex" +static const ALIGN_ASSET(2) char gMsgKanji9185Tex[] = dgMsgKanji9185Tex; + +#define dgMsgKanji9186Tex "__OTR__textures/kanji/gMsgKanji9186Tex" +static const ALIGN_ASSET(2) char gMsgKanji9186Tex[] = dgMsgKanji9186Tex; + +#define dgMsgKanji9187Tex "__OTR__textures/kanji/gMsgKanji9187Tex" +static const ALIGN_ASSET(2) char gMsgKanji9187Tex[] = dgMsgKanji9187Tex; + +#define dgMsgKanji9188Tex "__OTR__textures/kanji/gMsgKanji9188Tex" +static const ALIGN_ASSET(2) char gMsgKanji9188Tex[] = dgMsgKanji9188Tex; + +#define dgMsgKanji9189Tex "__OTR__textures/kanji/gMsgKanji9189Tex" +static const ALIGN_ASSET(2) char gMsgKanji9189Tex[] = dgMsgKanji9189Tex; + +#define dgMsgKanji918ATex "__OTR__textures/kanji/gMsgKanji918ATex" +static const ALIGN_ASSET(2) char gMsgKanji918ATex[] = dgMsgKanji918ATex; + +#define dgMsgKanji918BTex "__OTR__textures/kanji/gMsgKanji918BTex" +static const ALIGN_ASSET(2) char gMsgKanji918BTex[] = dgMsgKanji918BTex; + +#define dgMsgKanji918CTex "__OTR__textures/kanji/gMsgKanji918CTex" +static const ALIGN_ASSET(2) char gMsgKanji918CTex[] = dgMsgKanji918CTex; + +#define dgMsgKanji918DTex "__OTR__textures/kanji/gMsgKanji918DTex" +static const ALIGN_ASSET(2) char gMsgKanji918DTex[] = dgMsgKanji918DTex; + +#define dgMsgKanji918ETex "__OTR__textures/kanji/gMsgKanji918ETex" +static const ALIGN_ASSET(2) char gMsgKanji918ETex[] = dgMsgKanji918ETex; + +#define dgMsgKanji918FTex "__OTR__textures/kanji/gMsgKanji918FTex" +static const ALIGN_ASSET(2) char gMsgKanji918FTex[] = dgMsgKanji918FTex; + +#define dgMsgKanji9190Tex "__OTR__textures/kanji/gMsgKanji9190Tex" +static const ALIGN_ASSET(2) char gMsgKanji9190Tex[] = dgMsgKanji9190Tex; + +#define dgMsgKanji9191Tex "__OTR__textures/kanji/gMsgKanji9191Tex" +static const ALIGN_ASSET(2) char gMsgKanji9191Tex[] = dgMsgKanji9191Tex; + +#define dgMsgKanji9192Tex "__OTR__textures/kanji/gMsgKanji9192Tex" +static const ALIGN_ASSET(2) char gMsgKanji9192Tex[] = dgMsgKanji9192Tex; + +#define dgMsgKanji9193Tex "__OTR__textures/kanji/gMsgKanji9193Tex" +static const ALIGN_ASSET(2) char gMsgKanji9193Tex[] = dgMsgKanji9193Tex; + +#define dgMsgKanji9194Tex "__OTR__textures/kanji/gMsgKanji9194Tex" +static const ALIGN_ASSET(2) char gMsgKanji9194Tex[] = dgMsgKanji9194Tex; + +#define dgMsgKanji9195Tex "__OTR__textures/kanji/gMsgKanji9195Tex" +static const ALIGN_ASSET(2) char gMsgKanji9195Tex[] = dgMsgKanji9195Tex; + +#define dgMsgKanji9196Tex "__OTR__textures/kanji/gMsgKanji9196Tex" +static const ALIGN_ASSET(2) char gMsgKanji9196Tex[] = dgMsgKanji9196Tex; + +#define dgMsgKanji9197Tex "__OTR__textures/kanji/gMsgKanji9197Tex" +static const ALIGN_ASSET(2) char gMsgKanji9197Tex[] = dgMsgKanji9197Tex; + +#define dgMsgKanji9198Tex "__OTR__textures/kanji/gMsgKanji9198Tex" +static const ALIGN_ASSET(2) char gMsgKanji9198Tex[] = dgMsgKanji9198Tex; + +#define dgMsgKanji9199Tex "__OTR__textures/kanji/gMsgKanji9199Tex" +static const ALIGN_ASSET(2) char gMsgKanji9199Tex[] = dgMsgKanji9199Tex; + +#define dgMsgKanji919ATex "__OTR__textures/kanji/gMsgKanji919ATex" +static const ALIGN_ASSET(2) char gMsgKanji919ATex[] = dgMsgKanji919ATex; + +#define dgMsgKanji919BTex "__OTR__textures/kanji/gMsgKanji919BTex" +static const ALIGN_ASSET(2) char gMsgKanji919BTex[] = dgMsgKanji919BTex; + +#define dgMsgKanji919CTex "__OTR__textures/kanji/gMsgKanji919CTex" +static const ALIGN_ASSET(2) char gMsgKanji919CTex[] = dgMsgKanji919CTex; + +#define dgMsgKanji919DTex "__OTR__textures/kanji/gMsgKanji919DTex" +static const ALIGN_ASSET(2) char gMsgKanji919DTex[] = dgMsgKanji919DTex; + +#define dgMsgKanji919ETex "__OTR__textures/kanji/gMsgKanji919ETex" +static const ALIGN_ASSET(2) char gMsgKanji919ETex[] = dgMsgKanji919ETex; + +#define dgMsgKanji919FTex "__OTR__textures/kanji/gMsgKanji919FTex" +static const ALIGN_ASSET(2) char gMsgKanji919FTex[] = dgMsgKanji919FTex; + +#define dgMsgKanji91A0Tex "__OTR__textures/kanji/gMsgKanji91A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A0Tex[] = dgMsgKanji91A0Tex; + +#define dgMsgKanji91A1Tex "__OTR__textures/kanji/gMsgKanji91A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A1Tex[] = dgMsgKanji91A1Tex; + +#define dgMsgKanji91A2Tex "__OTR__textures/kanji/gMsgKanji91A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A2Tex[] = dgMsgKanji91A2Tex; + +#define dgMsgKanji91A3Tex "__OTR__textures/kanji/gMsgKanji91A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A3Tex[] = dgMsgKanji91A3Tex; + +#define dgMsgKanji91A4Tex "__OTR__textures/kanji/gMsgKanji91A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A4Tex[] = dgMsgKanji91A4Tex; + +#define dgMsgKanji91A5Tex "__OTR__textures/kanji/gMsgKanji91A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A5Tex[] = dgMsgKanji91A5Tex; + +#define dgMsgKanji91A6Tex "__OTR__textures/kanji/gMsgKanji91A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A6Tex[] = dgMsgKanji91A6Tex; + +#define dgMsgKanji91A7Tex "__OTR__textures/kanji/gMsgKanji91A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A7Tex[] = dgMsgKanji91A7Tex; + +#define dgMsgKanji91A8Tex "__OTR__textures/kanji/gMsgKanji91A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A8Tex[] = dgMsgKanji91A8Tex; + +#define dgMsgKanji91A9Tex "__OTR__textures/kanji/gMsgKanji91A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A9Tex[] = dgMsgKanji91A9Tex; + +#define dgMsgKanji91AATex "__OTR__textures/kanji/gMsgKanji91AATex" +static const ALIGN_ASSET(2) char gMsgKanji91AATex[] = dgMsgKanji91AATex; + +#define dgMsgKanji91ABTex "__OTR__textures/kanji/gMsgKanji91ABTex" +static const ALIGN_ASSET(2) char gMsgKanji91ABTex[] = dgMsgKanji91ABTex; + +#define dgMsgKanji91ACTex "__OTR__textures/kanji/gMsgKanji91ACTex" +static const ALIGN_ASSET(2) char gMsgKanji91ACTex[] = dgMsgKanji91ACTex; + +#define dgMsgKanji91ADTex "__OTR__textures/kanji/gMsgKanji91ADTex" +static const ALIGN_ASSET(2) char gMsgKanji91ADTex[] = dgMsgKanji91ADTex; + +#define dgMsgKanji91AETex "__OTR__textures/kanji/gMsgKanji91AETex" +static const ALIGN_ASSET(2) char gMsgKanji91AETex[] = dgMsgKanji91AETex; + +#define dgMsgKanji91AFTex "__OTR__textures/kanji/gMsgKanji91AFTex" +static const ALIGN_ASSET(2) char gMsgKanji91AFTex[] = dgMsgKanji91AFTex; + +#define dgMsgKanji91B0Tex "__OTR__textures/kanji/gMsgKanji91B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B0Tex[] = dgMsgKanji91B0Tex; + +#define dgMsgKanji91B1Tex "__OTR__textures/kanji/gMsgKanji91B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B1Tex[] = dgMsgKanji91B1Tex; + +#define dgMsgKanji91B2Tex "__OTR__textures/kanji/gMsgKanji91B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B2Tex[] = dgMsgKanji91B2Tex; + +#define dgMsgKanji91B3Tex "__OTR__textures/kanji/gMsgKanji91B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B3Tex[] = dgMsgKanji91B3Tex; + +#define dgMsgKanji91B4Tex "__OTR__textures/kanji/gMsgKanji91B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B4Tex[] = dgMsgKanji91B4Tex; + +#define dgMsgKanji91B5Tex "__OTR__textures/kanji/gMsgKanji91B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B5Tex[] = dgMsgKanji91B5Tex; + +#define dgMsgKanji91B6Tex "__OTR__textures/kanji/gMsgKanji91B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B6Tex[] = dgMsgKanji91B6Tex; + +#define dgMsgKanji91B7Tex "__OTR__textures/kanji/gMsgKanji91B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B7Tex[] = dgMsgKanji91B7Tex; + +#define dgMsgKanji91B8Tex "__OTR__textures/kanji/gMsgKanji91B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B8Tex[] = dgMsgKanji91B8Tex; + +#define dgMsgKanji91B9Tex "__OTR__textures/kanji/gMsgKanji91B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B9Tex[] = dgMsgKanji91B9Tex; + +#define dgMsgKanji91BATex "__OTR__textures/kanji/gMsgKanji91BATex" +static const ALIGN_ASSET(2) char gMsgKanji91BATex[] = dgMsgKanji91BATex; + +#define dgMsgKanji91BBTex "__OTR__textures/kanji/gMsgKanji91BBTex" +static const ALIGN_ASSET(2) char gMsgKanji91BBTex[] = dgMsgKanji91BBTex; + +#define dgMsgKanji91BCTex "__OTR__textures/kanji/gMsgKanji91BCTex" +static const ALIGN_ASSET(2) char gMsgKanji91BCTex[] = dgMsgKanji91BCTex; + +#define dgMsgKanji91BDTex "__OTR__textures/kanji/gMsgKanji91BDTex" +static const ALIGN_ASSET(2) char gMsgKanji91BDTex[] = dgMsgKanji91BDTex; + +#define dgMsgKanji91BETex "__OTR__textures/kanji/gMsgKanji91BETex" +static const ALIGN_ASSET(2) char gMsgKanji91BETex[] = dgMsgKanji91BETex; + +#define dgMsgKanji91BFTex "__OTR__textures/kanji/gMsgKanji91BFTex" +static const ALIGN_ASSET(2) char gMsgKanji91BFTex[] = dgMsgKanji91BFTex; + +#define dgMsgKanji91C0Tex "__OTR__textures/kanji/gMsgKanji91C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C0Tex[] = dgMsgKanji91C0Tex; + +#define dgMsgKanji91C1Tex "__OTR__textures/kanji/gMsgKanji91C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C1Tex[] = dgMsgKanji91C1Tex; + +#define dgMsgKanji91C2Tex "__OTR__textures/kanji/gMsgKanji91C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C2Tex[] = dgMsgKanji91C2Tex; + +#define dgMsgKanji91C3Tex "__OTR__textures/kanji/gMsgKanji91C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C3Tex[] = dgMsgKanji91C3Tex; + +#define dgMsgKanji91C4Tex "__OTR__textures/kanji/gMsgKanji91C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C4Tex[] = dgMsgKanji91C4Tex; + +#define dgMsgKanji91C5Tex "__OTR__textures/kanji/gMsgKanji91C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C5Tex[] = dgMsgKanji91C5Tex; + +#define dgMsgKanji91C6Tex "__OTR__textures/kanji/gMsgKanji91C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C6Tex[] = dgMsgKanji91C6Tex; + +#define dgMsgKanji91C7Tex "__OTR__textures/kanji/gMsgKanji91C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C7Tex[] = dgMsgKanji91C7Tex; + +#define dgMsgKanji91C8Tex "__OTR__textures/kanji/gMsgKanji91C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C8Tex[] = dgMsgKanji91C8Tex; + +#define dgMsgKanji91C9Tex "__OTR__textures/kanji/gMsgKanji91C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C9Tex[] = dgMsgKanji91C9Tex; + +#define dgMsgKanji91CATex "__OTR__textures/kanji/gMsgKanji91CATex" +static const ALIGN_ASSET(2) char gMsgKanji91CATex[] = dgMsgKanji91CATex; + +#define dgMsgKanji91CBTex "__OTR__textures/kanji/gMsgKanji91CBTex" +static const ALIGN_ASSET(2) char gMsgKanji91CBTex[] = dgMsgKanji91CBTex; + +#define dgMsgKanji91CCTex "__OTR__textures/kanji/gMsgKanji91CCTex" +static const ALIGN_ASSET(2) char gMsgKanji91CCTex[] = dgMsgKanji91CCTex; + +#define dgMsgKanji91CDTex "__OTR__textures/kanji/gMsgKanji91CDTex" +static const ALIGN_ASSET(2) char gMsgKanji91CDTex[] = dgMsgKanji91CDTex; + +#define dgMsgKanji91CETex "__OTR__textures/kanji/gMsgKanji91CETex" +static const ALIGN_ASSET(2) char gMsgKanji91CETex[] = dgMsgKanji91CETex; + +#define dgMsgKanji91CFTex "__OTR__textures/kanji/gMsgKanji91CFTex" +static const ALIGN_ASSET(2) char gMsgKanji91CFTex[] = dgMsgKanji91CFTex; + +#define dgMsgKanji91D0Tex "__OTR__textures/kanji/gMsgKanji91D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D0Tex[] = dgMsgKanji91D0Tex; + +#define dgMsgKanji91D1Tex "__OTR__textures/kanji/gMsgKanji91D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D1Tex[] = dgMsgKanji91D1Tex; + +#define dgMsgKanji91D2Tex "__OTR__textures/kanji/gMsgKanji91D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D2Tex[] = dgMsgKanji91D2Tex; + +#define dgMsgKanji91D3Tex "__OTR__textures/kanji/gMsgKanji91D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D3Tex[] = dgMsgKanji91D3Tex; + +#define dgMsgKanji91D4Tex "__OTR__textures/kanji/gMsgKanji91D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D4Tex[] = dgMsgKanji91D4Tex; + +#define dgMsgKanji91D5Tex "__OTR__textures/kanji/gMsgKanji91D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D5Tex[] = dgMsgKanji91D5Tex; + +#define dgMsgKanji91D6Tex "__OTR__textures/kanji/gMsgKanji91D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D6Tex[] = dgMsgKanji91D6Tex; + +#define dgMsgKanji91D7Tex "__OTR__textures/kanji/gMsgKanji91D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D7Tex[] = dgMsgKanji91D7Tex; + +#define dgMsgKanji91D8Tex "__OTR__textures/kanji/gMsgKanji91D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D8Tex[] = dgMsgKanji91D8Tex; + +#define dgMsgKanji91D9Tex "__OTR__textures/kanji/gMsgKanji91D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D9Tex[] = dgMsgKanji91D9Tex; + +#define dgMsgKanji91DATex "__OTR__textures/kanji/gMsgKanji91DATex" +static const ALIGN_ASSET(2) char gMsgKanji91DATex[] = dgMsgKanji91DATex; + +#define dgMsgKanji91DBTex "__OTR__textures/kanji/gMsgKanji91DBTex" +static const ALIGN_ASSET(2) char gMsgKanji91DBTex[] = dgMsgKanji91DBTex; + +#define dgMsgKanji91DCTex "__OTR__textures/kanji/gMsgKanji91DCTex" +static const ALIGN_ASSET(2) char gMsgKanji91DCTex[] = dgMsgKanji91DCTex; + +#define dgMsgKanji91DDTex "__OTR__textures/kanji/gMsgKanji91DDTex" +static const ALIGN_ASSET(2) char gMsgKanji91DDTex[] = dgMsgKanji91DDTex; + +#define dgMsgKanji91DETex "__OTR__textures/kanji/gMsgKanji91DETex" +static const ALIGN_ASSET(2) char gMsgKanji91DETex[] = dgMsgKanji91DETex; + +#define dgMsgKanji91DFTex "__OTR__textures/kanji/gMsgKanji91DFTex" +static const ALIGN_ASSET(2) char gMsgKanji91DFTex[] = dgMsgKanji91DFTex; + +#define dgMsgKanji91E0Tex "__OTR__textures/kanji/gMsgKanji91E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E0Tex[] = dgMsgKanji91E0Tex; + +#define dgMsgKanji91E1Tex "__OTR__textures/kanji/gMsgKanji91E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E1Tex[] = dgMsgKanji91E1Tex; + +#define dgMsgKanji91E2Tex "__OTR__textures/kanji/gMsgKanji91E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E2Tex[] = dgMsgKanji91E2Tex; + +#define dgMsgKanji91E3Tex "__OTR__textures/kanji/gMsgKanji91E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E3Tex[] = dgMsgKanji91E3Tex; + +#define dgMsgKanji91E4Tex "__OTR__textures/kanji/gMsgKanji91E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E4Tex[] = dgMsgKanji91E4Tex; + +#define dgMsgKanji91E5Tex "__OTR__textures/kanji/gMsgKanji91E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E5Tex[] = dgMsgKanji91E5Tex; + +#define dgMsgKanji91E6Tex "__OTR__textures/kanji/gMsgKanji91E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E6Tex[] = dgMsgKanji91E6Tex; + +#define dgMsgKanji91E7Tex "__OTR__textures/kanji/gMsgKanji91E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E7Tex[] = dgMsgKanji91E7Tex; + +#define dgMsgKanji91E8Tex "__OTR__textures/kanji/gMsgKanji91E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E8Tex[] = dgMsgKanji91E8Tex; + +#define dgMsgKanji91E9Tex "__OTR__textures/kanji/gMsgKanji91E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E9Tex[] = dgMsgKanji91E9Tex; + +#define dgMsgKanji91EATex "__OTR__textures/kanji/gMsgKanji91EATex" +static const ALIGN_ASSET(2) char gMsgKanji91EATex[] = dgMsgKanji91EATex; + +#define dgMsgKanji91EBTex "__OTR__textures/kanji/gMsgKanji91EBTex" +static const ALIGN_ASSET(2) char gMsgKanji91EBTex[] = dgMsgKanji91EBTex; + +#define dgMsgKanji91ECTex "__OTR__textures/kanji/gMsgKanji91ECTex" +static const ALIGN_ASSET(2) char gMsgKanji91ECTex[] = dgMsgKanji91ECTex; + +#define dgMsgKanji91EDTex "__OTR__textures/kanji/gMsgKanji91EDTex" +static const ALIGN_ASSET(2) char gMsgKanji91EDTex[] = dgMsgKanji91EDTex; + +#define dgMsgKanji91EETex "__OTR__textures/kanji/gMsgKanji91EETex" +static const ALIGN_ASSET(2) char gMsgKanji91EETex[] = dgMsgKanji91EETex; + +#define dgMsgKanji91EFTex "__OTR__textures/kanji/gMsgKanji91EFTex" +static const ALIGN_ASSET(2) char gMsgKanji91EFTex[] = dgMsgKanji91EFTex; + +#define dgMsgKanji91F0Tex "__OTR__textures/kanji/gMsgKanji91F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F0Tex[] = dgMsgKanji91F0Tex; + +#define dgMsgKanji91F1Tex "__OTR__textures/kanji/gMsgKanji91F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F1Tex[] = dgMsgKanji91F1Tex; + +#define dgMsgKanji91F2Tex "__OTR__textures/kanji/gMsgKanji91F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F2Tex[] = dgMsgKanji91F2Tex; + +#define dgMsgKanji91F3Tex "__OTR__textures/kanji/gMsgKanji91F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F3Tex[] = dgMsgKanji91F3Tex; + +#define dgMsgKanji91F4Tex "__OTR__textures/kanji/gMsgKanji91F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F4Tex[] = dgMsgKanji91F4Tex; + +#define dgMsgKanji91F5Tex "__OTR__textures/kanji/gMsgKanji91F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F5Tex[] = dgMsgKanji91F5Tex; + +#define dgMsgKanji91F6Tex "__OTR__textures/kanji/gMsgKanji91F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F6Tex[] = dgMsgKanji91F6Tex; + +#define dgMsgKanji91F7Tex "__OTR__textures/kanji/gMsgKanji91F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F7Tex[] = dgMsgKanji91F7Tex; + +#define dgMsgKanji91F8Tex "__OTR__textures/kanji/gMsgKanji91F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F8Tex[] = dgMsgKanji91F8Tex; + +#define dgMsgKanji91F9Tex "__OTR__textures/kanji/gMsgKanji91F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F9Tex[] = dgMsgKanji91F9Tex; + +#define dgMsgKanji91FATex "__OTR__textures/kanji/gMsgKanji91FATex" +static const ALIGN_ASSET(2) char gMsgKanji91FATex[] = dgMsgKanji91FATex; + +#define dgMsgKanji91FBTex "__OTR__textures/kanji/gMsgKanji91FBTex" +static const ALIGN_ASSET(2) char gMsgKanji91FBTex[] = dgMsgKanji91FBTex; + +#define dgMsgKanji91FCTex "__OTR__textures/kanji/gMsgKanji91FCTex" +static const ALIGN_ASSET(2) char gMsgKanji91FCTex[] = dgMsgKanji91FCTex; + +#define dgMsgKanji9240Tex "__OTR__textures/kanji/gMsgKanji9240Tex" +static const ALIGN_ASSET(2) char gMsgKanji9240Tex[] = dgMsgKanji9240Tex; + +#define dgMsgKanji9241Tex "__OTR__textures/kanji/gMsgKanji9241Tex" +static const ALIGN_ASSET(2) char gMsgKanji9241Tex[] = dgMsgKanji9241Tex; + +#define dgMsgKanji9242Tex "__OTR__textures/kanji/gMsgKanji9242Tex" +static const ALIGN_ASSET(2) char gMsgKanji9242Tex[] = dgMsgKanji9242Tex; + +#define dgMsgKanji9243Tex "__OTR__textures/kanji/gMsgKanji9243Tex" +static const ALIGN_ASSET(2) char gMsgKanji9243Tex[] = dgMsgKanji9243Tex; + +#define dgMsgKanji9244Tex "__OTR__textures/kanji/gMsgKanji9244Tex" +static const ALIGN_ASSET(2) char gMsgKanji9244Tex[] = dgMsgKanji9244Tex; + +#define dgMsgKanji9245Tex "__OTR__textures/kanji/gMsgKanji9245Tex" +static const ALIGN_ASSET(2) char gMsgKanji9245Tex[] = dgMsgKanji9245Tex; + +#define dgMsgKanji9246Tex "__OTR__textures/kanji/gMsgKanji9246Tex" +static const ALIGN_ASSET(2) char gMsgKanji9246Tex[] = dgMsgKanji9246Tex; + +#define dgMsgKanji9247Tex "__OTR__textures/kanji/gMsgKanji9247Tex" +static const ALIGN_ASSET(2) char gMsgKanji9247Tex[] = dgMsgKanji9247Tex; + +#define dgMsgKanji9248Tex "__OTR__textures/kanji/gMsgKanji9248Tex" +static const ALIGN_ASSET(2) char gMsgKanji9248Tex[] = dgMsgKanji9248Tex; + +#define dgMsgKanji9249Tex "__OTR__textures/kanji/gMsgKanji9249Tex" +static const ALIGN_ASSET(2) char gMsgKanji9249Tex[] = dgMsgKanji9249Tex; + +#define dgMsgKanji924ATex "__OTR__textures/kanji/gMsgKanji924ATex" +static const ALIGN_ASSET(2) char gMsgKanji924ATex[] = dgMsgKanji924ATex; + +#define dgMsgKanji924BTex "__OTR__textures/kanji/gMsgKanji924BTex" +static const ALIGN_ASSET(2) char gMsgKanji924BTex[] = dgMsgKanji924BTex; + +#define dgMsgKanji924CTex "__OTR__textures/kanji/gMsgKanji924CTex" +static const ALIGN_ASSET(2) char gMsgKanji924CTex[] = dgMsgKanji924CTex; + +#define dgMsgKanji924DTex "__OTR__textures/kanji/gMsgKanji924DTex" +static const ALIGN_ASSET(2) char gMsgKanji924DTex[] = dgMsgKanji924DTex; + +#define dgMsgKanji924ETex "__OTR__textures/kanji/gMsgKanji924ETex" +static const ALIGN_ASSET(2) char gMsgKanji924ETex[] = dgMsgKanji924ETex; + +#define dgMsgKanji924FTex "__OTR__textures/kanji/gMsgKanji924FTex" +static const ALIGN_ASSET(2) char gMsgKanji924FTex[] = dgMsgKanji924FTex; + +#define dgMsgKanji9250Tex "__OTR__textures/kanji/gMsgKanji9250Tex" +static const ALIGN_ASSET(2) char gMsgKanji9250Tex[] = dgMsgKanji9250Tex; + +#define dgMsgKanji9251Tex "__OTR__textures/kanji/gMsgKanji9251Tex" +static const ALIGN_ASSET(2) char gMsgKanji9251Tex[] = dgMsgKanji9251Tex; + +#define dgMsgKanji9252Tex "__OTR__textures/kanji/gMsgKanji9252Tex" +static const ALIGN_ASSET(2) char gMsgKanji9252Tex[] = dgMsgKanji9252Tex; + +#define dgMsgKanji9253Tex "__OTR__textures/kanji/gMsgKanji9253Tex" +static const ALIGN_ASSET(2) char gMsgKanji9253Tex[] = dgMsgKanji9253Tex; + +#define dgMsgKanji9254Tex "__OTR__textures/kanji/gMsgKanji9254Tex" +static const ALIGN_ASSET(2) char gMsgKanji9254Tex[] = dgMsgKanji9254Tex; + +#define dgMsgKanji9255Tex "__OTR__textures/kanji/gMsgKanji9255Tex" +static const ALIGN_ASSET(2) char gMsgKanji9255Tex[] = dgMsgKanji9255Tex; + +#define dgMsgKanji9256Tex "__OTR__textures/kanji/gMsgKanji9256Tex" +static const ALIGN_ASSET(2) char gMsgKanji9256Tex[] = dgMsgKanji9256Tex; + +#define dgMsgKanji9257Tex "__OTR__textures/kanji/gMsgKanji9257Tex" +static const ALIGN_ASSET(2) char gMsgKanji9257Tex[] = dgMsgKanji9257Tex; + +#define dgMsgKanji9258Tex "__OTR__textures/kanji/gMsgKanji9258Tex" +static const ALIGN_ASSET(2) char gMsgKanji9258Tex[] = dgMsgKanji9258Tex; + +#define dgMsgKanji9259Tex "__OTR__textures/kanji/gMsgKanji9259Tex" +static const ALIGN_ASSET(2) char gMsgKanji9259Tex[] = dgMsgKanji9259Tex; + +#define dgMsgKanji925ATex "__OTR__textures/kanji/gMsgKanji925ATex" +static const ALIGN_ASSET(2) char gMsgKanji925ATex[] = dgMsgKanji925ATex; + +#define dgMsgKanji925BTex "__OTR__textures/kanji/gMsgKanji925BTex" +static const ALIGN_ASSET(2) char gMsgKanji925BTex[] = dgMsgKanji925BTex; + +#define dgMsgKanji925CTex "__OTR__textures/kanji/gMsgKanji925CTex" +static const ALIGN_ASSET(2) char gMsgKanji925CTex[] = dgMsgKanji925CTex; + +#define dgMsgKanji925DTex "__OTR__textures/kanji/gMsgKanji925DTex" +static const ALIGN_ASSET(2) char gMsgKanji925DTex[] = dgMsgKanji925DTex; + +#define dgMsgKanji925ETex "__OTR__textures/kanji/gMsgKanji925ETex" +static const ALIGN_ASSET(2) char gMsgKanji925ETex[] = dgMsgKanji925ETex; + +#define dgMsgKanji925FTex "__OTR__textures/kanji/gMsgKanji925FTex" +static const ALIGN_ASSET(2) char gMsgKanji925FTex[] = dgMsgKanji925FTex; + +#define dgMsgKanji9260Tex "__OTR__textures/kanji/gMsgKanji9260Tex" +static const ALIGN_ASSET(2) char gMsgKanji9260Tex[] = dgMsgKanji9260Tex; + +#define dgMsgKanji9261Tex "__OTR__textures/kanji/gMsgKanji9261Tex" +static const ALIGN_ASSET(2) char gMsgKanji9261Tex[] = dgMsgKanji9261Tex; + +#define dgMsgKanji9262Tex "__OTR__textures/kanji/gMsgKanji9262Tex" +static const ALIGN_ASSET(2) char gMsgKanji9262Tex[] = dgMsgKanji9262Tex; + +#define dgMsgKanji9263Tex "__OTR__textures/kanji/gMsgKanji9263Tex" +static const ALIGN_ASSET(2) char gMsgKanji9263Tex[] = dgMsgKanji9263Tex; + +#define dgMsgKanji9264Tex "__OTR__textures/kanji/gMsgKanji9264Tex" +static const ALIGN_ASSET(2) char gMsgKanji9264Tex[] = dgMsgKanji9264Tex; + +#define dgMsgKanji9265Tex "__OTR__textures/kanji/gMsgKanji9265Tex" +static const ALIGN_ASSET(2) char gMsgKanji9265Tex[] = dgMsgKanji9265Tex; + +#define dgMsgKanji9266Tex "__OTR__textures/kanji/gMsgKanji9266Tex" +static const ALIGN_ASSET(2) char gMsgKanji9266Tex[] = dgMsgKanji9266Tex; + +#define dgMsgKanji9267Tex "__OTR__textures/kanji/gMsgKanji9267Tex" +static const ALIGN_ASSET(2) char gMsgKanji9267Tex[] = dgMsgKanji9267Tex; + +#define dgMsgKanji9268Tex "__OTR__textures/kanji/gMsgKanji9268Tex" +static const ALIGN_ASSET(2) char gMsgKanji9268Tex[] = dgMsgKanji9268Tex; + +#define dgMsgKanji9269Tex "__OTR__textures/kanji/gMsgKanji9269Tex" +static const ALIGN_ASSET(2) char gMsgKanji9269Tex[] = dgMsgKanji9269Tex; + +#define dgMsgKanji926ATex "__OTR__textures/kanji/gMsgKanji926ATex" +static const ALIGN_ASSET(2) char gMsgKanji926ATex[] = dgMsgKanji926ATex; + +#define dgMsgKanji926BTex "__OTR__textures/kanji/gMsgKanji926BTex" +static const ALIGN_ASSET(2) char gMsgKanji926BTex[] = dgMsgKanji926BTex; + +#define dgMsgKanji926CTex "__OTR__textures/kanji/gMsgKanji926CTex" +static const ALIGN_ASSET(2) char gMsgKanji926CTex[] = dgMsgKanji926CTex; + +#define dgMsgKanji926DTex "__OTR__textures/kanji/gMsgKanji926DTex" +static const ALIGN_ASSET(2) char gMsgKanji926DTex[] = dgMsgKanji926DTex; + +#define dgMsgKanji926ETex "__OTR__textures/kanji/gMsgKanji926ETex" +static const ALIGN_ASSET(2) char gMsgKanji926ETex[] = dgMsgKanji926ETex; + +#define dgMsgKanji926FTex "__OTR__textures/kanji/gMsgKanji926FTex" +static const ALIGN_ASSET(2) char gMsgKanji926FTex[] = dgMsgKanji926FTex; + +#define dgMsgKanji9270Tex "__OTR__textures/kanji/gMsgKanji9270Tex" +static const ALIGN_ASSET(2) char gMsgKanji9270Tex[] = dgMsgKanji9270Tex; + +#define dgMsgKanji9271Tex "__OTR__textures/kanji/gMsgKanji9271Tex" +static const ALIGN_ASSET(2) char gMsgKanji9271Tex[] = dgMsgKanji9271Tex; + +#define dgMsgKanji9272Tex "__OTR__textures/kanji/gMsgKanji9272Tex" +static const ALIGN_ASSET(2) char gMsgKanji9272Tex[] = dgMsgKanji9272Tex; + +#define dgMsgKanji9273Tex "__OTR__textures/kanji/gMsgKanji9273Tex" +static const ALIGN_ASSET(2) char gMsgKanji9273Tex[] = dgMsgKanji9273Tex; + +#define dgMsgKanji9274Tex "__OTR__textures/kanji/gMsgKanji9274Tex" +static const ALIGN_ASSET(2) char gMsgKanji9274Tex[] = dgMsgKanji9274Tex; + +#define dgMsgKanji9275Tex "__OTR__textures/kanji/gMsgKanji9275Tex" +static const ALIGN_ASSET(2) char gMsgKanji9275Tex[] = dgMsgKanji9275Tex; + +#define dgMsgKanji9276Tex "__OTR__textures/kanji/gMsgKanji9276Tex" +static const ALIGN_ASSET(2) char gMsgKanji9276Tex[] = dgMsgKanji9276Tex; + +#define dgMsgKanji9277Tex "__OTR__textures/kanji/gMsgKanji9277Tex" +static const ALIGN_ASSET(2) char gMsgKanji9277Tex[] = dgMsgKanji9277Tex; + +#define dgMsgKanji9278Tex "__OTR__textures/kanji/gMsgKanji9278Tex" +static const ALIGN_ASSET(2) char gMsgKanji9278Tex[] = dgMsgKanji9278Tex; + +#define dgMsgKanji9279Tex "__OTR__textures/kanji/gMsgKanji9279Tex" +static const ALIGN_ASSET(2) char gMsgKanji9279Tex[] = dgMsgKanji9279Tex; + +#define dgMsgKanji927ATex "__OTR__textures/kanji/gMsgKanji927ATex" +static const ALIGN_ASSET(2) char gMsgKanji927ATex[] = dgMsgKanji927ATex; + +#define dgMsgKanji927BTex "__OTR__textures/kanji/gMsgKanji927BTex" +static const ALIGN_ASSET(2) char gMsgKanji927BTex[] = dgMsgKanji927BTex; + +#define dgMsgKanji927CTex "__OTR__textures/kanji/gMsgKanji927CTex" +static const ALIGN_ASSET(2) char gMsgKanji927CTex[] = dgMsgKanji927CTex; + +#define dgMsgKanji927DTex "__OTR__textures/kanji/gMsgKanji927DTex" +static const ALIGN_ASSET(2) char gMsgKanji927DTex[] = dgMsgKanji927DTex; + +#define dgMsgKanji927ETex "__OTR__textures/kanji/gMsgKanji927ETex" +static const ALIGN_ASSET(2) char gMsgKanji927ETex[] = dgMsgKanji927ETex; + +#define dgMsgKanji9280Tex "__OTR__textures/kanji/gMsgKanji9280Tex" +static const ALIGN_ASSET(2) char gMsgKanji9280Tex[] = dgMsgKanji9280Tex; + +#define dgMsgKanji9281Tex "__OTR__textures/kanji/gMsgKanji9281Tex" +static const ALIGN_ASSET(2) char gMsgKanji9281Tex[] = dgMsgKanji9281Tex; + +#define dgMsgKanji9282Tex "__OTR__textures/kanji/gMsgKanji9282Tex" +static const ALIGN_ASSET(2) char gMsgKanji9282Tex[] = dgMsgKanji9282Tex; + +#define dgMsgKanji9283Tex "__OTR__textures/kanji/gMsgKanji9283Tex" +static const ALIGN_ASSET(2) char gMsgKanji9283Tex[] = dgMsgKanji9283Tex; + +#define dgMsgKanji9284Tex "__OTR__textures/kanji/gMsgKanji9284Tex" +static const ALIGN_ASSET(2) char gMsgKanji9284Tex[] = dgMsgKanji9284Tex; + +#define dgMsgKanji9285Tex "__OTR__textures/kanji/gMsgKanji9285Tex" +static const ALIGN_ASSET(2) char gMsgKanji9285Tex[] = dgMsgKanji9285Tex; + +#define dgMsgKanji9286Tex "__OTR__textures/kanji/gMsgKanji9286Tex" +static const ALIGN_ASSET(2) char gMsgKanji9286Tex[] = dgMsgKanji9286Tex; + +#define dgMsgKanji9287Tex "__OTR__textures/kanji/gMsgKanji9287Tex" +static const ALIGN_ASSET(2) char gMsgKanji9287Tex[] = dgMsgKanji9287Tex; + +#define dgMsgKanji9288Tex "__OTR__textures/kanji/gMsgKanji9288Tex" +static const ALIGN_ASSET(2) char gMsgKanji9288Tex[] = dgMsgKanji9288Tex; + +#define dgMsgKanji9289Tex "__OTR__textures/kanji/gMsgKanji9289Tex" +static const ALIGN_ASSET(2) char gMsgKanji9289Tex[] = dgMsgKanji9289Tex; + +#define dgMsgKanji928ATex "__OTR__textures/kanji/gMsgKanji928ATex" +static const ALIGN_ASSET(2) char gMsgKanji928ATex[] = dgMsgKanji928ATex; + +#define dgMsgKanji928BTex "__OTR__textures/kanji/gMsgKanji928BTex" +static const ALIGN_ASSET(2) char gMsgKanji928BTex[] = dgMsgKanji928BTex; + +#define dgMsgKanji928CTex "__OTR__textures/kanji/gMsgKanji928CTex" +static const ALIGN_ASSET(2) char gMsgKanji928CTex[] = dgMsgKanji928CTex; + +#define dgMsgKanji928DTex "__OTR__textures/kanji/gMsgKanji928DTex" +static const ALIGN_ASSET(2) char gMsgKanji928DTex[] = dgMsgKanji928DTex; + +#define dgMsgKanji928ETex "__OTR__textures/kanji/gMsgKanji928ETex" +static const ALIGN_ASSET(2) char gMsgKanji928ETex[] = dgMsgKanji928ETex; + +#define dgMsgKanji928FTex "__OTR__textures/kanji/gMsgKanji928FTex" +static const ALIGN_ASSET(2) char gMsgKanji928FTex[] = dgMsgKanji928FTex; + +#define dgMsgKanji9290Tex "__OTR__textures/kanji/gMsgKanji9290Tex" +static const ALIGN_ASSET(2) char gMsgKanji9290Tex[] = dgMsgKanji9290Tex; + +#define dgMsgKanji9291Tex "__OTR__textures/kanji/gMsgKanji9291Tex" +static const ALIGN_ASSET(2) char gMsgKanji9291Tex[] = dgMsgKanji9291Tex; + +#define dgMsgKanji9292Tex "__OTR__textures/kanji/gMsgKanji9292Tex" +static const ALIGN_ASSET(2) char gMsgKanji9292Tex[] = dgMsgKanji9292Tex; + +#define dgMsgKanji9293Tex "__OTR__textures/kanji/gMsgKanji9293Tex" +static const ALIGN_ASSET(2) char gMsgKanji9293Tex[] = dgMsgKanji9293Tex; + +#define dgMsgKanji9294Tex "__OTR__textures/kanji/gMsgKanji9294Tex" +static const ALIGN_ASSET(2) char gMsgKanji9294Tex[] = dgMsgKanji9294Tex; + +#define dgMsgKanji9295Tex "__OTR__textures/kanji/gMsgKanji9295Tex" +static const ALIGN_ASSET(2) char gMsgKanji9295Tex[] = dgMsgKanji9295Tex; + +#define dgMsgKanji9296Tex "__OTR__textures/kanji/gMsgKanji9296Tex" +static const ALIGN_ASSET(2) char gMsgKanji9296Tex[] = dgMsgKanji9296Tex; + +#define dgMsgKanji9297Tex "__OTR__textures/kanji/gMsgKanji9297Tex" +static const ALIGN_ASSET(2) char gMsgKanji9297Tex[] = dgMsgKanji9297Tex; + +#define dgMsgKanji9298Tex "__OTR__textures/kanji/gMsgKanji9298Tex" +static const ALIGN_ASSET(2) char gMsgKanji9298Tex[] = dgMsgKanji9298Tex; + +#define dgMsgKanji9299Tex "__OTR__textures/kanji/gMsgKanji9299Tex" +static const ALIGN_ASSET(2) char gMsgKanji9299Tex[] = dgMsgKanji9299Tex; + +#define dgMsgKanji929ATex "__OTR__textures/kanji/gMsgKanji929ATex" +static const ALIGN_ASSET(2) char gMsgKanji929ATex[] = dgMsgKanji929ATex; + +#define dgMsgKanji929BTex "__OTR__textures/kanji/gMsgKanji929BTex" +static const ALIGN_ASSET(2) char gMsgKanji929BTex[] = dgMsgKanji929BTex; + +#define dgMsgKanji929CTex "__OTR__textures/kanji/gMsgKanji929CTex" +static const ALIGN_ASSET(2) char gMsgKanji929CTex[] = dgMsgKanji929CTex; + +#define dgMsgKanji929DTex "__OTR__textures/kanji/gMsgKanji929DTex" +static const ALIGN_ASSET(2) char gMsgKanji929DTex[] = dgMsgKanji929DTex; + +#define dgMsgKanji929ETex "__OTR__textures/kanji/gMsgKanji929ETex" +static const ALIGN_ASSET(2) char gMsgKanji929ETex[] = dgMsgKanji929ETex; + +#define dgMsgKanji929FTex "__OTR__textures/kanji/gMsgKanji929FTex" +static const ALIGN_ASSET(2) char gMsgKanji929FTex[] = dgMsgKanji929FTex; + +#define dgMsgKanji92A0Tex "__OTR__textures/kanji/gMsgKanji92A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A0Tex[] = dgMsgKanji92A0Tex; + +#define dgMsgKanji92A1Tex "__OTR__textures/kanji/gMsgKanji92A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A1Tex[] = dgMsgKanji92A1Tex; + +#define dgMsgKanji92A2Tex "__OTR__textures/kanji/gMsgKanji92A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A2Tex[] = dgMsgKanji92A2Tex; + +#define dgMsgKanji92A3Tex "__OTR__textures/kanji/gMsgKanji92A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A3Tex[] = dgMsgKanji92A3Tex; + +#define dgMsgKanji92A4Tex "__OTR__textures/kanji/gMsgKanji92A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A4Tex[] = dgMsgKanji92A4Tex; + +#define dgMsgKanji92A5Tex "__OTR__textures/kanji/gMsgKanji92A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A5Tex[] = dgMsgKanji92A5Tex; + +#define dgMsgKanji92A6Tex "__OTR__textures/kanji/gMsgKanji92A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A6Tex[] = dgMsgKanji92A6Tex; + +#define dgMsgKanji92A7Tex "__OTR__textures/kanji/gMsgKanji92A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A7Tex[] = dgMsgKanji92A7Tex; + +#define dgMsgKanji92A8Tex "__OTR__textures/kanji/gMsgKanji92A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A8Tex[] = dgMsgKanji92A8Tex; + +#define dgMsgKanji92A9Tex "__OTR__textures/kanji/gMsgKanji92A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A9Tex[] = dgMsgKanji92A9Tex; + +#define dgMsgKanji92AATex "__OTR__textures/kanji/gMsgKanji92AATex" +static const ALIGN_ASSET(2) char gMsgKanji92AATex[] = dgMsgKanji92AATex; + +#define dgMsgKanji92ABTex "__OTR__textures/kanji/gMsgKanji92ABTex" +static const ALIGN_ASSET(2) char gMsgKanji92ABTex[] = dgMsgKanji92ABTex; + +#define dgMsgKanji92ACTex "__OTR__textures/kanji/gMsgKanji92ACTex" +static const ALIGN_ASSET(2) char gMsgKanji92ACTex[] = dgMsgKanji92ACTex; + +#define dgMsgKanji92ADTex "__OTR__textures/kanji/gMsgKanji92ADTex" +static const ALIGN_ASSET(2) char gMsgKanji92ADTex[] = dgMsgKanji92ADTex; + +#define dgMsgKanji92AETex "__OTR__textures/kanji/gMsgKanji92AETex" +static const ALIGN_ASSET(2) char gMsgKanji92AETex[] = dgMsgKanji92AETex; + +#define dgMsgKanji92AFTex "__OTR__textures/kanji/gMsgKanji92AFTex" +static const ALIGN_ASSET(2) char gMsgKanji92AFTex[] = dgMsgKanji92AFTex; + +#define dgMsgKanji92B0Tex "__OTR__textures/kanji/gMsgKanji92B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B0Tex[] = dgMsgKanji92B0Tex; + +#define dgMsgKanji92B1Tex "__OTR__textures/kanji/gMsgKanji92B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B1Tex[] = dgMsgKanji92B1Tex; + +#define dgMsgKanji92B2Tex "__OTR__textures/kanji/gMsgKanji92B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B2Tex[] = dgMsgKanji92B2Tex; + +#define dgMsgKanji92B3Tex "__OTR__textures/kanji/gMsgKanji92B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B3Tex[] = dgMsgKanji92B3Tex; + +#define dgMsgKanji92B4Tex "__OTR__textures/kanji/gMsgKanji92B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B4Tex[] = dgMsgKanji92B4Tex; + +#define dgMsgKanji92B5Tex "__OTR__textures/kanji/gMsgKanji92B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B5Tex[] = dgMsgKanji92B5Tex; + +#define dgMsgKanji92B6Tex "__OTR__textures/kanji/gMsgKanji92B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B6Tex[] = dgMsgKanji92B6Tex; + +#define dgMsgKanji92B7Tex "__OTR__textures/kanji/gMsgKanji92B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B7Tex[] = dgMsgKanji92B7Tex; + +#define dgMsgKanji92B8Tex "__OTR__textures/kanji/gMsgKanji92B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B8Tex[] = dgMsgKanji92B8Tex; + +#define dgMsgKanji92B9Tex "__OTR__textures/kanji/gMsgKanji92B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B9Tex[] = dgMsgKanji92B9Tex; + +#define dgMsgKanji92BATex "__OTR__textures/kanji/gMsgKanji92BATex" +static const ALIGN_ASSET(2) char gMsgKanji92BATex[] = dgMsgKanji92BATex; + +#define dgMsgKanji92BBTex "__OTR__textures/kanji/gMsgKanji92BBTex" +static const ALIGN_ASSET(2) char gMsgKanji92BBTex[] = dgMsgKanji92BBTex; + +#define dgMsgKanji92BCTex "__OTR__textures/kanji/gMsgKanji92BCTex" +static const ALIGN_ASSET(2) char gMsgKanji92BCTex[] = dgMsgKanji92BCTex; + +#define dgMsgKanji92BDTex "__OTR__textures/kanji/gMsgKanji92BDTex" +static const ALIGN_ASSET(2) char gMsgKanji92BDTex[] = dgMsgKanji92BDTex; + +#define dgMsgKanji92BETex "__OTR__textures/kanji/gMsgKanji92BETex" +static const ALIGN_ASSET(2) char gMsgKanji92BETex[] = dgMsgKanji92BETex; + +#define dgMsgKanji92BFTex "__OTR__textures/kanji/gMsgKanji92BFTex" +static const ALIGN_ASSET(2) char gMsgKanji92BFTex[] = dgMsgKanji92BFTex; + +#define dgMsgKanji92C0Tex "__OTR__textures/kanji/gMsgKanji92C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C0Tex[] = dgMsgKanji92C0Tex; + +#define dgMsgKanji92C1Tex "__OTR__textures/kanji/gMsgKanji92C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C1Tex[] = dgMsgKanji92C1Tex; + +#define dgMsgKanji92C2Tex "__OTR__textures/kanji/gMsgKanji92C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C2Tex[] = dgMsgKanji92C2Tex; + +#define dgMsgKanji92C3Tex "__OTR__textures/kanji/gMsgKanji92C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C3Tex[] = dgMsgKanji92C3Tex; + +#define dgMsgKanji92C4Tex "__OTR__textures/kanji/gMsgKanji92C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C4Tex[] = dgMsgKanji92C4Tex; + +#define dgMsgKanji92C5Tex "__OTR__textures/kanji/gMsgKanji92C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C5Tex[] = dgMsgKanji92C5Tex; + +#define dgMsgKanji92C6Tex "__OTR__textures/kanji/gMsgKanji92C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C6Tex[] = dgMsgKanji92C6Tex; + +#define dgMsgKanji92C7Tex "__OTR__textures/kanji/gMsgKanji92C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C7Tex[] = dgMsgKanji92C7Tex; + +#define dgMsgKanji92C8Tex "__OTR__textures/kanji/gMsgKanji92C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C8Tex[] = dgMsgKanji92C8Tex; + +#define dgMsgKanji92C9Tex "__OTR__textures/kanji/gMsgKanji92C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C9Tex[] = dgMsgKanji92C9Tex; + +#define dgMsgKanji92CATex "__OTR__textures/kanji/gMsgKanji92CATex" +static const ALIGN_ASSET(2) char gMsgKanji92CATex[] = dgMsgKanji92CATex; + +#define dgMsgKanji92CBTex "__OTR__textures/kanji/gMsgKanji92CBTex" +static const ALIGN_ASSET(2) char gMsgKanji92CBTex[] = dgMsgKanji92CBTex; + +#define dgMsgKanji92CCTex "__OTR__textures/kanji/gMsgKanji92CCTex" +static const ALIGN_ASSET(2) char gMsgKanji92CCTex[] = dgMsgKanji92CCTex; + +#define dgMsgKanji92CDTex "__OTR__textures/kanji/gMsgKanji92CDTex" +static const ALIGN_ASSET(2) char gMsgKanji92CDTex[] = dgMsgKanji92CDTex; + +#define dgMsgKanji92CETex "__OTR__textures/kanji/gMsgKanji92CETex" +static const ALIGN_ASSET(2) char gMsgKanji92CETex[] = dgMsgKanji92CETex; + +#define dgMsgKanji92CFTex "__OTR__textures/kanji/gMsgKanji92CFTex" +static const ALIGN_ASSET(2) char gMsgKanji92CFTex[] = dgMsgKanji92CFTex; + +#define dgMsgKanji92D0Tex "__OTR__textures/kanji/gMsgKanji92D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D0Tex[] = dgMsgKanji92D0Tex; + +#define dgMsgKanji92D1Tex "__OTR__textures/kanji/gMsgKanji92D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D1Tex[] = dgMsgKanji92D1Tex; + +#define dgMsgKanji92D2Tex "__OTR__textures/kanji/gMsgKanji92D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D2Tex[] = dgMsgKanji92D2Tex; + +#define dgMsgKanji92D3Tex "__OTR__textures/kanji/gMsgKanji92D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D3Tex[] = dgMsgKanji92D3Tex; + +#define dgMsgKanji92D4Tex "__OTR__textures/kanji/gMsgKanji92D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D4Tex[] = dgMsgKanji92D4Tex; + +#define dgMsgKanji92D5Tex "__OTR__textures/kanji/gMsgKanji92D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D5Tex[] = dgMsgKanji92D5Tex; + +#define dgMsgKanji92D6Tex "__OTR__textures/kanji/gMsgKanji92D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D6Tex[] = dgMsgKanji92D6Tex; + +#define dgMsgKanji92D7Tex "__OTR__textures/kanji/gMsgKanji92D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D7Tex[] = dgMsgKanji92D7Tex; + +#define dgMsgKanji92D8Tex "__OTR__textures/kanji/gMsgKanji92D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D8Tex[] = dgMsgKanji92D8Tex; + +#define dgMsgKanji92D9Tex "__OTR__textures/kanji/gMsgKanji92D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D9Tex[] = dgMsgKanji92D9Tex; + +#define dgMsgKanji92DATex "__OTR__textures/kanji/gMsgKanji92DATex" +static const ALIGN_ASSET(2) char gMsgKanji92DATex[] = dgMsgKanji92DATex; + +#define dgMsgKanji92DBTex "__OTR__textures/kanji/gMsgKanji92DBTex" +static const ALIGN_ASSET(2) char gMsgKanji92DBTex[] = dgMsgKanji92DBTex; + +#define dgMsgKanji92DCTex "__OTR__textures/kanji/gMsgKanji92DCTex" +static const ALIGN_ASSET(2) char gMsgKanji92DCTex[] = dgMsgKanji92DCTex; + +#define dgMsgKanji92DDTex "__OTR__textures/kanji/gMsgKanji92DDTex" +static const ALIGN_ASSET(2) char gMsgKanji92DDTex[] = dgMsgKanji92DDTex; + +#define dgMsgKanji92DETex "__OTR__textures/kanji/gMsgKanji92DETex" +static const ALIGN_ASSET(2) char gMsgKanji92DETex[] = dgMsgKanji92DETex; + +#define dgMsgKanji92DFTex "__OTR__textures/kanji/gMsgKanji92DFTex" +static const ALIGN_ASSET(2) char gMsgKanji92DFTex[] = dgMsgKanji92DFTex; + +#define dgMsgKanji92E0Tex "__OTR__textures/kanji/gMsgKanji92E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E0Tex[] = dgMsgKanji92E0Tex; + +#define dgMsgKanji92E1Tex "__OTR__textures/kanji/gMsgKanji92E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E1Tex[] = dgMsgKanji92E1Tex; + +#define dgMsgKanji92E2Tex "__OTR__textures/kanji/gMsgKanji92E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E2Tex[] = dgMsgKanji92E2Tex; + +#define dgMsgKanji92E3Tex "__OTR__textures/kanji/gMsgKanji92E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E3Tex[] = dgMsgKanji92E3Tex; + +#define dgMsgKanji92E4Tex "__OTR__textures/kanji/gMsgKanji92E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E4Tex[] = dgMsgKanji92E4Tex; + +#define dgMsgKanji92E5Tex "__OTR__textures/kanji/gMsgKanji92E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E5Tex[] = dgMsgKanji92E5Tex; + +#define dgMsgKanji92E6Tex "__OTR__textures/kanji/gMsgKanji92E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E6Tex[] = dgMsgKanji92E6Tex; + +#define dgMsgKanji92E7Tex "__OTR__textures/kanji/gMsgKanji92E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E7Tex[] = dgMsgKanji92E7Tex; + +#define dgMsgKanji92E8Tex "__OTR__textures/kanji/gMsgKanji92E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E8Tex[] = dgMsgKanji92E8Tex; + +#define dgMsgKanji92E9Tex "__OTR__textures/kanji/gMsgKanji92E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E9Tex[] = dgMsgKanji92E9Tex; + +#define dgMsgKanji92EATex "__OTR__textures/kanji/gMsgKanji92EATex" +static const ALIGN_ASSET(2) char gMsgKanji92EATex[] = dgMsgKanji92EATex; + +#define dgMsgKanji92EBTex "__OTR__textures/kanji/gMsgKanji92EBTex" +static const ALIGN_ASSET(2) char gMsgKanji92EBTex[] = dgMsgKanji92EBTex; + +#define dgMsgKanji92ECTex "__OTR__textures/kanji/gMsgKanji92ECTex" +static const ALIGN_ASSET(2) char gMsgKanji92ECTex[] = dgMsgKanji92ECTex; + +#define dgMsgKanji92EDTex "__OTR__textures/kanji/gMsgKanji92EDTex" +static const ALIGN_ASSET(2) char gMsgKanji92EDTex[] = dgMsgKanji92EDTex; + +#define dgMsgKanji92EETex "__OTR__textures/kanji/gMsgKanji92EETex" +static const ALIGN_ASSET(2) char gMsgKanji92EETex[] = dgMsgKanji92EETex; + +#define dgMsgKanji92EFTex "__OTR__textures/kanji/gMsgKanji92EFTex" +static const ALIGN_ASSET(2) char gMsgKanji92EFTex[] = dgMsgKanji92EFTex; + +#define dgMsgKanji92F0Tex "__OTR__textures/kanji/gMsgKanji92F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F0Tex[] = dgMsgKanji92F0Tex; + +#define dgMsgKanji92F1Tex "__OTR__textures/kanji/gMsgKanji92F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F1Tex[] = dgMsgKanji92F1Tex; + +#define dgMsgKanji92F2Tex "__OTR__textures/kanji/gMsgKanji92F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F2Tex[] = dgMsgKanji92F2Tex; + +#define dgMsgKanji92F3Tex "__OTR__textures/kanji/gMsgKanji92F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F3Tex[] = dgMsgKanji92F3Tex; + +#define dgMsgKanji92F4Tex "__OTR__textures/kanji/gMsgKanji92F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F4Tex[] = dgMsgKanji92F4Tex; + +#define dgMsgKanji92F5Tex "__OTR__textures/kanji/gMsgKanji92F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F5Tex[] = dgMsgKanji92F5Tex; + +#define dgMsgKanji92F6Tex "__OTR__textures/kanji/gMsgKanji92F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F6Tex[] = dgMsgKanji92F6Tex; + +#define dgMsgKanji92F7Tex "__OTR__textures/kanji/gMsgKanji92F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F7Tex[] = dgMsgKanji92F7Tex; + +#define dgMsgKanji92F8Tex "__OTR__textures/kanji/gMsgKanji92F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F8Tex[] = dgMsgKanji92F8Tex; + +#define dgMsgKanji92F9Tex "__OTR__textures/kanji/gMsgKanji92F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F9Tex[] = dgMsgKanji92F9Tex; + +#define dgMsgKanji92FATex "__OTR__textures/kanji/gMsgKanji92FATex" +static const ALIGN_ASSET(2) char gMsgKanji92FATex[] = dgMsgKanji92FATex; + +#define dgMsgKanji92FBTex "__OTR__textures/kanji/gMsgKanji92FBTex" +static const ALIGN_ASSET(2) char gMsgKanji92FBTex[] = dgMsgKanji92FBTex; + +#define dgMsgKanji92FCTex "__OTR__textures/kanji/gMsgKanji92FCTex" +static const ALIGN_ASSET(2) char gMsgKanji92FCTex[] = dgMsgKanji92FCTex; + +#define dgMsgKanji9340Tex "__OTR__textures/kanji/gMsgKanji9340Tex" +static const ALIGN_ASSET(2) char gMsgKanji9340Tex[] = dgMsgKanji9340Tex; + +#define dgMsgKanji9341Tex "__OTR__textures/kanji/gMsgKanji9341Tex" +static const ALIGN_ASSET(2) char gMsgKanji9341Tex[] = dgMsgKanji9341Tex; + +#define dgMsgKanji9342Tex "__OTR__textures/kanji/gMsgKanji9342Tex" +static const ALIGN_ASSET(2) char gMsgKanji9342Tex[] = dgMsgKanji9342Tex; + +#define dgMsgKanji9343Tex "__OTR__textures/kanji/gMsgKanji9343Tex" +static const ALIGN_ASSET(2) char gMsgKanji9343Tex[] = dgMsgKanji9343Tex; + +#define dgMsgKanji9344Tex "__OTR__textures/kanji/gMsgKanji9344Tex" +static const ALIGN_ASSET(2) char gMsgKanji9344Tex[] = dgMsgKanji9344Tex; + +#define dgMsgKanji9345Tex "__OTR__textures/kanji/gMsgKanji9345Tex" +static const ALIGN_ASSET(2) char gMsgKanji9345Tex[] = dgMsgKanji9345Tex; + +#define dgMsgKanji9346Tex "__OTR__textures/kanji/gMsgKanji9346Tex" +static const ALIGN_ASSET(2) char gMsgKanji9346Tex[] = dgMsgKanji9346Tex; + +#define dgMsgKanji9347Tex "__OTR__textures/kanji/gMsgKanji9347Tex" +static const ALIGN_ASSET(2) char gMsgKanji9347Tex[] = dgMsgKanji9347Tex; + +#define dgMsgKanji9348Tex "__OTR__textures/kanji/gMsgKanji9348Tex" +static const ALIGN_ASSET(2) char gMsgKanji9348Tex[] = dgMsgKanji9348Tex; + +#define dgMsgKanji9349Tex "__OTR__textures/kanji/gMsgKanji9349Tex" +static const ALIGN_ASSET(2) char gMsgKanji9349Tex[] = dgMsgKanji9349Tex; + +#define dgMsgKanji934ATex "__OTR__textures/kanji/gMsgKanji934ATex" +static const ALIGN_ASSET(2) char gMsgKanji934ATex[] = dgMsgKanji934ATex; + +#define dgMsgKanji934BTex "__OTR__textures/kanji/gMsgKanji934BTex" +static const ALIGN_ASSET(2) char gMsgKanji934BTex[] = dgMsgKanji934BTex; + +#define dgMsgKanji934CTex "__OTR__textures/kanji/gMsgKanji934CTex" +static const ALIGN_ASSET(2) char gMsgKanji934CTex[] = dgMsgKanji934CTex; + +#define dgMsgKanji934DTex "__OTR__textures/kanji/gMsgKanji934DTex" +static const ALIGN_ASSET(2) char gMsgKanji934DTex[] = dgMsgKanji934DTex; + +#define dgMsgKanji934ETex "__OTR__textures/kanji/gMsgKanji934ETex" +static const ALIGN_ASSET(2) char gMsgKanji934ETex[] = dgMsgKanji934ETex; + +#define dgMsgKanji934FTex "__OTR__textures/kanji/gMsgKanji934FTex" +static const ALIGN_ASSET(2) char gMsgKanji934FTex[] = dgMsgKanji934FTex; + +#define dgMsgKanji9350Tex "__OTR__textures/kanji/gMsgKanji9350Tex" +static const ALIGN_ASSET(2) char gMsgKanji9350Tex[] = dgMsgKanji9350Tex; + +#define dgMsgKanji9351Tex "__OTR__textures/kanji/gMsgKanji9351Tex" +static const ALIGN_ASSET(2) char gMsgKanji9351Tex[] = dgMsgKanji9351Tex; + +#define dgMsgKanji9352Tex "__OTR__textures/kanji/gMsgKanji9352Tex" +static const ALIGN_ASSET(2) char gMsgKanji9352Tex[] = dgMsgKanji9352Tex; + +#define dgMsgKanji9353Tex "__OTR__textures/kanji/gMsgKanji9353Tex" +static const ALIGN_ASSET(2) char gMsgKanji9353Tex[] = dgMsgKanji9353Tex; + +#define dgMsgKanji9354Tex "__OTR__textures/kanji/gMsgKanji9354Tex" +static const ALIGN_ASSET(2) char gMsgKanji9354Tex[] = dgMsgKanji9354Tex; + +#define dgMsgKanji9355Tex "__OTR__textures/kanji/gMsgKanji9355Tex" +static const ALIGN_ASSET(2) char gMsgKanji9355Tex[] = dgMsgKanji9355Tex; + +#define dgMsgKanji9356Tex "__OTR__textures/kanji/gMsgKanji9356Tex" +static const ALIGN_ASSET(2) char gMsgKanji9356Tex[] = dgMsgKanji9356Tex; + +#define dgMsgKanji9357Tex "__OTR__textures/kanji/gMsgKanji9357Tex" +static const ALIGN_ASSET(2) char gMsgKanji9357Tex[] = dgMsgKanji9357Tex; + +#define dgMsgKanji9358Tex "__OTR__textures/kanji/gMsgKanji9358Tex" +static const ALIGN_ASSET(2) char gMsgKanji9358Tex[] = dgMsgKanji9358Tex; + +#define dgMsgKanji9359Tex "__OTR__textures/kanji/gMsgKanji9359Tex" +static const ALIGN_ASSET(2) char gMsgKanji9359Tex[] = dgMsgKanji9359Tex; + +#define dgMsgKanji935ATex "__OTR__textures/kanji/gMsgKanji935ATex" +static const ALIGN_ASSET(2) char gMsgKanji935ATex[] = dgMsgKanji935ATex; + +#define dgMsgKanji935BTex "__OTR__textures/kanji/gMsgKanji935BTex" +static const ALIGN_ASSET(2) char gMsgKanji935BTex[] = dgMsgKanji935BTex; + +#define dgMsgKanji935CTex "__OTR__textures/kanji/gMsgKanji935CTex" +static const ALIGN_ASSET(2) char gMsgKanji935CTex[] = dgMsgKanji935CTex; + +#define dgMsgKanji935DTex "__OTR__textures/kanji/gMsgKanji935DTex" +static const ALIGN_ASSET(2) char gMsgKanji935DTex[] = dgMsgKanji935DTex; + +#define dgMsgKanji935ETex "__OTR__textures/kanji/gMsgKanji935ETex" +static const ALIGN_ASSET(2) char gMsgKanji935ETex[] = dgMsgKanji935ETex; + +#define dgMsgKanji935FTex "__OTR__textures/kanji/gMsgKanji935FTex" +static const ALIGN_ASSET(2) char gMsgKanji935FTex[] = dgMsgKanji935FTex; + +#define dgMsgKanji9360Tex "__OTR__textures/kanji/gMsgKanji9360Tex" +static const ALIGN_ASSET(2) char gMsgKanji9360Tex[] = dgMsgKanji9360Tex; + +#define dgMsgKanji9361Tex "__OTR__textures/kanji/gMsgKanji9361Tex" +static const ALIGN_ASSET(2) char gMsgKanji9361Tex[] = dgMsgKanji9361Tex; + +#define dgMsgKanji9362Tex "__OTR__textures/kanji/gMsgKanji9362Tex" +static const ALIGN_ASSET(2) char gMsgKanji9362Tex[] = dgMsgKanji9362Tex; + +#define dgMsgKanji9363Tex "__OTR__textures/kanji/gMsgKanji9363Tex" +static const ALIGN_ASSET(2) char gMsgKanji9363Tex[] = dgMsgKanji9363Tex; + +#define dgMsgKanji9364Tex "__OTR__textures/kanji/gMsgKanji9364Tex" +static const ALIGN_ASSET(2) char gMsgKanji9364Tex[] = dgMsgKanji9364Tex; + +#define dgMsgKanji9365Tex "__OTR__textures/kanji/gMsgKanji9365Tex" +static const ALIGN_ASSET(2) char gMsgKanji9365Tex[] = dgMsgKanji9365Tex; + +#define dgMsgKanji9366Tex "__OTR__textures/kanji/gMsgKanji9366Tex" +static const ALIGN_ASSET(2) char gMsgKanji9366Tex[] = dgMsgKanji9366Tex; + +#define dgMsgKanji9367Tex "__OTR__textures/kanji/gMsgKanji9367Tex" +static const ALIGN_ASSET(2) char gMsgKanji9367Tex[] = dgMsgKanji9367Tex; + +#define dgMsgKanji9368Tex "__OTR__textures/kanji/gMsgKanji9368Tex" +static const ALIGN_ASSET(2) char gMsgKanji9368Tex[] = dgMsgKanji9368Tex; + +#define dgMsgKanji9369Tex "__OTR__textures/kanji/gMsgKanji9369Tex" +static const ALIGN_ASSET(2) char gMsgKanji9369Tex[] = dgMsgKanji9369Tex; + +#define dgMsgKanji936ATex "__OTR__textures/kanji/gMsgKanji936ATex" +static const ALIGN_ASSET(2) char gMsgKanji936ATex[] = dgMsgKanji936ATex; + +#define dgMsgKanji936BTex "__OTR__textures/kanji/gMsgKanji936BTex" +static const ALIGN_ASSET(2) char gMsgKanji936BTex[] = dgMsgKanji936BTex; + +#define dgMsgKanji936CTex "__OTR__textures/kanji/gMsgKanji936CTex" +static const ALIGN_ASSET(2) char gMsgKanji936CTex[] = dgMsgKanji936CTex; + +#define dgMsgKanji936DTex "__OTR__textures/kanji/gMsgKanji936DTex" +static const ALIGN_ASSET(2) char gMsgKanji936DTex[] = dgMsgKanji936DTex; + +#define dgMsgKanji936ETex "__OTR__textures/kanji/gMsgKanji936ETex" +static const ALIGN_ASSET(2) char gMsgKanji936ETex[] = dgMsgKanji936ETex; + +#define dgMsgKanji936FTex "__OTR__textures/kanji/gMsgKanji936FTex" +static const ALIGN_ASSET(2) char gMsgKanji936FTex[] = dgMsgKanji936FTex; + +#define dgMsgKanji9370Tex "__OTR__textures/kanji/gMsgKanji9370Tex" +static const ALIGN_ASSET(2) char gMsgKanji9370Tex[] = dgMsgKanji9370Tex; + +#define dgMsgKanji9371Tex "__OTR__textures/kanji/gMsgKanji9371Tex" +static const ALIGN_ASSET(2) char gMsgKanji9371Tex[] = dgMsgKanji9371Tex; + +#define dgMsgKanji9372Tex "__OTR__textures/kanji/gMsgKanji9372Tex" +static const ALIGN_ASSET(2) char gMsgKanji9372Tex[] = dgMsgKanji9372Tex; + +#define dgMsgKanji9373Tex "__OTR__textures/kanji/gMsgKanji9373Tex" +static const ALIGN_ASSET(2) char gMsgKanji9373Tex[] = dgMsgKanji9373Tex; + +#define dgMsgKanji9374Tex "__OTR__textures/kanji/gMsgKanji9374Tex" +static const ALIGN_ASSET(2) char gMsgKanji9374Tex[] = dgMsgKanji9374Tex; + +#define dgMsgKanji9375Tex "__OTR__textures/kanji/gMsgKanji9375Tex" +static const ALIGN_ASSET(2) char gMsgKanji9375Tex[] = dgMsgKanji9375Tex; + +#define dgMsgKanji9376Tex "__OTR__textures/kanji/gMsgKanji9376Tex" +static const ALIGN_ASSET(2) char gMsgKanji9376Tex[] = dgMsgKanji9376Tex; + +#define dgMsgKanji9377Tex "__OTR__textures/kanji/gMsgKanji9377Tex" +static const ALIGN_ASSET(2) char gMsgKanji9377Tex[] = dgMsgKanji9377Tex; + +#define dgMsgKanji9378Tex "__OTR__textures/kanji/gMsgKanji9378Tex" +static const ALIGN_ASSET(2) char gMsgKanji9378Tex[] = dgMsgKanji9378Tex; + +#define dgMsgKanji9379Tex "__OTR__textures/kanji/gMsgKanji9379Tex" +static const ALIGN_ASSET(2) char gMsgKanji9379Tex[] = dgMsgKanji9379Tex; + +#define dgMsgKanji937ATex "__OTR__textures/kanji/gMsgKanji937ATex" +static const ALIGN_ASSET(2) char gMsgKanji937ATex[] = dgMsgKanji937ATex; + +#define dgMsgKanji937BTex "__OTR__textures/kanji/gMsgKanji937BTex" +static const ALIGN_ASSET(2) char gMsgKanji937BTex[] = dgMsgKanji937BTex; + +#define dgMsgKanji937CTex "__OTR__textures/kanji/gMsgKanji937CTex" +static const ALIGN_ASSET(2) char gMsgKanji937CTex[] = dgMsgKanji937CTex; + +#define dgMsgKanji937DTex "__OTR__textures/kanji/gMsgKanji937DTex" +static const ALIGN_ASSET(2) char gMsgKanji937DTex[] = dgMsgKanji937DTex; + +#define dgMsgKanji937ETex "__OTR__textures/kanji/gMsgKanji937ETex" +static const ALIGN_ASSET(2) char gMsgKanji937ETex[] = dgMsgKanji937ETex; + +#define dgMsgKanji9380Tex "__OTR__textures/kanji/gMsgKanji9380Tex" +static const ALIGN_ASSET(2) char gMsgKanji9380Tex[] = dgMsgKanji9380Tex; + +#define dgMsgKanji9381Tex "__OTR__textures/kanji/gMsgKanji9381Tex" +static const ALIGN_ASSET(2) char gMsgKanji9381Tex[] = dgMsgKanji9381Tex; + +#define dgMsgKanji9382Tex "__OTR__textures/kanji/gMsgKanji9382Tex" +static const ALIGN_ASSET(2) char gMsgKanji9382Tex[] = dgMsgKanji9382Tex; + +#define dgMsgKanji9383Tex "__OTR__textures/kanji/gMsgKanji9383Tex" +static const ALIGN_ASSET(2) char gMsgKanji9383Tex[] = dgMsgKanji9383Tex; + +#define dgMsgKanji9384Tex "__OTR__textures/kanji/gMsgKanji9384Tex" +static const ALIGN_ASSET(2) char gMsgKanji9384Tex[] = dgMsgKanji9384Tex; + +#define dgMsgKanji9385Tex "__OTR__textures/kanji/gMsgKanji9385Tex" +static const ALIGN_ASSET(2) char gMsgKanji9385Tex[] = dgMsgKanji9385Tex; + +#define dgMsgKanji9386Tex "__OTR__textures/kanji/gMsgKanji9386Tex" +static const ALIGN_ASSET(2) char gMsgKanji9386Tex[] = dgMsgKanji9386Tex; + +#define dgMsgKanji9387Tex "__OTR__textures/kanji/gMsgKanji9387Tex" +static const ALIGN_ASSET(2) char gMsgKanji9387Tex[] = dgMsgKanji9387Tex; + +#define dgMsgKanji9388Tex "__OTR__textures/kanji/gMsgKanji9388Tex" +static const ALIGN_ASSET(2) char gMsgKanji9388Tex[] = dgMsgKanji9388Tex; + +#define dgMsgKanji9389Tex "__OTR__textures/kanji/gMsgKanji9389Tex" +static const ALIGN_ASSET(2) char gMsgKanji9389Tex[] = dgMsgKanji9389Tex; + +#define dgMsgKanji938ATex "__OTR__textures/kanji/gMsgKanji938ATex" +static const ALIGN_ASSET(2) char gMsgKanji938ATex[] = dgMsgKanji938ATex; + +#define dgMsgKanji938BTex "__OTR__textures/kanji/gMsgKanji938BTex" +static const ALIGN_ASSET(2) char gMsgKanji938BTex[] = dgMsgKanji938BTex; + +#define dgMsgKanji938CTex "__OTR__textures/kanji/gMsgKanji938CTex" +static const ALIGN_ASSET(2) char gMsgKanji938CTex[] = dgMsgKanji938CTex; + +#define dgMsgKanji938DTex "__OTR__textures/kanji/gMsgKanji938DTex" +static const ALIGN_ASSET(2) char gMsgKanji938DTex[] = dgMsgKanji938DTex; + +#define dgMsgKanji938ETex "__OTR__textures/kanji/gMsgKanji938ETex" +static const ALIGN_ASSET(2) char gMsgKanji938ETex[] = dgMsgKanji938ETex; + +#define dgMsgKanji938FTex "__OTR__textures/kanji/gMsgKanji938FTex" +static const ALIGN_ASSET(2) char gMsgKanji938FTex[] = dgMsgKanji938FTex; + +#define dgMsgKanji9390Tex "__OTR__textures/kanji/gMsgKanji9390Tex" +static const ALIGN_ASSET(2) char gMsgKanji9390Tex[] = dgMsgKanji9390Tex; + +#define dgMsgKanji9391Tex "__OTR__textures/kanji/gMsgKanji9391Tex" +static const ALIGN_ASSET(2) char gMsgKanji9391Tex[] = dgMsgKanji9391Tex; + +#define dgMsgKanji9392Tex "__OTR__textures/kanji/gMsgKanji9392Tex" +static const ALIGN_ASSET(2) char gMsgKanji9392Tex[] = dgMsgKanji9392Tex; + +#define dgMsgKanji9393Tex "__OTR__textures/kanji/gMsgKanji9393Tex" +static const ALIGN_ASSET(2) char gMsgKanji9393Tex[] = dgMsgKanji9393Tex; + +#define dgMsgKanji9394Tex "__OTR__textures/kanji/gMsgKanji9394Tex" +static const ALIGN_ASSET(2) char gMsgKanji9394Tex[] = dgMsgKanji9394Tex; + +#define dgMsgKanji9395Tex "__OTR__textures/kanji/gMsgKanji9395Tex" +static const ALIGN_ASSET(2) char gMsgKanji9395Tex[] = dgMsgKanji9395Tex; + +#define dgMsgKanji9396Tex "__OTR__textures/kanji/gMsgKanji9396Tex" +static const ALIGN_ASSET(2) char gMsgKanji9396Tex[] = dgMsgKanji9396Tex; + +#define dgMsgKanji9397Tex "__OTR__textures/kanji/gMsgKanji9397Tex" +static const ALIGN_ASSET(2) char gMsgKanji9397Tex[] = dgMsgKanji9397Tex; + +#define dgMsgKanji9398Tex "__OTR__textures/kanji/gMsgKanji9398Tex" +static const ALIGN_ASSET(2) char gMsgKanji9398Tex[] = dgMsgKanji9398Tex; + +#define dgMsgKanji9399Tex "__OTR__textures/kanji/gMsgKanji9399Tex" +static const ALIGN_ASSET(2) char gMsgKanji9399Tex[] = dgMsgKanji9399Tex; + +#define dgMsgKanji939ATex "__OTR__textures/kanji/gMsgKanji939ATex" +static const ALIGN_ASSET(2) char gMsgKanji939ATex[] = dgMsgKanji939ATex; + +#define dgMsgKanji939BTex "__OTR__textures/kanji/gMsgKanji939BTex" +static const ALIGN_ASSET(2) char gMsgKanji939BTex[] = dgMsgKanji939BTex; + +#define dgMsgKanji939CTex "__OTR__textures/kanji/gMsgKanji939CTex" +static const ALIGN_ASSET(2) char gMsgKanji939CTex[] = dgMsgKanji939CTex; + +#define dgMsgKanji939DTex "__OTR__textures/kanji/gMsgKanji939DTex" +static const ALIGN_ASSET(2) char gMsgKanji939DTex[] = dgMsgKanji939DTex; + +#define dgMsgKanji939ETex "__OTR__textures/kanji/gMsgKanji939ETex" +static const ALIGN_ASSET(2) char gMsgKanji939ETex[] = dgMsgKanji939ETex; + +#define dgMsgKanji939FTex "__OTR__textures/kanji/gMsgKanji939FTex" +static const ALIGN_ASSET(2) char gMsgKanji939FTex[] = dgMsgKanji939FTex; + +#define dgMsgKanji93A0Tex "__OTR__textures/kanji/gMsgKanji93A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A0Tex[] = dgMsgKanji93A0Tex; + +#define dgMsgKanji93A1Tex "__OTR__textures/kanji/gMsgKanji93A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A1Tex[] = dgMsgKanji93A1Tex; + +#define dgMsgKanji93A2Tex "__OTR__textures/kanji/gMsgKanji93A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A2Tex[] = dgMsgKanji93A2Tex; + +#define dgMsgKanji93A3Tex "__OTR__textures/kanji/gMsgKanji93A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A3Tex[] = dgMsgKanji93A3Tex; + +#define dgMsgKanji93A4Tex "__OTR__textures/kanji/gMsgKanji93A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A4Tex[] = dgMsgKanji93A4Tex; + +#define dgMsgKanji93A5Tex "__OTR__textures/kanji/gMsgKanji93A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A5Tex[] = dgMsgKanji93A5Tex; + +#define dgMsgKanji93A6Tex "__OTR__textures/kanji/gMsgKanji93A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A6Tex[] = dgMsgKanji93A6Tex; + +#define dgMsgKanji93A7Tex "__OTR__textures/kanji/gMsgKanji93A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A7Tex[] = dgMsgKanji93A7Tex; + +#define dgMsgKanji93A8Tex "__OTR__textures/kanji/gMsgKanji93A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A8Tex[] = dgMsgKanji93A8Tex; + +#define dgMsgKanji93A9Tex "__OTR__textures/kanji/gMsgKanji93A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A9Tex[] = dgMsgKanji93A9Tex; + +#define dgMsgKanji93AATex "__OTR__textures/kanji/gMsgKanji93AATex" +static const ALIGN_ASSET(2) char gMsgKanji93AATex[] = dgMsgKanji93AATex; + +#define dgMsgKanji93ABTex "__OTR__textures/kanji/gMsgKanji93ABTex" +static const ALIGN_ASSET(2) char gMsgKanji93ABTex[] = dgMsgKanji93ABTex; + +#define dgMsgKanji93ACTex "__OTR__textures/kanji/gMsgKanji93ACTex" +static const ALIGN_ASSET(2) char gMsgKanji93ACTex[] = dgMsgKanji93ACTex; + +#define dgMsgKanji93ADTex "__OTR__textures/kanji/gMsgKanji93ADTex" +static const ALIGN_ASSET(2) char gMsgKanji93ADTex[] = dgMsgKanji93ADTex; + +#define dgMsgKanji93AETex "__OTR__textures/kanji/gMsgKanji93AETex" +static const ALIGN_ASSET(2) char gMsgKanji93AETex[] = dgMsgKanji93AETex; + +#define dgMsgKanji93AFTex "__OTR__textures/kanji/gMsgKanji93AFTex" +static const ALIGN_ASSET(2) char gMsgKanji93AFTex[] = dgMsgKanji93AFTex; + +#define dgMsgKanji93B0Tex "__OTR__textures/kanji/gMsgKanji93B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B0Tex[] = dgMsgKanji93B0Tex; + +#define dgMsgKanji93B1Tex "__OTR__textures/kanji/gMsgKanji93B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B1Tex[] = dgMsgKanji93B1Tex; + +#define dgMsgKanji93B2Tex "__OTR__textures/kanji/gMsgKanji93B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B2Tex[] = dgMsgKanji93B2Tex; + +#define dgMsgKanji93B3Tex "__OTR__textures/kanji/gMsgKanji93B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B3Tex[] = dgMsgKanji93B3Tex; + +#define dgMsgKanji93B4Tex "__OTR__textures/kanji/gMsgKanji93B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B4Tex[] = dgMsgKanji93B4Tex; + +#define dgMsgKanji93B5Tex "__OTR__textures/kanji/gMsgKanji93B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B5Tex[] = dgMsgKanji93B5Tex; + +#define dgMsgKanji93B6Tex "__OTR__textures/kanji/gMsgKanji93B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B6Tex[] = dgMsgKanji93B6Tex; + +#define dgMsgKanji93B7Tex "__OTR__textures/kanji/gMsgKanji93B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B7Tex[] = dgMsgKanji93B7Tex; + +#define dgMsgKanji93B8Tex "__OTR__textures/kanji/gMsgKanji93B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B8Tex[] = dgMsgKanji93B8Tex; + +#define dgMsgKanji93B9Tex "__OTR__textures/kanji/gMsgKanji93B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B9Tex[] = dgMsgKanji93B9Tex; + +#define dgMsgKanji93BATex "__OTR__textures/kanji/gMsgKanji93BATex" +static const ALIGN_ASSET(2) char gMsgKanji93BATex[] = dgMsgKanji93BATex; + +#define dgMsgKanji93BBTex "__OTR__textures/kanji/gMsgKanji93BBTex" +static const ALIGN_ASSET(2) char gMsgKanji93BBTex[] = dgMsgKanji93BBTex; + +#define dgMsgKanji93BCTex "__OTR__textures/kanji/gMsgKanji93BCTex" +static const ALIGN_ASSET(2) char gMsgKanji93BCTex[] = dgMsgKanji93BCTex; + +#define dgMsgKanji93BDTex "__OTR__textures/kanji/gMsgKanji93BDTex" +static const ALIGN_ASSET(2) char gMsgKanji93BDTex[] = dgMsgKanji93BDTex; + +#define dgMsgKanji93BETex "__OTR__textures/kanji/gMsgKanji93BETex" +static const ALIGN_ASSET(2) char gMsgKanji93BETex[] = dgMsgKanji93BETex; + +#define dgMsgKanji93BFTex "__OTR__textures/kanji/gMsgKanji93BFTex" +static const ALIGN_ASSET(2) char gMsgKanji93BFTex[] = dgMsgKanji93BFTex; + +#define dgMsgKanji93C0Tex "__OTR__textures/kanji/gMsgKanji93C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C0Tex[] = dgMsgKanji93C0Tex; + +#define dgMsgKanji93C1Tex "__OTR__textures/kanji/gMsgKanji93C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C1Tex[] = dgMsgKanji93C1Tex; + +#define dgMsgKanji93C2Tex "__OTR__textures/kanji/gMsgKanji93C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C2Tex[] = dgMsgKanji93C2Tex; + +#define dgMsgKanji93C3Tex "__OTR__textures/kanji/gMsgKanji93C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C3Tex[] = dgMsgKanji93C3Tex; + +#define dgMsgKanji93C4Tex "__OTR__textures/kanji/gMsgKanji93C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C4Tex[] = dgMsgKanji93C4Tex; + +#define dgMsgKanji93C5Tex "__OTR__textures/kanji/gMsgKanji93C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C5Tex[] = dgMsgKanji93C5Tex; + +#define dgMsgKanji93C6Tex "__OTR__textures/kanji/gMsgKanji93C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C6Tex[] = dgMsgKanji93C6Tex; + +#define dgMsgKanji93C7Tex "__OTR__textures/kanji/gMsgKanji93C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C7Tex[] = dgMsgKanji93C7Tex; + +#define dgMsgKanji93C8Tex "__OTR__textures/kanji/gMsgKanji93C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C8Tex[] = dgMsgKanji93C8Tex; + +#define dgMsgKanji93C9Tex "__OTR__textures/kanji/gMsgKanji93C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C9Tex[] = dgMsgKanji93C9Tex; + +#define dgMsgKanji93CATex "__OTR__textures/kanji/gMsgKanji93CATex" +static const ALIGN_ASSET(2) char gMsgKanji93CATex[] = dgMsgKanji93CATex; + +#define dgMsgKanji93CBTex "__OTR__textures/kanji/gMsgKanji93CBTex" +static const ALIGN_ASSET(2) char gMsgKanji93CBTex[] = dgMsgKanji93CBTex; + +#define dgMsgKanji93CCTex "__OTR__textures/kanji/gMsgKanji93CCTex" +static const ALIGN_ASSET(2) char gMsgKanji93CCTex[] = dgMsgKanji93CCTex; + +#define dgMsgKanji93CDTex "__OTR__textures/kanji/gMsgKanji93CDTex" +static const ALIGN_ASSET(2) char gMsgKanji93CDTex[] = dgMsgKanji93CDTex; + +#define dgMsgKanji93CETex "__OTR__textures/kanji/gMsgKanji93CETex" +static const ALIGN_ASSET(2) char gMsgKanji93CETex[] = dgMsgKanji93CETex; + +#define dgMsgKanji93CFTex "__OTR__textures/kanji/gMsgKanji93CFTex" +static const ALIGN_ASSET(2) char gMsgKanji93CFTex[] = dgMsgKanji93CFTex; + +#define dgMsgKanji93D0Tex "__OTR__textures/kanji/gMsgKanji93D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D0Tex[] = dgMsgKanji93D0Tex; + +#define dgMsgKanji93D1Tex "__OTR__textures/kanji/gMsgKanji93D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D1Tex[] = dgMsgKanji93D1Tex; + +#define dgMsgKanji93D2Tex "__OTR__textures/kanji/gMsgKanji93D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D2Tex[] = dgMsgKanji93D2Tex; + +#define dgMsgKanji93D3Tex "__OTR__textures/kanji/gMsgKanji93D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D3Tex[] = dgMsgKanji93D3Tex; + +#define dgMsgKanji93D4Tex "__OTR__textures/kanji/gMsgKanji93D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D4Tex[] = dgMsgKanji93D4Tex; + +#define dgMsgKanji93D5Tex "__OTR__textures/kanji/gMsgKanji93D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D5Tex[] = dgMsgKanji93D5Tex; + +#define dgMsgKanji93D6Tex "__OTR__textures/kanji/gMsgKanji93D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D6Tex[] = dgMsgKanji93D6Tex; + +#define dgMsgKanji93D7Tex "__OTR__textures/kanji/gMsgKanji93D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D7Tex[] = dgMsgKanji93D7Tex; + +#define dgMsgKanji93D8Tex "__OTR__textures/kanji/gMsgKanji93D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D8Tex[] = dgMsgKanji93D8Tex; + +#define dgMsgKanji93D9Tex "__OTR__textures/kanji/gMsgKanji93D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D9Tex[] = dgMsgKanji93D9Tex; + +#define dgMsgKanji93DATex "__OTR__textures/kanji/gMsgKanji93DATex" +static const ALIGN_ASSET(2) char gMsgKanji93DATex[] = dgMsgKanji93DATex; + +#define dgMsgKanji93DBTex "__OTR__textures/kanji/gMsgKanji93DBTex" +static const ALIGN_ASSET(2) char gMsgKanji93DBTex[] = dgMsgKanji93DBTex; + +#define dgMsgKanji93DCTex "__OTR__textures/kanji/gMsgKanji93DCTex" +static const ALIGN_ASSET(2) char gMsgKanji93DCTex[] = dgMsgKanji93DCTex; + +#define dgMsgKanji93DDTex "__OTR__textures/kanji/gMsgKanji93DDTex" +static const ALIGN_ASSET(2) char gMsgKanji93DDTex[] = dgMsgKanji93DDTex; + +#define dgMsgKanji93DETex "__OTR__textures/kanji/gMsgKanji93DETex" +static const ALIGN_ASSET(2) char gMsgKanji93DETex[] = dgMsgKanji93DETex; + +#define dgMsgKanji93DFTex "__OTR__textures/kanji/gMsgKanji93DFTex" +static const ALIGN_ASSET(2) char gMsgKanji93DFTex[] = dgMsgKanji93DFTex; + +#define dgMsgKanji93E0Tex "__OTR__textures/kanji/gMsgKanji93E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E0Tex[] = dgMsgKanji93E0Tex; + +#define dgMsgKanji93E1Tex "__OTR__textures/kanji/gMsgKanji93E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E1Tex[] = dgMsgKanji93E1Tex; + +#define dgMsgKanji93E2Tex "__OTR__textures/kanji/gMsgKanji93E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E2Tex[] = dgMsgKanji93E2Tex; + +#define dgMsgKanji93E3Tex "__OTR__textures/kanji/gMsgKanji93E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E3Tex[] = dgMsgKanji93E3Tex; + +#define dgMsgKanji93E4Tex "__OTR__textures/kanji/gMsgKanji93E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E4Tex[] = dgMsgKanji93E4Tex; + +#define dgMsgKanji93E5Tex "__OTR__textures/kanji/gMsgKanji93E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E5Tex[] = dgMsgKanji93E5Tex; + +#define dgMsgKanji93E6Tex "__OTR__textures/kanji/gMsgKanji93E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E6Tex[] = dgMsgKanji93E6Tex; + +#define dgMsgKanji93E7Tex "__OTR__textures/kanji/gMsgKanji93E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E7Tex[] = dgMsgKanji93E7Tex; + +#define dgMsgKanji93E8Tex "__OTR__textures/kanji/gMsgKanji93E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E8Tex[] = dgMsgKanji93E8Tex; + +#define dgMsgKanji93E9Tex "__OTR__textures/kanji/gMsgKanji93E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E9Tex[] = dgMsgKanji93E9Tex; + +#define dgMsgKanji93EATex "__OTR__textures/kanji/gMsgKanji93EATex" +static const ALIGN_ASSET(2) char gMsgKanji93EATex[] = dgMsgKanji93EATex; + +#define dgMsgKanji93EBTex "__OTR__textures/kanji/gMsgKanji93EBTex" +static const ALIGN_ASSET(2) char gMsgKanji93EBTex[] = dgMsgKanji93EBTex; + +#define dgMsgKanji93ECTex "__OTR__textures/kanji/gMsgKanji93ECTex" +static const ALIGN_ASSET(2) char gMsgKanji93ECTex[] = dgMsgKanji93ECTex; + +#define dgMsgKanji93EDTex "__OTR__textures/kanji/gMsgKanji93EDTex" +static const ALIGN_ASSET(2) char gMsgKanji93EDTex[] = dgMsgKanji93EDTex; + +#define dgMsgKanji93EETex "__OTR__textures/kanji/gMsgKanji93EETex" +static const ALIGN_ASSET(2) char gMsgKanji93EETex[] = dgMsgKanji93EETex; + +#define dgMsgKanji93EFTex "__OTR__textures/kanji/gMsgKanji93EFTex" +static const ALIGN_ASSET(2) char gMsgKanji93EFTex[] = dgMsgKanji93EFTex; + +#define dgMsgKanji93F0Tex "__OTR__textures/kanji/gMsgKanji93F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F0Tex[] = dgMsgKanji93F0Tex; + +#define dgMsgKanji93F1Tex "__OTR__textures/kanji/gMsgKanji93F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F1Tex[] = dgMsgKanji93F1Tex; + +#define dgMsgKanji93F2Tex "__OTR__textures/kanji/gMsgKanji93F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F2Tex[] = dgMsgKanji93F2Tex; + +#define dgMsgKanji93F3Tex "__OTR__textures/kanji/gMsgKanji93F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F3Tex[] = dgMsgKanji93F3Tex; + +#define dgMsgKanji93F4Tex "__OTR__textures/kanji/gMsgKanji93F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F4Tex[] = dgMsgKanji93F4Tex; + +#define dgMsgKanji93F5Tex "__OTR__textures/kanji/gMsgKanji93F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F5Tex[] = dgMsgKanji93F5Tex; + +#define dgMsgKanji93F6Tex "__OTR__textures/kanji/gMsgKanji93F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F6Tex[] = dgMsgKanji93F6Tex; + +#define dgMsgKanji93F7Tex "__OTR__textures/kanji/gMsgKanji93F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F7Tex[] = dgMsgKanji93F7Tex; + +#define dgMsgKanji93F8Tex "__OTR__textures/kanji/gMsgKanji93F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F8Tex[] = dgMsgKanji93F8Tex; + +#define dgMsgKanji93F9Tex "__OTR__textures/kanji/gMsgKanji93F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F9Tex[] = dgMsgKanji93F9Tex; + +#define dgMsgKanji93FATex "__OTR__textures/kanji/gMsgKanji93FATex" +static const ALIGN_ASSET(2) char gMsgKanji93FATex[] = dgMsgKanji93FATex; + +#define dgMsgKanji93FBTex "__OTR__textures/kanji/gMsgKanji93FBTex" +static const ALIGN_ASSET(2) char gMsgKanji93FBTex[] = dgMsgKanji93FBTex; + +#define dgMsgKanji93FCTex "__OTR__textures/kanji/gMsgKanji93FCTex" +static const ALIGN_ASSET(2) char gMsgKanji93FCTex[] = dgMsgKanji93FCTex; + +#define dgMsgKanji9440Tex "__OTR__textures/kanji/gMsgKanji9440Tex" +static const ALIGN_ASSET(2) char gMsgKanji9440Tex[] = dgMsgKanji9440Tex; + +#define dgMsgKanji9441Tex "__OTR__textures/kanji/gMsgKanji9441Tex" +static const ALIGN_ASSET(2) char gMsgKanji9441Tex[] = dgMsgKanji9441Tex; + +#define dgMsgKanji9442Tex "__OTR__textures/kanji/gMsgKanji9442Tex" +static const ALIGN_ASSET(2) char gMsgKanji9442Tex[] = dgMsgKanji9442Tex; + +#define dgMsgKanji9443Tex "__OTR__textures/kanji/gMsgKanji9443Tex" +static const ALIGN_ASSET(2) char gMsgKanji9443Tex[] = dgMsgKanji9443Tex; + +#define dgMsgKanji9444Tex "__OTR__textures/kanji/gMsgKanji9444Tex" +static const ALIGN_ASSET(2) char gMsgKanji9444Tex[] = dgMsgKanji9444Tex; + +#define dgMsgKanji9445Tex "__OTR__textures/kanji/gMsgKanji9445Tex" +static const ALIGN_ASSET(2) char gMsgKanji9445Tex[] = dgMsgKanji9445Tex; + +#define dgMsgKanji9446Tex "__OTR__textures/kanji/gMsgKanji9446Tex" +static const ALIGN_ASSET(2) char gMsgKanji9446Tex[] = dgMsgKanji9446Tex; + +#define dgMsgKanji9447Tex "__OTR__textures/kanji/gMsgKanji9447Tex" +static const ALIGN_ASSET(2) char gMsgKanji9447Tex[] = dgMsgKanji9447Tex; + +#define dgMsgKanji9448Tex "__OTR__textures/kanji/gMsgKanji9448Tex" +static const ALIGN_ASSET(2) char gMsgKanji9448Tex[] = dgMsgKanji9448Tex; + +#define dgMsgKanji9449Tex "__OTR__textures/kanji/gMsgKanji9449Tex" +static const ALIGN_ASSET(2) char gMsgKanji9449Tex[] = dgMsgKanji9449Tex; + +#define dgMsgKanji944ATex "__OTR__textures/kanji/gMsgKanji944ATex" +static const ALIGN_ASSET(2) char gMsgKanji944ATex[] = dgMsgKanji944ATex; + +#define dgMsgKanji944BTex "__OTR__textures/kanji/gMsgKanji944BTex" +static const ALIGN_ASSET(2) char gMsgKanji944BTex[] = dgMsgKanji944BTex; + +#define dgMsgKanji944CTex "__OTR__textures/kanji/gMsgKanji944CTex" +static const ALIGN_ASSET(2) char gMsgKanji944CTex[] = dgMsgKanji944CTex; + +#define dgMsgKanji944DTex "__OTR__textures/kanji/gMsgKanji944DTex" +static const ALIGN_ASSET(2) char gMsgKanji944DTex[] = dgMsgKanji944DTex; + +#define dgMsgKanji944ETex "__OTR__textures/kanji/gMsgKanji944ETex" +static const ALIGN_ASSET(2) char gMsgKanji944ETex[] = dgMsgKanji944ETex; + +#define dgMsgKanji944FTex "__OTR__textures/kanji/gMsgKanji944FTex" +static const ALIGN_ASSET(2) char gMsgKanji944FTex[] = dgMsgKanji944FTex; + +#define dgMsgKanji9450Tex "__OTR__textures/kanji/gMsgKanji9450Tex" +static const ALIGN_ASSET(2) char gMsgKanji9450Tex[] = dgMsgKanji9450Tex; + +#define dgMsgKanji9451Tex "__OTR__textures/kanji/gMsgKanji9451Tex" +static const ALIGN_ASSET(2) char gMsgKanji9451Tex[] = dgMsgKanji9451Tex; + +#define dgMsgKanji9452Tex "__OTR__textures/kanji/gMsgKanji9452Tex" +static const ALIGN_ASSET(2) char gMsgKanji9452Tex[] = dgMsgKanji9452Tex; + +#define dgMsgKanji9453Tex "__OTR__textures/kanji/gMsgKanji9453Tex" +static const ALIGN_ASSET(2) char gMsgKanji9453Tex[] = dgMsgKanji9453Tex; + +#define dgMsgKanji9454Tex "__OTR__textures/kanji/gMsgKanji9454Tex" +static const ALIGN_ASSET(2) char gMsgKanji9454Tex[] = dgMsgKanji9454Tex; + +#define dgMsgKanji9455Tex "__OTR__textures/kanji/gMsgKanji9455Tex" +static const ALIGN_ASSET(2) char gMsgKanji9455Tex[] = dgMsgKanji9455Tex; + +#define dgMsgKanji9456Tex "__OTR__textures/kanji/gMsgKanji9456Tex" +static const ALIGN_ASSET(2) char gMsgKanji9456Tex[] = dgMsgKanji9456Tex; + +#define dgMsgKanji9457Tex "__OTR__textures/kanji/gMsgKanji9457Tex" +static const ALIGN_ASSET(2) char gMsgKanji9457Tex[] = dgMsgKanji9457Tex; + +#define dgMsgKanji9458Tex "__OTR__textures/kanji/gMsgKanji9458Tex" +static const ALIGN_ASSET(2) char gMsgKanji9458Tex[] = dgMsgKanji9458Tex; + +#define dgMsgKanji9459Tex "__OTR__textures/kanji/gMsgKanji9459Tex" +static const ALIGN_ASSET(2) char gMsgKanji9459Tex[] = dgMsgKanji9459Tex; + +#define dgMsgKanji945ATex "__OTR__textures/kanji/gMsgKanji945ATex" +static const ALIGN_ASSET(2) char gMsgKanji945ATex[] = dgMsgKanji945ATex; + +#define dgMsgKanji945BTex "__OTR__textures/kanji/gMsgKanji945BTex" +static const ALIGN_ASSET(2) char gMsgKanji945BTex[] = dgMsgKanji945BTex; + +#define dgMsgKanji945CTex "__OTR__textures/kanji/gMsgKanji945CTex" +static const ALIGN_ASSET(2) char gMsgKanji945CTex[] = dgMsgKanji945CTex; + +#define dgMsgKanji945DTex "__OTR__textures/kanji/gMsgKanji945DTex" +static const ALIGN_ASSET(2) char gMsgKanji945DTex[] = dgMsgKanji945DTex; + +#define dgMsgKanji945ETex "__OTR__textures/kanji/gMsgKanji945ETex" +static const ALIGN_ASSET(2) char gMsgKanji945ETex[] = dgMsgKanji945ETex; + +#define dgMsgKanji945FTex "__OTR__textures/kanji/gMsgKanji945FTex" +static const ALIGN_ASSET(2) char gMsgKanji945FTex[] = dgMsgKanji945FTex; + +#define dgMsgKanji9460Tex "__OTR__textures/kanji/gMsgKanji9460Tex" +static const ALIGN_ASSET(2) char gMsgKanji9460Tex[] = dgMsgKanji9460Tex; + +#define dgMsgKanji9461Tex "__OTR__textures/kanji/gMsgKanji9461Tex" +static const ALIGN_ASSET(2) char gMsgKanji9461Tex[] = dgMsgKanji9461Tex; + +#define dgMsgKanji9462Tex "__OTR__textures/kanji/gMsgKanji9462Tex" +static const ALIGN_ASSET(2) char gMsgKanji9462Tex[] = dgMsgKanji9462Tex; + +#define dgMsgKanji9463Tex "__OTR__textures/kanji/gMsgKanji9463Tex" +static const ALIGN_ASSET(2) char gMsgKanji9463Tex[] = dgMsgKanji9463Tex; + +#define dgMsgKanji9464Tex "__OTR__textures/kanji/gMsgKanji9464Tex" +static const ALIGN_ASSET(2) char gMsgKanji9464Tex[] = dgMsgKanji9464Tex; + +#define dgMsgKanji9465Tex "__OTR__textures/kanji/gMsgKanji9465Tex" +static const ALIGN_ASSET(2) char gMsgKanji9465Tex[] = dgMsgKanji9465Tex; + +#define dgMsgKanji9466Tex "__OTR__textures/kanji/gMsgKanji9466Tex" +static const ALIGN_ASSET(2) char gMsgKanji9466Tex[] = dgMsgKanji9466Tex; + +#define dgMsgKanji9467Tex "__OTR__textures/kanji/gMsgKanji9467Tex" +static const ALIGN_ASSET(2) char gMsgKanji9467Tex[] = dgMsgKanji9467Tex; + +#define dgMsgKanji9468Tex "__OTR__textures/kanji/gMsgKanji9468Tex" +static const ALIGN_ASSET(2) char gMsgKanji9468Tex[] = dgMsgKanji9468Tex; + +#define dgMsgKanji9469Tex "__OTR__textures/kanji/gMsgKanji9469Tex" +static const ALIGN_ASSET(2) char gMsgKanji9469Tex[] = dgMsgKanji9469Tex; + +#define dgMsgKanji946ATex "__OTR__textures/kanji/gMsgKanji946ATex" +static const ALIGN_ASSET(2) char gMsgKanji946ATex[] = dgMsgKanji946ATex; + +#define dgMsgKanji946BTex "__OTR__textures/kanji/gMsgKanji946BTex" +static const ALIGN_ASSET(2) char gMsgKanji946BTex[] = dgMsgKanji946BTex; + +#define dgMsgKanji946CTex "__OTR__textures/kanji/gMsgKanji946CTex" +static const ALIGN_ASSET(2) char gMsgKanji946CTex[] = dgMsgKanji946CTex; + +#define dgMsgKanji946DTex "__OTR__textures/kanji/gMsgKanji946DTex" +static const ALIGN_ASSET(2) char gMsgKanji946DTex[] = dgMsgKanji946DTex; + +#define dgMsgKanji946ETex "__OTR__textures/kanji/gMsgKanji946ETex" +static const ALIGN_ASSET(2) char gMsgKanji946ETex[] = dgMsgKanji946ETex; + +#define dgMsgKanji946FTex "__OTR__textures/kanji/gMsgKanji946FTex" +static const ALIGN_ASSET(2) char gMsgKanji946FTex[] = dgMsgKanji946FTex; + +#define dgMsgKanji9470Tex "__OTR__textures/kanji/gMsgKanji9470Tex" +static const ALIGN_ASSET(2) char gMsgKanji9470Tex[] = dgMsgKanji9470Tex; + +#define dgMsgKanji9471Tex "__OTR__textures/kanji/gMsgKanji9471Tex" +static const ALIGN_ASSET(2) char gMsgKanji9471Tex[] = dgMsgKanji9471Tex; + +#define dgMsgKanji9472Tex "__OTR__textures/kanji/gMsgKanji9472Tex" +static const ALIGN_ASSET(2) char gMsgKanji9472Tex[] = dgMsgKanji9472Tex; + +#define dgMsgKanji9473Tex "__OTR__textures/kanji/gMsgKanji9473Tex" +static const ALIGN_ASSET(2) char gMsgKanji9473Tex[] = dgMsgKanji9473Tex; + +#define dgMsgKanji9474Tex "__OTR__textures/kanji/gMsgKanji9474Tex" +static const ALIGN_ASSET(2) char gMsgKanji9474Tex[] = dgMsgKanji9474Tex; + +#define dgMsgKanji9475Tex "__OTR__textures/kanji/gMsgKanji9475Tex" +static const ALIGN_ASSET(2) char gMsgKanji9475Tex[] = dgMsgKanji9475Tex; + +#define dgMsgKanji9476Tex "__OTR__textures/kanji/gMsgKanji9476Tex" +static const ALIGN_ASSET(2) char gMsgKanji9476Tex[] = dgMsgKanji9476Tex; + +#define dgMsgKanji9477Tex "__OTR__textures/kanji/gMsgKanji9477Tex" +static const ALIGN_ASSET(2) char gMsgKanji9477Tex[] = dgMsgKanji9477Tex; + +#define dgMsgKanji9478Tex "__OTR__textures/kanji/gMsgKanji9478Tex" +static const ALIGN_ASSET(2) char gMsgKanji9478Tex[] = dgMsgKanji9478Tex; + +#define dgMsgKanji9479Tex "__OTR__textures/kanji/gMsgKanji9479Tex" +static const ALIGN_ASSET(2) char gMsgKanji9479Tex[] = dgMsgKanji9479Tex; + +#define dgMsgKanji947ATex "__OTR__textures/kanji/gMsgKanji947ATex" +static const ALIGN_ASSET(2) char gMsgKanji947ATex[] = dgMsgKanji947ATex; + +#define dgMsgKanji947BTex "__OTR__textures/kanji/gMsgKanji947BTex" +static const ALIGN_ASSET(2) char gMsgKanji947BTex[] = dgMsgKanji947BTex; + +#define dgMsgKanji947CTex "__OTR__textures/kanji/gMsgKanji947CTex" +static const ALIGN_ASSET(2) char gMsgKanji947CTex[] = dgMsgKanji947CTex; + +#define dgMsgKanji947DTex "__OTR__textures/kanji/gMsgKanji947DTex" +static const ALIGN_ASSET(2) char gMsgKanji947DTex[] = dgMsgKanji947DTex; + +#define dgMsgKanji947ETex "__OTR__textures/kanji/gMsgKanji947ETex" +static const ALIGN_ASSET(2) char gMsgKanji947ETex[] = dgMsgKanji947ETex; + +#define dgMsgKanji9480Tex "__OTR__textures/kanji/gMsgKanji9480Tex" +static const ALIGN_ASSET(2) char gMsgKanji9480Tex[] = dgMsgKanji9480Tex; + +#define dgMsgKanji9481Tex "__OTR__textures/kanji/gMsgKanji9481Tex" +static const ALIGN_ASSET(2) char gMsgKanji9481Tex[] = dgMsgKanji9481Tex; + +#define dgMsgKanji9482Tex "__OTR__textures/kanji/gMsgKanji9482Tex" +static const ALIGN_ASSET(2) char gMsgKanji9482Tex[] = dgMsgKanji9482Tex; + +#define dgMsgKanji9483Tex "__OTR__textures/kanji/gMsgKanji9483Tex" +static const ALIGN_ASSET(2) char gMsgKanji9483Tex[] = dgMsgKanji9483Tex; + +#define dgMsgKanji9484Tex "__OTR__textures/kanji/gMsgKanji9484Tex" +static const ALIGN_ASSET(2) char gMsgKanji9484Tex[] = dgMsgKanji9484Tex; + +#define dgMsgKanji9485Tex "__OTR__textures/kanji/gMsgKanji9485Tex" +static const ALIGN_ASSET(2) char gMsgKanji9485Tex[] = dgMsgKanji9485Tex; + +#define dgMsgKanji9486Tex "__OTR__textures/kanji/gMsgKanji9486Tex" +static const ALIGN_ASSET(2) char gMsgKanji9486Tex[] = dgMsgKanji9486Tex; + +#define dgMsgKanji9487Tex "__OTR__textures/kanji/gMsgKanji9487Tex" +static const ALIGN_ASSET(2) char gMsgKanji9487Tex[] = dgMsgKanji9487Tex; + +#define dgMsgKanji9488Tex "__OTR__textures/kanji/gMsgKanji9488Tex" +static const ALIGN_ASSET(2) char gMsgKanji9488Tex[] = dgMsgKanji9488Tex; + +#define dgMsgKanji9489Tex "__OTR__textures/kanji/gMsgKanji9489Tex" +static const ALIGN_ASSET(2) char gMsgKanji9489Tex[] = dgMsgKanji9489Tex; + +#define dgMsgKanji948ATex "__OTR__textures/kanji/gMsgKanji948ATex" +static const ALIGN_ASSET(2) char gMsgKanji948ATex[] = dgMsgKanji948ATex; + +#define dgMsgKanji948BTex "__OTR__textures/kanji/gMsgKanji948BTex" +static const ALIGN_ASSET(2) char gMsgKanji948BTex[] = dgMsgKanji948BTex; + +#define dgMsgKanji948CTex "__OTR__textures/kanji/gMsgKanji948CTex" +static const ALIGN_ASSET(2) char gMsgKanji948CTex[] = dgMsgKanji948CTex; + +#define dgMsgKanji948DTex "__OTR__textures/kanji/gMsgKanji948DTex" +static const ALIGN_ASSET(2) char gMsgKanji948DTex[] = dgMsgKanji948DTex; + +#define dgMsgKanji948ETex "__OTR__textures/kanji/gMsgKanji948ETex" +static const ALIGN_ASSET(2) char gMsgKanji948ETex[] = dgMsgKanji948ETex; + +#define dgMsgKanji948FTex "__OTR__textures/kanji/gMsgKanji948FTex" +static const ALIGN_ASSET(2) char gMsgKanji948FTex[] = dgMsgKanji948FTex; + +#define dgMsgKanji9490Tex "__OTR__textures/kanji/gMsgKanji9490Tex" +static const ALIGN_ASSET(2) char gMsgKanji9490Tex[] = dgMsgKanji9490Tex; + +#define dgMsgKanji9491Tex "__OTR__textures/kanji/gMsgKanji9491Tex" +static const ALIGN_ASSET(2) char gMsgKanji9491Tex[] = dgMsgKanji9491Tex; + +#define dgMsgKanji9492Tex "__OTR__textures/kanji/gMsgKanji9492Tex" +static const ALIGN_ASSET(2) char gMsgKanji9492Tex[] = dgMsgKanji9492Tex; + +#define dgMsgKanji9493Tex "__OTR__textures/kanji/gMsgKanji9493Tex" +static const ALIGN_ASSET(2) char gMsgKanji9493Tex[] = dgMsgKanji9493Tex; + +#define dgMsgKanji9494Tex "__OTR__textures/kanji/gMsgKanji9494Tex" +static const ALIGN_ASSET(2) char gMsgKanji9494Tex[] = dgMsgKanji9494Tex; + +#define dgMsgKanji9495Tex "__OTR__textures/kanji/gMsgKanji9495Tex" +static const ALIGN_ASSET(2) char gMsgKanji9495Tex[] = dgMsgKanji9495Tex; + +#define dgMsgKanji9496Tex "__OTR__textures/kanji/gMsgKanji9496Tex" +static const ALIGN_ASSET(2) char gMsgKanji9496Tex[] = dgMsgKanji9496Tex; + +#define dgMsgKanji9497Tex "__OTR__textures/kanji/gMsgKanji9497Tex" +static const ALIGN_ASSET(2) char gMsgKanji9497Tex[] = dgMsgKanji9497Tex; + +#define dgMsgKanji9498Tex "__OTR__textures/kanji/gMsgKanji9498Tex" +static const ALIGN_ASSET(2) char gMsgKanji9498Tex[] = dgMsgKanji9498Tex; + +#define dgMsgKanji9499Tex "__OTR__textures/kanji/gMsgKanji9499Tex" +static const ALIGN_ASSET(2) char gMsgKanji9499Tex[] = dgMsgKanji9499Tex; + +#define dgMsgKanji949ATex "__OTR__textures/kanji/gMsgKanji949ATex" +static const ALIGN_ASSET(2) char gMsgKanji949ATex[] = dgMsgKanji949ATex; + +#define dgMsgKanji949BTex "__OTR__textures/kanji/gMsgKanji949BTex" +static const ALIGN_ASSET(2) char gMsgKanji949BTex[] = dgMsgKanji949BTex; + +#define dgMsgKanji949CTex "__OTR__textures/kanji/gMsgKanji949CTex" +static const ALIGN_ASSET(2) char gMsgKanji949CTex[] = dgMsgKanji949CTex; + +#define dgMsgKanji949DTex "__OTR__textures/kanji/gMsgKanji949DTex" +static const ALIGN_ASSET(2) char gMsgKanji949DTex[] = dgMsgKanji949DTex; + +#define dgMsgKanji949ETex "__OTR__textures/kanji/gMsgKanji949ETex" +static const ALIGN_ASSET(2) char gMsgKanji949ETex[] = dgMsgKanji949ETex; + +#define dgMsgKanji949FTex "__OTR__textures/kanji/gMsgKanji949FTex" +static const ALIGN_ASSET(2) char gMsgKanji949FTex[] = dgMsgKanji949FTex; + +#define dgMsgKanji94A0Tex "__OTR__textures/kanji/gMsgKanji94A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A0Tex[] = dgMsgKanji94A0Tex; + +#define dgMsgKanji94A1Tex "__OTR__textures/kanji/gMsgKanji94A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A1Tex[] = dgMsgKanji94A1Tex; + +#define dgMsgKanji94A2Tex "__OTR__textures/kanji/gMsgKanji94A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A2Tex[] = dgMsgKanji94A2Tex; + +#define dgMsgKanji94A3Tex "__OTR__textures/kanji/gMsgKanji94A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A3Tex[] = dgMsgKanji94A3Tex; + +#define dgMsgKanji94A4Tex "__OTR__textures/kanji/gMsgKanji94A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A4Tex[] = dgMsgKanji94A4Tex; + +#define dgMsgKanji94A5Tex "__OTR__textures/kanji/gMsgKanji94A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A5Tex[] = dgMsgKanji94A5Tex; + +#define dgMsgKanji94A6Tex "__OTR__textures/kanji/gMsgKanji94A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A6Tex[] = dgMsgKanji94A6Tex; + +#define dgMsgKanji94A7Tex "__OTR__textures/kanji/gMsgKanji94A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A7Tex[] = dgMsgKanji94A7Tex; + +#define dgMsgKanji94A8Tex "__OTR__textures/kanji/gMsgKanji94A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A8Tex[] = dgMsgKanji94A8Tex; + +#define dgMsgKanji94A9Tex "__OTR__textures/kanji/gMsgKanji94A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A9Tex[] = dgMsgKanji94A9Tex; + +#define dgMsgKanji94AATex "__OTR__textures/kanji/gMsgKanji94AATex" +static const ALIGN_ASSET(2) char gMsgKanji94AATex[] = dgMsgKanji94AATex; + +#define dgMsgKanji94ABTex "__OTR__textures/kanji/gMsgKanji94ABTex" +static const ALIGN_ASSET(2) char gMsgKanji94ABTex[] = dgMsgKanji94ABTex; + +#define dgMsgKanji94ACTex "__OTR__textures/kanji/gMsgKanji94ACTex" +static const ALIGN_ASSET(2) char gMsgKanji94ACTex[] = dgMsgKanji94ACTex; + +#define dgMsgKanji94ADTex "__OTR__textures/kanji/gMsgKanji94ADTex" +static const ALIGN_ASSET(2) char gMsgKanji94ADTex[] = dgMsgKanji94ADTex; + +#define dgMsgKanji94AETex "__OTR__textures/kanji/gMsgKanji94AETex" +static const ALIGN_ASSET(2) char gMsgKanji94AETex[] = dgMsgKanji94AETex; + +#define dgMsgKanji94AFTex "__OTR__textures/kanji/gMsgKanji94AFTex" +static const ALIGN_ASSET(2) char gMsgKanji94AFTex[] = dgMsgKanji94AFTex; + +#define dgMsgKanji94B0Tex "__OTR__textures/kanji/gMsgKanji94B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B0Tex[] = dgMsgKanji94B0Tex; + +#define dgMsgKanji94B1Tex "__OTR__textures/kanji/gMsgKanji94B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B1Tex[] = dgMsgKanji94B1Tex; + +#define dgMsgKanji94B2Tex "__OTR__textures/kanji/gMsgKanji94B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B2Tex[] = dgMsgKanji94B2Tex; + +#define dgMsgKanji94B3Tex "__OTR__textures/kanji/gMsgKanji94B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B3Tex[] = dgMsgKanji94B3Tex; + +#define dgMsgKanji94B4Tex "__OTR__textures/kanji/gMsgKanji94B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B4Tex[] = dgMsgKanji94B4Tex; + +#define dgMsgKanji94B5Tex "__OTR__textures/kanji/gMsgKanji94B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B5Tex[] = dgMsgKanji94B5Tex; + +#define dgMsgKanji94B6Tex "__OTR__textures/kanji/gMsgKanji94B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B6Tex[] = dgMsgKanji94B6Tex; + +#define dgMsgKanji94B7Tex "__OTR__textures/kanji/gMsgKanji94B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B7Tex[] = dgMsgKanji94B7Tex; + +#define dgMsgKanji94B8Tex "__OTR__textures/kanji/gMsgKanji94B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B8Tex[] = dgMsgKanji94B8Tex; + +#define dgMsgKanji94B9Tex "__OTR__textures/kanji/gMsgKanji94B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B9Tex[] = dgMsgKanji94B9Tex; + +#define dgMsgKanji94BATex "__OTR__textures/kanji/gMsgKanji94BATex" +static const ALIGN_ASSET(2) char gMsgKanji94BATex[] = dgMsgKanji94BATex; + +#define dgMsgKanji94BBTex "__OTR__textures/kanji/gMsgKanji94BBTex" +static const ALIGN_ASSET(2) char gMsgKanji94BBTex[] = dgMsgKanji94BBTex; + +#define dgMsgKanji94BCTex "__OTR__textures/kanji/gMsgKanji94BCTex" +static const ALIGN_ASSET(2) char gMsgKanji94BCTex[] = dgMsgKanji94BCTex; + +#define dgMsgKanji94BDTex "__OTR__textures/kanji/gMsgKanji94BDTex" +static const ALIGN_ASSET(2) char gMsgKanji94BDTex[] = dgMsgKanji94BDTex; + +#define dgMsgKanji94BETex "__OTR__textures/kanji/gMsgKanji94BETex" +static const ALIGN_ASSET(2) char gMsgKanji94BETex[] = dgMsgKanji94BETex; + +#define dgMsgKanji94BFTex "__OTR__textures/kanji/gMsgKanji94BFTex" +static const ALIGN_ASSET(2) char gMsgKanji94BFTex[] = dgMsgKanji94BFTex; + +#define dgMsgKanji94C0Tex "__OTR__textures/kanji/gMsgKanji94C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C0Tex[] = dgMsgKanji94C0Tex; + +#define dgMsgKanji94C1Tex "__OTR__textures/kanji/gMsgKanji94C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C1Tex[] = dgMsgKanji94C1Tex; + +#define dgMsgKanji94C2Tex "__OTR__textures/kanji/gMsgKanji94C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C2Tex[] = dgMsgKanji94C2Tex; + +#define dgMsgKanji94C3Tex "__OTR__textures/kanji/gMsgKanji94C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C3Tex[] = dgMsgKanji94C3Tex; + +#define dgMsgKanji94C4Tex "__OTR__textures/kanji/gMsgKanji94C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C4Tex[] = dgMsgKanji94C4Tex; + +#define dgMsgKanji94C5Tex "__OTR__textures/kanji/gMsgKanji94C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C5Tex[] = dgMsgKanji94C5Tex; + +#define dgMsgKanji94C6Tex "__OTR__textures/kanji/gMsgKanji94C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C6Tex[] = dgMsgKanji94C6Tex; + +#define dgMsgKanji94C7Tex "__OTR__textures/kanji/gMsgKanji94C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C7Tex[] = dgMsgKanji94C7Tex; + +#define dgMsgKanji94C8Tex "__OTR__textures/kanji/gMsgKanji94C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C8Tex[] = dgMsgKanji94C8Tex; + +#define dgMsgKanji94C9Tex "__OTR__textures/kanji/gMsgKanji94C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C9Tex[] = dgMsgKanji94C9Tex; + +#define dgMsgKanji94CATex "__OTR__textures/kanji/gMsgKanji94CATex" +static const ALIGN_ASSET(2) char gMsgKanji94CATex[] = dgMsgKanji94CATex; + +#define dgMsgKanji94CBTex "__OTR__textures/kanji/gMsgKanji94CBTex" +static const ALIGN_ASSET(2) char gMsgKanji94CBTex[] = dgMsgKanji94CBTex; + +#define dgMsgKanji94CCTex "__OTR__textures/kanji/gMsgKanji94CCTex" +static const ALIGN_ASSET(2) char gMsgKanji94CCTex[] = dgMsgKanji94CCTex; + +#define dgMsgKanji94CDTex "__OTR__textures/kanji/gMsgKanji94CDTex" +static const ALIGN_ASSET(2) char gMsgKanji94CDTex[] = dgMsgKanji94CDTex; + +#define dgMsgKanji94CETex "__OTR__textures/kanji/gMsgKanji94CETex" +static const ALIGN_ASSET(2) char gMsgKanji94CETex[] = dgMsgKanji94CETex; + +#define dgMsgKanji94CFTex "__OTR__textures/kanji/gMsgKanji94CFTex" +static const ALIGN_ASSET(2) char gMsgKanji94CFTex[] = dgMsgKanji94CFTex; + +#define dgMsgKanji94D0Tex "__OTR__textures/kanji/gMsgKanji94D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D0Tex[] = dgMsgKanji94D0Tex; + +#define dgMsgKanji94D1Tex "__OTR__textures/kanji/gMsgKanji94D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D1Tex[] = dgMsgKanji94D1Tex; + +#define dgMsgKanji94D2Tex "__OTR__textures/kanji/gMsgKanji94D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D2Tex[] = dgMsgKanji94D2Tex; + +#define dgMsgKanji94D3Tex "__OTR__textures/kanji/gMsgKanji94D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D3Tex[] = dgMsgKanji94D3Tex; + +#define dgMsgKanji94D4Tex "__OTR__textures/kanji/gMsgKanji94D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D4Tex[] = dgMsgKanji94D4Tex; + +#define dgMsgKanji94D5Tex "__OTR__textures/kanji/gMsgKanji94D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D5Tex[] = dgMsgKanji94D5Tex; + +#define dgMsgKanji94D6Tex "__OTR__textures/kanji/gMsgKanji94D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D6Tex[] = dgMsgKanji94D6Tex; + +#define dgMsgKanji94D7Tex "__OTR__textures/kanji/gMsgKanji94D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D7Tex[] = dgMsgKanji94D7Tex; + +#define dgMsgKanji94D8Tex "__OTR__textures/kanji/gMsgKanji94D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D8Tex[] = dgMsgKanji94D8Tex; + +#define dgMsgKanji94D9Tex "__OTR__textures/kanji/gMsgKanji94D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D9Tex[] = dgMsgKanji94D9Tex; + +#define dgMsgKanji94DATex "__OTR__textures/kanji/gMsgKanji94DATex" +static const ALIGN_ASSET(2) char gMsgKanji94DATex[] = dgMsgKanji94DATex; + +#define dgMsgKanji94DBTex "__OTR__textures/kanji/gMsgKanji94DBTex" +static const ALIGN_ASSET(2) char gMsgKanji94DBTex[] = dgMsgKanji94DBTex; + +#define dgMsgKanji94DCTex "__OTR__textures/kanji/gMsgKanji94DCTex" +static const ALIGN_ASSET(2) char gMsgKanji94DCTex[] = dgMsgKanji94DCTex; + +#define dgMsgKanji94DDTex "__OTR__textures/kanji/gMsgKanji94DDTex" +static const ALIGN_ASSET(2) char gMsgKanji94DDTex[] = dgMsgKanji94DDTex; + +#define dgMsgKanji94DETex "__OTR__textures/kanji/gMsgKanji94DETex" +static const ALIGN_ASSET(2) char gMsgKanji94DETex[] = dgMsgKanji94DETex; + +#define dgMsgKanji94DFTex "__OTR__textures/kanji/gMsgKanji94DFTex" +static const ALIGN_ASSET(2) char gMsgKanji94DFTex[] = dgMsgKanji94DFTex; + +#define dgMsgKanji94E0Tex "__OTR__textures/kanji/gMsgKanji94E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E0Tex[] = dgMsgKanji94E0Tex; + +#define dgMsgKanji94E1Tex "__OTR__textures/kanji/gMsgKanji94E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E1Tex[] = dgMsgKanji94E1Tex; + +#define dgMsgKanji94E2Tex "__OTR__textures/kanji/gMsgKanji94E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E2Tex[] = dgMsgKanji94E2Tex; + +#define dgMsgKanji94E3Tex "__OTR__textures/kanji/gMsgKanji94E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E3Tex[] = dgMsgKanji94E3Tex; + +#define dgMsgKanji94E4Tex "__OTR__textures/kanji/gMsgKanji94E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E4Tex[] = dgMsgKanji94E4Tex; + +#define dgMsgKanji94E5Tex "__OTR__textures/kanji/gMsgKanji94E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E5Tex[] = dgMsgKanji94E5Tex; + +#define dgMsgKanji94E6Tex "__OTR__textures/kanji/gMsgKanji94E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E6Tex[] = dgMsgKanji94E6Tex; + +#define dgMsgKanji94E7Tex "__OTR__textures/kanji/gMsgKanji94E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E7Tex[] = dgMsgKanji94E7Tex; + +#define dgMsgKanji94E8Tex "__OTR__textures/kanji/gMsgKanji94E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E8Tex[] = dgMsgKanji94E8Tex; + +#define dgMsgKanji94E9Tex "__OTR__textures/kanji/gMsgKanji94E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E9Tex[] = dgMsgKanji94E9Tex; + +#define dgMsgKanji94EATex "__OTR__textures/kanji/gMsgKanji94EATex" +static const ALIGN_ASSET(2) char gMsgKanji94EATex[] = dgMsgKanji94EATex; + +#define dgMsgKanji94EBTex "__OTR__textures/kanji/gMsgKanji94EBTex" +static const ALIGN_ASSET(2) char gMsgKanji94EBTex[] = dgMsgKanji94EBTex; + +#define dgMsgKanji94ECTex "__OTR__textures/kanji/gMsgKanji94ECTex" +static const ALIGN_ASSET(2) char gMsgKanji94ECTex[] = dgMsgKanji94ECTex; + +#define dgMsgKanji94EDTex "__OTR__textures/kanji/gMsgKanji94EDTex" +static const ALIGN_ASSET(2) char gMsgKanji94EDTex[] = dgMsgKanji94EDTex; + +#define dgMsgKanji94EETex "__OTR__textures/kanji/gMsgKanji94EETex" +static const ALIGN_ASSET(2) char gMsgKanji94EETex[] = dgMsgKanji94EETex; + +#define dgMsgKanji94EFTex "__OTR__textures/kanji/gMsgKanji94EFTex" +static const ALIGN_ASSET(2) char gMsgKanji94EFTex[] = dgMsgKanji94EFTex; + +#define dgMsgKanji94F0Tex "__OTR__textures/kanji/gMsgKanji94F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F0Tex[] = dgMsgKanji94F0Tex; + +#define dgMsgKanji94F1Tex "__OTR__textures/kanji/gMsgKanji94F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F1Tex[] = dgMsgKanji94F1Tex; + +#define dgMsgKanji94F2Tex "__OTR__textures/kanji/gMsgKanji94F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F2Tex[] = dgMsgKanji94F2Tex; + +#define dgMsgKanji94F3Tex "__OTR__textures/kanji/gMsgKanji94F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F3Tex[] = dgMsgKanji94F3Tex; + +#define dgMsgKanji94F4Tex "__OTR__textures/kanji/gMsgKanji94F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F4Tex[] = dgMsgKanji94F4Tex; + +#define dgMsgKanji94F5Tex "__OTR__textures/kanji/gMsgKanji94F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F5Tex[] = dgMsgKanji94F5Tex; + +#define dgMsgKanji94F6Tex "__OTR__textures/kanji/gMsgKanji94F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F6Tex[] = dgMsgKanji94F6Tex; + +#define dgMsgKanji94F7Tex "__OTR__textures/kanji/gMsgKanji94F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F7Tex[] = dgMsgKanji94F7Tex; + +#define dgMsgKanji94F8Tex "__OTR__textures/kanji/gMsgKanji94F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F8Tex[] = dgMsgKanji94F8Tex; + +#define dgMsgKanji94F9Tex "__OTR__textures/kanji/gMsgKanji94F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F9Tex[] = dgMsgKanji94F9Tex; + +#define dgMsgKanji94FATex "__OTR__textures/kanji/gMsgKanji94FATex" +static const ALIGN_ASSET(2) char gMsgKanji94FATex[] = dgMsgKanji94FATex; + +#define dgMsgKanji94FBTex "__OTR__textures/kanji/gMsgKanji94FBTex" +static const ALIGN_ASSET(2) char gMsgKanji94FBTex[] = dgMsgKanji94FBTex; + +#define dgMsgKanji94FCTex "__OTR__textures/kanji/gMsgKanji94FCTex" +static const ALIGN_ASSET(2) char gMsgKanji94FCTex[] = dgMsgKanji94FCTex; + +#define dgMsgKanji9540Tex "__OTR__textures/kanji/gMsgKanji9540Tex" +static const ALIGN_ASSET(2) char gMsgKanji9540Tex[] = dgMsgKanji9540Tex; + +#define dgMsgKanji9541Tex "__OTR__textures/kanji/gMsgKanji9541Tex" +static const ALIGN_ASSET(2) char gMsgKanji9541Tex[] = dgMsgKanji9541Tex; + +#define dgMsgKanji9542Tex "__OTR__textures/kanji/gMsgKanji9542Tex" +static const ALIGN_ASSET(2) char gMsgKanji9542Tex[] = dgMsgKanji9542Tex; + +#define dgMsgKanji9543Tex "__OTR__textures/kanji/gMsgKanji9543Tex" +static const ALIGN_ASSET(2) char gMsgKanji9543Tex[] = dgMsgKanji9543Tex; + +#define dgMsgKanji9544Tex "__OTR__textures/kanji/gMsgKanji9544Tex" +static const ALIGN_ASSET(2) char gMsgKanji9544Tex[] = dgMsgKanji9544Tex; + +#define dgMsgKanji9545Tex "__OTR__textures/kanji/gMsgKanji9545Tex" +static const ALIGN_ASSET(2) char gMsgKanji9545Tex[] = dgMsgKanji9545Tex; + +#define dgMsgKanji9546Tex "__OTR__textures/kanji/gMsgKanji9546Tex" +static const ALIGN_ASSET(2) char gMsgKanji9546Tex[] = dgMsgKanji9546Tex; + +#define dgMsgKanji9547Tex "__OTR__textures/kanji/gMsgKanji9547Tex" +static const ALIGN_ASSET(2) char gMsgKanji9547Tex[] = dgMsgKanji9547Tex; + +#define dgMsgKanji9548Tex "__OTR__textures/kanji/gMsgKanji9548Tex" +static const ALIGN_ASSET(2) char gMsgKanji9548Tex[] = dgMsgKanji9548Tex; + +#define dgMsgKanji9549Tex "__OTR__textures/kanji/gMsgKanji9549Tex" +static const ALIGN_ASSET(2) char gMsgKanji9549Tex[] = dgMsgKanji9549Tex; + +#define dgMsgKanji954ATex "__OTR__textures/kanji/gMsgKanji954ATex" +static const ALIGN_ASSET(2) char gMsgKanji954ATex[] = dgMsgKanji954ATex; + +#define dgMsgKanji954BTex "__OTR__textures/kanji/gMsgKanji954BTex" +static const ALIGN_ASSET(2) char gMsgKanji954BTex[] = dgMsgKanji954BTex; + +#define dgMsgKanji954CTex "__OTR__textures/kanji/gMsgKanji954CTex" +static const ALIGN_ASSET(2) char gMsgKanji954CTex[] = dgMsgKanji954CTex; + +#define dgMsgKanji954DTex "__OTR__textures/kanji/gMsgKanji954DTex" +static const ALIGN_ASSET(2) char gMsgKanji954DTex[] = dgMsgKanji954DTex; + +#define dgMsgKanji954ETex "__OTR__textures/kanji/gMsgKanji954ETex" +static const ALIGN_ASSET(2) char gMsgKanji954ETex[] = dgMsgKanji954ETex; + +#define dgMsgKanji954FTex "__OTR__textures/kanji/gMsgKanji954FTex" +static const ALIGN_ASSET(2) char gMsgKanji954FTex[] = dgMsgKanji954FTex; + +#define dgMsgKanji9550Tex "__OTR__textures/kanji/gMsgKanji9550Tex" +static const ALIGN_ASSET(2) char gMsgKanji9550Tex[] = dgMsgKanji9550Tex; + +#define dgMsgKanji9551Tex "__OTR__textures/kanji/gMsgKanji9551Tex" +static const ALIGN_ASSET(2) char gMsgKanji9551Tex[] = dgMsgKanji9551Tex; + +#define dgMsgKanji9552Tex "__OTR__textures/kanji/gMsgKanji9552Tex" +static const ALIGN_ASSET(2) char gMsgKanji9552Tex[] = dgMsgKanji9552Tex; + +#define dgMsgKanji9553Tex "__OTR__textures/kanji/gMsgKanji9553Tex" +static const ALIGN_ASSET(2) char gMsgKanji9553Tex[] = dgMsgKanji9553Tex; + +#define dgMsgKanji9554Tex "__OTR__textures/kanji/gMsgKanji9554Tex" +static const ALIGN_ASSET(2) char gMsgKanji9554Tex[] = dgMsgKanji9554Tex; + +#define dgMsgKanji9555Tex "__OTR__textures/kanji/gMsgKanji9555Tex" +static const ALIGN_ASSET(2) char gMsgKanji9555Tex[] = dgMsgKanji9555Tex; + +#define dgMsgKanji9556Tex "__OTR__textures/kanji/gMsgKanji9556Tex" +static const ALIGN_ASSET(2) char gMsgKanji9556Tex[] = dgMsgKanji9556Tex; + +#define dgMsgKanji9557Tex "__OTR__textures/kanji/gMsgKanji9557Tex" +static const ALIGN_ASSET(2) char gMsgKanji9557Tex[] = dgMsgKanji9557Tex; + +#define dgMsgKanji9558Tex "__OTR__textures/kanji/gMsgKanji9558Tex" +static const ALIGN_ASSET(2) char gMsgKanji9558Tex[] = dgMsgKanji9558Tex; + +#define dgMsgKanji9559Tex "__OTR__textures/kanji/gMsgKanji9559Tex" +static const ALIGN_ASSET(2) char gMsgKanji9559Tex[] = dgMsgKanji9559Tex; + +#define dgMsgKanji955ATex "__OTR__textures/kanji/gMsgKanji955ATex" +static const ALIGN_ASSET(2) char gMsgKanji955ATex[] = dgMsgKanji955ATex; + +#define dgMsgKanji955BTex "__OTR__textures/kanji/gMsgKanji955BTex" +static const ALIGN_ASSET(2) char gMsgKanji955BTex[] = dgMsgKanji955BTex; + +#define dgMsgKanji955CTex "__OTR__textures/kanji/gMsgKanji955CTex" +static const ALIGN_ASSET(2) char gMsgKanji955CTex[] = dgMsgKanji955CTex; + +#define dgMsgKanji955DTex "__OTR__textures/kanji/gMsgKanji955DTex" +static const ALIGN_ASSET(2) char gMsgKanji955DTex[] = dgMsgKanji955DTex; + +#define dgMsgKanji955ETex "__OTR__textures/kanji/gMsgKanji955ETex" +static const ALIGN_ASSET(2) char gMsgKanji955ETex[] = dgMsgKanji955ETex; + +#define dgMsgKanji955FTex "__OTR__textures/kanji/gMsgKanji955FTex" +static const ALIGN_ASSET(2) char gMsgKanji955FTex[] = dgMsgKanji955FTex; + +#define dgMsgKanji9560Tex "__OTR__textures/kanji/gMsgKanji9560Tex" +static const ALIGN_ASSET(2) char gMsgKanji9560Tex[] = dgMsgKanji9560Tex; + +#define dgMsgKanji9561Tex "__OTR__textures/kanji/gMsgKanji9561Tex" +static const ALIGN_ASSET(2) char gMsgKanji9561Tex[] = dgMsgKanji9561Tex; + +#define dgMsgKanji9562Tex "__OTR__textures/kanji/gMsgKanji9562Tex" +static const ALIGN_ASSET(2) char gMsgKanji9562Tex[] = dgMsgKanji9562Tex; + +#define dgMsgKanji9563Tex "__OTR__textures/kanji/gMsgKanji9563Tex" +static const ALIGN_ASSET(2) char gMsgKanji9563Tex[] = dgMsgKanji9563Tex; + +#define dgMsgKanji9564Tex "__OTR__textures/kanji/gMsgKanji9564Tex" +static const ALIGN_ASSET(2) char gMsgKanji9564Tex[] = dgMsgKanji9564Tex; + +#define dgMsgKanji9565Tex "__OTR__textures/kanji/gMsgKanji9565Tex" +static const ALIGN_ASSET(2) char gMsgKanji9565Tex[] = dgMsgKanji9565Tex; + +#define dgMsgKanji9566Tex "__OTR__textures/kanji/gMsgKanji9566Tex" +static const ALIGN_ASSET(2) char gMsgKanji9566Tex[] = dgMsgKanji9566Tex; + +#define dgMsgKanji9567Tex "__OTR__textures/kanji/gMsgKanji9567Tex" +static const ALIGN_ASSET(2) char gMsgKanji9567Tex[] = dgMsgKanji9567Tex; + +#define dgMsgKanji9568Tex "__OTR__textures/kanji/gMsgKanji9568Tex" +static const ALIGN_ASSET(2) char gMsgKanji9568Tex[] = dgMsgKanji9568Tex; + +#define dgMsgKanji9569Tex "__OTR__textures/kanji/gMsgKanji9569Tex" +static const ALIGN_ASSET(2) char gMsgKanji9569Tex[] = dgMsgKanji9569Tex; + +#define dgMsgKanji956ATex "__OTR__textures/kanji/gMsgKanji956ATex" +static const ALIGN_ASSET(2) char gMsgKanji956ATex[] = dgMsgKanji956ATex; + +#define dgMsgKanji956BTex "__OTR__textures/kanji/gMsgKanji956BTex" +static const ALIGN_ASSET(2) char gMsgKanji956BTex[] = dgMsgKanji956BTex; + +#define dgMsgKanji956CTex "__OTR__textures/kanji/gMsgKanji956CTex" +static const ALIGN_ASSET(2) char gMsgKanji956CTex[] = dgMsgKanji956CTex; + +#define dgMsgKanji956DTex "__OTR__textures/kanji/gMsgKanji956DTex" +static const ALIGN_ASSET(2) char gMsgKanji956DTex[] = dgMsgKanji956DTex; + +#define dgMsgKanji956ETex "__OTR__textures/kanji/gMsgKanji956ETex" +static const ALIGN_ASSET(2) char gMsgKanji956ETex[] = dgMsgKanji956ETex; + +#define dgMsgKanji956FTex "__OTR__textures/kanji/gMsgKanji956FTex" +static const ALIGN_ASSET(2) char gMsgKanji956FTex[] = dgMsgKanji956FTex; + +#define dgMsgKanji9570Tex "__OTR__textures/kanji/gMsgKanji9570Tex" +static const ALIGN_ASSET(2) char gMsgKanji9570Tex[] = dgMsgKanji9570Tex; + +#define dgMsgKanji9571Tex "__OTR__textures/kanji/gMsgKanji9571Tex" +static const ALIGN_ASSET(2) char gMsgKanji9571Tex[] = dgMsgKanji9571Tex; + +#define dgMsgKanji9572Tex "__OTR__textures/kanji/gMsgKanji9572Tex" +static const ALIGN_ASSET(2) char gMsgKanji9572Tex[] = dgMsgKanji9572Tex; + +#define dgMsgKanji9573Tex "__OTR__textures/kanji/gMsgKanji9573Tex" +static const ALIGN_ASSET(2) char gMsgKanji9573Tex[] = dgMsgKanji9573Tex; + +#define dgMsgKanji9574Tex "__OTR__textures/kanji/gMsgKanji9574Tex" +static const ALIGN_ASSET(2) char gMsgKanji9574Tex[] = dgMsgKanji9574Tex; + +#define dgMsgKanji9575Tex "__OTR__textures/kanji/gMsgKanji9575Tex" +static const ALIGN_ASSET(2) char gMsgKanji9575Tex[] = dgMsgKanji9575Tex; + +#define dgMsgKanji9576Tex "__OTR__textures/kanji/gMsgKanji9576Tex" +static const ALIGN_ASSET(2) char gMsgKanji9576Tex[] = dgMsgKanji9576Tex; + +#define dgMsgKanji9577Tex "__OTR__textures/kanji/gMsgKanji9577Tex" +static const ALIGN_ASSET(2) char gMsgKanji9577Tex[] = dgMsgKanji9577Tex; + +#define dgMsgKanji9578Tex "__OTR__textures/kanji/gMsgKanji9578Tex" +static const ALIGN_ASSET(2) char gMsgKanji9578Tex[] = dgMsgKanji9578Tex; + +#define dgMsgKanji9579Tex "__OTR__textures/kanji/gMsgKanji9579Tex" +static const ALIGN_ASSET(2) char gMsgKanji9579Tex[] = dgMsgKanji9579Tex; + +#define dgMsgKanji957ATex "__OTR__textures/kanji/gMsgKanji957ATex" +static const ALIGN_ASSET(2) char gMsgKanji957ATex[] = dgMsgKanji957ATex; + +#define dgMsgKanji957BTex "__OTR__textures/kanji/gMsgKanji957BTex" +static const ALIGN_ASSET(2) char gMsgKanji957BTex[] = dgMsgKanji957BTex; + +#define dgMsgKanji957CTex "__OTR__textures/kanji/gMsgKanji957CTex" +static const ALIGN_ASSET(2) char gMsgKanji957CTex[] = dgMsgKanji957CTex; + +#define dgMsgKanji957DTex "__OTR__textures/kanji/gMsgKanji957DTex" +static const ALIGN_ASSET(2) char gMsgKanji957DTex[] = dgMsgKanji957DTex; + +#define dgMsgKanji957ETex "__OTR__textures/kanji/gMsgKanji957ETex" +static const ALIGN_ASSET(2) char gMsgKanji957ETex[] = dgMsgKanji957ETex; + +#define dgMsgKanji9580Tex "__OTR__textures/kanji/gMsgKanji9580Tex" +static const ALIGN_ASSET(2) char gMsgKanji9580Tex[] = dgMsgKanji9580Tex; + +#define dgMsgKanji9581Tex "__OTR__textures/kanji/gMsgKanji9581Tex" +static const ALIGN_ASSET(2) char gMsgKanji9581Tex[] = dgMsgKanji9581Tex; + +#define dgMsgKanji9582Tex "__OTR__textures/kanji/gMsgKanji9582Tex" +static const ALIGN_ASSET(2) char gMsgKanji9582Tex[] = dgMsgKanji9582Tex; + +#define dgMsgKanji9583Tex "__OTR__textures/kanji/gMsgKanji9583Tex" +static const ALIGN_ASSET(2) char gMsgKanji9583Tex[] = dgMsgKanji9583Tex; + +#define dgMsgKanji9584Tex "__OTR__textures/kanji/gMsgKanji9584Tex" +static const ALIGN_ASSET(2) char gMsgKanji9584Tex[] = dgMsgKanji9584Tex; + +#define dgMsgKanji9585Tex "__OTR__textures/kanji/gMsgKanji9585Tex" +static const ALIGN_ASSET(2) char gMsgKanji9585Tex[] = dgMsgKanji9585Tex; + +#define dgMsgKanji9586Tex "__OTR__textures/kanji/gMsgKanji9586Tex" +static const ALIGN_ASSET(2) char gMsgKanji9586Tex[] = dgMsgKanji9586Tex; + +#define dgMsgKanji9587Tex "__OTR__textures/kanji/gMsgKanji9587Tex" +static const ALIGN_ASSET(2) char gMsgKanji9587Tex[] = dgMsgKanji9587Tex; + +#define dgMsgKanji9588Tex "__OTR__textures/kanji/gMsgKanji9588Tex" +static const ALIGN_ASSET(2) char gMsgKanji9588Tex[] = dgMsgKanji9588Tex; + +#define dgMsgKanji9589Tex "__OTR__textures/kanji/gMsgKanji9589Tex" +static const ALIGN_ASSET(2) char gMsgKanji9589Tex[] = dgMsgKanji9589Tex; + +#define dgMsgKanji958ATex "__OTR__textures/kanji/gMsgKanji958ATex" +static const ALIGN_ASSET(2) char gMsgKanji958ATex[] = dgMsgKanji958ATex; + +#define dgMsgKanji958BTex "__OTR__textures/kanji/gMsgKanji958BTex" +static const ALIGN_ASSET(2) char gMsgKanji958BTex[] = dgMsgKanji958BTex; + +#define dgMsgKanji958CTex "__OTR__textures/kanji/gMsgKanji958CTex" +static const ALIGN_ASSET(2) char gMsgKanji958CTex[] = dgMsgKanji958CTex; + +#define dgMsgKanji958DTex "__OTR__textures/kanji/gMsgKanji958DTex" +static const ALIGN_ASSET(2) char gMsgKanji958DTex[] = dgMsgKanji958DTex; + +#define dgMsgKanji958ETex "__OTR__textures/kanji/gMsgKanji958ETex" +static const ALIGN_ASSET(2) char gMsgKanji958ETex[] = dgMsgKanji958ETex; + +#define dgMsgKanji958FTex "__OTR__textures/kanji/gMsgKanji958FTex" +static const ALIGN_ASSET(2) char gMsgKanji958FTex[] = dgMsgKanji958FTex; + +#define dgMsgKanji9590Tex "__OTR__textures/kanji/gMsgKanji9590Tex" +static const ALIGN_ASSET(2) char gMsgKanji9590Tex[] = dgMsgKanji9590Tex; + +#define dgMsgKanji9591Tex "__OTR__textures/kanji/gMsgKanji9591Tex" +static const ALIGN_ASSET(2) char gMsgKanji9591Tex[] = dgMsgKanji9591Tex; + +#define dgMsgKanji9592Tex "__OTR__textures/kanji/gMsgKanji9592Tex" +static const ALIGN_ASSET(2) char gMsgKanji9592Tex[] = dgMsgKanji9592Tex; + +#define dgMsgKanji9593Tex "__OTR__textures/kanji/gMsgKanji9593Tex" +static const ALIGN_ASSET(2) char gMsgKanji9593Tex[] = dgMsgKanji9593Tex; + +#define dgMsgKanji9594Tex "__OTR__textures/kanji/gMsgKanji9594Tex" +static const ALIGN_ASSET(2) char gMsgKanji9594Tex[] = dgMsgKanji9594Tex; + +#define dgMsgKanji9595Tex "__OTR__textures/kanji/gMsgKanji9595Tex" +static const ALIGN_ASSET(2) char gMsgKanji9595Tex[] = dgMsgKanji9595Tex; + +#define dgMsgKanji9596Tex "__OTR__textures/kanji/gMsgKanji9596Tex" +static const ALIGN_ASSET(2) char gMsgKanji9596Tex[] = dgMsgKanji9596Tex; + +#define dgMsgKanji9597Tex "__OTR__textures/kanji/gMsgKanji9597Tex" +static const ALIGN_ASSET(2) char gMsgKanji9597Tex[] = dgMsgKanji9597Tex; + +#define dgMsgKanji9598Tex "__OTR__textures/kanji/gMsgKanji9598Tex" +static const ALIGN_ASSET(2) char gMsgKanji9598Tex[] = dgMsgKanji9598Tex; + +#define dgMsgKanji9599Tex "__OTR__textures/kanji/gMsgKanji9599Tex" +static const ALIGN_ASSET(2) char gMsgKanji9599Tex[] = dgMsgKanji9599Tex; + +#define dgMsgKanji959ATex "__OTR__textures/kanji/gMsgKanji959ATex" +static const ALIGN_ASSET(2) char gMsgKanji959ATex[] = dgMsgKanji959ATex; + +#define dgMsgKanji959BTex "__OTR__textures/kanji/gMsgKanji959BTex" +static const ALIGN_ASSET(2) char gMsgKanji959BTex[] = dgMsgKanji959BTex; + +#define dgMsgKanji959CTex "__OTR__textures/kanji/gMsgKanji959CTex" +static const ALIGN_ASSET(2) char gMsgKanji959CTex[] = dgMsgKanji959CTex; + +#define dgMsgKanji959DTex "__OTR__textures/kanji/gMsgKanji959DTex" +static const ALIGN_ASSET(2) char gMsgKanji959DTex[] = dgMsgKanji959DTex; + +#define dgMsgKanji959ETex "__OTR__textures/kanji/gMsgKanji959ETex" +static const ALIGN_ASSET(2) char gMsgKanji959ETex[] = dgMsgKanji959ETex; + +#define dgMsgKanji959FTex "__OTR__textures/kanji/gMsgKanji959FTex" +static const ALIGN_ASSET(2) char gMsgKanji959FTex[] = dgMsgKanji959FTex; + +#define dgMsgKanji95A0Tex "__OTR__textures/kanji/gMsgKanji95A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A0Tex[] = dgMsgKanji95A0Tex; + +#define dgMsgKanji95A1Tex "__OTR__textures/kanji/gMsgKanji95A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A1Tex[] = dgMsgKanji95A1Tex; + +#define dgMsgKanji95A2Tex "__OTR__textures/kanji/gMsgKanji95A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A2Tex[] = dgMsgKanji95A2Tex; + +#define dgMsgKanji95A3Tex "__OTR__textures/kanji/gMsgKanji95A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A3Tex[] = dgMsgKanji95A3Tex; + +#define dgMsgKanji95A4Tex "__OTR__textures/kanji/gMsgKanji95A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A4Tex[] = dgMsgKanji95A4Tex; + +#define dgMsgKanji95A5Tex "__OTR__textures/kanji/gMsgKanji95A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A5Tex[] = dgMsgKanji95A5Tex; + +#define dgMsgKanji95A6Tex "__OTR__textures/kanji/gMsgKanji95A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A6Tex[] = dgMsgKanji95A6Tex; + +#define dgMsgKanji95A7Tex "__OTR__textures/kanji/gMsgKanji95A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A7Tex[] = dgMsgKanji95A7Tex; + +#define dgMsgKanji95A8Tex "__OTR__textures/kanji/gMsgKanji95A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A8Tex[] = dgMsgKanji95A8Tex; + +#define dgMsgKanji95A9Tex "__OTR__textures/kanji/gMsgKanji95A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A9Tex[] = dgMsgKanji95A9Tex; + +#define dgMsgKanji95AATex "__OTR__textures/kanji/gMsgKanji95AATex" +static const ALIGN_ASSET(2) char gMsgKanji95AATex[] = dgMsgKanji95AATex; + +#define dgMsgKanji95ABTex "__OTR__textures/kanji/gMsgKanji95ABTex" +static const ALIGN_ASSET(2) char gMsgKanji95ABTex[] = dgMsgKanji95ABTex; + +#define dgMsgKanji95ACTex "__OTR__textures/kanji/gMsgKanji95ACTex" +static const ALIGN_ASSET(2) char gMsgKanji95ACTex[] = dgMsgKanji95ACTex; + +#define dgMsgKanji95ADTex "__OTR__textures/kanji/gMsgKanji95ADTex" +static const ALIGN_ASSET(2) char gMsgKanji95ADTex[] = dgMsgKanji95ADTex; + +#define dgMsgKanji95AETex "__OTR__textures/kanji/gMsgKanji95AETex" +static const ALIGN_ASSET(2) char gMsgKanji95AETex[] = dgMsgKanji95AETex; + +#define dgMsgKanji95AFTex "__OTR__textures/kanji/gMsgKanji95AFTex" +static const ALIGN_ASSET(2) char gMsgKanji95AFTex[] = dgMsgKanji95AFTex; + +#define dgMsgKanji95B0Tex "__OTR__textures/kanji/gMsgKanji95B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B0Tex[] = dgMsgKanji95B0Tex; + +#define dgMsgKanji95B1Tex "__OTR__textures/kanji/gMsgKanji95B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B1Tex[] = dgMsgKanji95B1Tex; + +#define dgMsgKanji95B2Tex "__OTR__textures/kanji/gMsgKanji95B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B2Tex[] = dgMsgKanji95B2Tex; + +#define dgMsgKanji95B3Tex "__OTR__textures/kanji/gMsgKanji95B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B3Tex[] = dgMsgKanji95B3Tex; + +#define dgMsgKanji95B4Tex "__OTR__textures/kanji/gMsgKanji95B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B4Tex[] = dgMsgKanji95B4Tex; + +#define dgMsgKanji95B5Tex "__OTR__textures/kanji/gMsgKanji95B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B5Tex[] = dgMsgKanji95B5Tex; + +#define dgMsgKanji95B6Tex "__OTR__textures/kanji/gMsgKanji95B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B6Tex[] = dgMsgKanji95B6Tex; + +#define dgMsgKanji95B7Tex "__OTR__textures/kanji/gMsgKanji95B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B7Tex[] = dgMsgKanji95B7Tex; + +#define dgMsgKanji95B8Tex "__OTR__textures/kanji/gMsgKanji95B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B8Tex[] = dgMsgKanji95B8Tex; + +#define dgMsgKanji95B9Tex "__OTR__textures/kanji/gMsgKanji95B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B9Tex[] = dgMsgKanji95B9Tex; + +#define dgMsgKanji95BATex "__OTR__textures/kanji/gMsgKanji95BATex" +static const ALIGN_ASSET(2) char gMsgKanji95BATex[] = dgMsgKanji95BATex; + +#define dgMsgKanji95BBTex "__OTR__textures/kanji/gMsgKanji95BBTex" +static const ALIGN_ASSET(2) char gMsgKanji95BBTex[] = dgMsgKanji95BBTex; + +#define dgMsgKanji95BCTex "__OTR__textures/kanji/gMsgKanji95BCTex" +static const ALIGN_ASSET(2) char gMsgKanji95BCTex[] = dgMsgKanji95BCTex; + +#define dgMsgKanji95BDTex "__OTR__textures/kanji/gMsgKanji95BDTex" +static const ALIGN_ASSET(2) char gMsgKanji95BDTex[] = dgMsgKanji95BDTex; + +#define dgMsgKanji95BETex "__OTR__textures/kanji/gMsgKanji95BETex" +static const ALIGN_ASSET(2) char gMsgKanji95BETex[] = dgMsgKanji95BETex; + +#define dgMsgKanji95BFTex "__OTR__textures/kanji/gMsgKanji95BFTex" +static const ALIGN_ASSET(2) char gMsgKanji95BFTex[] = dgMsgKanji95BFTex; + +#define dgMsgKanji95C0Tex "__OTR__textures/kanji/gMsgKanji95C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C0Tex[] = dgMsgKanji95C0Tex; + +#define dgMsgKanji95C1Tex "__OTR__textures/kanji/gMsgKanji95C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C1Tex[] = dgMsgKanji95C1Tex; + +#define dgMsgKanji95C2Tex "__OTR__textures/kanji/gMsgKanji95C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C2Tex[] = dgMsgKanji95C2Tex; + +#define dgMsgKanji95C3Tex "__OTR__textures/kanji/gMsgKanji95C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C3Tex[] = dgMsgKanji95C3Tex; + +#define dgMsgKanji95C4Tex "__OTR__textures/kanji/gMsgKanji95C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C4Tex[] = dgMsgKanji95C4Tex; + +#define dgMsgKanji95C5Tex "__OTR__textures/kanji/gMsgKanji95C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C5Tex[] = dgMsgKanji95C5Tex; + +#define dgMsgKanji95C6Tex "__OTR__textures/kanji/gMsgKanji95C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C6Tex[] = dgMsgKanji95C6Tex; + +#define dgMsgKanji95C7Tex "__OTR__textures/kanji/gMsgKanji95C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C7Tex[] = dgMsgKanji95C7Tex; + +#define dgMsgKanji95C8Tex "__OTR__textures/kanji/gMsgKanji95C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C8Tex[] = dgMsgKanji95C8Tex; + +#define dgMsgKanji95C9Tex "__OTR__textures/kanji/gMsgKanji95C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C9Tex[] = dgMsgKanji95C9Tex; + +#define dgMsgKanji95CATex "__OTR__textures/kanji/gMsgKanji95CATex" +static const ALIGN_ASSET(2) char gMsgKanji95CATex[] = dgMsgKanji95CATex; + +#define dgMsgKanji95CBTex "__OTR__textures/kanji/gMsgKanji95CBTex" +static const ALIGN_ASSET(2) char gMsgKanji95CBTex[] = dgMsgKanji95CBTex; + +#define dgMsgKanji95CCTex "__OTR__textures/kanji/gMsgKanji95CCTex" +static const ALIGN_ASSET(2) char gMsgKanji95CCTex[] = dgMsgKanji95CCTex; + +#define dgMsgKanji95CDTex "__OTR__textures/kanji/gMsgKanji95CDTex" +static const ALIGN_ASSET(2) char gMsgKanji95CDTex[] = dgMsgKanji95CDTex; + +#define dgMsgKanji95CETex "__OTR__textures/kanji/gMsgKanji95CETex" +static const ALIGN_ASSET(2) char gMsgKanji95CETex[] = dgMsgKanji95CETex; + +#define dgMsgKanji95CFTex "__OTR__textures/kanji/gMsgKanji95CFTex" +static const ALIGN_ASSET(2) char gMsgKanji95CFTex[] = dgMsgKanji95CFTex; + +#define dgMsgKanji95D0Tex "__OTR__textures/kanji/gMsgKanji95D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D0Tex[] = dgMsgKanji95D0Tex; + +#define dgMsgKanji95D1Tex "__OTR__textures/kanji/gMsgKanji95D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D1Tex[] = dgMsgKanji95D1Tex; + +#define dgMsgKanji95D2Tex "__OTR__textures/kanji/gMsgKanji95D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D2Tex[] = dgMsgKanji95D2Tex; + +#define dgMsgKanji95D3Tex "__OTR__textures/kanji/gMsgKanji95D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D3Tex[] = dgMsgKanji95D3Tex; + +#define dgMsgKanji95D4Tex "__OTR__textures/kanji/gMsgKanji95D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D4Tex[] = dgMsgKanji95D4Tex; + +#define dgMsgKanji95D5Tex "__OTR__textures/kanji/gMsgKanji95D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D5Tex[] = dgMsgKanji95D5Tex; + +#define dgMsgKanji95D6Tex "__OTR__textures/kanji/gMsgKanji95D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D6Tex[] = dgMsgKanji95D6Tex; + +#define dgMsgKanji95D7Tex "__OTR__textures/kanji/gMsgKanji95D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D7Tex[] = dgMsgKanji95D7Tex; + +#define dgMsgKanji95D8Tex "__OTR__textures/kanji/gMsgKanji95D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D8Tex[] = dgMsgKanji95D8Tex; + +#define dgMsgKanji95D9Tex "__OTR__textures/kanji/gMsgKanji95D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D9Tex[] = dgMsgKanji95D9Tex; + +#define dgMsgKanji95DATex "__OTR__textures/kanji/gMsgKanji95DATex" +static const ALIGN_ASSET(2) char gMsgKanji95DATex[] = dgMsgKanji95DATex; + +#define dgMsgKanji95DBTex "__OTR__textures/kanji/gMsgKanji95DBTex" +static const ALIGN_ASSET(2) char gMsgKanji95DBTex[] = dgMsgKanji95DBTex; + +#define dgMsgKanji95DCTex "__OTR__textures/kanji/gMsgKanji95DCTex" +static const ALIGN_ASSET(2) char gMsgKanji95DCTex[] = dgMsgKanji95DCTex; + +#define dgMsgKanji95DDTex "__OTR__textures/kanji/gMsgKanji95DDTex" +static const ALIGN_ASSET(2) char gMsgKanji95DDTex[] = dgMsgKanji95DDTex; + +#define dgMsgKanji95DETex "__OTR__textures/kanji/gMsgKanji95DETex" +static const ALIGN_ASSET(2) char gMsgKanji95DETex[] = dgMsgKanji95DETex; + +#define dgMsgKanji95DFTex "__OTR__textures/kanji/gMsgKanji95DFTex" +static const ALIGN_ASSET(2) char gMsgKanji95DFTex[] = dgMsgKanji95DFTex; + +#define dgMsgKanji95E0Tex "__OTR__textures/kanji/gMsgKanji95E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E0Tex[] = dgMsgKanji95E0Tex; + +#define dgMsgKanji95E1Tex "__OTR__textures/kanji/gMsgKanji95E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E1Tex[] = dgMsgKanji95E1Tex; + +#define dgMsgKanji95E2Tex "__OTR__textures/kanji/gMsgKanji95E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E2Tex[] = dgMsgKanji95E2Tex; + +#define dgMsgKanji95E3Tex "__OTR__textures/kanji/gMsgKanji95E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E3Tex[] = dgMsgKanji95E3Tex; + +#define dgMsgKanji95E4Tex "__OTR__textures/kanji/gMsgKanji95E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E4Tex[] = dgMsgKanji95E4Tex; + +#define dgMsgKanji95E5Tex "__OTR__textures/kanji/gMsgKanji95E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E5Tex[] = dgMsgKanji95E5Tex; + +#define dgMsgKanji95E6Tex "__OTR__textures/kanji/gMsgKanji95E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E6Tex[] = dgMsgKanji95E6Tex; + +#define dgMsgKanji95E7Tex "__OTR__textures/kanji/gMsgKanji95E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E7Tex[] = dgMsgKanji95E7Tex; + +#define dgMsgKanji95E8Tex "__OTR__textures/kanji/gMsgKanji95E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E8Tex[] = dgMsgKanji95E8Tex; + +#define dgMsgKanji95E9Tex "__OTR__textures/kanji/gMsgKanji95E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E9Tex[] = dgMsgKanji95E9Tex; + +#define dgMsgKanji95EATex "__OTR__textures/kanji/gMsgKanji95EATex" +static const ALIGN_ASSET(2) char gMsgKanji95EATex[] = dgMsgKanji95EATex; + +#define dgMsgKanji95EBTex "__OTR__textures/kanji/gMsgKanji95EBTex" +static const ALIGN_ASSET(2) char gMsgKanji95EBTex[] = dgMsgKanji95EBTex; + +#define dgMsgKanji95ECTex "__OTR__textures/kanji/gMsgKanji95ECTex" +static const ALIGN_ASSET(2) char gMsgKanji95ECTex[] = dgMsgKanji95ECTex; + +#define dgMsgKanji95EDTex "__OTR__textures/kanji/gMsgKanji95EDTex" +static const ALIGN_ASSET(2) char gMsgKanji95EDTex[] = dgMsgKanji95EDTex; + +#define dgMsgKanji95EETex "__OTR__textures/kanji/gMsgKanji95EETex" +static const ALIGN_ASSET(2) char gMsgKanji95EETex[] = dgMsgKanji95EETex; + +#define dgMsgKanji95EFTex "__OTR__textures/kanji/gMsgKanji95EFTex" +static const ALIGN_ASSET(2) char gMsgKanji95EFTex[] = dgMsgKanji95EFTex; + +#define dgMsgKanji95F0Tex "__OTR__textures/kanji/gMsgKanji95F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F0Tex[] = dgMsgKanji95F0Tex; + +#define dgMsgKanji95F1Tex "__OTR__textures/kanji/gMsgKanji95F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F1Tex[] = dgMsgKanji95F1Tex; + +#define dgMsgKanji95F2Tex "__OTR__textures/kanji/gMsgKanji95F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F2Tex[] = dgMsgKanji95F2Tex; + +#define dgMsgKanji95F3Tex "__OTR__textures/kanji/gMsgKanji95F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F3Tex[] = dgMsgKanji95F3Tex; + +#define dgMsgKanji95F4Tex "__OTR__textures/kanji/gMsgKanji95F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F4Tex[] = dgMsgKanji95F4Tex; + +#define dgMsgKanji95F5Tex "__OTR__textures/kanji/gMsgKanji95F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F5Tex[] = dgMsgKanji95F5Tex; + +#define dgMsgKanji95F6Tex "__OTR__textures/kanji/gMsgKanji95F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F6Tex[] = dgMsgKanji95F6Tex; + +#define dgMsgKanji95F7Tex "__OTR__textures/kanji/gMsgKanji95F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F7Tex[] = dgMsgKanji95F7Tex; + +#define dgMsgKanji95F8Tex "__OTR__textures/kanji/gMsgKanji95F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F8Tex[] = dgMsgKanji95F8Tex; + +#define dgMsgKanji95F9Tex "__OTR__textures/kanji/gMsgKanji95F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F9Tex[] = dgMsgKanji95F9Tex; + +#define dgMsgKanji95FATex "__OTR__textures/kanji/gMsgKanji95FATex" +static const ALIGN_ASSET(2) char gMsgKanji95FATex[] = dgMsgKanji95FATex; + +#define dgMsgKanji95FBTex "__OTR__textures/kanji/gMsgKanji95FBTex" +static const ALIGN_ASSET(2) char gMsgKanji95FBTex[] = dgMsgKanji95FBTex; + +#define dgMsgKanji95FCTex "__OTR__textures/kanji/gMsgKanji95FCTex" +static const ALIGN_ASSET(2) char gMsgKanji95FCTex[] = dgMsgKanji95FCTex; + +#define dgMsgKanji9640Tex "__OTR__textures/kanji/gMsgKanji9640Tex" +static const ALIGN_ASSET(2) char gMsgKanji9640Tex[] = dgMsgKanji9640Tex; + +#define dgMsgKanji9641Tex "__OTR__textures/kanji/gMsgKanji9641Tex" +static const ALIGN_ASSET(2) char gMsgKanji9641Tex[] = dgMsgKanji9641Tex; + +#define dgMsgKanji9642Tex "__OTR__textures/kanji/gMsgKanji9642Tex" +static const ALIGN_ASSET(2) char gMsgKanji9642Tex[] = dgMsgKanji9642Tex; + +#define dgMsgKanji9643Tex "__OTR__textures/kanji/gMsgKanji9643Tex" +static const ALIGN_ASSET(2) char gMsgKanji9643Tex[] = dgMsgKanji9643Tex; + +#define dgMsgKanji9644Tex "__OTR__textures/kanji/gMsgKanji9644Tex" +static const ALIGN_ASSET(2) char gMsgKanji9644Tex[] = dgMsgKanji9644Tex; + +#define dgMsgKanji9645Tex "__OTR__textures/kanji/gMsgKanji9645Tex" +static const ALIGN_ASSET(2) char gMsgKanji9645Tex[] = dgMsgKanji9645Tex; + +#define dgMsgKanji9646Tex "__OTR__textures/kanji/gMsgKanji9646Tex" +static const ALIGN_ASSET(2) char gMsgKanji9646Tex[] = dgMsgKanji9646Tex; + +#define dgMsgKanji9647Tex "__OTR__textures/kanji/gMsgKanji9647Tex" +static const ALIGN_ASSET(2) char gMsgKanji9647Tex[] = dgMsgKanji9647Tex; + +#define dgMsgKanji9648Tex "__OTR__textures/kanji/gMsgKanji9648Tex" +static const ALIGN_ASSET(2) char gMsgKanji9648Tex[] = dgMsgKanji9648Tex; + +#define dgMsgKanji9649Tex "__OTR__textures/kanji/gMsgKanji9649Tex" +static const ALIGN_ASSET(2) char gMsgKanji9649Tex[] = dgMsgKanji9649Tex; + +#define dgMsgKanji964ATex "__OTR__textures/kanji/gMsgKanji964ATex" +static const ALIGN_ASSET(2) char gMsgKanji964ATex[] = dgMsgKanji964ATex; + +#define dgMsgKanji964BTex "__OTR__textures/kanji/gMsgKanji964BTex" +static const ALIGN_ASSET(2) char gMsgKanji964BTex[] = dgMsgKanji964BTex; + +#define dgMsgKanji964CTex "__OTR__textures/kanji/gMsgKanji964CTex" +static const ALIGN_ASSET(2) char gMsgKanji964CTex[] = dgMsgKanji964CTex; + +#define dgMsgKanji964DTex "__OTR__textures/kanji/gMsgKanji964DTex" +static const ALIGN_ASSET(2) char gMsgKanji964DTex[] = dgMsgKanji964DTex; + +#define dgMsgKanji964ETex "__OTR__textures/kanji/gMsgKanji964ETex" +static const ALIGN_ASSET(2) char gMsgKanji964ETex[] = dgMsgKanji964ETex; + +#define dgMsgKanji964FTex "__OTR__textures/kanji/gMsgKanji964FTex" +static const ALIGN_ASSET(2) char gMsgKanji964FTex[] = dgMsgKanji964FTex; + +#define dgMsgKanji9650Tex "__OTR__textures/kanji/gMsgKanji9650Tex" +static const ALIGN_ASSET(2) char gMsgKanji9650Tex[] = dgMsgKanji9650Tex; + +#define dgMsgKanji9651Tex "__OTR__textures/kanji/gMsgKanji9651Tex" +static const ALIGN_ASSET(2) char gMsgKanji9651Tex[] = dgMsgKanji9651Tex; + +#define dgMsgKanji9652Tex "__OTR__textures/kanji/gMsgKanji9652Tex" +static const ALIGN_ASSET(2) char gMsgKanji9652Tex[] = dgMsgKanji9652Tex; + +#define dgMsgKanji9653Tex "__OTR__textures/kanji/gMsgKanji9653Tex" +static const ALIGN_ASSET(2) char gMsgKanji9653Tex[] = dgMsgKanji9653Tex; + +#define dgMsgKanji9654Tex "__OTR__textures/kanji/gMsgKanji9654Tex" +static const ALIGN_ASSET(2) char gMsgKanji9654Tex[] = dgMsgKanji9654Tex; + +#define dgMsgKanji9655Tex "__OTR__textures/kanji/gMsgKanji9655Tex" +static const ALIGN_ASSET(2) char gMsgKanji9655Tex[] = dgMsgKanji9655Tex; + +#define dgMsgKanji9656Tex "__OTR__textures/kanji/gMsgKanji9656Tex" +static const ALIGN_ASSET(2) char gMsgKanji9656Tex[] = dgMsgKanji9656Tex; + +#define dgMsgKanji9657Tex "__OTR__textures/kanji/gMsgKanji9657Tex" +static const ALIGN_ASSET(2) char gMsgKanji9657Tex[] = dgMsgKanji9657Tex; + +#define dgMsgKanji9658Tex "__OTR__textures/kanji/gMsgKanji9658Tex" +static const ALIGN_ASSET(2) char gMsgKanji9658Tex[] = dgMsgKanji9658Tex; + +#define dgMsgKanji9659Tex "__OTR__textures/kanji/gMsgKanji9659Tex" +static const ALIGN_ASSET(2) char gMsgKanji9659Tex[] = dgMsgKanji9659Tex; + +#define dgMsgKanji965ATex "__OTR__textures/kanji/gMsgKanji965ATex" +static const ALIGN_ASSET(2) char gMsgKanji965ATex[] = dgMsgKanji965ATex; + +#define dgMsgKanji965BTex "__OTR__textures/kanji/gMsgKanji965BTex" +static const ALIGN_ASSET(2) char gMsgKanji965BTex[] = dgMsgKanji965BTex; + +#define dgMsgKanji965CTex "__OTR__textures/kanji/gMsgKanji965CTex" +static const ALIGN_ASSET(2) char gMsgKanji965CTex[] = dgMsgKanji965CTex; + +#define dgMsgKanji965DTex "__OTR__textures/kanji/gMsgKanji965DTex" +static const ALIGN_ASSET(2) char gMsgKanji965DTex[] = dgMsgKanji965DTex; + +#define dgMsgKanji965ETex "__OTR__textures/kanji/gMsgKanji965ETex" +static const ALIGN_ASSET(2) char gMsgKanji965ETex[] = dgMsgKanji965ETex; + +#define dgMsgKanji965FTex "__OTR__textures/kanji/gMsgKanji965FTex" +static const ALIGN_ASSET(2) char gMsgKanji965FTex[] = dgMsgKanji965FTex; + +#define dgMsgKanji9660Tex "__OTR__textures/kanji/gMsgKanji9660Tex" +static const ALIGN_ASSET(2) char gMsgKanji9660Tex[] = dgMsgKanji9660Tex; + +#define dgMsgKanji9661Tex "__OTR__textures/kanji/gMsgKanji9661Tex" +static const ALIGN_ASSET(2) char gMsgKanji9661Tex[] = dgMsgKanji9661Tex; + +#define dgMsgKanji9662Tex "__OTR__textures/kanji/gMsgKanji9662Tex" +static const ALIGN_ASSET(2) char gMsgKanji9662Tex[] = dgMsgKanji9662Tex; + +#define dgMsgKanji9663Tex "__OTR__textures/kanji/gMsgKanji9663Tex" +static const ALIGN_ASSET(2) char gMsgKanji9663Tex[] = dgMsgKanji9663Tex; + +#define dgMsgKanji9664Tex "__OTR__textures/kanji/gMsgKanji9664Tex" +static const ALIGN_ASSET(2) char gMsgKanji9664Tex[] = dgMsgKanji9664Tex; + +#define dgMsgKanji9665Tex "__OTR__textures/kanji/gMsgKanji9665Tex" +static const ALIGN_ASSET(2) char gMsgKanji9665Tex[] = dgMsgKanji9665Tex; + +#define dgMsgKanji9666Tex "__OTR__textures/kanji/gMsgKanji9666Tex" +static const ALIGN_ASSET(2) char gMsgKanji9666Tex[] = dgMsgKanji9666Tex; + +#define dgMsgKanji9667Tex "__OTR__textures/kanji/gMsgKanji9667Tex" +static const ALIGN_ASSET(2) char gMsgKanji9667Tex[] = dgMsgKanji9667Tex; + +#define dgMsgKanji9668Tex "__OTR__textures/kanji/gMsgKanji9668Tex" +static const ALIGN_ASSET(2) char gMsgKanji9668Tex[] = dgMsgKanji9668Tex; + +#define dgMsgKanji9669Tex "__OTR__textures/kanji/gMsgKanji9669Tex" +static const ALIGN_ASSET(2) char gMsgKanji9669Tex[] = dgMsgKanji9669Tex; + +#define dgMsgKanji966ATex "__OTR__textures/kanji/gMsgKanji966ATex" +static const ALIGN_ASSET(2) char gMsgKanji966ATex[] = dgMsgKanji966ATex; + +#define dgMsgKanji966BTex "__OTR__textures/kanji/gMsgKanji966BTex" +static const ALIGN_ASSET(2) char gMsgKanji966BTex[] = dgMsgKanji966BTex; + +#define dgMsgKanji966CTex "__OTR__textures/kanji/gMsgKanji966CTex" +static const ALIGN_ASSET(2) char gMsgKanji966CTex[] = dgMsgKanji966CTex; + +#define dgMsgKanji966DTex "__OTR__textures/kanji/gMsgKanji966DTex" +static const ALIGN_ASSET(2) char gMsgKanji966DTex[] = dgMsgKanji966DTex; + +#define dgMsgKanji966ETex "__OTR__textures/kanji/gMsgKanji966ETex" +static const ALIGN_ASSET(2) char gMsgKanji966ETex[] = dgMsgKanji966ETex; + +#define dgMsgKanji966FTex "__OTR__textures/kanji/gMsgKanji966FTex" +static const ALIGN_ASSET(2) char gMsgKanji966FTex[] = dgMsgKanji966FTex; + +#define dgMsgKanji9670Tex "__OTR__textures/kanji/gMsgKanji9670Tex" +static const ALIGN_ASSET(2) char gMsgKanji9670Tex[] = dgMsgKanji9670Tex; + +#define dgMsgKanji9671Tex "__OTR__textures/kanji/gMsgKanji9671Tex" +static const ALIGN_ASSET(2) char gMsgKanji9671Tex[] = dgMsgKanji9671Tex; + +#define dgMsgKanji9672Tex "__OTR__textures/kanji/gMsgKanji9672Tex" +static const ALIGN_ASSET(2) char gMsgKanji9672Tex[] = dgMsgKanji9672Tex; + +#define dgMsgKanji9673Tex "__OTR__textures/kanji/gMsgKanji9673Tex" +static const ALIGN_ASSET(2) char gMsgKanji9673Tex[] = dgMsgKanji9673Tex; + +#define dgMsgKanji9674Tex "__OTR__textures/kanji/gMsgKanji9674Tex" +static const ALIGN_ASSET(2) char gMsgKanji9674Tex[] = dgMsgKanji9674Tex; + +#define dgMsgKanji9675Tex "__OTR__textures/kanji/gMsgKanji9675Tex" +static const ALIGN_ASSET(2) char gMsgKanji9675Tex[] = dgMsgKanji9675Tex; + +#define dgMsgKanji9676Tex "__OTR__textures/kanji/gMsgKanji9676Tex" +static const ALIGN_ASSET(2) char gMsgKanji9676Tex[] = dgMsgKanji9676Tex; + +#define dgMsgKanji9677Tex "__OTR__textures/kanji/gMsgKanji9677Tex" +static const ALIGN_ASSET(2) char gMsgKanji9677Tex[] = dgMsgKanji9677Tex; + +#define dgMsgKanji9678Tex "__OTR__textures/kanji/gMsgKanji9678Tex" +static const ALIGN_ASSET(2) char gMsgKanji9678Tex[] = dgMsgKanji9678Tex; + +#define dgMsgKanji9679Tex "__OTR__textures/kanji/gMsgKanji9679Tex" +static const ALIGN_ASSET(2) char gMsgKanji9679Tex[] = dgMsgKanji9679Tex; + +#define dgMsgKanji967ATex "__OTR__textures/kanji/gMsgKanji967ATex" +static const ALIGN_ASSET(2) char gMsgKanji967ATex[] = dgMsgKanji967ATex; + +#define dgMsgKanji967BTex "__OTR__textures/kanji/gMsgKanji967BTex" +static const ALIGN_ASSET(2) char gMsgKanji967BTex[] = dgMsgKanji967BTex; + +#define dgMsgKanji967CTex "__OTR__textures/kanji/gMsgKanji967CTex" +static const ALIGN_ASSET(2) char gMsgKanji967CTex[] = dgMsgKanji967CTex; + +#define dgMsgKanji967DTex "__OTR__textures/kanji/gMsgKanji967DTex" +static const ALIGN_ASSET(2) char gMsgKanji967DTex[] = dgMsgKanji967DTex; + +#define dgMsgKanji967ETex "__OTR__textures/kanji/gMsgKanji967ETex" +static const ALIGN_ASSET(2) char gMsgKanji967ETex[] = dgMsgKanji967ETex; + +#define dgMsgKanji9680Tex "__OTR__textures/kanji/gMsgKanji9680Tex" +static const ALIGN_ASSET(2) char gMsgKanji9680Tex[] = dgMsgKanji9680Tex; + +#define dgMsgKanji9681Tex "__OTR__textures/kanji/gMsgKanji9681Tex" +static const ALIGN_ASSET(2) char gMsgKanji9681Tex[] = dgMsgKanji9681Tex; + +#define dgMsgKanji9682Tex "__OTR__textures/kanji/gMsgKanji9682Tex" +static const ALIGN_ASSET(2) char gMsgKanji9682Tex[] = dgMsgKanji9682Tex; + +#define dgMsgKanji9683Tex "__OTR__textures/kanji/gMsgKanji9683Tex" +static const ALIGN_ASSET(2) char gMsgKanji9683Tex[] = dgMsgKanji9683Tex; + +#define dgMsgKanji9684Tex "__OTR__textures/kanji/gMsgKanji9684Tex" +static const ALIGN_ASSET(2) char gMsgKanji9684Tex[] = dgMsgKanji9684Tex; + +#define dgMsgKanji9685Tex "__OTR__textures/kanji/gMsgKanji9685Tex" +static const ALIGN_ASSET(2) char gMsgKanji9685Tex[] = dgMsgKanji9685Tex; + +#define dgMsgKanji9686Tex "__OTR__textures/kanji/gMsgKanji9686Tex" +static const ALIGN_ASSET(2) char gMsgKanji9686Tex[] = dgMsgKanji9686Tex; + +#define dgMsgKanji9687Tex "__OTR__textures/kanji/gMsgKanji9687Tex" +static const ALIGN_ASSET(2) char gMsgKanji9687Tex[] = dgMsgKanji9687Tex; + +#define dgMsgKanji9688Tex "__OTR__textures/kanji/gMsgKanji9688Tex" +static const ALIGN_ASSET(2) char gMsgKanji9688Tex[] = dgMsgKanji9688Tex; + +#define dgMsgKanji9689Tex "__OTR__textures/kanji/gMsgKanji9689Tex" +static const ALIGN_ASSET(2) char gMsgKanji9689Tex[] = dgMsgKanji9689Tex; + +#define dgMsgKanji968ATex "__OTR__textures/kanji/gMsgKanji968ATex" +static const ALIGN_ASSET(2) char gMsgKanji968ATex[] = dgMsgKanji968ATex; + +#define dgMsgKanji968BTex "__OTR__textures/kanji/gMsgKanji968BTex" +static const ALIGN_ASSET(2) char gMsgKanji968BTex[] = dgMsgKanji968BTex; + +#define dgMsgKanji968CTex "__OTR__textures/kanji/gMsgKanji968CTex" +static const ALIGN_ASSET(2) char gMsgKanji968CTex[] = dgMsgKanji968CTex; + +#define dgMsgKanji968DTex "__OTR__textures/kanji/gMsgKanji968DTex" +static const ALIGN_ASSET(2) char gMsgKanji968DTex[] = dgMsgKanji968DTex; + +#define dgMsgKanji968ETex "__OTR__textures/kanji/gMsgKanji968ETex" +static const ALIGN_ASSET(2) char gMsgKanji968ETex[] = dgMsgKanji968ETex; + +#define dgMsgKanji968FTex "__OTR__textures/kanji/gMsgKanji968FTex" +static const ALIGN_ASSET(2) char gMsgKanji968FTex[] = dgMsgKanji968FTex; + +#define dgMsgKanji9690Tex "__OTR__textures/kanji/gMsgKanji9690Tex" +static const ALIGN_ASSET(2) char gMsgKanji9690Tex[] = dgMsgKanji9690Tex; + +#define dgMsgKanji9691Tex "__OTR__textures/kanji/gMsgKanji9691Tex" +static const ALIGN_ASSET(2) char gMsgKanji9691Tex[] = dgMsgKanji9691Tex; + +#define dgMsgKanji9692Tex "__OTR__textures/kanji/gMsgKanji9692Tex" +static const ALIGN_ASSET(2) char gMsgKanji9692Tex[] = dgMsgKanji9692Tex; + +#define dgMsgKanji9693Tex "__OTR__textures/kanji/gMsgKanji9693Tex" +static const ALIGN_ASSET(2) char gMsgKanji9693Tex[] = dgMsgKanji9693Tex; + +#define dgMsgKanji9694Tex "__OTR__textures/kanji/gMsgKanji9694Tex" +static const ALIGN_ASSET(2) char gMsgKanji9694Tex[] = dgMsgKanji9694Tex; + +#define dgMsgKanji9695Tex "__OTR__textures/kanji/gMsgKanji9695Tex" +static const ALIGN_ASSET(2) char gMsgKanji9695Tex[] = dgMsgKanji9695Tex; + +#define dgMsgKanji9696Tex "__OTR__textures/kanji/gMsgKanji9696Tex" +static const ALIGN_ASSET(2) char gMsgKanji9696Tex[] = dgMsgKanji9696Tex; + +#define dgMsgKanji9697Tex "__OTR__textures/kanji/gMsgKanji9697Tex" +static const ALIGN_ASSET(2) char gMsgKanji9697Tex[] = dgMsgKanji9697Tex; + +#define dgMsgKanji9698Tex "__OTR__textures/kanji/gMsgKanji9698Tex" +static const ALIGN_ASSET(2) char gMsgKanji9698Tex[] = dgMsgKanji9698Tex; + +#define dgMsgKanji9699Tex "__OTR__textures/kanji/gMsgKanji9699Tex" +static const ALIGN_ASSET(2) char gMsgKanji9699Tex[] = dgMsgKanji9699Tex; + +#define dgMsgKanji969ATex "__OTR__textures/kanji/gMsgKanji969ATex" +static const ALIGN_ASSET(2) char gMsgKanji969ATex[] = dgMsgKanji969ATex; + +#define dgMsgKanji969BTex "__OTR__textures/kanji/gMsgKanji969BTex" +static const ALIGN_ASSET(2) char gMsgKanji969BTex[] = dgMsgKanji969BTex; + +#define dgMsgKanji969CTex "__OTR__textures/kanji/gMsgKanji969CTex" +static const ALIGN_ASSET(2) char gMsgKanji969CTex[] = dgMsgKanji969CTex; + +#define dgMsgKanji969DTex "__OTR__textures/kanji/gMsgKanji969DTex" +static const ALIGN_ASSET(2) char gMsgKanji969DTex[] = dgMsgKanji969DTex; + +#define dgMsgKanji969ETex "__OTR__textures/kanji/gMsgKanji969ETex" +static const ALIGN_ASSET(2) char gMsgKanji969ETex[] = dgMsgKanji969ETex; + +#define dgMsgKanji969FTex "__OTR__textures/kanji/gMsgKanji969FTex" +static const ALIGN_ASSET(2) char gMsgKanji969FTex[] = dgMsgKanji969FTex; + +#define dgMsgKanji96A0Tex "__OTR__textures/kanji/gMsgKanji96A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A0Tex[] = dgMsgKanji96A0Tex; + +#define dgMsgKanji96A1Tex "__OTR__textures/kanji/gMsgKanji96A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A1Tex[] = dgMsgKanji96A1Tex; + +#define dgMsgKanji96A2Tex "__OTR__textures/kanji/gMsgKanji96A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A2Tex[] = dgMsgKanji96A2Tex; + +#define dgMsgKanji96A3Tex "__OTR__textures/kanji/gMsgKanji96A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A3Tex[] = dgMsgKanji96A3Tex; + +#define dgMsgKanji96A4Tex "__OTR__textures/kanji/gMsgKanji96A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A4Tex[] = dgMsgKanji96A4Tex; + +#define dgMsgKanji96A5Tex "__OTR__textures/kanji/gMsgKanji96A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A5Tex[] = dgMsgKanji96A5Tex; + +#define dgMsgKanji96A6Tex "__OTR__textures/kanji/gMsgKanji96A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A6Tex[] = dgMsgKanji96A6Tex; + +#define dgMsgKanji96A7Tex "__OTR__textures/kanji/gMsgKanji96A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A7Tex[] = dgMsgKanji96A7Tex; + +#define dgMsgKanji96A8Tex "__OTR__textures/kanji/gMsgKanji96A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A8Tex[] = dgMsgKanji96A8Tex; + +#define dgMsgKanji96A9Tex "__OTR__textures/kanji/gMsgKanji96A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A9Tex[] = dgMsgKanji96A9Tex; + +#define dgMsgKanji96AATex "__OTR__textures/kanji/gMsgKanji96AATex" +static const ALIGN_ASSET(2) char gMsgKanji96AATex[] = dgMsgKanji96AATex; + +#define dgMsgKanji96ABTex "__OTR__textures/kanji/gMsgKanji96ABTex" +static const ALIGN_ASSET(2) char gMsgKanji96ABTex[] = dgMsgKanji96ABTex; + +#define dgMsgKanji96ACTex "__OTR__textures/kanji/gMsgKanji96ACTex" +static const ALIGN_ASSET(2) char gMsgKanji96ACTex[] = dgMsgKanji96ACTex; + +#define dgMsgKanji96ADTex "__OTR__textures/kanji/gMsgKanji96ADTex" +static const ALIGN_ASSET(2) char gMsgKanji96ADTex[] = dgMsgKanji96ADTex; + +#define dgMsgKanji96AETex "__OTR__textures/kanji/gMsgKanji96AETex" +static const ALIGN_ASSET(2) char gMsgKanji96AETex[] = dgMsgKanji96AETex; + +#define dgMsgKanji96AFTex "__OTR__textures/kanji/gMsgKanji96AFTex" +static const ALIGN_ASSET(2) char gMsgKanji96AFTex[] = dgMsgKanji96AFTex; + +#define dgMsgKanji96B0Tex "__OTR__textures/kanji/gMsgKanji96B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B0Tex[] = dgMsgKanji96B0Tex; + +#define dgMsgKanji96B1Tex "__OTR__textures/kanji/gMsgKanji96B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B1Tex[] = dgMsgKanji96B1Tex; + +#define dgMsgKanji96B2Tex "__OTR__textures/kanji/gMsgKanji96B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B2Tex[] = dgMsgKanji96B2Tex; + +#define dgMsgKanji96B3Tex "__OTR__textures/kanji/gMsgKanji96B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B3Tex[] = dgMsgKanji96B3Tex; + +#define dgMsgKanji96B4Tex "__OTR__textures/kanji/gMsgKanji96B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B4Tex[] = dgMsgKanji96B4Tex; + +#define dgMsgKanji96B5Tex "__OTR__textures/kanji/gMsgKanji96B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B5Tex[] = dgMsgKanji96B5Tex; + +#define dgMsgKanji96B6Tex "__OTR__textures/kanji/gMsgKanji96B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B6Tex[] = dgMsgKanji96B6Tex; + +#define dgMsgKanji96B7Tex "__OTR__textures/kanji/gMsgKanji96B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B7Tex[] = dgMsgKanji96B7Tex; + +#define dgMsgKanji96B8Tex "__OTR__textures/kanji/gMsgKanji96B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B8Tex[] = dgMsgKanji96B8Tex; + +#define dgMsgKanji96B9Tex "__OTR__textures/kanji/gMsgKanji96B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B9Tex[] = dgMsgKanji96B9Tex; + +#define dgMsgKanji96BATex "__OTR__textures/kanji/gMsgKanji96BATex" +static const ALIGN_ASSET(2) char gMsgKanji96BATex[] = dgMsgKanji96BATex; + +#define dgMsgKanji96BBTex "__OTR__textures/kanji/gMsgKanji96BBTex" +static const ALIGN_ASSET(2) char gMsgKanji96BBTex[] = dgMsgKanji96BBTex; + +#define dgMsgKanji96BCTex "__OTR__textures/kanji/gMsgKanji96BCTex" +static const ALIGN_ASSET(2) char gMsgKanji96BCTex[] = dgMsgKanji96BCTex; + +#define dgMsgKanji96BDTex "__OTR__textures/kanji/gMsgKanji96BDTex" +static const ALIGN_ASSET(2) char gMsgKanji96BDTex[] = dgMsgKanji96BDTex; + +#define dgMsgKanji96BETex "__OTR__textures/kanji/gMsgKanji96BETex" +static const ALIGN_ASSET(2) char gMsgKanji96BETex[] = dgMsgKanji96BETex; + +#define dgMsgKanji96BFTex "__OTR__textures/kanji/gMsgKanji96BFTex" +static const ALIGN_ASSET(2) char gMsgKanji96BFTex[] = dgMsgKanji96BFTex; + +#define dgMsgKanji96C0Tex "__OTR__textures/kanji/gMsgKanji96C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C0Tex[] = dgMsgKanji96C0Tex; + +#define dgMsgKanji96C1Tex "__OTR__textures/kanji/gMsgKanji96C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C1Tex[] = dgMsgKanji96C1Tex; + +#define dgMsgKanji96C2Tex "__OTR__textures/kanji/gMsgKanji96C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C2Tex[] = dgMsgKanji96C2Tex; + +#define dgMsgKanji96C3Tex "__OTR__textures/kanji/gMsgKanji96C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C3Tex[] = dgMsgKanji96C3Tex; + +#define dgMsgKanji96C4Tex "__OTR__textures/kanji/gMsgKanji96C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C4Tex[] = dgMsgKanji96C4Tex; + +#define dgMsgKanji96C5Tex "__OTR__textures/kanji/gMsgKanji96C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C5Tex[] = dgMsgKanji96C5Tex; + +#define dgMsgKanji96C6Tex "__OTR__textures/kanji/gMsgKanji96C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C6Tex[] = dgMsgKanji96C6Tex; + +#define dgMsgKanji96C7Tex "__OTR__textures/kanji/gMsgKanji96C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C7Tex[] = dgMsgKanji96C7Tex; + +#define dgMsgKanji96C8Tex "__OTR__textures/kanji/gMsgKanji96C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C8Tex[] = dgMsgKanji96C8Tex; + +#define dgMsgKanji96C9Tex "__OTR__textures/kanji/gMsgKanji96C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C9Tex[] = dgMsgKanji96C9Tex; + +#define dgMsgKanji96CATex "__OTR__textures/kanji/gMsgKanji96CATex" +static const ALIGN_ASSET(2) char gMsgKanji96CATex[] = dgMsgKanji96CATex; + +#define dgMsgKanji96CBTex "__OTR__textures/kanji/gMsgKanji96CBTex" +static const ALIGN_ASSET(2) char gMsgKanji96CBTex[] = dgMsgKanji96CBTex; + +#define dgMsgKanji96CCTex "__OTR__textures/kanji/gMsgKanji96CCTex" +static const ALIGN_ASSET(2) char gMsgKanji96CCTex[] = dgMsgKanji96CCTex; + +#define dgMsgKanji96CDTex "__OTR__textures/kanji/gMsgKanji96CDTex" +static const ALIGN_ASSET(2) char gMsgKanji96CDTex[] = dgMsgKanji96CDTex; + +#define dgMsgKanji96CETex "__OTR__textures/kanji/gMsgKanji96CETex" +static const ALIGN_ASSET(2) char gMsgKanji96CETex[] = dgMsgKanji96CETex; + +#define dgMsgKanji96CFTex "__OTR__textures/kanji/gMsgKanji96CFTex" +static const ALIGN_ASSET(2) char gMsgKanji96CFTex[] = dgMsgKanji96CFTex; + +#define dgMsgKanji96D0Tex "__OTR__textures/kanji/gMsgKanji96D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D0Tex[] = dgMsgKanji96D0Tex; + +#define dgMsgKanji96D1Tex "__OTR__textures/kanji/gMsgKanji96D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D1Tex[] = dgMsgKanji96D1Tex; + +#define dgMsgKanji96D2Tex "__OTR__textures/kanji/gMsgKanji96D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D2Tex[] = dgMsgKanji96D2Tex; + +#define dgMsgKanji96D3Tex "__OTR__textures/kanji/gMsgKanji96D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D3Tex[] = dgMsgKanji96D3Tex; + +#define dgMsgKanji96D4Tex "__OTR__textures/kanji/gMsgKanji96D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D4Tex[] = dgMsgKanji96D4Tex; + +#define dgMsgKanji96D5Tex "__OTR__textures/kanji/gMsgKanji96D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D5Tex[] = dgMsgKanji96D5Tex; + +#define dgMsgKanji96D6Tex "__OTR__textures/kanji/gMsgKanji96D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D6Tex[] = dgMsgKanji96D6Tex; + +#define dgMsgKanji96D7Tex "__OTR__textures/kanji/gMsgKanji96D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D7Tex[] = dgMsgKanji96D7Tex; + +#define dgMsgKanji96D8Tex "__OTR__textures/kanji/gMsgKanji96D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D8Tex[] = dgMsgKanji96D8Tex; + +#define dgMsgKanji96D9Tex "__OTR__textures/kanji/gMsgKanji96D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D9Tex[] = dgMsgKanji96D9Tex; + +#define dgMsgKanji96DATex "__OTR__textures/kanji/gMsgKanji96DATex" +static const ALIGN_ASSET(2) char gMsgKanji96DATex[] = dgMsgKanji96DATex; + +#define dgMsgKanji96DBTex "__OTR__textures/kanji/gMsgKanji96DBTex" +static const ALIGN_ASSET(2) char gMsgKanji96DBTex[] = dgMsgKanji96DBTex; + +#define dgMsgKanji96DCTex "__OTR__textures/kanji/gMsgKanji96DCTex" +static const ALIGN_ASSET(2) char gMsgKanji96DCTex[] = dgMsgKanji96DCTex; + +#define dgMsgKanji96DDTex "__OTR__textures/kanji/gMsgKanji96DDTex" +static const ALIGN_ASSET(2) char gMsgKanji96DDTex[] = dgMsgKanji96DDTex; + +#define dgMsgKanji96DETex "__OTR__textures/kanji/gMsgKanji96DETex" +static const ALIGN_ASSET(2) char gMsgKanji96DETex[] = dgMsgKanji96DETex; + +#define dgMsgKanji96DFTex "__OTR__textures/kanji/gMsgKanji96DFTex" +static const ALIGN_ASSET(2) char gMsgKanji96DFTex[] = dgMsgKanji96DFTex; + +#define dgMsgKanji96E0Tex "__OTR__textures/kanji/gMsgKanji96E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E0Tex[] = dgMsgKanji96E0Tex; + +#define dgMsgKanji96E1Tex "__OTR__textures/kanji/gMsgKanji96E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E1Tex[] = dgMsgKanji96E1Tex; + +#define dgMsgKanji96E2Tex "__OTR__textures/kanji/gMsgKanji96E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E2Tex[] = dgMsgKanji96E2Tex; + +#define dgMsgKanji96E3Tex "__OTR__textures/kanji/gMsgKanji96E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E3Tex[] = dgMsgKanji96E3Tex; + +#define dgMsgKanji96E4Tex "__OTR__textures/kanji/gMsgKanji96E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E4Tex[] = dgMsgKanji96E4Tex; + +#define dgMsgKanji96E5Tex "__OTR__textures/kanji/gMsgKanji96E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E5Tex[] = dgMsgKanji96E5Tex; + +#define dgMsgKanji96E6Tex "__OTR__textures/kanji/gMsgKanji96E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E6Tex[] = dgMsgKanji96E6Tex; + +#define dgMsgKanji96E7Tex "__OTR__textures/kanji/gMsgKanji96E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E7Tex[] = dgMsgKanji96E7Tex; + +#define dgMsgKanji96E8Tex "__OTR__textures/kanji/gMsgKanji96E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E8Tex[] = dgMsgKanji96E8Tex; + +#define dgMsgKanji96E9Tex "__OTR__textures/kanji/gMsgKanji96E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E9Tex[] = dgMsgKanji96E9Tex; + +#define dgMsgKanji96EATex "__OTR__textures/kanji/gMsgKanji96EATex" +static const ALIGN_ASSET(2) char gMsgKanji96EATex[] = dgMsgKanji96EATex; + +#define dgMsgKanji96EBTex "__OTR__textures/kanji/gMsgKanji96EBTex" +static const ALIGN_ASSET(2) char gMsgKanji96EBTex[] = dgMsgKanji96EBTex; + +#define dgMsgKanji96ECTex "__OTR__textures/kanji/gMsgKanji96ECTex" +static const ALIGN_ASSET(2) char gMsgKanji96ECTex[] = dgMsgKanji96ECTex; + +#define dgMsgKanji96EDTex "__OTR__textures/kanji/gMsgKanji96EDTex" +static const ALIGN_ASSET(2) char gMsgKanji96EDTex[] = dgMsgKanji96EDTex; + +#define dgMsgKanji96EETex "__OTR__textures/kanji/gMsgKanji96EETex" +static const ALIGN_ASSET(2) char gMsgKanji96EETex[] = dgMsgKanji96EETex; + +#define dgMsgKanji96EFTex "__OTR__textures/kanji/gMsgKanji96EFTex" +static const ALIGN_ASSET(2) char gMsgKanji96EFTex[] = dgMsgKanji96EFTex; + +#define dgMsgKanji96F0Tex "__OTR__textures/kanji/gMsgKanji96F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F0Tex[] = dgMsgKanji96F0Tex; + +#define dgMsgKanji96F1Tex "__OTR__textures/kanji/gMsgKanji96F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F1Tex[] = dgMsgKanji96F1Tex; + +#define dgMsgKanji96F2Tex "__OTR__textures/kanji/gMsgKanji96F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F2Tex[] = dgMsgKanji96F2Tex; + +#define dgMsgKanji96F3Tex "__OTR__textures/kanji/gMsgKanji96F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F3Tex[] = dgMsgKanji96F3Tex; + +#define dgMsgKanji96F4Tex "__OTR__textures/kanji/gMsgKanji96F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F4Tex[] = dgMsgKanji96F4Tex; + +#define dgMsgKanji96F5Tex "__OTR__textures/kanji/gMsgKanji96F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F5Tex[] = dgMsgKanji96F5Tex; + +#define dgMsgKanji96F6Tex "__OTR__textures/kanji/gMsgKanji96F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F6Tex[] = dgMsgKanji96F6Tex; + +#define dgMsgKanji96F7Tex "__OTR__textures/kanji/gMsgKanji96F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F7Tex[] = dgMsgKanji96F7Tex; + +#define dgMsgKanji96F8Tex "__OTR__textures/kanji/gMsgKanji96F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F8Tex[] = dgMsgKanji96F8Tex; + +#define dgMsgKanji96F9Tex "__OTR__textures/kanji/gMsgKanji96F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F9Tex[] = dgMsgKanji96F9Tex; + +#define dgMsgKanji96FATex "__OTR__textures/kanji/gMsgKanji96FATex" +static const ALIGN_ASSET(2) char gMsgKanji96FATex[] = dgMsgKanji96FATex; + +#define dgMsgKanji96FBTex "__OTR__textures/kanji/gMsgKanji96FBTex" +static const ALIGN_ASSET(2) char gMsgKanji96FBTex[] = dgMsgKanji96FBTex; + +#define dgMsgKanji96FCTex "__OTR__textures/kanji/gMsgKanji96FCTex" +static const ALIGN_ASSET(2) char gMsgKanji96FCTex[] = dgMsgKanji96FCTex; + +#define dgMsgKanji9740Tex "__OTR__textures/kanji/gMsgKanji9740Tex" +static const ALIGN_ASSET(2) char gMsgKanji9740Tex[] = dgMsgKanji9740Tex; + +#define dgMsgKanji9741Tex "__OTR__textures/kanji/gMsgKanji9741Tex" +static const ALIGN_ASSET(2) char gMsgKanji9741Tex[] = dgMsgKanji9741Tex; + +#define dgMsgKanji9742Tex "__OTR__textures/kanji/gMsgKanji9742Tex" +static const ALIGN_ASSET(2) char gMsgKanji9742Tex[] = dgMsgKanji9742Tex; + +#define dgMsgKanji9743Tex "__OTR__textures/kanji/gMsgKanji9743Tex" +static const ALIGN_ASSET(2) char gMsgKanji9743Tex[] = dgMsgKanji9743Tex; + +#define dgMsgKanji9744Tex "__OTR__textures/kanji/gMsgKanji9744Tex" +static const ALIGN_ASSET(2) char gMsgKanji9744Tex[] = dgMsgKanji9744Tex; + +#define dgMsgKanji9745Tex "__OTR__textures/kanji/gMsgKanji9745Tex" +static const ALIGN_ASSET(2) char gMsgKanji9745Tex[] = dgMsgKanji9745Tex; + +#define dgMsgKanji9746Tex "__OTR__textures/kanji/gMsgKanji9746Tex" +static const ALIGN_ASSET(2) char gMsgKanji9746Tex[] = dgMsgKanji9746Tex; + +#define dgMsgKanji9747Tex "__OTR__textures/kanji/gMsgKanji9747Tex" +static const ALIGN_ASSET(2) char gMsgKanji9747Tex[] = dgMsgKanji9747Tex; + +#define dgMsgKanji9748Tex "__OTR__textures/kanji/gMsgKanji9748Tex" +static const ALIGN_ASSET(2) char gMsgKanji9748Tex[] = dgMsgKanji9748Tex; + +#define dgMsgKanji9749Tex "__OTR__textures/kanji/gMsgKanji9749Tex" +static const ALIGN_ASSET(2) char gMsgKanji9749Tex[] = dgMsgKanji9749Tex; + +#define dgMsgKanji974ATex "__OTR__textures/kanji/gMsgKanji974ATex" +static const ALIGN_ASSET(2) char gMsgKanji974ATex[] = dgMsgKanji974ATex; + +#define dgMsgKanji974BTex "__OTR__textures/kanji/gMsgKanji974BTex" +static const ALIGN_ASSET(2) char gMsgKanji974BTex[] = dgMsgKanji974BTex; + +#define dgMsgKanji974CTex "__OTR__textures/kanji/gMsgKanji974CTex" +static const ALIGN_ASSET(2) char gMsgKanji974CTex[] = dgMsgKanji974CTex; + +#define dgMsgKanji974DTex "__OTR__textures/kanji/gMsgKanji974DTex" +static const ALIGN_ASSET(2) char gMsgKanji974DTex[] = dgMsgKanji974DTex; + +#define dgMsgKanji974ETex "__OTR__textures/kanji/gMsgKanji974ETex" +static const ALIGN_ASSET(2) char gMsgKanji974ETex[] = dgMsgKanji974ETex; + +#define dgMsgKanji974FTex "__OTR__textures/kanji/gMsgKanji974FTex" +static const ALIGN_ASSET(2) char gMsgKanji974FTex[] = dgMsgKanji974FTex; + +#define dgMsgKanji9750Tex "__OTR__textures/kanji/gMsgKanji9750Tex" +static const ALIGN_ASSET(2) char gMsgKanji9750Tex[] = dgMsgKanji9750Tex; + +#define dgMsgKanji9751Tex "__OTR__textures/kanji/gMsgKanji9751Tex" +static const ALIGN_ASSET(2) char gMsgKanji9751Tex[] = dgMsgKanji9751Tex; + +#define dgMsgKanji9752Tex "__OTR__textures/kanji/gMsgKanji9752Tex" +static const ALIGN_ASSET(2) char gMsgKanji9752Tex[] = dgMsgKanji9752Tex; + +#define dgMsgKanji9753Tex "__OTR__textures/kanji/gMsgKanji9753Tex" +static const ALIGN_ASSET(2) char gMsgKanji9753Tex[] = dgMsgKanji9753Tex; + +#define dgMsgKanji9754Tex "__OTR__textures/kanji/gMsgKanji9754Tex" +static const ALIGN_ASSET(2) char gMsgKanji9754Tex[] = dgMsgKanji9754Tex; + +#define dgMsgKanji9755Tex "__OTR__textures/kanji/gMsgKanji9755Tex" +static const ALIGN_ASSET(2) char gMsgKanji9755Tex[] = dgMsgKanji9755Tex; + +#define dgMsgKanji9756Tex "__OTR__textures/kanji/gMsgKanji9756Tex" +static const ALIGN_ASSET(2) char gMsgKanji9756Tex[] = dgMsgKanji9756Tex; + +#define dgMsgKanji9757Tex "__OTR__textures/kanji/gMsgKanji9757Tex" +static const ALIGN_ASSET(2) char gMsgKanji9757Tex[] = dgMsgKanji9757Tex; + +#define dgMsgKanji9758Tex "__OTR__textures/kanji/gMsgKanji9758Tex" +static const ALIGN_ASSET(2) char gMsgKanji9758Tex[] = dgMsgKanji9758Tex; + +#define dgMsgKanji9759Tex "__OTR__textures/kanji/gMsgKanji9759Tex" +static const ALIGN_ASSET(2) char gMsgKanji9759Tex[] = dgMsgKanji9759Tex; + +#define dgMsgKanji975ATex "__OTR__textures/kanji/gMsgKanji975ATex" +static const ALIGN_ASSET(2) char gMsgKanji975ATex[] = dgMsgKanji975ATex; + +#define dgMsgKanji975BTex "__OTR__textures/kanji/gMsgKanji975BTex" +static const ALIGN_ASSET(2) char gMsgKanji975BTex[] = dgMsgKanji975BTex; + +#define dgMsgKanji975CTex "__OTR__textures/kanji/gMsgKanji975CTex" +static const ALIGN_ASSET(2) char gMsgKanji975CTex[] = dgMsgKanji975CTex; + +#define dgMsgKanji975DTex "__OTR__textures/kanji/gMsgKanji975DTex" +static const ALIGN_ASSET(2) char gMsgKanji975DTex[] = dgMsgKanji975DTex; + +#define dgMsgKanji975ETex "__OTR__textures/kanji/gMsgKanji975ETex" +static const ALIGN_ASSET(2) char gMsgKanji975ETex[] = dgMsgKanji975ETex; + +#define dgMsgKanji975FTex "__OTR__textures/kanji/gMsgKanji975FTex" +static const ALIGN_ASSET(2) char gMsgKanji975FTex[] = dgMsgKanji975FTex; + +#define dgMsgKanji9760Tex "__OTR__textures/kanji/gMsgKanji9760Tex" +static const ALIGN_ASSET(2) char gMsgKanji9760Tex[] = dgMsgKanji9760Tex; + +#define dgMsgKanji9761Tex "__OTR__textures/kanji/gMsgKanji9761Tex" +static const ALIGN_ASSET(2) char gMsgKanji9761Tex[] = dgMsgKanji9761Tex; + +#define dgMsgKanji9762Tex "__OTR__textures/kanji/gMsgKanji9762Tex" +static const ALIGN_ASSET(2) char gMsgKanji9762Tex[] = dgMsgKanji9762Tex; + +#define dgMsgKanji9763Tex "__OTR__textures/kanji/gMsgKanji9763Tex" +static const ALIGN_ASSET(2) char gMsgKanji9763Tex[] = dgMsgKanji9763Tex; + +#define dgMsgKanji9764Tex "__OTR__textures/kanji/gMsgKanji9764Tex" +static const ALIGN_ASSET(2) char gMsgKanji9764Tex[] = dgMsgKanji9764Tex; + +#define dgMsgKanji9765Tex "__OTR__textures/kanji/gMsgKanji9765Tex" +static const ALIGN_ASSET(2) char gMsgKanji9765Tex[] = dgMsgKanji9765Tex; + +#define dgMsgKanji9766Tex "__OTR__textures/kanji/gMsgKanji9766Tex" +static const ALIGN_ASSET(2) char gMsgKanji9766Tex[] = dgMsgKanji9766Tex; + +#define dgMsgKanji9767Tex "__OTR__textures/kanji/gMsgKanji9767Tex" +static const ALIGN_ASSET(2) char gMsgKanji9767Tex[] = dgMsgKanji9767Tex; + +#define dgMsgKanji9768Tex "__OTR__textures/kanji/gMsgKanji9768Tex" +static const ALIGN_ASSET(2) char gMsgKanji9768Tex[] = dgMsgKanji9768Tex; + +#define dgMsgKanji9769Tex "__OTR__textures/kanji/gMsgKanji9769Tex" +static const ALIGN_ASSET(2) char gMsgKanji9769Tex[] = dgMsgKanji9769Tex; + +#define dgMsgKanji976ATex "__OTR__textures/kanji/gMsgKanji976ATex" +static const ALIGN_ASSET(2) char gMsgKanji976ATex[] = dgMsgKanji976ATex; + +#define dgMsgKanji976BTex "__OTR__textures/kanji/gMsgKanji976BTex" +static const ALIGN_ASSET(2) char gMsgKanji976BTex[] = dgMsgKanji976BTex; + +#define dgMsgKanji976CTex "__OTR__textures/kanji/gMsgKanji976CTex" +static const ALIGN_ASSET(2) char gMsgKanji976CTex[] = dgMsgKanji976CTex; + +#define dgMsgKanji976DTex "__OTR__textures/kanji/gMsgKanji976DTex" +static const ALIGN_ASSET(2) char gMsgKanji976DTex[] = dgMsgKanji976DTex; + +#define dgMsgKanji976ETex "__OTR__textures/kanji/gMsgKanji976ETex" +static const ALIGN_ASSET(2) char gMsgKanji976ETex[] = dgMsgKanji976ETex; + +#define dgMsgKanji976FTex "__OTR__textures/kanji/gMsgKanji976FTex" +static const ALIGN_ASSET(2) char gMsgKanji976FTex[] = dgMsgKanji976FTex; + +#define dgMsgKanji9770Tex "__OTR__textures/kanji/gMsgKanji9770Tex" +static const ALIGN_ASSET(2) char gMsgKanji9770Tex[] = dgMsgKanji9770Tex; + +#define dgMsgKanji9771Tex "__OTR__textures/kanji/gMsgKanji9771Tex" +static const ALIGN_ASSET(2) char gMsgKanji9771Tex[] = dgMsgKanji9771Tex; + +#define dgMsgKanji9772Tex "__OTR__textures/kanji/gMsgKanji9772Tex" +static const ALIGN_ASSET(2) char gMsgKanji9772Tex[] = dgMsgKanji9772Tex; + +#define dgMsgKanji9773Tex "__OTR__textures/kanji/gMsgKanji9773Tex" +static const ALIGN_ASSET(2) char gMsgKanji9773Tex[] = dgMsgKanji9773Tex; + +#define dgMsgKanji9774Tex "__OTR__textures/kanji/gMsgKanji9774Tex" +static const ALIGN_ASSET(2) char gMsgKanji9774Tex[] = dgMsgKanji9774Tex; + +#define dgMsgKanji9775Tex "__OTR__textures/kanji/gMsgKanji9775Tex" +static const ALIGN_ASSET(2) char gMsgKanji9775Tex[] = dgMsgKanji9775Tex; + +#define dgMsgKanji9776Tex "__OTR__textures/kanji/gMsgKanji9776Tex" +static const ALIGN_ASSET(2) char gMsgKanji9776Tex[] = dgMsgKanji9776Tex; + +#define dgMsgKanji9777Tex "__OTR__textures/kanji/gMsgKanji9777Tex" +static const ALIGN_ASSET(2) char gMsgKanji9777Tex[] = dgMsgKanji9777Tex; + +#define dgMsgKanji9778Tex "__OTR__textures/kanji/gMsgKanji9778Tex" +static const ALIGN_ASSET(2) char gMsgKanji9778Tex[] = dgMsgKanji9778Tex; + +#define dgMsgKanji9779Tex "__OTR__textures/kanji/gMsgKanji9779Tex" +static const ALIGN_ASSET(2) char gMsgKanji9779Tex[] = dgMsgKanji9779Tex; + +#define dgMsgKanji977ATex "__OTR__textures/kanji/gMsgKanji977ATex" +static const ALIGN_ASSET(2) char gMsgKanji977ATex[] = dgMsgKanji977ATex; + +#define dgMsgKanji977BTex "__OTR__textures/kanji/gMsgKanji977BTex" +static const ALIGN_ASSET(2) char gMsgKanji977BTex[] = dgMsgKanji977BTex; + +#define dgMsgKanji977CTex "__OTR__textures/kanji/gMsgKanji977CTex" +static const ALIGN_ASSET(2) char gMsgKanji977CTex[] = dgMsgKanji977CTex; + +#define dgMsgKanji977DTex "__OTR__textures/kanji/gMsgKanji977DTex" +static const ALIGN_ASSET(2) char gMsgKanji977DTex[] = dgMsgKanji977DTex; + +#define dgMsgKanji977ETex "__OTR__textures/kanji/gMsgKanji977ETex" +static const ALIGN_ASSET(2) char gMsgKanji977ETex[] = dgMsgKanji977ETex; + +#define dgMsgKanji9780Tex "__OTR__textures/kanji/gMsgKanji9780Tex" +static const ALIGN_ASSET(2) char gMsgKanji9780Tex[] = dgMsgKanji9780Tex; + +#define dgMsgKanji9781Tex "__OTR__textures/kanji/gMsgKanji9781Tex" +static const ALIGN_ASSET(2) char gMsgKanji9781Tex[] = dgMsgKanji9781Tex; + +#define dgMsgKanji9782Tex "__OTR__textures/kanji/gMsgKanji9782Tex" +static const ALIGN_ASSET(2) char gMsgKanji9782Tex[] = dgMsgKanji9782Tex; + +#define dgMsgKanji9783Tex "__OTR__textures/kanji/gMsgKanji9783Tex" +static const ALIGN_ASSET(2) char gMsgKanji9783Tex[] = dgMsgKanji9783Tex; + +#define dgMsgKanji9784Tex "__OTR__textures/kanji/gMsgKanji9784Tex" +static const ALIGN_ASSET(2) char gMsgKanji9784Tex[] = dgMsgKanji9784Tex; + +#define dgMsgKanji9785Tex "__OTR__textures/kanji/gMsgKanji9785Tex" +static const ALIGN_ASSET(2) char gMsgKanji9785Tex[] = dgMsgKanji9785Tex; + +#define dgMsgKanji9786Tex "__OTR__textures/kanji/gMsgKanji9786Tex" +static const ALIGN_ASSET(2) char gMsgKanji9786Tex[] = dgMsgKanji9786Tex; + +#define dgMsgKanji9787Tex "__OTR__textures/kanji/gMsgKanji9787Tex" +static const ALIGN_ASSET(2) char gMsgKanji9787Tex[] = dgMsgKanji9787Tex; + +#define dgMsgKanji9788Tex "__OTR__textures/kanji/gMsgKanji9788Tex" +static const ALIGN_ASSET(2) char gMsgKanji9788Tex[] = dgMsgKanji9788Tex; + +#define dgMsgKanji9789Tex "__OTR__textures/kanji/gMsgKanji9789Tex" +static const ALIGN_ASSET(2) char gMsgKanji9789Tex[] = dgMsgKanji9789Tex; + +#define dgMsgKanji978ATex "__OTR__textures/kanji/gMsgKanji978ATex" +static const ALIGN_ASSET(2) char gMsgKanji978ATex[] = dgMsgKanji978ATex; + +#define dgMsgKanji978BTex "__OTR__textures/kanji/gMsgKanji978BTex" +static const ALIGN_ASSET(2) char gMsgKanji978BTex[] = dgMsgKanji978BTex; + +#define dgMsgKanji978CTex "__OTR__textures/kanji/gMsgKanji978CTex" +static const ALIGN_ASSET(2) char gMsgKanji978CTex[] = dgMsgKanji978CTex; + +#define dgMsgKanji978DTex "__OTR__textures/kanji/gMsgKanji978DTex" +static const ALIGN_ASSET(2) char gMsgKanji978DTex[] = dgMsgKanji978DTex; + +#define dgMsgKanji978ETex "__OTR__textures/kanji/gMsgKanji978ETex" +static const ALIGN_ASSET(2) char gMsgKanji978ETex[] = dgMsgKanji978ETex; + +#define dgMsgKanji978FTex "__OTR__textures/kanji/gMsgKanji978FTex" +static const ALIGN_ASSET(2) char gMsgKanji978FTex[] = dgMsgKanji978FTex; + +#define dgMsgKanji9790Tex "__OTR__textures/kanji/gMsgKanji9790Tex" +static const ALIGN_ASSET(2) char gMsgKanji9790Tex[] = dgMsgKanji9790Tex; + +#define dgMsgKanji9791Tex "__OTR__textures/kanji/gMsgKanji9791Tex" +static const ALIGN_ASSET(2) char gMsgKanji9791Tex[] = dgMsgKanji9791Tex; + +#define dgMsgKanji9792Tex "__OTR__textures/kanji/gMsgKanji9792Tex" +static const ALIGN_ASSET(2) char gMsgKanji9792Tex[] = dgMsgKanji9792Tex; + +#define dgMsgKanji9793Tex "__OTR__textures/kanji/gMsgKanji9793Tex" +static const ALIGN_ASSET(2) char gMsgKanji9793Tex[] = dgMsgKanji9793Tex; + +#define dgMsgKanji9794Tex "__OTR__textures/kanji/gMsgKanji9794Tex" +static const ALIGN_ASSET(2) char gMsgKanji9794Tex[] = dgMsgKanji9794Tex; + +#define dgMsgKanji9795Tex "__OTR__textures/kanji/gMsgKanji9795Tex" +static const ALIGN_ASSET(2) char gMsgKanji9795Tex[] = dgMsgKanji9795Tex; + +#define dgMsgKanji9796Tex "__OTR__textures/kanji/gMsgKanji9796Tex" +static const ALIGN_ASSET(2) char gMsgKanji9796Tex[] = dgMsgKanji9796Tex; + +#define dgMsgKanji9797Tex "__OTR__textures/kanji/gMsgKanji9797Tex" +static const ALIGN_ASSET(2) char gMsgKanji9797Tex[] = dgMsgKanji9797Tex; + +#define dgMsgKanji9798Tex "__OTR__textures/kanji/gMsgKanji9798Tex" +static const ALIGN_ASSET(2) char gMsgKanji9798Tex[] = dgMsgKanji9798Tex; + +#define dgMsgKanji9799Tex "__OTR__textures/kanji/gMsgKanji9799Tex" +static const ALIGN_ASSET(2) char gMsgKanji9799Tex[] = dgMsgKanji9799Tex; + +#define dgMsgKanji979ATex "__OTR__textures/kanji/gMsgKanji979ATex" +static const ALIGN_ASSET(2) char gMsgKanji979ATex[] = dgMsgKanji979ATex; + +#define dgMsgKanji979BTex "__OTR__textures/kanji/gMsgKanji979BTex" +static const ALIGN_ASSET(2) char gMsgKanji979BTex[] = dgMsgKanji979BTex; + +#define dgMsgKanji979CTex "__OTR__textures/kanji/gMsgKanji979CTex" +static const ALIGN_ASSET(2) char gMsgKanji979CTex[] = dgMsgKanji979CTex; + +#define dgMsgKanji979DTex "__OTR__textures/kanji/gMsgKanji979DTex" +static const ALIGN_ASSET(2) char gMsgKanji979DTex[] = dgMsgKanji979DTex; + +#define dgMsgKanji979ETex "__OTR__textures/kanji/gMsgKanji979ETex" +static const ALIGN_ASSET(2) char gMsgKanji979ETex[] = dgMsgKanji979ETex; + +#define dgMsgKanji979FTex "__OTR__textures/kanji/gMsgKanji979FTex" +static const ALIGN_ASSET(2) char gMsgKanji979FTex[] = dgMsgKanji979FTex; + +#define dgMsgKanji97A0Tex "__OTR__textures/kanji/gMsgKanji97A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A0Tex[] = dgMsgKanji97A0Tex; + +#define dgMsgKanji97A1Tex "__OTR__textures/kanji/gMsgKanji97A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A1Tex[] = dgMsgKanji97A1Tex; + +#define dgMsgKanji97A2Tex "__OTR__textures/kanji/gMsgKanji97A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A2Tex[] = dgMsgKanji97A2Tex; + +#define dgMsgKanji97A3Tex "__OTR__textures/kanji/gMsgKanji97A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A3Tex[] = dgMsgKanji97A3Tex; + +#define dgMsgKanji97A4Tex "__OTR__textures/kanji/gMsgKanji97A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A4Tex[] = dgMsgKanji97A4Tex; + +#define dgMsgKanji97A5Tex "__OTR__textures/kanji/gMsgKanji97A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A5Tex[] = dgMsgKanji97A5Tex; + +#define dgMsgKanji97A6Tex "__OTR__textures/kanji/gMsgKanji97A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A6Tex[] = dgMsgKanji97A6Tex; + +#define dgMsgKanji97A7Tex "__OTR__textures/kanji/gMsgKanji97A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A7Tex[] = dgMsgKanji97A7Tex; + +#define dgMsgKanji97A8Tex "__OTR__textures/kanji/gMsgKanji97A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A8Tex[] = dgMsgKanji97A8Tex; + +#define dgMsgKanji97A9Tex "__OTR__textures/kanji/gMsgKanji97A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A9Tex[] = dgMsgKanji97A9Tex; + +#define dgMsgKanji97AATex "__OTR__textures/kanji/gMsgKanji97AATex" +static const ALIGN_ASSET(2) char gMsgKanji97AATex[] = dgMsgKanji97AATex; + +#define dgMsgKanji97ABTex "__OTR__textures/kanji/gMsgKanji97ABTex" +static const ALIGN_ASSET(2) char gMsgKanji97ABTex[] = dgMsgKanji97ABTex; + +#define dgMsgKanji97ACTex "__OTR__textures/kanji/gMsgKanji97ACTex" +static const ALIGN_ASSET(2) char gMsgKanji97ACTex[] = dgMsgKanji97ACTex; + +#define dgMsgKanji97ADTex "__OTR__textures/kanji/gMsgKanji97ADTex" +static const ALIGN_ASSET(2) char gMsgKanji97ADTex[] = dgMsgKanji97ADTex; + +#define dgMsgKanji97AETex "__OTR__textures/kanji/gMsgKanji97AETex" +static const ALIGN_ASSET(2) char gMsgKanji97AETex[] = dgMsgKanji97AETex; + +#define dgMsgKanji97AFTex "__OTR__textures/kanji/gMsgKanji97AFTex" +static const ALIGN_ASSET(2) char gMsgKanji97AFTex[] = dgMsgKanji97AFTex; + +#define dgMsgKanji97B0Tex "__OTR__textures/kanji/gMsgKanji97B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B0Tex[] = dgMsgKanji97B0Tex; + +#define dgMsgKanji97B1Tex "__OTR__textures/kanji/gMsgKanji97B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B1Tex[] = dgMsgKanji97B1Tex; + +#define dgMsgKanji97B2Tex "__OTR__textures/kanji/gMsgKanji97B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B2Tex[] = dgMsgKanji97B2Tex; + +#define dgMsgKanji97B3Tex "__OTR__textures/kanji/gMsgKanji97B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B3Tex[] = dgMsgKanji97B3Tex; + +#define dgMsgKanji97B4Tex "__OTR__textures/kanji/gMsgKanji97B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B4Tex[] = dgMsgKanji97B4Tex; + +#define dgMsgKanji97B5Tex "__OTR__textures/kanji/gMsgKanji97B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B5Tex[] = dgMsgKanji97B5Tex; + +#define dgMsgKanji97B6Tex "__OTR__textures/kanji/gMsgKanji97B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B6Tex[] = dgMsgKanji97B6Tex; + +#define dgMsgKanji97B7Tex "__OTR__textures/kanji/gMsgKanji97B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B7Tex[] = dgMsgKanji97B7Tex; + +#define dgMsgKanji97B8Tex "__OTR__textures/kanji/gMsgKanji97B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B8Tex[] = dgMsgKanji97B8Tex; + +#define dgMsgKanji97B9Tex "__OTR__textures/kanji/gMsgKanji97B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B9Tex[] = dgMsgKanji97B9Tex; + +#define dgMsgKanji97BATex "__OTR__textures/kanji/gMsgKanji97BATex" +static const ALIGN_ASSET(2) char gMsgKanji97BATex[] = dgMsgKanji97BATex; + +#define dgMsgKanji97BBTex "__OTR__textures/kanji/gMsgKanji97BBTex" +static const ALIGN_ASSET(2) char gMsgKanji97BBTex[] = dgMsgKanji97BBTex; + +#define dgMsgKanji97BCTex "__OTR__textures/kanji/gMsgKanji97BCTex" +static const ALIGN_ASSET(2) char gMsgKanji97BCTex[] = dgMsgKanji97BCTex; + +#define dgMsgKanji97BDTex "__OTR__textures/kanji/gMsgKanji97BDTex" +static const ALIGN_ASSET(2) char gMsgKanji97BDTex[] = dgMsgKanji97BDTex; + +#define dgMsgKanji97BETex "__OTR__textures/kanji/gMsgKanji97BETex" +static const ALIGN_ASSET(2) char gMsgKanji97BETex[] = dgMsgKanji97BETex; + +#define dgMsgKanji97BFTex "__OTR__textures/kanji/gMsgKanji97BFTex" +static const ALIGN_ASSET(2) char gMsgKanji97BFTex[] = dgMsgKanji97BFTex; + +#define dgMsgKanji97C0Tex "__OTR__textures/kanji/gMsgKanji97C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C0Tex[] = dgMsgKanji97C0Tex; + +#define dgMsgKanji97C1Tex "__OTR__textures/kanji/gMsgKanji97C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C1Tex[] = dgMsgKanji97C1Tex; + +#define dgMsgKanji97C2Tex "__OTR__textures/kanji/gMsgKanji97C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C2Tex[] = dgMsgKanji97C2Tex; + +#define dgMsgKanji97C3Tex "__OTR__textures/kanji/gMsgKanji97C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C3Tex[] = dgMsgKanji97C3Tex; + +#define dgMsgKanji97C4Tex "__OTR__textures/kanji/gMsgKanji97C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C4Tex[] = dgMsgKanji97C4Tex; + +#define dgMsgKanji97C5Tex "__OTR__textures/kanji/gMsgKanji97C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C5Tex[] = dgMsgKanji97C5Tex; + +#define dgMsgKanji97C6Tex "__OTR__textures/kanji/gMsgKanji97C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C6Tex[] = dgMsgKanji97C6Tex; + +#define dgMsgKanji97C7Tex "__OTR__textures/kanji/gMsgKanji97C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C7Tex[] = dgMsgKanji97C7Tex; + +#define dgMsgKanji97C8Tex "__OTR__textures/kanji/gMsgKanji97C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C8Tex[] = dgMsgKanji97C8Tex; + +#define dgMsgKanji97C9Tex "__OTR__textures/kanji/gMsgKanji97C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C9Tex[] = dgMsgKanji97C9Tex; + +#define dgMsgKanji97CATex "__OTR__textures/kanji/gMsgKanji97CATex" +static const ALIGN_ASSET(2) char gMsgKanji97CATex[] = dgMsgKanji97CATex; + +#define dgMsgKanji97CBTex "__OTR__textures/kanji/gMsgKanji97CBTex" +static const ALIGN_ASSET(2) char gMsgKanji97CBTex[] = dgMsgKanji97CBTex; + +#define dgMsgKanji97CCTex "__OTR__textures/kanji/gMsgKanji97CCTex" +static const ALIGN_ASSET(2) char gMsgKanji97CCTex[] = dgMsgKanji97CCTex; + +#define dgMsgKanji97CDTex "__OTR__textures/kanji/gMsgKanji97CDTex" +static const ALIGN_ASSET(2) char gMsgKanji97CDTex[] = dgMsgKanji97CDTex; + +#define dgMsgKanji97CETex "__OTR__textures/kanji/gMsgKanji97CETex" +static const ALIGN_ASSET(2) char gMsgKanji97CETex[] = dgMsgKanji97CETex; + +#define dgMsgKanji97CFTex "__OTR__textures/kanji/gMsgKanji97CFTex" +static const ALIGN_ASSET(2) char gMsgKanji97CFTex[] = dgMsgKanji97CFTex; + +#define dgMsgKanji97D0Tex "__OTR__textures/kanji/gMsgKanji97D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D0Tex[] = dgMsgKanji97D0Tex; + +#define dgMsgKanji97D1Tex "__OTR__textures/kanji/gMsgKanji97D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D1Tex[] = dgMsgKanji97D1Tex; + +#define dgMsgKanji97D2Tex "__OTR__textures/kanji/gMsgKanji97D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D2Tex[] = dgMsgKanji97D2Tex; + +#define dgMsgKanji97D3Tex "__OTR__textures/kanji/gMsgKanji97D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D3Tex[] = dgMsgKanji97D3Tex; + +#define dgMsgKanji97D4Tex "__OTR__textures/kanji/gMsgKanji97D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D4Tex[] = dgMsgKanji97D4Tex; + +#define dgMsgKanji97D5Tex "__OTR__textures/kanji/gMsgKanji97D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D5Tex[] = dgMsgKanji97D5Tex; + +#define dgMsgKanji97D6Tex "__OTR__textures/kanji/gMsgKanji97D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D6Tex[] = dgMsgKanji97D6Tex; + +#define dgMsgKanji97D7Tex "__OTR__textures/kanji/gMsgKanji97D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D7Tex[] = dgMsgKanji97D7Tex; + +#define dgMsgKanji97D8Tex "__OTR__textures/kanji/gMsgKanji97D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D8Tex[] = dgMsgKanji97D8Tex; + +#define dgMsgKanji97D9Tex "__OTR__textures/kanji/gMsgKanji97D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D9Tex[] = dgMsgKanji97D9Tex; + +#define dgMsgKanji97DATex "__OTR__textures/kanji/gMsgKanji97DATex" +static const ALIGN_ASSET(2) char gMsgKanji97DATex[] = dgMsgKanji97DATex; + +#define dgMsgKanji97DBTex "__OTR__textures/kanji/gMsgKanji97DBTex" +static const ALIGN_ASSET(2) char gMsgKanji97DBTex[] = dgMsgKanji97DBTex; + +#define dgMsgKanji97DCTex "__OTR__textures/kanji/gMsgKanji97DCTex" +static const ALIGN_ASSET(2) char gMsgKanji97DCTex[] = dgMsgKanji97DCTex; + +#define dgMsgKanji97DDTex "__OTR__textures/kanji/gMsgKanji97DDTex" +static const ALIGN_ASSET(2) char gMsgKanji97DDTex[] = dgMsgKanji97DDTex; + +#define dgMsgKanji97DETex "__OTR__textures/kanji/gMsgKanji97DETex" +static const ALIGN_ASSET(2) char gMsgKanji97DETex[] = dgMsgKanji97DETex; + +#define dgMsgKanji97DFTex "__OTR__textures/kanji/gMsgKanji97DFTex" +static const ALIGN_ASSET(2) char gMsgKanji97DFTex[] = dgMsgKanji97DFTex; + +#define dgMsgKanji97E0Tex "__OTR__textures/kanji/gMsgKanji97E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E0Tex[] = dgMsgKanji97E0Tex; + +#define dgMsgKanji97E1Tex "__OTR__textures/kanji/gMsgKanji97E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E1Tex[] = dgMsgKanji97E1Tex; + +#define dgMsgKanji97E2Tex "__OTR__textures/kanji/gMsgKanji97E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E2Tex[] = dgMsgKanji97E2Tex; + +#define dgMsgKanji97E3Tex "__OTR__textures/kanji/gMsgKanji97E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E3Tex[] = dgMsgKanji97E3Tex; + +#define dgMsgKanji97E4Tex "__OTR__textures/kanji/gMsgKanji97E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E4Tex[] = dgMsgKanji97E4Tex; + +#define dgMsgKanji97E5Tex "__OTR__textures/kanji/gMsgKanji97E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E5Tex[] = dgMsgKanji97E5Tex; + +#define dgMsgKanji97E6Tex "__OTR__textures/kanji/gMsgKanji97E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E6Tex[] = dgMsgKanji97E6Tex; + +#define dgMsgKanji97E7Tex "__OTR__textures/kanji/gMsgKanji97E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E7Tex[] = dgMsgKanji97E7Tex; + +#define dgMsgKanji97E8Tex "__OTR__textures/kanji/gMsgKanji97E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E8Tex[] = dgMsgKanji97E8Tex; + +#define dgMsgKanji97E9Tex "__OTR__textures/kanji/gMsgKanji97E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E9Tex[] = dgMsgKanji97E9Tex; + +#define dgMsgKanji97EATex "__OTR__textures/kanji/gMsgKanji97EATex" +static const ALIGN_ASSET(2) char gMsgKanji97EATex[] = dgMsgKanji97EATex; + +#define dgMsgKanji97EBTex "__OTR__textures/kanji/gMsgKanji97EBTex" +static const ALIGN_ASSET(2) char gMsgKanji97EBTex[] = dgMsgKanji97EBTex; + +#define dgMsgKanji97ECTex "__OTR__textures/kanji/gMsgKanji97ECTex" +static const ALIGN_ASSET(2) char gMsgKanji97ECTex[] = dgMsgKanji97ECTex; + +#define dgMsgKanji97EDTex "__OTR__textures/kanji/gMsgKanji97EDTex" +static const ALIGN_ASSET(2) char gMsgKanji97EDTex[] = dgMsgKanji97EDTex; + +#define dgMsgKanji97EETex "__OTR__textures/kanji/gMsgKanji97EETex" +static const ALIGN_ASSET(2) char gMsgKanji97EETex[] = dgMsgKanji97EETex; + +#define dgMsgKanji97EFTex "__OTR__textures/kanji/gMsgKanji97EFTex" +static const ALIGN_ASSET(2) char gMsgKanji97EFTex[] = dgMsgKanji97EFTex; + +#define dgMsgKanji97F0Tex "__OTR__textures/kanji/gMsgKanji97F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F0Tex[] = dgMsgKanji97F0Tex; + +#define dgMsgKanji97F1Tex "__OTR__textures/kanji/gMsgKanji97F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F1Tex[] = dgMsgKanji97F1Tex; + +#define dgMsgKanji97F2Tex "__OTR__textures/kanji/gMsgKanji97F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F2Tex[] = dgMsgKanji97F2Tex; + +#define dgMsgKanji97F3Tex "__OTR__textures/kanji/gMsgKanji97F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F3Tex[] = dgMsgKanji97F3Tex; + +#define dgMsgKanji97F4Tex "__OTR__textures/kanji/gMsgKanji97F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F4Tex[] = dgMsgKanji97F4Tex; + +#define dgMsgKanji97F5Tex "__OTR__textures/kanji/gMsgKanji97F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F5Tex[] = dgMsgKanji97F5Tex; + +#define dgMsgKanji97F6Tex "__OTR__textures/kanji/gMsgKanji97F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F6Tex[] = dgMsgKanji97F6Tex; + +#define dgMsgKanji97F7Tex "__OTR__textures/kanji/gMsgKanji97F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F7Tex[] = dgMsgKanji97F7Tex; + +#define dgMsgKanji97F8Tex "__OTR__textures/kanji/gMsgKanji97F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F8Tex[] = dgMsgKanji97F8Tex; + +#define dgMsgKanji97F9Tex "__OTR__textures/kanji/gMsgKanji97F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F9Tex[] = dgMsgKanji97F9Tex; + +#define dgMsgKanji97FATex "__OTR__textures/kanji/gMsgKanji97FATex" +static const ALIGN_ASSET(2) char gMsgKanji97FATex[] = dgMsgKanji97FATex; + +#define dgMsgKanji97FBTex "__OTR__textures/kanji/gMsgKanji97FBTex" +static const ALIGN_ASSET(2) char gMsgKanji97FBTex[] = dgMsgKanji97FBTex; + +#define dgMsgKanji97FCTex "__OTR__textures/kanji/gMsgKanji97FCTex" +static const ALIGN_ASSET(2) char gMsgKanji97FCTex[] = dgMsgKanji97FCTex; + +#define dgMsgKanji9840Tex "__OTR__textures/kanji/gMsgKanji9840Tex" +static const ALIGN_ASSET(2) char gMsgKanji9840Tex[] = dgMsgKanji9840Tex; + +#define dgMsgKanji9841Tex "__OTR__textures/kanji/gMsgKanji9841Tex" +static const ALIGN_ASSET(2) char gMsgKanji9841Tex[] = dgMsgKanji9841Tex; + +#define dgMsgKanji9842Tex "__OTR__textures/kanji/gMsgKanji9842Tex" +static const ALIGN_ASSET(2) char gMsgKanji9842Tex[] = dgMsgKanji9842Tex; + +#define dgMsgKanji9843Tex "__OTR__textures/kanji/gMsgKanji9843Tex" +static const ALIGN_ASSET(2) char gMsgKanji9843Tex[] = dgMsgKanji9843Tex; + +#define dgMsgKanji9844Tex "__OTR__textures/kanji/gMsgKanji9844Tex" +static const ALIGN_ASSET(2) char gMsgKanji9844Tex[] = dgMsgKanji9844Tex; + +#define dgMsgKanji9845Tex "__OTR__textures/kanji/gMsgKanji9845Tex" +static const ALIGN_ASSET(2) char gMsgKanji9845Tex[] = dgMsgKanji9845Tex; + +#define dgMsgKanji9846Tex "__OTR__textures/kanji/gMsgKanji9846Tex" +static const ALIGN_ASSET(2) char gMsgKanji9846Tex[] = dgMsgKanji9846Tex; + +#define dgMsgKanji9847Tex "__OTR__textures/kanji/gMsgKanji9847Tex" +static const ALIGN_ASSET(2) char gMsgKanji9847Tex[] = dgMsgKanji9847Tex; + +#define dgMsgKanji9848Tex "__OTR__textures/kanji/gMsgKanji9848Tex" +static const ALIGN_ASSET(2) char gMsgKanji9848Tex[] = dgMsgKanji9848Tex; + +#define dgMsgKanji9849Tex "__OTR__textures/kanji/gMsgKanji9849Tex" +static const ALIGN_ASSET(2) char gMsgKanji9849Tex[] = dgMsgKanji9849Tex; + +#define dgMsgKanji984ATex "__OTR__textures/kanji/gMsgKanji984ATex" +static const ALIGN_ASSET(2) char gMsgKanji984ATex[] = dgMsgKanji984ATex; + +#define dgMsgKanji984BTex "__OTR__textures/kanji/gMsgKanji984BTex" +static const ALIGN_ASSET(2) char gMsgKanji984BTex[] = dgMsgKanji984BTex; + +#define dgMsgKanji984CTex "__OTR__textures/kanji/gMsgKanji984CTex" +static const ALIGN_ASSET(2) char gMsgKanji984CTex[] = dgMsgKanji984CTex; + +#define dgMsgKanji984DTex "__OTR__textures/kanji/gMsgKanji984DTex" +static const ALIGN_ASSET(2) char gMsgKanji984DTex[] = dgMsgKanji984DTex; + +#define dgMsgKanji984ETex "__OTR__textures/kanji/gMsgKanji984ETex" +static const ALIGN_ASSET(2) char gMsgKanji984ETex[] = dgMsgKanji984ETex; + +#define dgMsgKanji984FTex "__OTR__textures/kanji/gMsgKanji984FTex" +static const ALIGN_ASSET(2) char gMsgKanji984FTex[] = dgMsgKanji984FTex; + +#define dgMsgKanji9850Tex "__OTR__textures/kanji/gMsgKanji9850Tex" +static const ALIGN_ASSET(2) char gMsgKanji9850Tex[] = dgMsgKanji9850Tex; + +#define dgMsgKanji9851Tex "__OTR__textures/kanji/gMsgKanji9851Tex" +static const ALIGN_ASSET(2) char gMsgKanji9851Tex[] = dgMsgKanji9851Tex; + +#define dgMsgKanji9852Tex "__OTR__textures/kanji/gMsgKanji9852Tex" +static const ALIGN_ASSET(2) char gMsgKanji9852Tex[] = dgMsgKanji9852Tex; + +#define dgMsgKanji9853Tex "__OTR__textures/kanji/gMsgKanji9853Tex" +static const ALIGN_ASSET(2) char gMsgKanji9853Tex[] = dgMsgKanji9853Tex; + +#define dgMsgKanji9854Tex "__OTR__textures/kanji/gMsgKanji9854Tex" +static const ALIGN_ASSET(2) char gMsgKanji9854Tex[] = dgMsgKanji9854Tex; + +#define dgMsgKanji9855Tex "__OTR__textures/kanji/gMsgKanji9855Tex" +static const ALIGN_ASSET(2) char gMsgKanji9855Tex[] = dgMsgKanji9855Tex; + +#define dgMsgKanji9856Tex "__OTR__textures/kanji/gMsgKanji9856Tex" +static const ALIGN_ASSET(2) char gMsgKanji9856Tex[] = dgMsgKanji9856Tex; + +#define dgMsgKanji9857Tex "__OTR__textures/kanji/gMsgKanji9857Tex" +static const ALIGN_ASSET(2) char gMsgKanji9857Tex[] = dgMsgKanji9857Tex; + +#define dgMsgKanji9858Tex "__OTR__textures/kanji/gMsgKanji9858Tex" +static const ALIGN_ASSET(2) char gMsgKanji9858Tex[] = dgMsgKanji9858Tex; + +#define dgMsgKanji9859Tex "__OTR__textures/kanji/gMsgKanji9859Tex" +static const ALIGN_ASSET(2) char gMsgKanji9859Tex[] = dgMsgKanji9859Tex; + +#define dgMsgKanji985ATex "__OTR__textures/kanji/gMsgKanji985ATex" +static const ALIGN_ASSET(2) char gMsgKanji985ATex[] = dgMsgKanji985ATex; + +#define dgMsgKanji985BTex "__OTR__textures/kanji/gMsgKanji985BTex" +static const ALIGN_ASSET(2) char gMsgKanji985BTex[] = dgMsgKanji985BTex; + +#define dgMsgKanji985CTex "__OTR__textures/kanji/gMsgKanji985CTex" +static const ALIGN_ASSET(2) char gMsgKanji985CTex[] = dgMsgKanji985CTex; + +#define dgMsgKanji985DTex "__OTR__textures/kanji/gMsgKanji985DTex" +static const ALIGN_ASSET(2) char gMsgKanji985DTex[] = dgMsgKanji985DTex; + +#define dgMsgKanji985ETex "__OTR__textures/kanji/gMsgKanji985ETex" +static const ALIGN_ASSET(2) char gMsgKanji985ETex[] = dgMsgKanji985ETex; + +#define dgMsgKanji985FTex "__OTR__textures/kanji/gMsgKanji985FTex" +static const ALIGN_ASSET(2) char gMsgKanji985FTex[] = dgMsgKanji985FTex; + +#define dgMsgKanji9860Tex "__OTR__textures/kanji/gMsgKanji9860Tex" +static const ALIGN_ASSET(2) char gMsgKanji9860Tex[] = dgMsgKanji9860Tex; + +#define dgMsgKanji9861Tex "__OTR__textures/kanji/gMsgKanji9861Tex" +static const ALIGN_ASSET(2) char gMsgKanji9861Tex[] = dgMsgKanji9861Tex; + +#define dgMsgKanji9862Tex "__OTR__textures/kanji/gMsgKanji9862Tex" +static const ALIGN_ASSET(2) char gMsgKanji9862Tex[] = dgMsgKanji9862Tex; + +#define dgMsgKanji9863Tex "__OTR__textures/kanji/gMsgKanji9863Tex" +static const ALIGN_ASSET(2) char gMsgKanji9863Tex[] = dgMsgKanji9863Tex; + +#define dgMsgKanji9864Tex "__OTR__textures/kanji/gMsgKanji9864Tex" +static const ALIGN_ASSET(2) char gMsgKanji9864Tex[] = dgMsgKanji9864Tex; + +#define dgMsgKanji9865Tex "__OTR__textures/kanji/gMsgKanji9865Tex" +static const ALIGN_ASSET(2) char gMsgKanji9865Tex[] = dgMsgKanji9865Tex; + +#define dgMsgKanji9866Tex "__OTR__textures/kanji/gMsgKanji9866Tex" +static const ALIGN_ASSET(2) char gMsgKanji9866Tex[] = dgMsgKanji9866Tex; + +#define dgMsgKanji9867Tex "__OTR__textures/kanji/gMsgKanji9867Tex" +static const ALIGN_ASSET(2) char gMsgKanji9867Tex[] = dgMsgKanji9867Tex; + +#define dgMsgKanji9868Tex "__OTR__textures/kanji/gMsgKanji9868Tex" +static const ALIGN_ASSET(2) char gMsgKanji9868Tex[] = dgMsgKanji9868Tex; + +#define dgMsgKanji9869Tex "__OTR__textures/kanji/gMsgKanji9869Tex" +static const ALIGN_ASSET(2) char gMsgKanji9869Tex[] = dgMsgKanji9869Tex; + +#define dgMsgKanji986ATex "__OTR__textures/kanji/gMsgKanji986ATex" +static const ALIGN_ASSET(2) char gMsgKanji986ATex[] = dgMsgKanji986ATex; + +#define dgMsgKanji986BTex "__OTR__textures/kanji/gMsgKanji986BTex" +static const ALIGN_ASSET(2) char gMsgKanji986BTex[] = dgMsgKanji986BTex; + +#define dgMsgKanji986CTex "__OTR__textures/kanji/gMsgKanji986CTex" +static const ALIGN_ASSET(2) char gMsgKanji986CTex[] = dgMsgKanji986CTex; + +#define dgMsgKanji986DTex "__OTR__textures/kanji/gMsgKanji986DTex" +static const ALIGN_ASSET(2) char gMsgKanji986DTex[] = dgMsgKanji986DTex; + +#define dgMsgKanji986ETex "__OTR__textures/kanji/gMsgKanji986ETex" +static const ALIGN_ASSET(2) char gMsgKanji986ETex[] = dgMsgKanji986ETex; + +#define dgMsgKanji986FTex "__OTR__textures/kanji/gMsgKanji986FTex" +static const ALIGN_ASSET(2) char gMsgKanji986FTex[] = dgMsgKanji986FTex; + +#define dgMsgKanji9870Tex "__OTR__textures/kanji/gMsgKanji9870Tex" +static const ALIGN_ASSET(2) char gMsgKanji9870Tex[] = dgMsgKanji9870Tex; + +#define dgMsgKanji9871Tex "__OTR__textures/kanji/gMsgKanji9871Tex" +static const ALIGN_ASSET(2) char gMsgKanji9871Tex[] = dgMsgKanji9871Tex; + +#define dgMsgKanji9872Tex "__OTR__textures/kanji/gMsgKanji9872Tex" +static const ALIGN_ASSET(2) char gMsgKanji9872Tex[] = dgMsgKanji9872Tex; + +#define dgMsgKanji9873EmptyTex "__OTR__textures/kanji/gMsgKanji9873EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9873EmptyTex[] = dgMsgKanji9873EmptyTex; + +#define dgMsgKanji9874EmptyTex "__OTR__textures/kanji/gMsgKanji9874EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9874EmptyTex[] = dgMsgKanji9874EmptyTex; + +#define dgMsgKanji9875EmptyTex "__OTR__textures/kanji/gMsgKanji9875EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9875EmptyTex[] = dgMsgKanji9875EmptyTex; + +#define dgMsgKanji9876EmptyTex "__OTR__textures/kanji/gMsgKanji9876EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9876EmptyTex[] = dgMsgKanji9876EmptyTex; + +#define dgMsgKanji9877EmptyTex "__OTR__textures/kanji/gMsgKanji9877EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9877EmptyTex[] = dgMsgKanji9877EmptyTex; + +#define dgMsgKanji9878EmptyTex "__OTR__textures/kanji/gMsgKanji9878EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9878EmptyTex[] = dgMsgKanji9878EmptyTex; + +#define dgMsgKanji9879EmptyTex "__OTR__textures/kanji/gMsgKanji9879EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9879EmptyTex[] = dgMsgKanji9879EmptyTex; + +#define dgMsgKanji987AEmptyTex "__OTR__textures/kanji/gMsgKanji987AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji987AEmptyTex[] = dgMsgKanji987AEmptyTex; + +#define dgMsgKanji987BEmptyTex "__OTR__textures/kanji/gMsgKanji987BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji987BEmptyTex[] = dgMsgKanji987BEmptyTex; + +#define dgMsgKanji987CEmptyTex "__OTR__textures/kanji/gMsgKanji987CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji987CEmptyTex[] = dgMsgKanji987CEmptyTex; + +#define dgMsgKanji987DEmptyTex "__OTR__textures/kanji/gMsgKanji987DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji987DEmptyTex[] = dgMsgKanji987DEmptyTex; + +#define dgMsgKanji987EEmptyTex "__OTR__textures/kanji/gMsgKanji987EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji987EEmptyTex[] = dgMsgKanji987EEmptyTex; + +#define dgMsgKanji9880EmptyTex "__OTR__textures/kanji/gMsgKanji9880EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9880EmptyTex[] = dgMsgKanji9880EmptyTex; + +#define dgMsgKanji9881EmptyTex "__OTR__textures/kanji/gMsgKanji9881EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9881EmptyTex[] = dgMsgKanji9881EmptyTex; + +#define dgMsgKanji9882EmptyTex "__OTR__textures/kanji/gMsgKanji9882EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9882EmptyTex[] = dgMsgKanji9882EmptyTex; + +#define dgMsgKanji9883EmptyTex "__OTR__textures/kanji/gMsgKanji9883EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9883EmptyTex[] = dgMsgKanji9883EmptyTex; + +#define dgMsgKanji9884EmptyTex "__OTR__textures/kanji/gMsgKanji9884EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9884EmptyTex[] = dgMsgKanji9884EmptyTex; + +#define dgMsgKanji9885EmptyTex "__OTR__textures/kanji/gMsgKanji9885EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9885EmptyTex[] = dgMsgKanji9885EmptyTex; + +#define dgMsgKanji9886EmptyTex "__OTR__textures/kanji/gMsgKanji9886EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9886EmptyTex[] = dgMsgKanji9886EmptyTex; + +#define dgMsgKanji9887EmptyTex "__OTR__textures/kanji/gMsgKanji9887EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9887EmptyTex[] = dgMsgKanji9887EmptyTex; + +#define dgMsgKanji9888EmptyTex "__OTR__textures/kanji/gMsgKanji9888EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9888EmptyTex[] = dgMsgKanji9888EmptyTex; + +#define dgMsgKanji9889EmptyTex "__OTR__textures/kanji/gMsgKanji9889EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9889EmptyTex[] = dgMsgKanji9889EmptyTex; + +#define dgMsgKanji988AEmptyTex "__OTR__textures/kanji/gMsgKanji988AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988AEmptyTex[] = dgMsgKanji988AEmptyTex; + +#define dgMsgKanji988BEmptyTex "__OTR__textures/kanji/gMsgKanji988BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988BEmptyTex[] = dgMsgKanji988BEmptyTex; + +#define dgMsgKanji988CEmptyTex "__OTR__textures/kanji/gMsgKanji988CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988CEmptyTex[] = dgMsgKanji988CEmptyTex; + +#define dgMsgKanji988DEmptyTex "__OTR__textures/kanji/gMsgKanji988DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988DEmptyTex[] = dgMsgKanji988DEmptyTex; + +#define dgMsgKanji988EEmptyTex "__OTR__textures/kanji/gMsgKanji988EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988EEmptyTex[] = dgMsgKanji988EEmptyTex; + +#define dgMsgKanji988FEmptyTex "__OTR__textures/kanji/gMsgKanji988FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988FEmptyTex[] = dgMsgKanji988FEmptyTex; + +#define dgMsgKanji9890EmptyTex "__OTR__textures/kanji/gMsgKanji9890EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9890EmptyTex[] = dgMsgKanji9890EmptyTex; + +#define dgMsgKanji9891EmptyTex "__OTR__textures/kanji/gMsgKanji9891EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9891EmptyTex[] = dgMsgKanji9891EmptyTex; + +#define dgMsgKanji9892EmptyTex "__OTR__textures/kanji/gMsgKanji9892EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9892EmptyTex[] = dgMsgKanji9892EmptyTex; + +#define dgMsgKanji9893EmptyTex "__OTR__textures/kanji/gMsgKanji9893EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9893EmptyTex[] = dgMsgKanji9893EmptyTex; + +#define dgMsgKanji9894EmptyTex "__OTR__textures/kanji/gMsgKanji9894EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9894EmptyTex[] = dgMsgKanji9894EmptyTex; + +#define dgMsgKanji9895EmptyTex "__OTR__textures/kanji/gMsgKanji9895EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9895EmptyTex[] = dgMsgKanji9895EmptyTex; + +#define dgMsgKanji9896EmptyTex "__OTR__textures/kanji/gMsgKanji9896EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9896EmptyTex[] = dgMsgKanji9896EmptyTex; + +#define dgMsgKanji9897EmptyTex "__OTR__textures/kanji/gMsgKanji9897EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9897EmptyTex[] = dgMsgKanji9897EmptyTex; + +#define dgMsgKanji9898EmptyTex "__OTR__textures/kanji/gMsgKanji9898EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9898EmptyTex[] = dgMsgKanji9898EmptyTex; + +#define dgMsgKanji9899EmptyTex "__OTR__textures/kanji/gMsgKanji9899EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9899EmptyTex[] = dgMsgKanji9899EmptyTex; + +#define dgMsgKanji989AEmptyTex "__OTR__textures/kanji/gMsgKanji989AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989AEmptyTex[] = dgMsgKanji989AEmptyTex; + +#define dgMsgKanji989BEmptyTex "__OTR__textures/kanji/gMsgKanji989BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989BEmptyTex[] = dgMsgKanji989BEmptyTex; + +#define dgMsgKanji989CEmptyTex "__OTR__textures/kanji/gMsgKanji989CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989CEmptyTex[] = dgMsgKanji989CEmptyTex; + +#define dgMsgKanji989DEmptyTex "__OTR__textures/kanji/gMsgKanji989DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989DEmptyTex[] = dgMsgKanji989DEmptyTex; + +#define dgMsgKanji989EEmptyTex "__OTR__textures/kanji/gMsgKanji989EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989EEmptyTex[] = dgMsgKanji989EEmptyTex; + +#define dgMsgKanji989FEmptyTex "__OTR__textures/kanji/gMsgKanji989FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989FEmptyTex[] = dgMsgKanji989FEmptyTex; + +#define dgMsgKanji98A0EmptyTex "__OTR__textures/kanji/gMsgKanji98A0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A0EmptyTex[] = dgMsgKanji98A0EmptyTex; + +#define dgMsgKanji98A1EmptyTex "__OTR__textures/kanji/gMsgKanji98A1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A1EmptyTex[] = dgMsgKanji98A1EmptyTex; + +#define dgMsgKanji98A2EmptyTex "__OTR__textures/kanji/gMsgKanji98A2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A2EmptyTex[] = dgMsgKanji98A2EmptyTex; + +#define dgMsgKanji98A3EmptyTex "__OTR__textures/kanji/gMsgKanji98A3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A3EmptyTex[] = dgMsgKanji98A3EmptyTex; + +#define dgMsgKanji98A4EmptyTex "__OTR__textures/kanji/gMsgKanji98A4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A4EmptyTex[] = dgMsgKanji98A4EmptyTex; + +#define dgMsgKanji98A5EmptyTex "__OTR__textures/kanji/gMsgKanji98A5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A5EmptyTex[] = dgMsgKanji98A5EmptyTex; + +#define dgMsgKanji98A6EmptyTex "__OTR__textures/kanji/gMsgKanji98A6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A6EmptyTex[] = dgMsgKanji98A6EmptyTex; + +#define dgMsgKanji98A7EmptyTex "__OTR__textures/kanji/gMsgKanji98A7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A7EmptyTex[] = dgMsgKanji98A7EmptyTex; + +#define dgMsgKanji98A8EmptyTex "__OTR__textures/kanji/gMsgKanji98A8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A8EmptyTex[] = dgMsgKanji98A8EmptyTex; + +#define dgMsgKanji98A9EmptyTex "__OTR__textures/kanji/gMsgKanji98A9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A9EmptyTex[] = dgMsgKanji98A9EmptyTex; + +#define dgMsgKanji98AAEmptyTex "__OTR__textures/kanji/gMsgKanji98AAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98AAEmptyTex[] = dgMsgKanji98AAEmptyTex; + +#define dgMsgKanji98ABEmptyTex "__OTR__textures/kanji/gMsgKanji98ABEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98ABEmptyTex[] = dgMsgKanji98ABEmptyTex; + +#define dgMsgKanji98ACEmptyTex "__OTR__textures/kanji/gMsgKanji98ACEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98ACEmptyTex[] = dgMsgKanji98ACEmptyTex; + +#define dgMsgKanji98ADEmptyTex "__OTR__textures/kanji/gMsgKanji98ADEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98ADEmptyTex[] = dgMsgKanji98ADEmptyTex; + +#define dgMsgKanji98AEEmptyTex "__OTR__textures/kanji/gMsgKanji98AEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98AEEmptyTex[] = dgMsgKanji98AEEmptyTex; + +#define dgMsgKanji98AFEmptyTex "__OTR__textures/kanji/gMsgKanji98AFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98AFEmptyTex[] = dgMsgKanji98AFEmptyTex; + +#define dgMsgKanji98B0EmptyTex "__OTR__textures/kanji/gMsgKanji98B0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B0EmptyTex[] = dgMsgKanji98B0EmptyTex; + +#define dgMsgKanji98B1EmptyTex "__OTR__textures/kanji/gMsgKanji98B1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B1EmptyTex[] = dgMsgKanji98B1EmptyTex; + +#define dgMsgKanji98B2EmptyTex "__OTR__textures/kanji/gMsgKanji98B2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B2EmptyTex[] = dgMsgKanji98B2EmptyTex; + +#define dgMsgKanji98B3EmptyTex "__OTR__textures/kanji/gMsgKanji98B3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B3EmptyTex[] = dgMsgKanji98B3EmptyTex; + +#define dgMsgKanji98B4EmptyTex "__OTR__textures/kanji/gMsgKanji98B4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B4EmptyTex[] = dgMsgKanji98B4EmptyTex; + +#define dgMsgKanji98B5EmptyTex "__OTR__textures/kanji/gMsgKanji98B5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B5EmptyTex[] = dgMsgKanji98B5EmptyTex; + +#define dgMsgKanji98B6EmptyTex "__OTR__textures/kanji/gMsgKanji98B6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B6EmptyTex[] = dgMsgKanji98B6EmptyTex; + +#define dgMsgKanji98B7EmptyTex "__OTR__textures/kanji/gMsgKanji98B7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B7EmptyTex[] = dgMsgKanji98B7EmptyTex; + +#define dgMsgKanji98B8EmptyTex "__OTR__textures/kanji/gMsgKanji98B8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B8EmptyTex[] = dgMsgKanji98B8EmptyTex; + +#define dgMsgKanji98B9EmptyTex "__OTR__textures/kanji/gMsgKanji98B9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B9EmptyTex[] = dgMsgKanji98B9EmptyTex; + +#define dgMsgKanji98BAEmptyTex "__OTR__textures/kanji/gMsgKanji98BAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BAEmptyTex[] = dgMsgKanji98BAEmptyTex; + +#define dgMsgKanji98BBEmptyTex "__OTR__textures/kanji/gMsgKanji98BBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BBEmptyTex[] = dgMsgKanji98BBEmptyTex; + +#define dgMsgKanji98BCEmptyTex "__OTR__textures/kanji/gMsgKanji98BCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BCEmptyTex[] = dgMsgKanji98BCEmptyTex; + +#define dgMsgKanji98BDEmptyTex "__OTR__textures/kanji/gMsgKanji98BDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BDEmptyTex[] = dgMsgKanji98BDEmptyTex; + +#define dgMsgKanji98BEEmptyTex "__OTR__textures/kanji/gMsgKanji98BEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BEEmptyTex[] = dgMsgKanji98BEEmptyTex; + +#define dgMsgKanji98BFEmptyTex "__OTR__textures/kanji/gMsgKanji98BFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BFEmptyTex[] = dgMsgKanji98BFEmptyTex; + +#define dgMsgKanji98C0EmptyTex "__OTR__textures/kanji/gMsgKanji98C0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C0EmptyTex[] = dgMsgKanji98C0EmptyTex; + +#define dgMsgKanji98C1EmptyTex "__OTR__textures/kanji/gMsgKanji98C1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C1EmptyTex[] = dgMsgKanji98C1EmptyTex; + +#define dgMsgKanji98C2EmptyTex "__OTR__textures/kanji/gMsgKanji98C2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C2EmptyTex[] = dgMsgKanji98C2EmptyTex; + +#define dgMsgKanji98C3EmptyTex "__OTR__textures/kanji/gMsgKanji98C3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C3EmptyTex[] = dgMsgKanji98C3EmptyTex; + +#define dgMsgKanji98C4EmptyTex "__OTR__textures/kanji/gMsgKanji98C4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C4EmptyTex[] = dgMsgKanji98C4EmptyTex; + +#define dgMsgKanji98C5EmptyTex "__OTR__textures/kanji/gMsgKanji98C5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C5EmptyTex[] = dgMsgKanji98C5EmptyTex; + +#define dgMsgKanji98C6EmptyTex "__OTR__textures/kanji/gMsgKanji98C6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C6EmptyTex[] = dgMsgKanji98C6EmptyTex; + +#define dgMsgKanji98C7EmptyTex "__OTR__textures/kanji/gMsgKanji98C7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C7EmptyTex[] = dgMsgKanji98C7EmptyTex; + +#define dgMsgKanji98C8EmptyTex "__OTR__textures/kanji/gMsgKanji98C8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C8EmptyTex[] = dgMsgKanji98C8EmptyTex; + +#define dgMsgKanji98C9EmptyTex "__OTR__textures/kanji/gMsgKanji98C9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C9EmptyTex[] = dgMsgKanji98C9EmptyTex; + +#define dgMsgKanji98CAEmptyTex "__OTR__textures/kanji/gMsgKanji98CAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CAEmptyTex[] = dgMsgKanji98CAEmptyTex; + +#define dgMsgKanji98CBEmptyTex "__OTR__textures/kanji/gMsgKanji98CBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CBEmptyTex[] = dgMsgKanji98CBEmptyTex; + +#define dgMsgKanji98CCEmptyTex "__OTR__textures/kanji/gMsgKanji98CCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CCEmptyTex[] = dgMsgKanji98CCEmptyTex; + +#define dgMsgKanji98CDEmptyTex "__OTR__textures/kanji/gMsgKanji98CDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CDEmptyTex[] = dgMsgKanji98CDEmptyTex; + +#define dgMsgKanji98CEEmptyTex "__OTR__textures/kanji/gMsgKanji98CEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CEEmptyTex[] = dgMsgKanji98CEEmptyTex; + +#define dgMsgKanji98CFEmptyTex "__OTR__textures/kanji/gMsgKanji98CFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CFEmptyTex[] = dgMsgKanji98CFEmptyTex; + +#define dgMsgKanji98D0EmptyTex "__OTR__textures/kanji/gMsgKanji98D0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D0EmptyTex[] = dgMsgKanji98D0EmptyTex; + +#define dgMsgKanji98D1EmptyTex "__OTR__textures/kanji/gMsgKanji98D1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D1EmptyTex[] = dgMsgKanji98D1EmptyTex; + +#define dgMsgKanji98D2EmptyTex "__OTR__textures/kanji/gMsgKanji98D2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D2EmptyTex[] = dgMsgKanji98D2EmptyTex; + +#define dgMsgKanji98D3EmptyTex "__OTR__textures/kanji/gMsgKanji98D3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D3EmptyTex[] = dgMsgKanji98D3EmptyTex; + +#define dgMsgKanji98D4EmptyTex "__OTR__textures/kanji/gMsgKanji98D4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D4EmptyTex[] = dgMsgKanji98D4EmptyTex; + +#define dgMsgKanji98D5EmptyTex "__OTR__textures/kanji/gMsgKanji98D5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D5EmptyTex[] = dgMsgKanji98D5EmptyTex; + +#define dgMsgKanji98D6EmptyTex "__OTR__textures/kanji/gMsgKanji98D6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D6EmptyTex[] = dgMsgKanji98D6EmptyTex; + +#define dgMsgKanji98D7EmptyTex "__OTR__textures/kanji/gMsgKanji98D7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D7EmptyTex[] = dgMsgKanji98D7EmptyTex; + +#define dgMsgKanji98D8EmptyTex "__OTR__textures/kanji/gMsgKanji98D8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D8EmptyTex[] = dgMsgKanji98D8EmptyTex; + +#define dgMsgKanji98D9EmptyTex "__OTR__textures/kanji/gMsgKanji98D9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D9EmptyTex[] = dgMsgKanji98D9EmptyTex; + +#define dgMsgKanji98DAEmptyTex "__OTR__textures/kanji/gMsgKanji98DAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DAEmptyTex[] = dgMsgKanji98DAEmptyTex; + +#define dgMsgKanji98DBEmptyTex "__OTR__textures/kanji/gMsgKanji98DBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DBEmptyTex[] = dgMsgKanji98DBEmptyTex; + +#define dgMsgKanji98DCEmptyTex "__OTR__textures/kanji/gMsgKanji98DCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DCEmptyTex[] = dgMsgKanji98DCEmptyTex; + +#define dgMsgKanji98DDEmptyTex "__OTR__textures/kanji/gMsgKanji98DDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DDEmptyTex[] = dgMsgKanji98DDEmptyTex; + +#define dgMsgKanji98DEEmptyTex "__OTR__textures/kanji/gMsgKanji98DEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DEEmptyTex[] = dgMsgKanji98DEEmptyTex; + +#define dgMsgKanji98DFEmptyTex "__OTR__textures/kanji/gMsgKanji98DFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DFEmptyTex[] = dgMsgKanji98DFEmptyTex; + +#define dgMsgKanji98E0EmptyTex "__OTR__textures/kanji/gMsgKanji98E0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E0EmptyTex[] = dgMsgKanji98E0EmptyTex; + +#define dgMsgKanji98E1EmptyTex "__OTR__textures/kanji/gMsgKanji98E1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E1EmptyTex[] = dgMsgKanji98E1EmptyTex; + +#define dgMsgKanji98E2EmptyTex "__OTR__textures/kanji/gMsgKanji98E2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E2EmptyTex[] = dgMsgKanji98E2EmptyTex; + +#define dgMsgKanji98E3EmptyTex "__OTR__textures/kanji/gMsgKanji98E3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E3EmptyTex[] = dgMsgKanji98E3EmptyTex; + +#define dgMsgKanji98E4EmptyTex "__OTR__textures/kanji/gMsgKanji98E4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E4EmptyTex[] = dgMsgKanji98E4EmptyTex; + +#define dgMsgKanji98E5EmptyTex "__OTR__textures/kanji/gMsgKanji98E5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E5EmptyTex[] = dgMsgKanji98E5EmptyTex; + +#define dgMsgKanji98E6EmptyTex "__OTR__textures/kanji/gMsgKanji98E6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E6EmptyTex[] = dgMsgKanji98E6EmptyTex; + +#define dgMsgKanji98E7EmptyTex "__OTR__textures/kanji/gMsgKanji98E7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E7EmptyTex[] = dgMsgKanji98E7EmptyTex; + +#define dgMsgKanji98E8EmptyTex "__OTR__textures/kanji/gMsgKanji98E8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E8EmptyTex[] = dgMsgKanji98E8EmptyTex; + +#define dgMsgKanji98E9EmptyTex "__OTR__textures/kanji/gMsgKanji98E9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E9EmptyTex[] = dgMsgKanji98E9EmptyTex; + +#define dgMsgKanji98EAEmptyTex "__OTR__textures/kanji/gMsgKanji98EAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98EAEmptyTex[] = dgMsgKanji98EAEmptyTex; + +#define dgMsgKanji98EBEmptyTex "__OTR__textures/kanji/gMsgKanji98EBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98EBEmptyTex[] = dgMsgKanji98EBEmptyTex; + +#define dgMsgKanji98ECEmptyTex "__OTR__textures/kanji/gMsgKanji98ECEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98ECEmptyTex[] = dgMsgKanji98ECEmptyTex; + +#define dgMsgKanji98EDEmptyTex "__OTR__textures/kanji/gMsgKanji98EDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98EDEmptyTex[] = dgMsgKanji98EDEmptyTex; + +#define dgMsgKanji98EEEmptyTex "__OTR__textures/kanji/gMsgKanji98EEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98EEEmptyTex[] = dgMsgKanji98EEEmptyTex; + +#define dgMsgKanji98EFEmptyTex "__OTR__textures/kanji/gMsgKanji98EFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98EFEmptyTex[] = dgMsgKanji98EFEmptyTex; + +#define dgMsgKanji98F0EmptyTex "__OTR__textures/kanji/gMsgKanji98F0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F0EmptyTex[] = dgMsgKanji98F0EmptyTex; + +#define dgMsgKanji98F1EmptyTex "__OTR__textures/kanji/gMsgKanji98F1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F1EmptyTex[] = dgMsgKanji98F1EmptyTex; + +#define dgMsgKanji98F2EmptyTex "__OTR__textures/kanji/gMsgKanji98F2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F2EmptyTex[] = dgMsgKanji98F2EmptyTex; + +#define dgMsgKanji98F3EmptyTex "__OTR__textures/kanji/gMsgKanji98F3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F3EmptyTex[] = dgMsgKanji98F3EmptyTex; + +#define dgMsgKanji98F4EmptyTex "__OTR__textures/kanji/gMsgKanji98F4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F4EmptyTex[] = dgMsgKanji98F4EmptyTex; + +#define dgMsgKanji98F5EmptyTex "__OTR__textures/kanji/gMsgKanji98F5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F5EmptyTex[] = dgMsgKanji98F5EmptyTex; + +#define dgMsgKanji98F6EmptyTex "__OTR__textures/kanji/gMsgKanji98F6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F6EmptyTex[] = dgMsgKanji98F6EmptyTex; + +#define dgMsgKanji98F7EmptyTex "__OTR__textures/kanji/gMsgKanji98F7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F7EmptyTex[] = dgMsgKanji98F7EmptyTex; + +#define dgMsgKanji98F8EmptyTex "__OTR__textures/kanji/gMsgKanji98F8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F8EmptyTex[] = dgMsgKanji98F8EmptyTex; + +#define dgMsgKanji98F9EmptyTex "__OTR__textures/kanji/gMsgKanji98F9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F9EmptyTex[] = dgMsgKanji98F9EmptyTex; + +#define dgMsgKanji98FAEmptyTex "__OTR__textures/kanji/gMsgKanji98FAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98FAEmptyTex[] = dgMsgKanji98FAEmptyTex; + +#define dgMsgKanji98FBEmptyTex "__OTR__textures/kanji/gMsgKanji98FBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98FBEmptyTex[] = dgMsgKanji98FBEmptyTex; + +#define dgMsgKanji98FCEmptyTex "__OTR__textures/kanji/gMsgKanji98FCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98FCEmptyTex[] = dgMsgKanji98FCEmptyTex; +#endif // INTERFACE_KANJI_H \ No newline at end of file diff --git a/soh/assets/textures/map_name_static/map_name_static.h b/soh/assets/textures/map_name_static/map_name_static.h index dcec5afcb9..b165356dba 100644 --- a/soh/assets/textures/map_name_static/map_name_static.h +++ b/soh/assets/textures/map_name_static/map_name_static.h @@ -309,4 +309,107 @@ static const ALIGN_ASSET(2) char gQuestionMarkPositionNameFRATex[] = dgQuestionM #define dgGanonsCastlePositionNameFRATex "__OTR__textures/map_name_static/gGanonsCastlePositionNameFRATex" static const ALIGN_ASSET(2) char gGanonsCastlePositionNameFRATex[] = dgGanonsCastlePositionNameFRATex; +#define dgHauntedWastelandPointNameJPNTex "__OTR__textures/map_name_static/gHauntedWastelandPointNameJPNTex" +static const ALIGN_ASSET(2) char gHauntedWastelandPointNameJPNTex[] = dgHauntedWastelandPointNameJPNTex; + +#define dgGerudosFortressPointNameJPNTex "__OTR__textures/map_name_static/gGerudosFortressPointNameJPNTex" +static const ALIGN_ASSET(2) char gGerudosFortressPointNameJPNTex[] = dgGerudosFortressPointNameJPNTex; + +#define dgGerudoValleyPointNameJPNTex "__OTR__textures/map_name_static/gGerudoValleyPointNameJPNTex" +static const ALIGN_ASSET(2) char gGerudoValleyPointNameJPNTex[] = dgGerudoValleyPointNameJPNTex; + +#define dgHyliaLakesidePointNameJPNTex "__OTR__textures/map_name_static/gHyliaLakesidePointNameJPNTex" +static const ALIGN_ASSET(2) char gHyliaLakesidePointNameJPNTex[] = dgHyliaLakesidePointNameJPNTex; + +#define dgLonLonRanchPointNameJPNTex "__OTR__textures/map_name_static/gLonLonRanchPointNameJPNTex" +static const ALIGN_ASSET(2) char gLonLonRanchPointNameJPNTex[] = dgLonLonRanchPointNameJPNTex; + +#define dgMarketPointNameJPNTex "__OTR__textures/map_name_static/gMarketPointNameJPNTex" +static const ALIGN_ASSET(2) char gMarketPointNameJPNTex[] = dgMarketPointNameJPNTex; + +#define dgHyruleFieldPointNameJPNTex "__OTR__textures/map_name_static/gHyruleFieldPointNameJPNTex" +static const ALIGN_ASSET(2) char gHyruleFieldPointNameJPNTex[] = dgHyruleFieldPointNameJPNTex; + +#define dgDeathMountainPointNameJPNTex "__OTR__textures/map_name_static/gDeathMountainPointNameJPNTex" +static const ALIGN_ASSET(2) char gDeathMountainPointNameJPNTex[] = dgDeathMountainPointNameJPNTex; + +#define dgKakarikoVillagePointNameJPNTex "__OTR__textures/map_name_static/gKakarikoVillagePointNameJPNTex" +static const ALIGN_ASSET(2) char gKakarikoVillagePointNameJPNTex[] = dgKakarikoVillagePointNameJPNTex; + +#define dgLostWoodsPointNameJPNTex "__OTR__textures/map_name_static/gLostWoodsPointNameJPNTex" +static const ALIGN_ASSET(2) char gLostWoodsPointNameJPNTex[] = dgLostWoodsPointNameJPNTex; + +#define dgKokiriForestPointNameJPNTex "__OTR__textures/map_name_static/gKokiriForestPointNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriForestPointNameJPNTex[] = dgKokiriForestPointNameJPNTex; + +#define dgZorasDomainPointNameJPNTex "__OTR__textures/map_name_static/gZorasDomainPointNameJPNTex" +static const ALIGN_ASSET(2) char gZorasDomainPointNameJPNTex[] = dgZorasDomainPointNameJPNTex; + +#define dgHyruleFieldPositionNameJPNTex "__OTR__textures/map_name_static/gHyruleFieldPositionNameJPNTex" +static const ALIGN_ASSET(2) char gHyruleFieldPositionNameJPNTex[] = dgHyruleFieldPositionNameJPNTex; + +#define dgKakarikoVillagePositionNameJPNTex "__OTR__textures/map_name_static/gKakarikoVillagePositionNameJPNTex" +static const ALIGN_ASSET(2) char gKakarikoVillagePositionNameJPNTex[] = dgKakarikoVillagePositionNameJPNTex; + +#define dgGraveyardPositionNameJPNTex "__OTR__textures/map_name_static/gGraveyardPositionNameJPNTex" +static const ALIGN_ASSET(2) char gGraveyardPositionNameJPNTex[] = dgGraveyardPositionNameJPNTex; + +#define dgZorasRiverPositionNameJPNTex "__OTR__textures/map_name_static/gZorasRiverPositionNameJPNTex" +static const ALIGN_ASSET(2) char gZorasRiverPositionNameJPNTex[] = dgZorasRiverPositionNameJPNTex; + +#define dgKokiriForestPositionNameJPNTex "__OTR__textures/map_name_static/gKokiriForestPositionNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriForestPositionNameJPNTex[] = dgKokiriForestPositionNameJPNTex; + +#define dgSacredForestMeadowPositionNameJPNTex "__OTR__textures/map_name_static/gSacredForestMeadowPositionNameJPNTex" +static const ALIGN_ASSET(2) char gSacredForestMeadowPositionNameJPNTex[] = dgSacredForestMeadowPositionNameJPNTex; + +#define dgLakeHyliaPositionNameJPNTex "__OTR__textures/map_name_static/gLakeHyliaPositionNameJPNTex" +static const ALIGN_ASSET(2) char gLakeHyliaPositionNameJPNTex[] = dgLakeHyliaPositionNameJPNTex; + +#define dgZorasDomainPositionNameJPNTex "__OTR__textures/map_name_static/gZorasDomainPositionNameJPNTex" +static const ALIGN_ASSET(2) char gZorasDomainPositionNameJPNTex[] = dgZorasDomainPositionNameJPNTex; + +#define dgZorasFountainPositionNameJPNTex "__OTR__textures/map_name_static/gZorasFountainPositionNameJPNTex" +static const ALIGN_ASSET(2) char gZorasFountainPositionNameJPNTex[] = dgZorasFountainPositionNameJPNTex; + +#define dgGerudoValleyPositionNameJPNTex "__OTR__textures/map_name_static/gGerudoValleyPositionNameJPNTex" +static const ALIGN_ASSET(2) char gGerudoValleyPositionNameJPNTex[] = dgGerudoValleyPositionNameJPNTex; + +#define dgLostWoodsPositionNameJPNTex "__OTR__textures/map_name_static/gLostWoodsPositionNameJPNTex" +static const ALIGN_ASSET(2) char gLostWoodsPositionNameJPNTex[] = dgLostWoodsPositionNameJPNTex; + +#define dgDesertColossusPositionNameJPNTex "__OTR__textures/map_name_static/gDesertColossusPositionNameJPNTex" +static const ALIGN_ASSET(2) char gDesertColossusPositionNameJPNTex[] = dgDesertColossusPositionNameJPNTex; + +#define dgGerudosFortressPositionNameJPNTex "__OTR__textures/map_name_static/gGerudosFortressPositionNameJPNTex" +static const ALIGN_ASSET(2) char gGerudosFortressPositionNameJPNTex[] = dgGerudosFortressPositionNameJPNTex; + +#define dgHauntedWastelandPositionNameJPNTex "__OTR__textures/map_name_static/gHauntedWastelandPositionNameJPNTex" +static const ALIGN_ASSET(2) char gHauntedWastelandPositionNameJPNTex[] = dgHauntedWastelandPositionNameJPNTex; + +#define dgMarketPositionNameJPNTex "__OTR__textures/map_name_static/gMarketPositionNameJPNTex" +static const ALIGN_ASSET(2) char gMarketPositionNameJPNTex[] = dgMarketPositionNameJPNTex; + +#define dgHyruleCastlePositionNameJPNTex "__OTR__textures/map_name_static/gHyruleCastlePositionNameJPNTex" +static const ALIGN_ASSET(2) char gHyruleCastlePositionNameJPNTex[] = dgHyruleCastlePositionNameJPNTex; + +#define dgDeathMountainTrailPositionNameJPNTex "__OTR__textures/map_name_static/gDeathMountainTrailPositionNameJPNTex" +static const ALIGN_ASSET(2) char gDeathMountainTrailPositionNameJPNTex[] = dgDeathMountainTrailPositionNameJPNTex; + +#define dgDeathMountainCraterPositionNameJPNTex "__OTR__textures/map_name_static/gDeathMountainCraterPositionNameJPNTex" +static const ALIGN_ASSET(2) char gDeathMountainCraterPositionNameJPNTex[] = dgDeathMountainCraterPositionNameJPNTex; + +#define dgGoronCityPositionNameJPNTex "__OTR__textures/map_name_static/gGoronCityPositionNameJPNTex" +static const ALIGN_ASSET(2) char gGoronCityPositionNameJPNTex[] = dgGoronCityPositionNameJPNTex; + +#define dgLonLonRanchPositionNameJPNTex "__OTR__textures/map_name_static/gLonLonRanchPositionNameJPNTex" +static const ALIGN_ASSET(2) char gLonLonRanchPositionNameJPNTex[] = dgLonLonRanchPositionNameJPNTex; + +#define dgQuestionMarkPositionNameJPNTex "__OTR__textures/map_name_static/gQuestionMarkPositionNameJPNTex" +static const ALIGN_ASSET(2) char gQuestionMarkPositionNameJPNTex[] = dgQuestionMarkPositionNameJPNTex; + +#define dgGanonsCastlePositionNameJPNTex "__OTR__textures/map_name_static/gGanonsCastlePositionNameJPNTex" +static const ALIGN_ASSET(2) char gGanonsCastlePositionNameJPNTex[] = dgGanonsCastlePositionNameJPNTex; + + #endif // TEXTURES_MAP_NAME_STATIC_H diff --git a/soh/assets/textures/title_static/title_static.h b/soh/assets/textures/title_static/title_static.h index 88ea9a5553..b3baf985f3 100644 --- a/soh/assets/textures/title_static/title_static.h +++ b/soh/assets/textures/title_static/title_static.h @@ -423,6 +423,9 @@ static const ALIGN_ASSET(2) char gFileSelHoldFRATex[] = dgFileSelHoldFRATex; #define dgFileSelCheckBrightnessENGTex "__OTR__textures/title_static/gFileSelCheckBrightnessENGTex" static const ALIGN_ASSET(2) char gFileSelCheckBrightnessENGTex[] = dgFileSelCheckBrightnessENGTex; +#define dgFileSelCheckBrightnessENGNTSCTex "__OTR__textures/title_static/gFileSelCheckBrightnessENGNTSCTex" +static const ALIGN_ASSET(2) char gFileSelCheckBrightnessENGNTSCTex[] = dgFileSelCheckBrightnessENGNTSCTex; + #define dgFileSelCheckBrightnessGERTex "__OTR__textures/title_static/gFileSelCheckBrightnessGERTex" static const ALIGN_ASSET(2) char gFileSelCheckBrightnessGERTex[] = dgFileSelCheckBrightnessGERTex; @@ -447,4 +450,110 @@ static const ALIGN_ASSET(2) char gFileSelWindow2DL[] = dgFileSelWindow2DL; #define dgFileSelWindow3DL "__OTR__textures/title_static/gFileSelWindow3DL" static const ALIGN_ASSET(2) char gFileSelWindow3DL[] = dgFileSelWindow3DL; +#define dgFileSelNoFileToCopyJPNTex "__OTR__textures/title_static/gFileSelNoFileToCopyJPNTex" +static const ALIGN_ASSET(2) char gFileSelNoFileToCopyJPNTex[] = dgFileSelNoFileToCopyJPNTex; + +#define dgFileSelNoFileToEraseJPNTex "__OTR__textures/title_static/gFileSelNoFileToEraseJPNTex" +static const ALIGN_ASSET(2) char gFileSelNoFileToEraseJPNTex[] = dgFileSelNoFileToEraseJPNTex; + +#define dgFileSelNoEmptyFileJPNTex "__OTR__textures/title_static/gFileSelNoEmptyFileJPNTex" +static const ALIGN_ASSET(2) char gFileSelNoEmptyFileJPNTex[] = dgFileSelNoEmptyFileJPNTex; + +#define dgFileSelFileEmptyJPNTex "__OTR__textures/title_static/gFileSelFileEmptyJPNTex" +static const ALIGN_ASSET(2) char gFileSelFileEmptyJPNTex[] = dgFileSelFileEmptyJPNTex; + +#define dgFileSelFileInUseJPNTex "__OTR__textures/title_static/gFileSelFileInUseJPNTex" +static const ALIGN_ASSET(2) char gFileSelFileInUseJPNTex[] = dgFileSelFileInUseJPNTex; + +#define dgFileSelWhichFile1JPNTex "__OTR__textures/title_static/gFileSelWhichFile1JPNTex" +static const ALIGN_ASSET(2) char gFileSelWhichFile1JPNTex[] = dgFileSelWhichFile1JPNTex; + +#define dgFileSelCopyToWhichFileJPNTex "__OTR__textures/title_static/gFileSelCopyToWhichFileJPNTex" +static const ALIGN_ASSET(2) char gFileSelCopyToWhichFileJPNTex[] = dgFileSelCopyToWhichFileJPNTex; + +#define dgFileSelAreYouSureJPNTex "__OTR__textures/title_static/gFileSelAreYouSureJPNTex" +static const ALIGN_ASSET(2) char gFileSelAreYouSureJPNTex[] = dgFileSelAreYouSureJPNTex; + +#define dgFileSelFileCopiedJPNTex "__OTR__textures/title_static/gFileSelFileCopiedJPNTex" +static const ALIGN_ASSET(2) char gFileSelFileCopiedJPNTex[] = dgFileSelFileCopiedJPNTex; + +#define dgFileSelPleaseSelectAFileJPNTex "__OTR__textures/title_static/gFileSelPleaseSelectAFileJPNTex" +static const ALIGN_ASSET(2) char gFileSelPleaseSelectAFileJPNTex[] = dgFileSelPleaseSelectAFileJPNTex; + +#define dgFileSelOpenThisFileJPNTex "__OTR__textures/title_static/gFileSelOpenThisFileJPNTex" +static const ALIGN_ASSET(2) char gFileSelOpenThisFileJPNTex[] = dgFileSelOpenThisFileJPNTex; + +#define dgFileSelEraseWhichFileJPNTex "__OTR__textures/title_static/gFileSelEraseWhichFileJPNTex" +static const ALIGN_ASSET(2) char gFileSelEraseWhichFileJPNTex[] = dgFileSelEraseWhichFileJPNTex; + +#define dgFileSelAreYouSure2JPNTex "__OTR__textures/title_static/gFileSelAreYouSure2JPNTex" +static const ALIGN_ASSET(2) char gFileSelAreYouSure2JPNTex[] = dgFileSelAreYouSure2JPNTex; + +#define dgFileSelFileErasedJPNTex "__OTR__textures/title_static/gFileSelFileErasedJPNTex" +static const ALIGN_ASSET(2) char gFileSelFileErasedJPNTex[] = dgFileSelFileErasedJPNTex; + +#define dgFileSelOptionsJPNTex "__OTR__textures/title_static/gFileSelOptionsJPNTex" +static const ALIGN_ASSET(2) char gFileSelOptionsJPNTex[] = dgFileSelOptionsJPNTex; + +#define dgFileSelNameJPNTex "__OTR__textures/title_static/gFileSelNameJPNTex" +static const ALIGN_ASSET(2) char gFileSelNameJPNTex[] = dgFileSelNameJPNTex; + +#define dgFileSelSurroundJPNTex "__OTR__textures/title_static/gFileSelSurroundJPNTex" +static const ALIGN_ASSET(2) char gFileSelSurroundJPNTex[] = dgFileSelSurroundJPNTex; + +#define dgFileSelHeadsetJPNTex "__OTR__textures/title_static/gFileSelHeadsetJPNTex" +static const ALIGN_ASSET(2) char gFileSelHeadsetJPNTex[] = dgFileSelHeadsetJPNTex; + +#define dgFileSelMonoJPNTex "__OTR__textures/title_static/gFileSelMonoJPNTex" +static const ALIGN_ASSET(2) char gFileSelMonoJPNTex[] = dgFileSelMonoJPNTex; + +#define dgFileSelStereoJPNTex "__OTR__textures/title_static/gFileSelStereoJPNTex" +static const ALIGN_ASSET(2) char gFileSelStereoJPNTex[] = dgFileSelStereoJPNTex; + +#define dgFileSelLTargetingJPNTex "__OTR__textures/title_static/gFileSelLTargetingJPNTex" +static const ALIGN_ASSET(2) char gFileSelLTargetingJPNTex[] = dgFileSelLTargetingJPNTex; + +#define dgFileSelSwitchJPNTex "__OTR__textures/title_static/gFileSelSwitchJPNTex" +static const ALIGN_ASSET(2) char gFileSelSwitchJPNTex[] = dgFileSelSwitchJPNTex; + +#define dgFileSelHoldJPNTex "__OTR__textures/title_static/gFileSelHoldJPNTex" +static const ALIGN_ASSET(2) char gFileSelHoldJPNTex[] = dgFileSelHoldJPNTex; + +#define dgFileSelControlsJPNTex "__OTR__textures/title_static/gFileSelControlsJPNTex" +static const ALIGN_ASSET(2) char gFileSelControlsJPNTex[] = dgFileSelControlsJPNTex; + +#define dgFileSelCheckBrightnessJPNTex "__OTR__textures/title_static/gFileSelCheckBrightnessJPNTex" +static const ALIGN_ASSET(2) char gFileSelCheckBrightnessJPNTex[] = dgFileSelCheckBrightnessJPNTex; + +#define dgFileSelCopyButtonJPNTex "__OTR__textures/title_static/gFileSelCopyButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelCopyButtonJPNTex[] = dgFileSelCopyButtonJPNTex; + +#define dgFileSelFile1ButtonJPNTex "__OTR__textures/title_static/gFileSelFile1ButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelFile1ButtonJPNTex[] = dgFileSelFile1ButtonJPNTex; + +#define dgFileSelFile2ButtonJPNTex "__OTR__textures/title_static/gFileSelFile2ButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelFile2ButtonJPNTex[] = dgFileSelFile2ButtonJPNTex; + +#define dgFileSelFile3ButtonJPNTex "__OTR__textures/title_static/gFileSelFile3ButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelFile3ButtonJPNTex[] = dgFileSelFile3ButtonJPNTex; + +#define dgFileSelYesButtonJPNTex "__OTR__textures/title_static/gFileSelYesButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelYesButtonJPNTex[] = dgFileSelYesButtonJPNTex; + +#define dgFileSelEraseButtonJPNTex "__OTR__textures/title_static/gFileSelEraseButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelEraseButtonJPNTex[] = dgFileSelEraseButtonJPNTex; + +#define dgFileSelOptionsButtonJPNTex "__OTR__textures/title_static/gFileSelOptionsButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelOptionsButtonJPNTex[] = dgFileSelOptionsButtonJPNTex; + +#define dgFileSelQuitButtonJPNTex "__OTR__textures/title_static/gFileSelQuitButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelQuitButtonJPNTex[] = dgFileSelQuitButtonJPNTex; + +#define dgFileSelSaveXJPNTex "__OTR__textures/title_static/gFileSelSaveXJPNTex" +static const ALIGN_ASSET(2) char gFileSelSaveXJPNTex[] = dgFileSelSaveXJPNTex; + +#define dgFileSelSaveXENGTex "__OTR__textures/title_static/gFileSelSaveXENGTex" +static const ALIGN_ASSET(2) char gFileSelSaveXENGTex[] = dgFileSelSaveXENGTex; + + #endif // TEXTURES_TITLE_STATIC_H diff --git a/soh/assets/xml/GC_MQ_D/audio/Audio.xml b/soh/assets/xml/GC_MQ_D/audio/Audio.xml index 3cd3d42bab..e649d1f0a4 100644 --- a/soh/assets/xml/GC_MQ_D/audio/Audio.xml +++ b/soh/assets/xml/GC_MQ_D/audio/Audio.xml @@ -116,1402 +116,484 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_MQ_D/code/sys_matrix.xml b/soh/assets/xml/GC_MQ_D/code/sys_matrix.xml index 28a2adc4c6..3895030566 100644 --- a/soh/assets/xml/GC_MQ_D/code/sys_matrix.xml +++ b/soh/assets/xml/GC_MQ_D/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/assets/xml/GC_MQ_D/objects/gameplay_keep.xml b/soh/assets/xml/GC_MQ_D/objects/gameplay_keep.xml index 9925251147..4a071ef985 100644 --- a/soh/assets/xml/GC_MQ_D/objects/gameplay_keep.xml +++ b/soh/assets/xml/GC_MQ_D/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml b/soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml new file mode 100644 index 0000000000..e9f385ca87 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml @@ -0,0 +1,639 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_circle.xml b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_circle.xml new file mode 100644 index 0000000000..e6b4bba124 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_triforce.xml b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_triforce.xml new file mode 100644 index 0000000000..bbc709a4fd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_wipe1.xml new file mode 100644 index 0000000000..9d2e12231a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/code/sys_matrix.xml b/soh/assets/xml/GC_MQ_NTSC_J/code/sys_matrix.xml new file mode 100644 index 0000000000..1521be9f1e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/misc/link_animetion.xml b/soh/assets/xml/GC_MQ_NTSC_J/misc/link_animetion.xml new file mode 100644 index 0000000000..9de1e92d36 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_dangeon_keep.xml new file mode 100644 index 0000000000..5b1a9050d9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_field_keep.xml new file mode 100644 index 0000000000..011e8f7fc7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_keep.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_keep.xml new file mode 100644 index 0000000000..94eee8845e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_Bb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_Bb.xml new file mode 100644 index 0000000000..5d04bde451 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ahg.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ahg.xml new file mode 100644 index 0000000000..4d37b1b110 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_am.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_am.xml new file mode 100644 index 0000000000..b70c70d709 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ane.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ane.xml new file mode 100644 index 0000000000..1e29b351e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ani.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ani.xml new file mode 100644 index 0000000000..c70621c6f9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_anubice.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_anubice.xml new file mode 100644 index 0000000000..fb029586ba --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_aob.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_aob.xml new file mode 100644 index 0000000000..e6202d0cf9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_b_heart.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_b_heart.xml new file mode 100644 index 0000000000..00f7cd6773 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bba.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bba.xml new file mode 100644 index 0000000000..ccc5c21365 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdan_objects.xml new file mode 100644 index 0000000000..dcd56d3856 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdoor.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdoor.xml new file mode 100644 index 0000000000..a092f0c23b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bg.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bg.xml new file mode 100644 index 0000000000..791226b71d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bigokuta.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bigokuta.xml new file mode 100644 index 0000000000..1c7d39e319 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bird.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bird.xml new file mode 100644 index 0000000000..167a5022dc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bji.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bji.xml new file mode 100644 index 0000000000..c665b6b001 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bl.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bl.xml new file mode 100644 index 0000000000..1c2ef4ec63 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_blkobj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_blkobj.xml new file mode 100644 index 0000000000..345a8ebd9d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bob.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bob.xml new file mode 100644 index 0000000000..289e994e47 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_boj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_boj.xml new file mode 100644 index 0000000000..4be4764ab5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombf.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombf.xml new file mode 100644 index 0000000000..83e60248d1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombiwa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombiwa.xml new file mode 100644 index 0000000000..26ab6b4f33 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bowl.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bowl.xml new file mode 100644 index 0000000000..ffe6d43db7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_box.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_box.xml new file mode 100644 index 0000000000..106d2d3356 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_brob.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_brob.xml new file mode 100644 index 0000000000..718dcd5617 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bubble.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bubble.xml new file mode 100644 index 0000000000..f5de186920 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bv.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bv.xml new file mode 100644 index 0000000000..d2ebf275ba --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bw.xml new file mode 100644 index 0000000000..6fd39fbb1c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bwall.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bwall.xml new file mode 100644 index 0000000000..d4f43ddc14 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bxa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bxa.xml new file mode 100644 index 0000000000..fb78c117e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cne.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cne.xml new file mode 100644 index 0000000000..0c14d0bc54 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cob.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cob.xml new file mode 100644 index 0000000000..ba051cfa74 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cow.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cow.xml new file mode 100644 index 0000000000..5d067c329f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_crow.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_crow.xml new file mode 100644 index 0000000000..77337c6445 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cs.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cs.xml new file mode 100644 index 0000000000..83804ccaf4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_elevator.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_elevator.xml new file mode 100644 index 0000000000..6be59c154b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_hsblock.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_hsblock.xml new file mode 100644 index 0000000000..4bb50c2b4f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_lift.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_lift.xml new file mode 100644 index 0000000000..2912385190 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_daiku.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_daiku.xml new file mode 100644 index 0000000000..1524c7a26c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ddan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ddan_objects.xml new file mode 100644 index 0000000000..3fc563b96f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekubaba.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekubaba.xml new file mode 100644 index 0000000000..7202a833fc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekujr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekujr.xml new file mode 100644 index 0000000000..e906bf61c4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekunuts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekunuts.xml new file mode 100644 index 0000000000..5fceef4165 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_6k.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_6k.xml new file mode 100644 index 0000000000..73058d5e46 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_kekkai.xml new file mode 100644 index 0000000000..aa54bc2eef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_tre_lgt.xml new file mode 100644 index 0000000000..9ea19012b7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dh.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dh.xml new file mode 100644 index 0000000000..7a52d7dbe7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dnk.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dnk.xml new file mode 100644 index 0000000000..3bce343048 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dns.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dns.xml new file mode 100644 index 0000000000..8b78ffcf20 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodojr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodojr.xml new file mode 100644 index 0000000000..4dfd7d6e45 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodongo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodongo.xml new file mode 100644 index 0000000000..779e20e9dc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dog.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dog.xml new file mode 100644 index 0000000000..ef00442b60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_gerudo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_gerudo.xml new file mode 100644 index 0000000000..2f17262041 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_killer.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_killer.xml new file mode 100644 index 0000000000..a37f590d60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds.xml new file mode 100644 index 0000000000..0413a9e2e8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds2.xml new file mode 100644 index 0000000000..683bcc68d4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_du.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_du.xml new file mode 100644 index 0000000000..0babd962b9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dy_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dy_obj.xml new file mode 100644 index 0000000000..5e792edb50 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ec.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ec.xml new file mode 100644 index 0000000000..7ec83e284d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_crystal_light.xml new file mode 100644 index 0000000000..9215b6a394 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_doughnut.xml new file mode 100644 index 0000000000..7f12c56f53 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_erupc.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_erupc.xml new file mode 100644 index 0000000000..800d9535f1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_fire_ball.xml new file mode 100644 index 0000000000..2fc65b16ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_flash.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_flash.xml new file mode 100644 index 0000000000..5f962f162b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_lgt_shower.xml new file mode 100644 index 0000000000..67ef5ce7e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_star_field.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_star_field.xml new file mode 100644 index 0000000000..00b47c460f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_tw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_tw.xml new file mode 100644 index 0000000000..de53765696 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ei.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ei.xml new file mode 100644 index 0000000000..e4132491f4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fa.xml new file mode 100644 index 0000000000..2f1bf9a5e8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd.xml new file mode 100644 index 0000000000..2609579670 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd2.xml new file mode 100644 index 0000000000..44b5f5f9c1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fhg.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fhg.xml new file mode 100644 index 0000000000..669875aaf8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fire.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fire.xml new file mode 100644 index 0000000000..49bf620cb8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_firefly.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_firefly.xml new file mode 100644 index 0000000000..8c26a43418 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fish.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fish.xml new file mode 100644 index 0000000000..f5ad4f6da0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fr.xml new file mode 100644 index 0000000000..25ee2ad42e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fu.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fu.xml new file mode 100644 index 0000000000..82c449e3de --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fw.xml new file mode 100644 index 0000000000..ee9821d263 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fz.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fz.xml new file mode 100644 index 0000000000..dad6fec5ce --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon.xml new file mode 100644 index 0000000000..c654c7fec9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon2.xml new file mode 100644 index 0000000000..7e715dd414 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime1.xml new file mode 100644 index 0000000000..b1016299bc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime2.xml new file mode 100644 index 0000000000..180e5995c5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime3.xml new file mode 100644 index 0000000000..be4c4dcb15 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_objects.xml new file mode 100644 index 0000000000..5e32610ffc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ge1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ge1.xml new file mode 100644 index 0000000000..79e0768b81 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geff.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geff.xml new file mode 100644 index 0000000000..f0667743b0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geldb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geldb.xml new file mode 100644 index 0000000000..49b12ef2e5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrow.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrow.xml new file mode 100644 index 0000000000..4b58787a9d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrowcase.xml new file mode 100644 index 0000000000..267b0a734d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bean.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bean.xml new file mode 100644 index 0000000000..e74247816f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_1.xml new file mode 100644 index 0000000000..bae86c11d8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_2.xml new file mode 100644 index 0000000000..1400c4a4d4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bombpouch.xml new file mode 100644 index 0000000000..07134748c3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boomerang.xml new file mode 100644 index 0000000000..3c1a0fe7fc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boots_2.xml new file mode 100644 index 0000000000..3bcb6a47ae --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bosskey.xml new file mode 100644 index 0000000000..e5e4bc86c9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle.xml new file mode 100644 index 0000000000..3b0884a03f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle_letter.xml new file mode 100644 index 0000000000..443219caf5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bow.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bow.xml new file mode 100644 index 0000000000..946e9c4965 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bracelet.xml new file mode 100644 index 0000000000..5a0b62a60a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_brokensword.xml new file mode 100644 index 0000000000..408741ac54 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_butterfly.xml new file mode 100644 index 0000000000..7b60a77247 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_clothes.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_clothes.xml new file mode 100644 index 0000000000..3f897b6d13 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_coin.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_coin.xml new file mode 100644 index 0000000000..22e29f255f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_compass.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_compass.xml new file mode 100644 index 0000000000..076229b11e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_dekupouch.xml new file mode 100644 index 0000000000..8925e6fa5f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_egg.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_egg.xml new file mode 100644 index 0000000000..2b2e2847db --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_eye_lotion.xml new file mode 100644 index 0000000000..5128c5f6ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fire.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fire.xml new file mode 100644 index 0000000000..4bfd76a7c5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fish.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fish.xml new file mode 100644 index 0000000000..edb39dc297 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_frog.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_frog.xml new file mode 100644 index 0000000000..a656c306bd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudo.xml new file mode 100644 index 0000000000..d65daee8e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudomask.xml new file mode 100644 index 0000000000..cfcb878d9b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ghost.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ghost.xml new file mode 100644 index 0000000000..795f0cfd10 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_glasses.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_glasses.xml new file mode 100644 index 0000000000..63d32ab5ac --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gloves.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gloves.xml new file mode 100644 index 0000000000..0e1c4259d5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_goddess.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_goddess.xml new file mode 100644 index 0000000000..50cbdd8918 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_golonmask.xml new file mode 100644 index 0000000000..844d90e714 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_grass.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_grass.xml new file mode 100644 index 0000000000..ae7834201a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hammer.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hammer.xml new file mode 100644 index 0000000000..feb5c8659d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_heart.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_heart.xml new file mode 100644 index 0000000000..48e78b1b5c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hearts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hearts.xml new file mode 100644 index 0000000000..d2e763e631 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hookshot.xml new file mode 100644 index 0000000000..a6b3b0fdac --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hoverboots.xml new file mode 100644 index 0000000000..6d41df8fd0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_insect.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_insect.xml new file mode 100644 index 0000000000..7af5b5b3b2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_jewel.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_jewel.xml new file mode 100644 index 0000000000..e83c651164 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_key.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_key.xml new file mode 100644 index 0000000000..a37d45a71c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 0000000000..46eff7d3e2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_letter.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_letter.xml new file mode 100644 index 0000000000..bea8683390 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_liquid.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_liquid.xml new file mode 100644 index 0000000000..18a5c3d7a2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_longsword.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_longsword.xml new file mode 100644 index 0000000000..7161e42e38 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_m_arrow.xml new file mode 100644 index 0000000000..0fd659ae95 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_magicpot.xml new file mode 100644 index 0000000000..7623e6353e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_map.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_map.xml new file mode 100644 index 0000000000..471c1dab97 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_medal.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_medal.xml new file mode 100644 index 0000000000..28e5b1e683 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_melody.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_melody.xml new file mode 100644 index 0000000000..b01fca9538 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_milk.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_milk.xml new file mode 100644 index 0000000000..a3e223b3e6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_mushroom.xml new file mode 100644 index 0000000000..5b19bca743 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_niwatori.xml new file mode 100644 index 0000000000..c8389f62c2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_nuts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_nuts.xml new file mode 100644 index 0000000000..c59903c43d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina.xml new file mode 100644 index 0000000000..82607677d3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina_0.xml new file mode 100644 index 0000000000..2c5f70d984 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_pachinko.xml new file mode 100644 index 0000000000..5f808baf92 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_powder.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_powder.xml new file mode 100644 index 0000000000..fb7dc0155d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_prescription.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_prescription.xml new file mode 100644 index 0000000000..75ae7eb2b7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_purse.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_purse.xml new file mode 100644 index 0000000000..054731dec7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rabit_mask.xml new file mode 100644 index 0000000000..9d4eb9487f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_redead_mask.xml new file mode 100644 index 0000000000..7de08487f8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rupy.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rupy.xml new file mode 100644 index 0000000000..0a1af96d0f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_saw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_saw.xml new file mode 100644 index 0000000000..dcc038b7c1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_scale.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_scale.xml new file mode 100644 index 0000000000..1cf5de5b99 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_seed.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_seed.xml new file mode 100644 index 0000000000..82c15c82d2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_1.xml new file mode 100644 index 0000000000..2f11e3f6d8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_2.xml new file mode 100644 index 0000000000..176ae025fe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_3.xml new file mode 100644 index 0000000000..8d1e5dafd4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_skj_mask.xml new file mode 100644 index 0000000000..e6c90f76f1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soldout.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soldout.xml new file mode 100644 index 0000000000..a15b1253e3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soul.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soul.xml new file mode 100644 index 0000000000..a68178eba5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_stick.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_stick.xml new file mode 100644 index 0000000000..fed89f4659 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sutaru.xml new file mode 100644 index 0000000000..a2606afbe3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sword_1.xml new file mode 100644 index 0000000000..e1119abca0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ticketstone.xml new file mode 100644 index 0000000000..73bf888d10 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_truth_mask.xml new file mode 100644 index 0000000000..3b4edf3dee --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_zoramask.xml new file mode 100644 index 0000000000..e3b1ab10ec --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gj.xml new file mode 100644 index 0000000000..ee6dab74f8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gjyo_objects.xml new file mode 100644 index 0000000000..ea4f8444fb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gla.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gla.xml new file mode 100644 index 0000000000..499a3720d1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gm.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gm.xml new file mode 100644 index 0000000000..91b10cc428 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd.xml new file mode 100644 index 0000000000..3ae3b57f3d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd_magic.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd_magic.xml new file mode 100644 index 0000000000..a88d419d7a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gndd.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gndd.xml new file mode 100644 index 0000000000..8bf5d770c4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_god_lgt.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_god_lgt.xml new file mode 100644 index 0000000000..60df9e4693 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gol.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gol.xml new file mode 100644 index 0000000000..7e04508cb6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goma.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goma.xml new file mode 100644 index 0000000000..922678a3cf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goroiwa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goroiwa.xml new file mode 100644 index 0000000000..5d406e9578 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gr.xml new file mode 100644 index 0000000000..5f7360ae57 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gs.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gs.xml new file mode 100644 index 0000000000..145be16653 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gt.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gt.xml new file mode 100644 index 0000000000..1d79d4e39e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka.xml new file mode 100644 index 0000000000..f6b263c375 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_door.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_door.xml new file mode 100644 index 0000000000..1376d03569 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_objects.xml new file mode 100644 index 0000000000..3ca6d27c08 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hakach_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hakach_objects.xml new file mode 100644 index 0000000000..0de02aaf15 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hata.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hata.xml new file mode 100644 index 0000000000..b0324c3be3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_heavy_object.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_heavy_object.xml new file mode 100644 index 0000000000..ecc7953211 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hidan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hidan_objects.xml new file mode 100644 index 0000000000..f41c0ee5ef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hintnuts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hintnuts.xml new file mode 100644 index 0000000000..a7290f3955 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hni.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hni.xml new file mode 100644 index 0000000000..6b317eb7a6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse.xml new file mode 100644 index 0000000000..74619e5977 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_ganon.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_ganon.xml new file mode 100644 index 0000000000..0a55462e25 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_link_child.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_link_child.xml new file mode 100644 index 0000000000..146c564f55 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_normal.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_normal.xml new file mode 100644 index 0000000000..2facab39c5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_zelda.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_zelda.xml new file mode 100644 index 0000000000..af270c6585 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hs.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hs.xml new file mode 100644 index 0000000000..cf5d06e1a2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_human.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_human.xml new file mode 100644 index 0000000000..05795cb332 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ice_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ice_objects.xml new file mode 100644 index 0000000000..c7d059d709 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ik.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ik.xml new file mode 100644 index 0000000000..8a6028f7c0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_im.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_im.xml new file mode 100644 index 0000000000..a628a113a4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_in.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_in.xml new file mode 100644 index 0000000000..84c1140475 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ingate.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ingate.xml new file mode 100644 index 0000000000..e6be42bebf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jj.xml new file mode 100644 index 0000000000..62bae8cb91 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_js.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_js.xml new file mode 100644 index 0000000000..ff7bd3efa1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_door.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_door.xml new file mode 100644 index 0000000000..60a7b37886 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_iron.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_iron.xml new file mode 100644 index 0000000000..c6f6773c6a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_obj.xml new file mode 100644 index 0000000000..a1f19b8066 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ka.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ka.xml new file mode 100644 index 0000000000..eb952732b4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kanban.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kanban.xml new file mode 100644 index 0000000000..9ffc7a2ceb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kibako2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kibako2.xml new file mode 100644 index 0000000000..a701b294de --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kingdodongo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kingdodongo.xml new file mode 100644 index 0000000000..5ef07a26f7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_km1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_km1.xml new file mode 100644 index 0000000000..0a918a798e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kusa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kusa.xml new file mode 100644 index 0000000000..67291a5543 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kw1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kw1.xml new file mode 100644 index 0000000000..eab561b1fb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kz.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kz.xml new file mode 100644 index 0000000000..4624fefdb6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_light_ring.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_light_ring.xml new file mode 100644 index 0000000000..babe7d2aa7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightbox.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightbox.xml new file mode 100644 index 0000000000..552a79d7c7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightswitch.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightswitch.xml new file mode 100644 index 0000000000..cfd5dcfb40 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_boy.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_boy.xml new file mode 100644 index 0000000000..6351af5050 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_child.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_child.xml new file mode 100644 index 0000000000..0de4003731 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma1.xml new file mode 100644 index 0000000000..63eeb38950 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma2.xml new file mode 100644 index 0000000000..ce5910fb80 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mag.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mag.xml new file mode 100644 index 0000000000..6e07fa2cdb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mag.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mamenoki.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mamenoki.xml new file mode 100644 index 0000000000..819d890225 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mastergolon.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mastergolon.xml new file mode 100644 index 0000000000..6dd9d16592 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokiri.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokiri.xml new file mode 100644 index 0000000000..af5a9ec153 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokirihead.xml new file mode 100644 index 0000000000..c64aa1c49e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterzoora.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterzoora.xml new file mode 100644 index 0000000000..2c703274e1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mb.xml new file mode 100644 index 0000000000..23c0930c02 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_md.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_md.xml new file mode 100644 index 0000000000..161c73dca1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_medal.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_medal.xml new file mode 100644 index 0000000000..533872a551 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_menkuri_objects.xml new file mode 100644 index 0000000000..4c2b51df5b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mir_ray.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mir_ray.xml new file mode 100644 index 0000000000..2acc9391ab --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mizu_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mizu_objects.xml new file mode 100644 index 0000000000..5a18b95cfe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin.xml new file mode 100644 index 0000000000..daf9b05412 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_dark.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_dark.xml new file mode 100644 index 0000000000..2fa0bdbe4c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flame.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flame.xml new file mode 100644 index 0000000000..6274feaee1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flash.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flash.xml new file mode 100644 index 0000000000..c1040ea118 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_ice.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_ice.xml new file mode 100644 index 0000000000..1aaeea193d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_oka.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_oka.xml new file mode 100644 index 0000000000..0f823b9237 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_soul.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_soul.xml new file mode 100644 index 0000000000..6386f7f9ea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_wind.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_wind.xml new file mode 100644 index 0000000000..8bba7eb91b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mk.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mk.xml new file mode 100644 index 0000000000..0b4aaae8aa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mm.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mm.xml new file mode 100644 index 0000000000..b27837e57e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mo.xml new file mode 100644 index 0000000000..4c4be74c83 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1.xml new file mode 100644 index 0000000000..bb1b31e2fc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1a.xml new file mode 100644 index 0000000000..c750ce20d0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2.xml new file mode 100644 index 0000000000..785b858571 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2a.xml new file mode 100644 index 0000000000..ad1bb4d5f0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_objects.xml new file mode 100644 index 0000000000..58ea8c085c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_tex.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_tex.xml new file mode 100644 index 0000000000..8ba4ff2d34 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ms.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ms.xml new file mode 100644 index 0000000000..a87d0e6b36 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mu.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mu.xml new file mode 100644 index 0000000000..7251ff7212 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nb.xml new file mode 100644 index 0000000000..74de9e2859 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_niw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_niw.xml new file mode 100644 index 0000000000..4eafec9566 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nwc.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nwc.xml new file mode 100644 index 0000000000..96ffa32383 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ny.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ny.xml new file mode 100644 index 0000000000..e2e8187ff8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA1.xml new file mode 100644 index 0000000000..1d665f1010 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA10.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA10.xml new file mode 100644 index 0000000000..65d0808349 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA11.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA11.xml new file mode 100644 index 0000000000..92ae474b60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA2.xml new file mode 100644 index 0000000000..ffdcd79896 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA3.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA3.xml new file mode 100644 index 0000000000..a492bd8751 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA4.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA4.xml new file mode 100644 index 0000000000..dcdbbfff9b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA5.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA5.xml new file mode 100644 index 0000000000..55072176dd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA6.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA6.xml new file mode 100644 index 0000000000..c17a510881 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA7.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA7.xml new file mode 100644 index 0000000000..52c68f6394 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA8.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA8.xml new file mode 100644 index 0000000000..8ed2d3df50 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA9.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA9.xml new file mode 100644 index 0000000000..d5c16abfcd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB1.xml new file mode 100644 index 0000000000..2f50c967b2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB2.xml new file mode 100644 index 0000000000..230783ceae --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB3.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB3.xml new file mode 100644 index 0000000000..1c42ddaccc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB4.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB4.xml new file mode 100644 index 0000000000..2924c9e753 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1.xml new file mode 100644 index 0000000000..4d5b1663fe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE10.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE10.xml new file mode 100644 index 0000000000..04ce914372 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE11.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE11.xml new file mode 100644 index 0000000000..04f6f186da --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE12.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE12.xml new file mode 100644 index 0000000000..a5fa39fd25 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1s.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1s.xml new file mode 100644 index 0000000000..d311e60104 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE2.xml new file mode 100644 index 0000000000..af62ad6d11 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE3.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE3.xml new file mode 100644 index 0000000000..95227da384 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4.xml new file mode 100644 index 0000000000..ae48d2adef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4s.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4s.xml new file mode 100644 index 0000000000..6037de52f9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE5.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE5.xml new file mode 100644 index 0000000000..f5edf745aa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE6.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE6.xml new file mode 100644 index 0000000000..95bb602b6b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE7.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE7.xml new file mode 100644 index 0000000000..b3e588d4c2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE8.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE8.xml new file mode 100644 index 0000000000..be5de24947 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE9.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE9.xml new file mode 100644 index 0000000000..8ea7ee18c7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE_anime.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE_anime.xml new file mode 100644 index 0000000000..f6b4659e22 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1d_map.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1d_map.xml new file mode 100644 index 0000000000..f14fecd825 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1s.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1s.xml new file mode 100644 index 0000000000..fe41dde630 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_o_anime.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_o_anime.xml new file mode 100644 index 0000000000..4ef4ac44c8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_okuta.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_okuta.xml new file mode 100644 index 0000000000..b4fccea6f3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_opening_demo1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_opening_demo1.xml new file mode 100644 index 0000000000..fd03230279 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os.xml new file mode 100644 index 0000000000..5880a92930 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os_anime.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os_anime.xml new file mode 100644 index 0000000000..f23636343c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ossan.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ossan.xml new file mode 100644 index 0000000000..5788e3a20d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ouke_haka.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ouke_haka.xml new file mode 100644 index 0000000000..11da9b26ef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_owl.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_owl.xml new file mode 100644 index 0000000000..64fdf64c53 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_peehat.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_peehat.xml new file mode 100644 index 0000000000..42ee66cdef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_composer.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_composer.xml new file mode 100644 index 0000000000..ff995efceb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_field.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_field.xml new file mode 100644 index 0000000000..78bc0d65ad --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_sisters.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_sisters.xml new file mode 100644 index 0000000000..b429be2588 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_poh.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_poh.xml new file mode 100644 index 0000000000..be6d6eff4b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ps.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ps.xml new file mode 100644 index 0000000000..9f9c894a60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_pu_box.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_pu_box.xml new file mode 100644 index 0000000000..e1d686e979 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rd.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rd.xml new file mode 100644 index 0000000000..22c7d33738 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_reeba.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_reeba.xml new file mode 100644 index 0000000000..32c697bd9d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_relay_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_relay_objects.xml new file mode 100644 index 0000000000..47b92fcd2d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rl.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rl.xml new file mode 100644 index 0000000000..2a5ad30f6b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rr.xml new file mode 100644 index 0000000000..98726b14bb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rs.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rs.xml new file mode 100644 index 0000000000..152b5489e1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru1.xml new file mode 100644 index 0000000000..3d413619ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru2.xml new file mode 100644 index 0000000000..fedf37d48b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sa.xml new file mode 100644 index 0000000000..ec45ac961d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sb.xml new file mode 100644 index 0000000000..64d3bb005a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sd.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sd.xml new file mode 100644 index 0000000000..fb58428c3f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shop_dungen.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shop_dungen.xml new file mode 100644 index 0000000000..594c43d390 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shopnuts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shopnuts.xml new file mode 100644 index 0000000000..7065f8941a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_siofuki.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_siofuki.xml new file mode 100644 index 0000000000..a23240a728 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sk2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sk2.xml new file mode 100644 index 0000000000..f2e7ef6d89 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skb.xml new file mode 100644 index 0000000000..5b5efb4848 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skj.xml new file mode 100644 index 0000000000..74548e5185 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_break.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_break.xml new file mode 100644 index 0000000000..d3be88315f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_objects.xml new file mode 100644 index 0000000000..10fb13aeac --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoya.xml new file mode 100644 index 0000000000..d44b944e0e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoyab.xml new file mode 100644 index 0000000000..720f50cd3e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects.xml new file mode 100644 index 0000000000..413e032a9c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects2.xml new file mode 100644 index 0000000000..36741a9492 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot02_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot02_objects.xml new file mode 100644 index 0000000000..65f45ff515 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot03_object.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot03_object.xml new file mode 100644 index 0000000000..f182e7d99a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot04_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot04_objects.xml new file mode 100644 index 0000000000..66293d7523 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot05_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot05_objects.xml new file mode 100644 index 0000000000..6e70791493 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot06_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot06_objects.xml new file mode 100644 index 0000000000..e3da63b0f0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot07_object.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot07_object.xml new file mode 100644 index 0000000000..5bc2bfb6bf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot08_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot08_obj.xml new file mode 100644 index 0000000000..4d71f3473f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot09_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot09_obj.xml new file mode 100644 index 0000000000..eb65283931 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot11_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot11_obj.xml new file mode 100644 index 0000000000..257298f7cc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot12_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot12_obj.xml new file mode 100644 index 0000000000..d619c781e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot15_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot15_obj.xml new file mode 100644 index 0000000000..bd59b8cd18 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot16_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot16_obj.xml new file mode 100644 index 0000000000..d39de812a9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot17_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot17_obj.xml new file mode 100644 index 0000000000..d4239d8d28 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot18_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot18_obj.xml new file mode 100644 index 0000000000..cc12b78946 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ssh.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ssh.xml new file mode 100644 index 0000000000..6283f8e9f2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sst.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sst.xml new file mode 100644 index 0000000000..b874b9a418 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_st.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_st.xml new file mode 100644 index 0000000000..983b9e2eab --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_stream.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_stream.xml new file mode 100644 index 0000000000..59b0838e47 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_syokudai.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_syokudai.xml new file mode 100644 index 0000000000..c1670edece --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ta.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ta.xml new file mode 100644 index 0000000000..5e446bf5c9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_timeblock.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_timeblock.xml new file mode 100644 index 0000000000..1d6b9e698c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tite.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tite.xml new file mode 100644 index 0000000000..1be65c4950 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tk.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tk.xml new file mode 100644 index 0000000000..6b6cce7244 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toki_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toki_objects.xml new file mode 100644 index 0000000000..cd07e60d2b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_torch2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_torch2.xml new file mode 100644 index 0000000000..3388e7d34e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toryo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toryo.xml new file mode 100644 index 0000000000..73f3dcb1e2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tp.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tp.xml new file mode 100644 index 0000000000..8ea908825e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tr.xml new file mode 100644 index 0000000000..17ab9ae392 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_trap.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_trap.xml new file mode 100644 index 0000000000..56195cf41b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_triforce_spot.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_triforce_spot.xml new file mode 100644 index 0000000000..87d4494589 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ts.xml new file mode 100644 index 0000000000..567277bc39 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tsubo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tsubo.xml new file mode 100644 index 0000000000..ee2c5e1846 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tw.xml new file mode 100644 index 0000000000..c7fd2a60be --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_umajump.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_umajump.xml new file mode 100644 index 0000000000..2ee4ade46a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vali.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vali.xml new file mode 100644 index 0000000000..2bab5efaa6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vase.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vase.xml new file mode 100644 index 0000000000..091d4c51e3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vm.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vm.xml new file mode 100644 index 0000000000..c5b949b36e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wallmaster.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wallmaster.xml new file mode 100644 index 0000000000..fbbc4f4af3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp1.xml new file mode 100644 index 0000000000..1497d7a108 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp2.xml new file mode 100644 index 0000000000..b6d1b3624c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wf.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wf.xml new file mode 100644 index 0000000000..ebfb708d2d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wood02.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wood02.xml new file mode 100644 index 0000000000..47ec342caa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_xc.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_xc.xml new file mode 100644 index 0000000000..bb2bf3e7af --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yabusame_point.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yabusame_point.xml new file mode 100644 index 0000000000..bed9e8a609 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ydan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ydan_objects.xml new file mode 100644 index 0000000000..e2adf307f7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yukabyun.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yukabyun.xml new file mode 100644 index 0000000000..d594ebbb89 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zf.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zf.xml new file mode 100644 index 0000000000..7f20eb7866 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zg.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zg.xml new file mode 100644 index 0000000000..79005516c4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl1.xml new file mode 100644 index 0000000000..001e5be145 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2.xml new file mode 100644 index 0000000000..959a919ec6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime1.xml new file mode 100644 index 0000000000..cada504867 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime2.xml new file mode 100644 index 0000000000..47016e2e00 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl4.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl4.xml new file mode 100644 index 0000000000..8e7a2837ed --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zo.xml new file mode 100644 index 0000000000..77465760ef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 0000000000..c4e829f1c7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 0000000000..bfb83104f9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Light.xml new file mode 100644 index 0000000000..d7348bd6c3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 0000000000..5e7096391e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 0000000000..0798a1de0d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 0000000000..25396b7f90 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 0000000000..d85ebbea2f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 0000000000..d70769842c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Sst.xml new file mode 100644 index 0000000000..51ded47f4e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Demo_Shd.xml new file mode 100644 index 0000000000..3f6d5243c2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Bili.xml new file mode 100644 index 0000000000..ed0ebdec35 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 0000000000..f4022c46ee --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 0000000000..fea6529a61 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 0000000000..7b3b037324 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Holl.xml new file mode 100644 index 0000000000..9a6be61828 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 0000000000..95e53a79ba --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Kanban.xml new file mode 100644 index 0000000000..1c470beaad --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sda.xml new file mode 100644 index 0000000000..ae9ea715fd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ssh.xml new file mode 100644 index 0000000000..8dd8e396db --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_St.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_St.xml new file mode 100644 index 0000000000..2b959296f4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sth.xml new file mode 100644 index 0000000000..75dc7ea35d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_End_Title.xml new file mode 100644 index 0000000000..c9dbe33846 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_File_Choose.xml new file mode 100644 index 0000000000..6b0b7848de --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_File_Choose.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Dark.xml new file mode 100644 index 0000000000..c5153a78e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Fire.xml new file mode 100644 index 0000000000..e5a353ba36 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Wind.xml new file mode 100644 index 0000000000..053730eea8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 0000000000..5f83c9b1a6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 0000000000..0eecf03879 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 0000000000..5af20cff63 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 0000000000..a79d02b74d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 0000000000..f55d57ca46 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 0000000000..d6cfddde80 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/Bmori1.xml new file mode 100644 index 0000000000..a39e5ccd1a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 0000000000..89331ecc2f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan.xml new file mode 100644 index 0000000000..a2c20d6920 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 0000000000..ea300b96c3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 0000000000..d36ac6b774 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HIDAN.xml new file mode 100644 index 0000000000..502dcd839c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin.xml new file mode 100644 index 0000000000..f8b5d8b6c1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 0000000000..99ae2b3efe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan.xml new file mode 100644 index 0000000000..9eb1ee61aa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan_boss.xml new file mode 100644 index 0000000000..9fccf2c301 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan.xml new file mode 100644 index 0000000000..c46e8ad279 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan_boss.xml new file mode 100644 index 0000000000..05633e53e2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon.xml new file mode 100644 index 0000000000..f857dbe94e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_boss.xml new file mode 100644 index 0000000000..36c5e81070 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_demo.xml new file mode 100644 index 0000000000..56c98efed7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_final.xml new file mode 100644 index 0000000000..1c9bf84b45 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 0000000000..7d5f5a1235 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_tou.xml new file mode 100644 index 0000000000..1ae37b9637 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontika.xml new file mode 100644 index 0000000000..ba5542faa2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 0000000000..a441206b07 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/gerudoway.xml new file mode 100644 index 0000000000..f2d07a2881 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 0000000000..7ad60c2a0f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinboss.xml new file mode 100644 index 0000000000..86c0d317b2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinzou.xml new file mode 100644 index 0000000000..166244e29b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/men.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/men.xml new file mode 100644 index 0000000000..679436de0e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/men.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/moribossroom.xml new file mode 100644 index 0000000000..b9959eefab --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan.xml new file mode 100644 index 0000000000..377c7a6824 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan_boss.xml new file mode 100644 index 0000000000..7ea240547a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/bowling.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/bowling.xml new file mode 100644 index 0000000000..9a41763a27 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 0000000000..4f9a03fc02 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa.xml new file mode 100644 index 0000000000..06d89f2fe7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 0000000000..6f4c181e0e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hakasitarelay.xml new file mode 100644 index 0000000000..91be63d147 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hut.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hut.xml new file mode 100644 index 0000000000..a4ef5715ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hylia_labo.xml new file mode 100644 index 0000000000..56822e67a7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/impa.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/impa.xml new file mode 100644 index 0000000000..db757e3d3c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kakariko.xml new file mode 100644 index 0000000000..e4e9b102c9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kenjyanoma.xml new file mode 100644 index 0000000000..4e8a58f3b6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home.xml new file mode 100644 index 0000000000..8c0305493a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home3.xml new file mode 100644 index 0000000000..9f36eb41c9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home4.xml new file mode 100644 index 0000000000..eb861aedb4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home5.xml new file mode 100644 index 0000000000..974987feda --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/labo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/labo.xml new file mode 100644 index 0000000000..c0a9d2eb8c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/link_home.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/link_home.xml new file mode 100644 index 0000000000..2fb88ae347 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/mahouya.xml new file mode 100644 index 0000000000..8ae462f9db --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/malon_stable.xml new file mode 100644 index 0000000000..aff97eeb86 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/miharigoya.xml new file mode 100644 index 0000000000..63f8676ac1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/nakaniwa.xml new file mode 100644 index 0000000000..2fb2d5e6a4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/syatekijyou.xml new file mode 100644 index 0000000000..05243b52ca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/takaraya.xml new file mode 100644 index 0000000000..5b438980b7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tent.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tent.xml new file mode 100644 index 0000000000..de72cc5f45 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tokinoma.xml new file mode 100644 index 0000000000..d7878b8951 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 0000000000..3b6dd2dec2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 0000000000..90a8d95d09 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/enrui.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/enrui.xml new file mode 100644 index 0000000000..d8c06e5454 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/entra_n.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/entra_n.xml new file mode 100644 index 0000000000..5b408ac3a6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana.xml new file mode 100644 index 0000000000..e7dc93dd0c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana2.xml new file mode 100644 index 0000000000..2d8ba4906a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana_ouke.xml new file mode 100644 index 0000000000..17f53613e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hiral_demo.xml new file mode 100644 index 0000000000..1331fdd4c5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakariko3.xml new file mode 100644 index 0000000000..07b62c44df --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakusiana.xml new file mode 100644 index 0000000000..c3f993ff4f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kinsuta.xml new file mode 100644 index 0000000000..aac0f6c4ea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley.xml new file mode 100644 index 0000000000..c304673032 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley_n.xml new file mode 100644 index 0000000000..65db604113 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_day.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_day.xml new file mode 100644 index 0000000000..00887e69cd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_night.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_night.xml new file mode 100644 index 0000000000..c58e38744e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_ruins.xml new file mode 100644 index 0000000000..f0ec75e759 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine.xml new file mode 100644 index 0000000000..b9ddf2cf70 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_n.xml new file mode 100644 index 0000000000..4878338aa1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_r.xml new file mode 100644 index 0000000000..1220367919 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/turibori.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/turibori.xml new file mode 100644 index 0000000000..0633224d9c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/entra.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/entra.xml new file mode 100644 index 0000000000..92ee57f59a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/souko.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/souko.xml new file mode 100644 index 0000000000..8dd9d9e48a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot00.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot00.xml new file mode 100644 index 0000000000..508d9309b3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot01.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot01.xml new file mode 100644 index 0000000000..eb725afa68 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot02.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot02.xml new file mode 100644 index 0000000000..c7924c29db --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot03.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot03.xml new file mode 100644 index 0000000000..9434185f44 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot04.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot04.xml new file mode 100644 index 0000000000..f338604207 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot05.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot05.xml new file mode 100644 index 0000000000..4f7c62b91e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot06.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot06.xml new file mode 100644 index 0000000000..f4af602cfd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot07.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot07.xml new file mode 100644 index 0000000000..eeb976f7f6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot08.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot08.xml new file mode 100644 index 0000000000..86582f0dca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot09.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot09.xml new file mode 100644 index 0000000000..5bb9e059c7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot10.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot10.xml new file mode 100644 index 0000000000..66365e3d86 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot11.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot11.xml new file mode 100644 index 0000000000..76ff3b8223 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot12.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot12.xml new file mode 100644 index 0000000000..e21523b217 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot13.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot13.xml new file mode 100644 index 0000000000..c689130650 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot15.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot15.xml new file mode 100644 index 0000000000..e75f7b6845 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot16.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot16.xml new file mode 100644 index 0000000000..f41b226f8e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot17.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot17.xml new file mode 100644 index 0000000000..feb267251e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot18.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot18.xml new file mode 100644 index 0000000000..d70fccf4bb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot20.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot20.xml new file mode 100644 index 0000000000..1381f6ecbe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/alley_shop.xml new file mode 100644 index 0000000000..95548de1bd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/drag.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/drag.xml new file mode 100644 index 0000000000..acb6515fba --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/face_shop.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/face_shop.xml new file mode 100644 index 0000000000..16a9746081 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/golon.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/golon.xml new file mode 100644 index 0000000000..c586727988 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/kokiri_shop.xml new file mode 100644 index 0000000000..50cd633e57 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/night_shop.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/night_shop.xml new file mode 100644 index 0000000000..5954d9c83d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/shop1.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/shop1.xml new file mode 100644 index 0000000000..525a06d633 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/zoora.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/zoora.xml new file mode 100644 index 0000000000..0e4ac18f8c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_field.xml b/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_field.xml new file mode 100644 index 0000000000..789a554ce8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_ydan.xml b/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_ydan.xml new file mode 100644 index 0000000000..f784afcf45 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/text/message_data_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/text/message_data_static.xml new file mode 100644 index 0000000000..94948fa8e7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/backgrounds.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/backgrounds.xml new file mode 100644 index 0000000000..c60ff57a8a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/boss_title_cards.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/boss_title_cards.xml new file mode 100644 index 0000000000..84f555bd10 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/do_action_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/do_action_static.xml new file mode 100644 index 0000000000..efabd54a58 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_24_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_24_static.xml new file mode 100644 index 0000000000..cdb8cc7379 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_dungeon_static.xml new file mode 100644 index 0000000000..873c490fc5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_field_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_field_static.xml new file mode 100644 index 0000000000..ed991406b5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_gameover_static.xml new file mode 100644 index 0000000000..ffd3928680 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_jpn_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_jpn_static.xml new file mode 100644 index 0000000000..f2fe854b8e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_nes_static.xml new file mode 100644 index 0000000000..6cd92acfca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_static.xml new file mode 100644 index 0000000000..9e844615b1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/item_name_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/item_name_static.xml new file mode 100644 index 0000000000..1bc074c2ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/kanji.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/kanji.xml new file mode 100644 index 0000000000..5159387a13 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/map_48x85_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_48x85_static.xml new file mode 100644 index 0000000000..b2ea46340a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/map_grand_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_grand_static.xml new file mode 100644 index 0000000000..201955bfc3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/map_i_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_i_static.xml new file mode 100644 index 0000000000..1721f6d848 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/map_name_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_name_static.xml new file mode 100644 index 0000000000..ca4c4c0bd6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/message_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/message_static.xml new file mode 100644 index 0000000000..afdde60def --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/message_texture_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/message_texture_static.xml new file mode 100644 index 0000000000..bbf7e1259e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/nes_font_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/nes_font_static.xml new file mode 100644 index 0000000000..f1b80ee045 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/nes_font_static.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/nintendo_rogo_static.xml new file mode 100644 index 0000000000..f09de3b0f9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/parameter_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/parameter_static.xml new file mode 100644 index 0000000000..c51dacf1f6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/place_title_cards.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/place_title_cards.xml new file mode 100644 index 0000000000..b688cce00c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/skyboxes.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/skyboxes.xml new file mode 100644 index 0000000000..104ffb2a3f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/title_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/title_static.xml new file mode 100644 index 0000000000..5f58c5a820 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml b/soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml new file mode 100644 index 0000000000..a9ee07d8ae --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml @@ -0,0 +1,639 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_circle.xml b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_circle.xml new file mode 100644 index 0000000000..a117b43ae2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_triforce.xml b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_triforce.xml new file mode 100644 index 0000000000..2353ae220d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_wipe1.xml new file mode 100644 index 0000000000..f2de3afce0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/code/sys_matrix.xml b/soh/assets/xml/GC_MQ_NTSC_U/code/sys_matrix.xml new file mode 100644 index 0000000000..7d1e905d37 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/misc/link_animetion.xml b/soh/assets/xml/GC_MQ_NTSC_U/misc/link_animetion.xml new file mode 100644 index 0000000000..9de1e92d36 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_dangeon_keep.xml new file mode 100644 index 0000000000..5b1a9050d9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_field_keep.xml new file mode 100644 index 0000000000..011e8f7fc7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_keep.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_keep.xml new file mode 100644 index 0000000000..94eee8845e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_Bb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_Bb.xml new file mode 100644 index 0000000000..5d04bde451 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ahg.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ahg.xml new file mode 100644 index 0000000000..4d37b1b110 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_am.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_am.xml new file mode 100644 index 0000000000..b70c70d709 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ane.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ane.xml new file mode 100644 index 0000000000..1e29b351e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ani.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ani.xml new file mode 100644 index 0000000000..c70621c6f9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_anubice.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_anubice.xml new file mode 100644 index 0000000000..fb029586ba --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_aob.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_aob.xml new file mode 100644 index 0000000000..e6202d0cf9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_b_heart.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_b_heart.xml new file mode 100644 index 0000000000..00f7cd6773 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bba.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bba.xml new file mode 100644 index 0000000000..ccc5c21365 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdan_objects.xml new file mode 100644 index 0000000000..dcd56d3856 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdoor.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdoor.xml new file mode 100644 index 0000000000..a092f0c23b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bg.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bg.xml new file mode 100644 index 0000000000..791226b71d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bigokuta.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bigokuta.xml new file mode 100644 index 0000000000..1c7d39e319 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bird.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bird.xml new file mode 100644 index 0000000000..167a5022dc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bji.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bji.xml new file mode 100644 index 0000000000..c665b6b001 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bl.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bl.xml new file mode 100644 index 0000000000..1c2ef4ec63 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_blkobj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_blkobj.xml new file mode 100644 index 0000000000..345a8ebd9d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bob.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bob.xml new file mode 100644 index 0000000000..289e994e47 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_boj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_boj.xml new file mode 100644 index 0000000000..4be4764ab5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombf.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombf.xml new file mode 100644 index 0000000000..83e60248d1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombiwa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombiwa.xml new file mode 100644 index 0000000000..26ab6b4f33 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bowl.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bowl.xml new file mode 100644 index 0000000000..ffe6d43db7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_box.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_box.xml new file mode 100644 index 0000000000..106d2d3356 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_brob.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_brob.xml new file mode 100644 index 0000000000..718dcd5617 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bubble.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bubble.xml new file mode 100644 index 0000000000..f5de186920 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bv.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bv.xml new file mode 100644 index 0000000000..d2ebf275ba --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bw.xml new file mode 100644 index 0000000000..6fd39fbb1c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bwall.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bwall.xml new file mode 100644 index 0000000000..d4f43ddc14 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bxa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bxa.xml new file mode 100644 index 0000000000..fb78c117e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cne.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cne.xml new file mode 100644 index 0000000000..0c14d0bc54 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cob.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cob.xml new file mode 100644 index 0000000000..ba051cfa74 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cow.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cow.xml new file mode 100644 index 0000000000..5d067c329f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_crow.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_crow.xml new file mode 100644 index 0000000000..77337c6445 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cs.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cs.xml new file mode 100644 index 0000000000..83804ccaf4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_elevator.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_elevator.xml new file mode 100644 index 0000000000..6be59c154b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_hsblock.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_hsblock.xml new file mode 100644 index 0000000000..4bb50c2b4f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_lift.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_lift.xml new file mode 100644 index 0000000000..2912385190 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_daiku.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_daiku.xml new file mode 100644 index 0000000000..1524c7a26c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ddan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ddan_objects.xml new file mode 100644 index 0000000000..3fc563b96f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekubaba.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekubaba.xml new file mode 100644 index 0000000000..7202a833fc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekujr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekujr.xml new file mode 100644 index 0000000000..e906bf61c4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekunuts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekunuts.xml new file mode 100644 index 0000000000..5fceef4165 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_6k.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_6k.xml new file mode 100644 index 0000000000..73058d5e46 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_kekkai.xml new file mode 100644 index 0000000000..aa54bc2eef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_tre_lgt.xml new file mode 100644 index 0000000000..9ea19012b7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dh.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dh.xml new file mode 100644 index 0000000000..7a52d7dbe7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dnk.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dnk.xml new file mode 100644 index 0000000000..3bce343048 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dns.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dns.xml new file mode 100644 index 0000000000..8b78ffcf20 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodojr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodojr.xml new file mode 100644 index 0000000000..4dfd7d6e45 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodongo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodongo.xml new file mode 100644 index 0000000000..779e20e9dc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dog.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dog.xml new file mode 100644 index 0000000000..ef00442b60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_gerudo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_gerudo.xml new file mode 100644 index 0000000000..2f17262041 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_killer.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_killer.xml new file mode 100644 index 0000000000..a37f590d60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds.xml new file mode 100644 index 0000000000..0413a9e2e8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds2.xml new file mode 100644 index 0000000000..683bcc68d4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_du.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_du.xml new file mode 100644 index 0000000000..0babd962b9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dy_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dy_obj.xml new file mode 100644 index 0000000000..5e792edb50 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ec.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ec.xml new file mode 100644 index 0000000000..7ec83e284d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_crystal_light.xml new file mode 100644 index 0000000000..9215b6a394 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_doughnut.xml new file mode 100644 index 0000000000..7f12c56f53 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_erupc.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_erupc.xml new file mode 100644 index 0000000000..800d9535f1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_fire_ball.xml new file mode 100644 index 0000000000..2fc65b16ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_flash.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_flash.xml new file mode 100644 index 0000000000..5f962f162b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_lgt_shower.xml new file mode 100644 index 0000000000..67ef5ce7e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_star_field.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_star_field.xml new file mode 100644 index 0000000000..00b47c460f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_tw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_tw.xml new file mode 100644 index 0000000000..de53765696 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ei.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ei.xml new file mode 100644 index 0000000000..e4132491f4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fa.xml new file mode 100644 index 0000000000..2f1bf9a5e8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd.xml new file mode 100644 index 0000000000..2609579670 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd2.xml new file mode 100644 index 0000000000..44b5f5f9c1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fhg.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fhg.xml new file mode 100644 index 0000000000..669875aaf8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fire.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fire.xml new file mode 100644 index 0000000000..49bf620cb8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_firefly.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_firefly.xml new file mode 100644 index 0000000000..8c26a43418 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fish.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fish.xml new file mode 100644 index 0000000000..f5ad4f6da0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fr.xml new file mode 100644 index 0000000000..25ee2ad42e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fu.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fu.xml new file mode 100644 index 0000000000..82c449e3de --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fw.xml new file mode 100644 index 0000000000..ee9821d263 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fz.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fz.xml new file mode 100644 index 0000000000..dad6fec5ce --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon.xml new file mode 100644 index 0000000000..c654c7fec9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon2.xml new file mode 100644 index 0000000000..7e715dd414 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime1.xml new file mode 100644 index 0000000000..b1016299bc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime2.xml new file mode 100644 index 0000000000..180e5995c5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime3.xml new file mode 100644 index 0000000000..be4c4dcb15 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_objects.xml new file mode 100644 index 0000000000..5e32610ffc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ge1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ge1.xml new file mode 100644 index 0000000000..79e0768b81 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geff.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geff.xml new file mode 100644 index 0000000000..f0667743b0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geldb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geldb.xml new file mode 100644 index 0000000000..49b12ef2e5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrow.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrow.xml new file mode 100644 index 0000000000..4b58787a9d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrowcase.xml new file mode 100644 index 0000000000..267b0a734d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bean.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bean.xml new file mode 100644 index 0000000000..e74247816f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_1.xml new file mode 100644 index 0000000000..bae86c11d8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_2.xml new file mode 100644 index 0000000000..1400c4a4d4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bombpouch.xml new file mode 100644 index 0000000000..07134748c3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boomerang.xml new file mode 100644 index 0000000000..3c1a0fe7fc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boots_2.xml new file mode 100644 index 0000000000..3bcb6a47ae --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bosskey.xml new file mode 100644 index 0000000000..e5e4bc86c9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle.xml new file mode 100644 index 0000000000..3b0884a03f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle_letter.xml new file mode 100644 index 0000000000..443219caf5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bow.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bow.xml new file mode 100644 index 0000000000..946e9c4965 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bracelet.xml new file mode 100644 index 0000000000..5a0b62a60a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_brokensword.xml new file mode 100644 index 0000000000..408741ac54 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_butterfly.xml new file mode 100644 index 0000000000..7b60a77247 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_clothes.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_clothes.xml new file mode 100644 index 0000000000..3f897b6d13 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_coin.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_coin.xml new file mode 100644 index 0000000000..22e29f255f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_compass.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_compass.xml new file mode 100644 index 0000000000..076229b11e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_dekupouch.xml new file mode 100644 index 0000000000..8925e6fa5f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_egg.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_egg.xml new file mode 100644 index 0000000000..2b2e2847db --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_eye_lotion.xml new file mode 100644 index 0000000000..5128c5f6ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fire.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fire.xml new file mode 100644 index 0000000000..4bfd76a7c5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fish.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fish.xml new file mode 100644 index 0000000000..edb39dc297 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_frog.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_frog.xml new file mode 100644 index 0000000000..a656c306bd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudo.xml new file mode 100644 index 0000000000..d65daee8e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudomask.xml new file mode 100644 index 0000000000..cfcb878d9b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ghost.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ghost.xml new file mode 100644 index 0000000000..795f0cfd10 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_glasses.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_glasses.xml new file mode 100644 index 0000000000..63d32ab5ac --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gloves.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gloves.xml new file mode 100644 index 0000000000..0e1c4259d5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_goddess.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_goddess.xml new file mode 100644 index 0000000000..50cbdd8918 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_golonmask.xml new file mode 100644 index 0000000000..844d90e714 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_grass.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_grass.xml new file mode 100644 index 0000000000..ae7834201a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hammer.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hammer.xml new file mode 100644 index 0000000000..feb5c8659d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_heart.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_heart.xml new file mode 100644 index 0000000000..48e78b1b5c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hearts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hearts.xml new file mode 100644 index 0000000000..d2e763e631 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hookshot.xml new file mode 100644 index 0000000000..a6b3b0fdac --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hoverboots.xml new file mode 100644 index 0000000000..6d41df8fd0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_insect.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_insect.xml new file mode 100644 index 0000000000..7af5b5b3b2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_jewel.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_jewel.xml new file mode 100644 index 0000000000..e83c651164 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_key.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_key.xml new file mode 100644 index 0000000000..a37d45a71c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 0000000000..46eff7d3e2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_letter.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_letter.xml new file mode 100644 index 0000000000..bea8683390 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_liquid.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_liquid.xml new file mode 100644 index 0000000000..18a5c3d7a2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_longsword.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_longsword.xml new file mode 100644 index 0000000000..7161e42e38 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_m_arrow.xml new file mode 100644 index 0000000000..0fd659ae95 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_magicpot.xml new file mode 100644 index 0000000000..7623e6353e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_map.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_map.xml new file mode 100644 index 0000000000..471c1dab97 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_medal.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_medal.xml new file mode 100644 index 0000000000..28e5b1e683 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_melody.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_melody.xml new file mode 100644 index 0000000000..b01fca9538 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_milk.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_milk.xml new file mode 100644 index 0000000000..a3e223b3e6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_mushroom.xml new file mode 100644 index 0000000000..5b19bca743 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_niwatori.xml new file mode 100644 index 0000000000..c8389f62c2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_nuts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_nuts.xml new file mode 100644 index 0000000000..c59903c43d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina.xml new file mode 100644 index 0000000000..82607677d3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina_0.xml new file mode 100644 index 0000000000..2c5f70d984 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_pachinko.xml new file mode 100644 index 0000000000..5f808baf92 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_powder.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_powder.xml new file mode 100644 index 0000000000..fb7dc0155d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_prescription.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_prescription.xml new file mode 100644 index 0000000000..75ae7eb2b7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_purse.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_purse.xml new file mode 100644 index 0000000000..054731dec7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rabit_mask.xml new file mode 100644 index 0000000000..9d4eb9487f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_redead_mask.xml new file mode 100644 index 0000000000..7de08487f8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rupy.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rupy.xml new file mode 100644 index 0000000000..0a1af96d0f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_saw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_saw.xml new file mode 100644 index 0000000000..dcc038b7c1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_scale.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_scale.xml new file mode 100644 index 0000000000..1cf5de5b99 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_seed.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_seed.xml new file mode 100644 index 0000000000..82c15c82d2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_1.xml new file mode 100644 index 0000000000..2f11e3f6d8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_2.xml new file mode 100644 index 0000000000..176ae025fe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_3.xml new file mode 100644 index 0000000000..8d1e5dafd4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_skj_mask.xml new file mode 100644 index 0000000000..e6c90f76f1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soldout.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soldout.xml new file mode 100644 index 0000000000..a15b1253e3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soul.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soul.xml new file mode 100644 index 0000000000..a68178eba5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_stick.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_stick.xml new file mode 100644 index 0000000000..fed89f4659 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sutaru.xml new file mode 100644 index 0000000000..a2606afbe3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sword_1.xml new file mode 100644 index 0000000000..e1119abca0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ticketstone.xml new file mode 100644 index 0000000000..73bf888d10 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_truth_mask.xml new file mode 100644 index 0000000000..3b4edf3dee --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_zoramask.xml new file mode 100644 index 0000000000..e3b1ab10ec --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gj.xml new file mode 100644 index 0000000000..ee6dab74f8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gjyo_objects.xml new file mode 100644 index 0000000000..ea4f8444fb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gla.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gla.xml new file mode 100644 index 0000000000..499a3720d1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gm.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gm.xml new file mode 100644 index 0000000000..91b10cc428 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd.xml new file mode 100644 index 0000000000..3ae3b57f3d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd_magic.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd_magic.xml new file mode 100644 index 0000000000..a88d419d7a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gndd.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gndd.xml new file mode 100644 index 0000000000..8bf5d770c4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_god_lgt.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_god_lgt.xml new file mode 100644 index 0000000000..60df9e4693 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gol.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gol.xml new file mode 100644 index 0000000000..7e04508cb6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goma.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goma.xml new file mode 100644 index 0000000000..922678a3cf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goroiwa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goroiwa.xml new file mode 100644 index 0000000000..5d406e9578 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gr.xml new file mode 100644 index 0000000000..5f7360ae57 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gs.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gs.xml new file mode 100644 index 0000000000..145be16653 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gt.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gt.xml new file mode 100644 index 0000000000..1d79d4e39e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka.xml new file mode 100644 index 0000000000..f6b263c375 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_door.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_door.xml new file mode 100644 index 0000000000..1376d03569 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_objects.xml new file mode 100644 index 0000000000..3ca6d27c08 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hakach_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hakach_objects.xml new file mode 100644 index 0000000000..0de02aaf15 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hata.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hata.xml new file mode 100644 index 0000000000..b0324c3be3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_heavy_object.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_heavy_object.xml new file mode 100644 index 0000000000..ecc7953211 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hidan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hidan_objects.xml new file mode 100644 index 0000000000..f41c0ee5ef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hintnuts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hintnuts.xml new file mode 100644 index 0000000000..a7290f3955 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hni.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hni.xml new file mode 100644 index 0000000000..6b317eb7a6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse.xml new file mode 100644 index 0000000000..74619e5977 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_ganon.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_ganon.xml new file mode 100644 index 0000000000..0a55462e25 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_link_child.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_link_child.xml new file mode 100644 index 0000000000..146c564f55 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_normal.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_normal.xml new file mode 100644 index 0000000000..2facab39c5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_zelda.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_zelda.xml new file mode 100644 index 0000000000..af270c6585 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hs.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hs.xml new file mode 100644 index 0000000000..cf5d06e1a2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_human.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_human.xml new file mode 100644 index 0000000000..05795cb332 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ice_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ice_objects.xml new file mode 100644 index 0000000000..c7d059d709 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ik.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ik.xml new file mode 100644 index 0000000000..8a6028f7c0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_im.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_im.xml new file mode 100644 index 0000000000..a628a113a4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_in.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_in.xml new file mode 100644 index 0000000000..84c1140475 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ingate.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ingate.xml new file mode 100644 index 0000000000..e6be42bebf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jj.xml new file mode 100644 index 0000000000..62bae8cb91 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_js.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_js.xml new file mode 100644 index 0000000000..ff7bd3efa1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_door.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_door.xml new file mode 100644 index 0000000000..60a7b37886 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_iron.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_iron.xml new file mode 100644 index 0000000000..c6f6773c6a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_obj.xml new file mode 100644 index 0000000000..a1f19b8066 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ka.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ka.xml new file mode 100644 index 0000000000..eb952732b4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kanban.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kanban.xml new file mode 100644 index 0000000000..9ffc7a2ceb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kibako2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kibako2.xml new file mode 100644 index 0000000000..a701b294de --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kingdodongo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kingdodongo.xml new file mode 100644 index 0000000000..5ef07a26f7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_km1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_km1.xml new file mode 100644 index 0000000000..0a918a798e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kusa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kusa.xml new file mode 100644 index 0000000000..67291a5543 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kw1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kw1.xml new file mode 100644 index 0000000000..eab561b1fb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kz.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kz.xml new file mode 100644 index 0000000000..4624fefdb6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_light_ring.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_light_ring.xml new file mode 100644 index 0000000000..babe7d2aa7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightbox.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightbox.xml new file mode 100644 index 0000000000..552a79d7c7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightswitch.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightswitch.xml new file mode 100644 index 0000000000..cfd5dcfb40 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_boy.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_boy.xml new file mode 100644 index 0000000000..6351af5050 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_child.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_child.xml new file mode 100644 index 0000000000..0de4003731 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma1.xml new file mode 100644 index 0000000000..63eeb38950 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma2.xml new file mode 100644 index 0000000000..ce5910fb80 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mag.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mag.xml new file mode 100644 index 0000000000..dfe25df276 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mag.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mamenoki.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mamenoki.xml new file mode 100644 index 0000000000..819d890225 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mastergolon.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mastergolon.xml new file mode 100644 index 0000000000..6dd9d16592 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokiri.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokiri.xml new file mode 100644 index 0000000000..af5a9ec153 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokirihead.xml new file mode 100644 index 0000000000..c64aa1c49e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterzoora.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterzoora.xml new file mode 100644 index 0000000000..2c703274e1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mb.xml new file mode 100644 index 0000000000..23c0930c02 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_md.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_md.xml new file mode 100644 index 0000000000..161c73dca1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_medal.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_medal.xml new file mode 100644 index 0000000000..533872a551 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_menkuri_objects.xml new file mode 100644 index 0000000000..4c2b51df5b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mir_ray.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mir_ray.xml new file mode 100644 index 0000000000..2acc9391ab --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mizu_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mizu_objects.xml new file mode 100644 index 0000000000..5a18b95cfe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin.xml new file mode 100644 index 0000000000..daf9b05412 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_dark.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_dark.xml new file mode 100644 index 0000000000..2fa0bdbe4c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flame.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flame.xml new file mode 100644 index 0000000000..6274feaee1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flash.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flash.xml new file mode 100644 index 0000000000..c1040ea118 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_ice.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_ice.xml new file mode 100644 index 0000000000..1aaeea193d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_oka.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_oka.xml new file mode 100644 index 0000000000..0f823b9237 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_soul.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_soul.xml new file mode 100644 index 0000000000..6386f7f9ea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_wind.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_wind.xml new file mode 100644 index 0000000000..8bba7eb91b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mk.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mk.xml new file mode 100644 index 0000000000..0b4aaae8aa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mm.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mm.xml new file mode 100644 index 0000000000..b27837e57e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mo.xml new file mode 100644 index 0000000000..4c4be74c83 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1.xml new file mode 100644 index 0000000000..bb1b31e2fc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1a.xml new file mode 100644 index 0000000000..c750ce20d0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2.xml new file mode 100644 index 0000000000..785b858571 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2a.xml new file mode 100644 index 0000000000..ad1bb4d5f0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_objects.xml new file mode 100644 index 0000000000..58ea8c085c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_tex.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_tex.xml new file mode 100644 index 0000000000..8ba4ff2d34 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ms.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ms.xml new file mode 100644 index 0000000000..a87d0e6b36 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mu.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mu.xml new file mode 100644 index 0000000000..7251ff7212 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nb.xml new file mode 100644 index 0000000000..74de9e2859 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_niw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_niw.xml new file mode 100644 index 0000000000..4eafec9566 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nwc.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nwc.xml new file mode 100644 index 0000000000..96ffa32383 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ny.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ny.xml new file mode 100644 index 0000000000..e2e8187ff8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA1.xml new file mode 100644 index 0000000000..1d665f1010 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA10.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA10.xml new file mode 100644 index 0000000000..65d0808349 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA11.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA11.xml new file mode 100644 index 0000000000..92ae474b60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA2.xml new file mode 100644 index 0000000000..ffdcd79896 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA3.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA3.xml new file mode 100644 index 0000000000..a492bd8751 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA4.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA4.xml new file mode 100644 index 0000000000..dcdbbfff9b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA5.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA5.xml new file mode 100644 index 0000000000..55072176dd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA6.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA6.xml new file mode 100644 index 0000000000..c17a510881 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA7.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA7.xml new file mode 100644 index 0000000000..52c68f6394 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA8.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA8.xml new file mode 100644 index 0000000000..8ed2d3df50 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA9.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA9.xml new file mode 100644 index 0000000000..d5c16abfcd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB1.xml new file mode 100644 index 0000000000..2f50c967b2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB2.xml new file mode 100644 index 0000000000..230783ceae --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB3.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB3.xml new file mode 100644 index 0000000000..1c42ddaccc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB4.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB4.xml new file mode 100644 index 0000000000..2924c9e753 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1.xml new file mode 100644 index 0000000000..4d5b1663fe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE10.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE10.xml new file mode 100644 index 0000000000..04ce914372 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE11.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE11.xml new file mode 100644 index 0000000000..04f6f186da --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE12.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE12.xml new file mode 100644 index 0000000000..a5fa39fd25 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1s.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1s.xml new file mode 100644 index 0000000000..d311e60104 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE2.xml new file mode 100644 index 0000000000..af62ad6d11 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE3.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE3.xml new file mode 100644 index 0000000000..95227da384 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4.xml new file mode 100644 index 0000000000..ae48d2adef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4s.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4s.xml new file mode 100644 index 0000000000..6037de52f9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE5.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE5.xml new file mode 100644 index 0000000000..f5edf745aa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE6.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE6.xml new file mode 100644 index 0000000000..95bb602b6b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE7.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE7.xml new file mode 100644 index 0000000000..b3e588d4c2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE8.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE8.xml new file mode 100644 index 0000000000..be5de24947 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE9.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE9.xml new file mode 100644 index 0000000000..8ea7ee18c7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE_anime.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE_anime.xml new file mode 100644 index 0000000000..f6b4659e22 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1d_map.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1d_map.xml new file mode 100644 index 0000000000..f14fecd825 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1s.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1s.xml new file mode 100644 index 0000000000..fe41dde630 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_o_anime.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_o_anime.xml new file mode 100644 index 0000000000..4ef4ac44c8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_okuta.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_okuta.xml new file mode 100644 index 0000000000..b4fccea6f3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_opening_demo1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_opening_demo1.xml new file mode 100644 index 0000000000..fd03230279 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os.xml new file mode 100644 index 0000000000..5880a92930 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os_anime.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os_anime.xml new file mode 100644 index 0000000000..f23636343c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ossan.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ossan.xml new file mode 100644 index 0000000000..5788e3a20d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ouke_haka.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ouke_haka.xml new file mode 100644 index 0000000000..11da9b26ef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_owl.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_owl.xml new file mode 100644 index 0000000000..64fdf64c53 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_peehat.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_peehat.xml new file mode 100644 index 0000000000..42ee66cdef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_composer.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_composer.xml new file mode 100644 index 0000000000..ff995efceb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_field.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_field.xml new file mode 100644 index 0000000000..78bc0d65ad --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_sisters.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_sisters.xml new file mode 100644 index 0000000000..b429be2588 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_poh.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_poh.xml new file mode 100644 index 0000000000..be6d6eff4b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ps.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ps.xml new file mode 100644 index 0000000000..9f9c894a60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_pu_box.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_pu_box.xml new file mode 100644 index 0000000000..e1d686e979 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rd.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rd.xml new file mode 100644 index 0000000000..22c7d33738 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_reeba.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_reeba.xml new file mode 100644 index 0000000000..32c697bd9d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_relay_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_relay_objects.xml new file mode 100644 index 0000000000..47b92fcd2d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rl.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rl.xml new file mode 100644 index 0000000000..2a5ad30f6b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rr.xml new file mode 100644 index 0000000000..98726b14bb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rs.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rs.xml new file mode 100644 index 0000000000..152b5489e1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru1.xml new file mode 100644 index 0000000000..3d413619ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru2.xml new file mode 100644 index 0000000000..fedf37d48b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sa.xml new file mode 100644 index 0000000000..ec45ac961d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sb.xml new file mode 100644 index 0000000000..64d3bb005a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sd.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sd.xml new file mode 100644 index 0000000000..fb58428c3f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shop_dungen.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shop_dungen.xml new file mode 100644 index 0000000000..594c43d390 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shopnuts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shopnuts.xml new file mode 100644 index 0000000000..7065f8941a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_siofuki.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_siofuki.xml new file mode 100644 index 0000000000..a23240a728 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sk2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sk2.xml new file mode 100644 index 0000000000..f2e7ef6d89 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skb.xml new file mode 100644 index 0000000000..5b5efb4848 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skj.xml new file mode 100644 index 0000000000..74548e5185 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_break.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_break.xml new file mode 100644 index 0000000000..d3be88315f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_objects.xml new file mode 100644 index 0000000000..10fb13aeac --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoya.xml new file mode 100644 index 0000000000..d44b944e0e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoyab.xml new file mode 100644 index 0000000000..720f50cd3e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects.xml new file mode 100644 index 0000000000..413e032a9c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects2.xml new file mode 100644 index 0000000000..36741a9492 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot02_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot02_objects.xml new file mode 100644 index 0000000000..65f45ff515 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot03_object.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot03_object.xml new file mode 100644 index 0000000000..f182e7d99a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot04_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot04_objects.xml new file mode 100644 index 0000000000..66293d7523 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot05_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot05_objects.xml new file mode 100644 index 0000000000..6e70791493 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot06_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot06_objects.xml new file mode 100644 index 0000000000..e3da63b0f0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot07_object.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot07_object.xml new file mode 100644 index 0000000000..5bc2bfb6bf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot08_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot08_obj.xml new file mode 100644 index 0000000000..4d71f3473f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot09_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot09_obj.xml new file mode 100644 index 0000000000..eb65283931 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot11_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot11_obj.xml new file mode 100644 index 0000000000..257298f7cc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot12_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot12_obj.xml new file mode 100644 index 0000000000..d619c781e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot15_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot15_obj.xml new file mode 100644 index 0000000000..bd59b8cd18 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot16_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot16_obj.xml new file mode 100644 index 0000000000..d39de812a9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot17_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot17_obj.xml new file mode 100644 index 0000000000..d4239d8d28 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot18_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot18_obj.xml new file mode 100644 index 0000000000..cc12b78946 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ssh.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ssh.xml new file mode 100644 index 0000000000..6283f8e9f2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sst.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sst.xml new file mode 100644 index 0000000000..b874b9a418 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_st.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_st.xml new file mode 100644 index 0000000000..983b9e2eab --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_stream.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_stream.xml new file mode 100644 index 0000000000..59b0838e47 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_syokudai.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_syokudai.xml new file mode 100644 index 0000000000..c1670edece --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ta.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ta.xml new file mode 100644 index 0000000000..5e446bf5c9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_timeblock.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_timeblock.xml new file mode 100644 index 0000000000..1d6b9e698c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tite.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tite.xml new file mode 100644 index 0000000000..1be65c4950 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tk.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tk.xml new file mode 100644 index 0000000000..6b6cce7244 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toki_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toki_objects.xml new file mode 100644 index 0000000000..cd07e60d2b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_torch2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_torch2.xml new file mode 100644 index 0000000000..3388e7d34e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toryo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toryo.xml new file mode 100644 index 0000000000..73f3dcb1e2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tp.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tp.xml new file mode 100644 index 0000000000..8ea908825e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tr.xml new file mode 100644 index 0000000000..17ab9ae392 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_trap.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_trap.xml new file mode 100644 index 0000000000..56195cf41b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_triforce_spot.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_triforce_spot.xml new file mode 100644 index 0000000000..87d4494589 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ts.xml new file mode 100644 index 0000000000..567277bc39 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tsubo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tsubo.xml new file mode 100644 index 0000000000..ee2c5e1846 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tw.xml new file mode 100644 index 0000000000..c7fd2a60be --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_umajump.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_umajump.xml new file mode 100644 index 0000000000..2ee4ade46a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vali.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vali.xml new file mode 100644 index 0000000000..2bab5efaa6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vase.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vase.xml new file mode 100644 index 0000000000..091d4c51e3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vm.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vm.xml new file mode 100644 index 0000000000..c5b949b36e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wallmaster.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wallmaster.xml new file mode 100644 index 0000000000..fbbc4f4af3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp1.xml new file mode 100644 index 0000000000..1497d7a108 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp2.xml new file mode 100644 index 0000000000..b6d1b3624c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wf.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wf.xml new file mode 100644 index 0000000000..ebfb708d2d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wood02.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wood02.xml new file mode 100644 index 0000000000..47ec342caa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_xc.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_xc.xml new file mode 100644 index 0000000000..bb2bf3e7af --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yabusame_point.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yabusame_point.xml new file mode 100644 index 0000000000..bed9e8a609 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ydan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ydan_objects.xml new file mode 100644 index 0000000000..e2adf307f7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yukabyun.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yukabyun.xml new file mode 100644 index 0000000000..d594ebbb89 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zf.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zf.xml new file mode 100644 index 0000000000..7f20eb7866 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zg.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zg.xml new file mode 100644 index 0000000000..79005516c4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl1.xml new file mode 100644 index 0000000000..001e5be145 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2.xml new file mode 100644 index 0000000000..959a919ec6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime1.xml new file mode 100644 index 0000000000..cada504867 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime2.xml new file mode 100644 index 0000000000..47016e2e00 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl4.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl4.xml new file mode 100644 index 0000000000..8e7a2837ed --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zo.xml new file mode 100644 index 0000000000..77465760ef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 0000000000..dce4da772b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 0000000000..76d82579ea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Light.xml new file mode 100644 index 0000000000..8bee2c8ddd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 0000000000..f7795146c1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 0000000000..84910e5f05 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 0000000000..a19dbed0fe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 0000000000..4ecda60209 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 0000000000..89e10b5b4b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Sst.xml new file mode 100644 index 0000000000..14195ccf84 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Demo_Shd.xml new file mode 100644 index 0000000000..b286b96124 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Bili.xml new file mode 100644 index 0000000000..f5d5f17089 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 0000000000..9dd01857a3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 0000000000..b69dbff0ec --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 0000000000..37953cff5e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Holl.xml new file mode 100644 index 0000000000..193e86796a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 0000000000..64d24dd76a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Kanban.xml new file mode 100644 index 0000000000..20230c5ce0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sda.xml new file mode 100644 index 0000000000..ece03e8ff5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ssh.xml new file mode 100644 index 0000000000..5d05b4faf8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_St.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_St.xml new file mode 100644 index 0000000000..4b87f9a6f2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sth.xml new file mode 100644 index 0000000000..263813cce5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_End_Title.xml new file mode 100644 index 0000000000..539e97f482 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_File_Choose.xml new file mode 100644 index 0000000000..5fa7563685 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_File_Choose.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Dark.xml new file mode 100644 index 0000000000..8e77b2ead8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Fire.xml new file mode 100644 index 0000000000..d7b3b32933 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Wind.xml new file mode 100644 index 0000000000..0229a15875 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 0000000000..556c166a9f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 0000000000..fab89b3aa5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 0000000000..3d813da57e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 0000000000..88eb306531 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 0000000000..7604e81ff6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 0000000000..7fa56605f9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/Bmori1.xml new file mode 100644 index 0000000000..a39e5ccd1a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 0000000000..89331ecc2f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan.xml new file mode 100644 index 0000000000..a2c20d6920 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 0000000000..ea300b96c3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 0000000000..d36ac6b774 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HIDAN.xml new file mode 100644 index 0000000000..502dcd839c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin.xml new file mode 100644 index 0000000000..f8b5d8b6c1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 0000000000..99ae2b3efe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan.xml new file mode 100644 index 0000000000..9eb1ee61aa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan_boss.xml new file mode 100644 index 0000000000..9fccf2c301 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan.xml new file mode 100644 index 0000000000..c46e8ad279 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan_boss.xml new file mode 100644 index 0000000000..05633e53e2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon.xml new file mode 100644 index 0000000000..f857dbe94e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_boss.xml new file mode 100644 index 0000000000..36c5e81070 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_demo.xml new file mode 100644 index 0000000000..56c98efed7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_final.xml new file mode 100644 index 0000000000..1c9bf84b45 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 0000000000..7d5f5a1235 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_tou.xml new file mode 100644 index 0000000000..1ae37b9637 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontika.xml new file mode 100644 index 0000000000..ba5542faa2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 0000000000..a441206b07 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/gerudoway.xml new file mode 100644 index 0000000000..f2d07a2881 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 0000000000..7ad60c2a0f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinboss.xml new file mode 100644 index 0000000000..86c0d317b2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinzou.xml new file mode 100644 index 0000000000..166244e29b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/men.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/men.xml new file mode 100644 index 0000000000..679436de0e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/men.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/moribossroom.xml new file mode 100644 index 0000000000..b9959eefab --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan.xml new file mode 100644 index 0000000000..377c7a6824 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan_boss.xml new file mode 100644 index 0000000000..7ea240547a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/bowling.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/bowling.xml new file mode 100644 index 0000000000..9a41763a27 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 0000000000..4f9a03fc02 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa.xml new file mode 100644 index 0000000000..06d89f2fe7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 0000000000..6f4c181e0e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hakasitarelay.xml new file mode 100644 index 0000000000..91be63d147 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hut.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hut.xml new file mode 100644 index 0000000000..a4ef5715ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hylia_labo.xml new file mode 100644 index 0000000000..56822e67a7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/impa.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/impa.xml new file mode 100644 index 0000000000..db757e3d3c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kakariko.xml new file mode 100644 index 0000000000..e4e9b102c9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kenjyanoma.xml new file mode 100644 index 0000000000..4e8a58f3b6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home.xml new file mode 100644 index 0000000000..8c0305493a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home3.xml new file mode 100644 index 0000000000..9f36eb41c9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home4.xml new file mode 100644 index 0000000000..eb861aedb4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home5.xml new file mode 100644 index 0000000000..974987feda --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/labo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/labo.xml new file mode 100644 index 0000000000..c0a9d2eb8c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/link_home.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/link_home.xml new file mode 100644 index 0000000000..2fb88ae347 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/mahouya.xml new file mode 100644 index 0000000000..8ae462f9db --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/malon_stable.xml new file mode 100644 index 0000000000..aff97eeb86 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/miharigoya.xml new file mode 100644 index 0000000000..63f8676ac1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/nakaniwa.xml new file mode 100644 index 0000000000..2fb2d5e6a4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/syatekijyou.xml new file mode 100644 index 0000000000..05243b52ca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/takaraya.xml new file mode 100644 index 0000000000..5b438980b7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tent.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tent.xml new file mode 100644 index 0000000000..de72cc5f45 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tokinoma.xml new file mode 100644 index 0000000000..d7878b8951 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 0000000000..3b6dd2dec2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 0000000000..90a8d95d09 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/enrui.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/enrui.xml new file mode 100644 index 0000000000..d8c06e5454 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/entra_n.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/entra_n.xml new file mode 100644 index 0000000000..5b408ac3a6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana.xml new file mode 100644 index 0000000000..e7dc93dd0c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana2.xml new file mode 100644 index 0000000000..2d8ba4906a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana_ouke.xml new file mode 100644 index 0000000000..17f53613e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hiral_demo.xml new file mode 100644 index 0000000000..1331fdd4c5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakariko3.xml new file mode 100644 index 0000000000..07b62c44df --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakusiana.xml new file mode 100644 index 0000000000..c3f993ff4f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kinsuta.xml new file mode 100644 index 0000000000..aac0f6c4ea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley.xml new file mode 100644 index 0000000000..c304673032 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley_n.xml new file mode 100644 index 0000000000..65db604113 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_day.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_day.xml new file mode 100644 index 0000000000..00887e69cd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_night.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_night.xml new file mode 100644 index 0000000000..c58e38744e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_ruins.xml new file mode 100644 index 0000000000..f0ec75e759 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine.xml new file mode 100644 index 0000000000..b9ddf2cf70 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_n.xml new file mode 100644 index 0000000000..4878338aa1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_r.xml new file mode 100644 index 0000000000..1220367919 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/turibori.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/turibori.xml new file mode 100644 index 0000000000..0633224d9c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/entra.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/entra.xml new file mode 100644 index 0000000000..92ee57f59a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/souko.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/souko.xml new file mode 100644 index 0000000000..8dd9d9e48a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot00.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot00.xml new file mode 100644 index 0000000000..508d9309b3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot01.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot01.xml new file mode 100644 index 0000000000..eb725afa68 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot02.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot02.xml new file mode 100644 index 0000000000..c7924c29db --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot03.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot03.xml new file mode 100644 index 0000000000..9434185f44 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot04.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot04.xml new file mode 100644 index 0000000000..f338604207 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot05.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot05.xml new file mode 100644 index 0000000000..4f7c62b91e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot06.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot06.xml new file mode 100644 index 0000000000..f4af602cfd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot07.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot07.xml new file mode 100644 index 0000000000..eeb976f7f6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot08.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot08.xml new file mode 100644 index 0000000000..86582f0dca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot09.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot09.xml new file mode 100644 index 0000000000..5bb9e059c7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot10.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot10.xml new file mode 100644 index 0000000000..66365e3d86 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot11.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot11.xml new file mode 100644 index 0000000000..76ff3b8223 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot12.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot12.xml new file mode 100644 index 0000000000..e21523b217 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot13.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot13.xml new file mode 100644 index 0000000000..c689130650 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot15.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot15.xml new file mode 100644 index 0000000000..e75f7b6845 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot16.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot16.xml new file mode 100644 index 0000000000..f41b226f8e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot17.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot17.xml new file mode 100644 index 0000000000..feb267251e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot18.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot18.xml new file mode 100644 index 0000000000..d70fccf4bb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot20.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot20.xml new file mode 100644 index 0000000000..1381f6ecbe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/alley_shop.xml new file mode 100644 index 0000000000..95548de1bd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/drag.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/drag.xml new file mode 100644 index 0000000000..acb6515fba --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/face_shop.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/face_shop.xml new file mode 100644 index 0000000000..16a9746081 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/golon.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/golon.xml new file mode 100644 index 0000000000..c586727988 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/kokiri_shop.xml new file mode 100644 index 0000000000..50cd633e57 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/night_shop.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/night_shop.xml new file mode 100644 index 0000000000..5954d9c83d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/shop1.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/shop1.xml new file mode 100644 index 0000000000..525a06d633 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/zoora.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/zoora.xml new file mode 100644 index 0000000000..0e4ac18f8c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_field.xml b/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_field.xml new file mode 100644 index 0000000000..789a554ce8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_ydan.xml b/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_ydan.xml new file mode 100644 index 0000000000..f784afcf45 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/text/message_data_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/text/message_data_static.xml new file mode 100644 index 0000000000..ff37dac658 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/backgrounds.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/backgrounds.xml new file mode 100644 index 0000000000..c60ff57a8a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/boss_title_cards.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/boss_title_cards.xml new file mode 100644 index 0000000000..84f555bd10 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/do_action_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/do_action_static.xml new file mode 100644 index 0000000000..efabd54a58 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_24_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_24_static.xml new file mode 100644 index 0000000000..cdb8cc7379 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_dungeon_static.xml new file mode 100644 index 0000000000..873c490fc5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_field_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_field_static.xml new file mode 100644 index 0000000000..ed991406b5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_gameover_static.xml new file mode 100644 index 0000000000..ffd3928680 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_jpn_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_jpn_static.xml new file mode 100644 index 0000000000..f2fe854b8e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_nes_static.xml new file mode 100644 index 0000000000..6cd92acfca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_static.xml new file mode 100644 index 0000000000..9e844615b1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/item_name_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/item_name_static.xml new file mode 100644 index 0000000000..1bc074c2ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/kanji.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/kanji.xml new file mode 100644 index 0000000000..5159387a13 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/map_48x85_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_48x85_static.xml new file mode 100644 index 0000000000..b2ea46340a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/map_grand_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_grand_static.xml new file mode 100644 index 0000000000..201955bfc3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/map_i_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_i_static.xml new file mode 100644 index 0000000000..1721f6d848 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/map_name_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_name_static.xml new file mode 100644 index 0000000000..ca4c4c0bd6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/message_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/message_static.xml new file mode 100644 index 0000000000..afdde60def --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/message_texture_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/message_texture_static.xml new file mode 100644 index 0000000000..bbf7e1259e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/nes_font_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/nes_font_static.xml new file mode 100644 index 0000000000..b01646cb54 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/nes_font_static.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/nintendo_rogo_static.xml new file mode 100644 index 0000000000..f09de3b0f9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/parameter_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/parameter_static.xml new file mode 100644 index 0000000000..c51dacf1f6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/place_title_cards.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/place_title_cards.xml new file mode 100644 index 0000000000..b688cce00c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/skyboxes.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/skyboxes.xml new file mode 100644 index 0000000000..104ffb2a3f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/title_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/title_static.xml new file mode 100644 index 0000000000..5f58c5a820 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_PAL_F/audio/Audio.xml b/soh/assets/xml/GC_MQ_PAL_F/audio/Audio.xml index 91521bf945..f2155154ba 100644 --- a/soh/assets/xml/GC_MQ_PAL_F/audio/Audio.xml +++ b/soh/assets/xml/GC_MQ_PAL_F/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_MQ_PAL_F/code/sys_matrix.xml b/soh/assets/xml/GC_MQ_PAL_F/code/sys_matrix.xml index 52e78bcb11..580fead4ae 100644 --- a/soh/assets/xml/GC_MQ_PAL_F/code/sys_matrix.xml +++ b/soh/assets/xml/GC_MQ_PAL_F/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/assets/xml/GC_MQ_PAL_F/objects/gameplay_keep.xml b/soh/assets/xml/GC_MQ_PAL_F/objects/gameplay_keep.xml index 5ffc52f655..8824228847 100644 --- a/soh/assets/xml/GC_MQ_PAL_F/objects/gameplay_keep.xml +++ b/soh/assets/xml/GC_MQ_PAL_F/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/assets/xml/GC_NMQ_D/audio/Audio.xml b/soh/assets/xml/GC_NMQ_D/audio/Audio.xml index 47bed74199..347ac75232 100644 --- a/soh/assets/xml/GC_NMQ_D/audio/Audio.xml +++ b/soh/assets/xml/GC_NMQ_D/audio/Audio.xml @@ -116,1402 +116,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_D/code/sys_matrix.xml b/soh/assets/xml/GC_NMQ_D/code/sys_matrix.xml index 3811322d38..99b5dbafd4 100644 --- a/soh/assets/xml/GC_NMQ_D/code/sys_matrix.xml +++ b/soh/assets/xml/GC_NMQ_D/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml index 5ffc52f655..905f5d2724 100644 --- a/soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml +++ b/soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml b/soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml new file mode 100644 index 0000000000..4ed6c08232 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml @@ -0,0 +1,639 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_circle.xml b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_circle.xml new file mode 100644 index 0000000000..0c552b70e6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_triforce.xml b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_triforce.xml new file mode 100644 index 0000000000..ee0922d815 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_wipe1.xml new file mode 100644 index 0000000000..f45e585361 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/code/sys_matrix.xml b/soh/assets/xml/GC_NMQ_NTSC_J/code/sys_matrix.xml new file mode 100644 index 0000000000..9088e3a63f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/misc/link_animetion.xml b/soh/assets/xml/GC_NMQ_NTSC_J/misc/link_animetion.xml new file mode 100644 index 0000000000..9de1e92d36 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_dangeon_keep.xml new file mode 100644 index 0000000000..5b1a9050d9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_field_keep.xml new file mode 100644 index 0000000000..011e8f7fc7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_keep.xml new file mode 100644 index 0000000000..94eee8845e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_Bb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_Bb.xml new file mode 100644 index 0000000000..5d04bde451 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ahg.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ahg.xml new file mode 100644 index 0000000000..4d37b1b110 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_am.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_am.xml new file mode 100644 index 0000000000..b70c70d709 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ane.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ane.xml new file mode 100644 index 0000000000..1e29b351e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ani.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ani.xml new file mode 100644 index 0000000000..c70621c6f9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_anubice.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_anubice.xml new file mode 100644 index 0000000000..fb029586ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_aob.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_aob.xml new file mode 100644 index 0000000000..e6202d0cf9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_b_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_b_heart.xml new file mode 100644 index 0000000000..00f7cd6773 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bba.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bba.xml new file mode 100644 index 0000000000..ccc5c21365 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdan_objects.xml new file mode 100644 index 0000000000..dcd56d3856 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdoor.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdoor.xml new file mode 100644 index 0000000000..a092f0c23b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bg.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bg.xml new file mode 100644 index 0000000000..791226b71d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bigokuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bigokuta.xml new file mode 100644 index 0000000000..1c7d39e319 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bird.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bird.xml new file mode 100644 index 0000000000..167a5022dc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bji.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bji.xml new file mode 100644 index 0000000000..c665b6b001 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bl.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bl.xml new file mode 100644 index 0000000000..1c2ef4ec63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_blkobj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_blkobj.xml new file mode 100644 index 0000000000..345a8ebd9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bob.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bob.xml new file mode 100644 index 0000000000..289e994e47 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_boj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_boj.xml new file mode 100644 index 0000000000..4be4764ab5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombf.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombf.xml new file mode 100644 index 0000000000..83e60248d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombiwa.xml new file mode 100644 index 0000000000..26ab6b4f33 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bowl.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bowl.xml new file mode 100644 index 0000000000..ffe6d43db7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_box.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_box.xml new file mode 100644 index 0000000000..106d2d3356 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_brob.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_brob.xml new file mode 100644 index 0000000000..718dcd5617 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bubble.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bubble.xml new file mode 100644 index 0000000000..f5de186920 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bv.xml new file mode 100644 index 0000000000..d2ebf275ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bw.xml new file mode 100644 index 0000000000..6fd39fbb1c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bwall.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bwall.xml new file mode 100644 index 0000000000..d4f43ddc14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bxa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bxa.xml new file mode 100644 index 0000000000..fb78c117e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cne.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cne.xml new file mode 100644 index 0000000000..0c14d0bc54 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cob.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cob.xml new file mode 100644 index 0000000000..ba051cfa74 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cow.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cow.xml new file mode 100644 index 0000000000..5d067c329f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_crow.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_crow.xml new file mode 100644 index 0000000000..77337c6445 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cs.xml new file mode 100644 index 0000000000..83804ccaf4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_elevator.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_elevator.xml new file mode 100644 index 0000000000..6be59c154b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_hsblock.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_hsblock.xml new file mode 100644 index 0000000000..4bb50c2b4f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_lift.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_lift.xml new file mode 100644 index 0000000000..2912385190 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_daiku.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_daiku.xml new file mode 100644 index 0000000000..1524c7a26c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ddan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ddan_objects.xml new file mode 100644 index 0000000000..3fc563b96f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekubaba.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekubaba.xml new file mode 100644 index 0000000000..7202a833fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekujr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekujr.xml new file mode 100644 index 0000000000..e906bf61c4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekunuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekunuts.xml new file mode 100644 index 0000000000..5fceef4165 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_6k.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_6k.xml new file mode 100644 index 0000000000..73058d5e46 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_kekkai.xml new file mode 100644 index 0000000000..aa54bc2eef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_tre_lgt.xml new file mode 100644 index 0000000000..9ea19012b7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dh.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dh.xml new file mode 100644 index 0000000000..7a52d7dbe7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dnk.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dnk.xml new file mode 100644 index 0000000000..3bce343048 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dns.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dns.xml new file mode 100644 index 0000000000..8b78ffcf20 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodojr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodojr.xml new file mode 100644 index 0000000000..4dfd7d6e45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodongo.xml new file mode 100644 index 0000000000..779e20e9dc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dog.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dog.xml new file mode 100644 index 0000000000..ef00442b60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_gerudo.xml new file mode 100644 index 0000000000..2f17262041 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_killer.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_killer.xml new file mode 100644 index 0000000000..a37f590d60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds.xml new file mode 100644 index 0000000000..0413a9e2e8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds2.xml new file mode 100644 index 0000000000..683bcc68d4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_du.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_du.xml new file mode 100644 index 0000000000..0babd962b9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dy_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dy_obj.xml new file mode 100644 index 0000000000..5e792edb50 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ec.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ec.xml new file mode 100644 index 0000000000..7ec83e284d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_crystal_light.xml new file mode 100644 index 0000000000..9215b6a394 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_doughnut.xml new file mode 100644 index 0000000000..7f12c56f53 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_erupc.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_erupc.xml new file mode 100644 index 0000000000..800d9535f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_fire_ball.xml new file mode 100644 index 0000000000..2fc65b16ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_flash.xml new file mode 100644 index 0000000000..5f962f162b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_lgt_shower.xml new file mode 100644 index 0000000000..67ef5ce7e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_star_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_star_field.xml new file mode 100644 index 0000000000..00b47c460f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_tw.xml new file mode 100644 index 0000000000..de53765696 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ei.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ei.xml new file mode 100644 index 0000000000..e4132491f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fa.xml new file mode 100644 index 0000000000..2f1bf9a5e8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd.xml new file mode 100644 index 0000000000..2609579670 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd2.xml new file mode 100644 index 0000000000..44b5f5f9c1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fhg.xml new file mode 100644 index 0000000000..669875aaf8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fire.xml new file mode 100644 index 0000000000..49bf620cb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_firefly.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_firefly.xml new file mode 100644 index 0000000000..8c26a43418 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fish.xml new file mode 100644 index 0000000000..f5ad4f6da0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fr.xml new file mode 100644 index 0000000000..25ee2ad42e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fu.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fu.xml new file mode 100644 index 0000000000..82c449e3de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fw.xml new file mode 100644 index 0000000000..ee9821d263 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fz.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fz.xml new file mode 100644 index 0000000000..dad6fec5ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon.xml new file mode 100644 index 0000000000..c654c7fec9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon2.xml new file mode 100644 index 0000000000..7e715dd414 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime1.xml new file mode 100644 index 0000000000..b1016299bc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime2.xml new file mode 100644 index 0000000000..180e5995c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime3.xml new file mode 100644 index 0000000000..be4c4dcb15 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_objects.xml new file mode 100644 index 0000000000..5e32610ffc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ge1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ge1.xml new file mode 100644 index 0000000000..79e0768b81 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geff.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geff.xml new file mode 100644 index 0000000000..f0667743b0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geldb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geldb.xml new file mode 100644 index 0000000000..49b12ef2e5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrow.xml new file mode 100644 index 0000000000..4b58787a9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrowcase.xml new file mode 100644 index 0000000000..267b0a734d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bean.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bean.xml new file mode 100644 index 0000000000..e74247816f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_1.xml new file mode 100644 index 0000000000..bae86c11d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_2.xml new file mode 100644 index 0000000000..1400c4a4d4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bombpouch.xml new file mode 100644 index 0000000000..07134748c3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boomerang.xml new file mode 100644 index 0000000000..3c1a0fe7fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boots_2.xml new file mode 100644 index 0000000000..3bcb6a47ae --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bosskey.xml new file mode 100644 index 0000000000..e5e4bc86c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle.xml new file mode 100644 index 0000000000..3b0884a03f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle_letter.xml new file mode 100644 index 0000000000..443219caf5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bow.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bow.xml new file mode 100644 index 0000000000..946e9c4965 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bracelet.xml new file mode 100644 index 0000000000..5a0b62a60a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_brokensword.xml new file mode 100644 index 0000000000..408741ac54 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_butterfly.xml new file mode 100644 index 0000000000..7b60a77247 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_clothes.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_clothes.xml new file mode 100644 index 0000000000..3f897b6d13 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_coin.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_coin.xml new file mode 100644 index 0000000000..22e29f255f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_compass.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_compass.xml new file mode 100644 index 0000000000..076229b11e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_dekupouch.xml new file mode 100644 index 0000000000..8925e6fa5f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_egg.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_egg.xml new file mode 100644 index 0000000000..2b2e2847db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_eye_lotion.xml new file mode 100644 index 0000000000..5128c5f6ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fire.xml new file mode 100644 index 0000000000..4bfd76a7c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fish.xml new file mode 100644 index 0000000000..edb39dc297 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_frog.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_frog.xml new file mode 100644 index 0000000000..a656c306bd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudo.xml new file mode 100644 index 0000000000..d65daee8e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudomask.xml new file mode 100644 index 0000000000..cfcb878d9b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ghost.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ghost.xml new file mode 100644 index 0000000000..795f0cfd10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_glasses.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_glasses.xml new file mode 100644 index 0000000000..63d32ab5ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gloves.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gloves.xml new file mode 100644 index 0000000000..0e1c4259d5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_goddess.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_goddess.xml new file mode 100644 index 0000000000..50cbdd8918 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_golonmask.xml new file mode 100644 index 0000000000..844d90e714 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_grass.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_grass.xml new file mode 100644 index 0000000000..ae7834201a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hammer.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hammer.xml new file mode 100644 index 0000000000..feb5c8659d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_heart.xml new file mode 100644 index 0000000000..48e78b1b5c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hearts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hearts.xml new file mode 100644 index 0000000000..d2e763e631 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hookshot.xml new file mode 100644 index 0000000000..a6b3b0fdac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hoverboots.xml new file mode 100644 index 0000000000..6d41df8fd0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_insect.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_insect.xml new file mode 100644 index 0000000000..7af5b5b3b2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_jewel.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_jewel.xml new file mode 100644 index 0000000000..e83c651164 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_key.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_key.xml new file mode 100644 index 0000000000..a37d45a71c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 0000000000..46eff7d3e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_letter.xml new file mode 100644 index 0000000000..bea8683390 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_liquid.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_liquid.xml new file mode 100644 index 0000000000..18a5c3d7a2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_longsword.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_longsword.xml new file mode 100644 index 0000000000..7161e42e38 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_m_arrow.xml new file mode 100644 index 0000000000..0fd659ae95 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_magicpot.xml new file mode 100644 index 0000000000..7623e6353e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_map.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_map.xml new file mode 100644 index 0000000000..471c1dab97 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_medal.xml new file mode 100644 index 0000000000..28e5b1e683 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_melody.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_melody.xml new file mode 100644 index 0000000000..b01fca9538 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_milk.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_milk.xml new file mode 100644 index 0000000000..a3e223b3e6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_mushroom.xml new file mode 100644 index 0000000000..5b19bca743 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_niwatori.xml new file mode 100644 index 0000000000..c8389f62c2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_nuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_nuts.xml new file mode 100644 index 0000000000..c59903c43d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina.xml new file mode 100644 index 0000000000..82607677d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina_0.xml new file mode 100644 index 0000000000..2c5f70d984 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_pachinko.xml new file mode 100644 index 0000000000..5f808baf92 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_powder.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_powder.xml new file mode 100644 index 0000000000..fb7dc0155d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_prescription.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_prescription.xml new file mode 100644 index 0000000000..75ae7eb2b7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_purse.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_purse.xml new file mode 100644 index 0000000000..054731dec7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rabit_mask.xml new file mode 100644 index 0000000000..9d4eb9487f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_redead_mask.xml new file mode 100644 index 0000000000..7de08487f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rupy.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rupy.xml new file mode 100644 index 0000000000..0a1af96d0f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_saw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_saw.xml new file mode 100644 index 0000000000..dcc038b7c1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_scale.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_scale.xml new file mode 100644 index 0000000000..1cf5de5b99 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_seed.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_seed.xml new file mode 100644 index 0000000000..82c15c82d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_1.xml new file mode 100644 index 0000000000..2f11e3f6d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_2.xml new file mode 100644 index 0000000000..176ae025fe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_3.xml new file mode 100644 index 0000000000..8d1e5dafd4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_skj_mask.xml new file mode 100644 index 0000000000..e6c90f76f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soldout.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soldout.xml new file mode 100644 index 0000000000..a15b1253e3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soul.xml new file mode 100644 index 0000000000..a68178eba5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_stick.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_stick.xml new file mode 100644 index 0000000000..fed89f4659 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sutaru.xml new file mode 100644 index 0000000000..a2606afbe3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sword_1.xml new file mode 100644 index 0000000000..e1119abca0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ticketstone.xml new file mode 100644 index 0000000000..73bf888d10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_truth_mask.xml new file mode 100644 index 0000000000..3b4edf3dee --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_zoramask.xml new file mode 100644 index 0000000000..e3b1ab10ec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gj.xml new file mode 100644 index 0000000000..ee6dab74f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gjyo_objects.xml new file mode 100644 index 0000000000..ea4f8444fb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gla.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gla.xml new file mode 100644 index 0000000000..499a3720d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gm.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gm.xml new file mode 100644 index 0000000000..91b10cc428 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd.xml new file mode 100644 index 0000000000..3ae3b57f3d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd_magic.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd_magic.xml new file mode 100644 index 0000000000..a88d419d7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gndd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gndd.xml new file mode 100644 index 0000000000..8bf5d770c4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_god_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_god_lgt.xml new file mode 100644 index 0000000000..60df9e4693 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gol.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gol.xml new file mode 100644 index 0000000000..7e04508cb6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goma.xml new file mode 100644 index 0000000000..922678a3cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goroiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goroiwa.xml new file mode 100644 index 0000000000..5d406e9578 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gr.xml new file mode 100644 index 0000000000..5f7360ae57 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gs.xml new file mode 100644 index 0000000000..145be16653 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gt.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gt.xml new file mode 100644 index 0000000000..1d79d4e39e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka.xml new file mode 100644 index 0000000000..f6b263c375 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_door.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_door.xml new file mode 100644 index 0000000000..1376d03569 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_objects.xml new file mode 100644 index 0000000000..3ca6d27c08 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hakach_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hakach_objects.xml new file mode 100644 index 0000000000..0de02aaf15 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hata.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hata.xml new file mode 100644 index 0000000000..b0324c3be3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_heavy_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_heavy_object.xml new file mode 100644 index 0000000000..ecc7953211 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hidan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hidan_objects.xml new file mode 100644 index 0000000000..f41c0ee5ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hintnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hintnuts.xml new file mode 100644 index 0000000000..a7290f3955 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hni.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hni.xml new file mode 100644 index 0000000000..6b317eb7a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse.xml new file mode 100644 index 0000000000..74619e5977 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_ganon.xml new file mode 100644 index 0000000000..0a55462e25 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_link_child.xml new file mode 100644 index 0000000000..146c564f55 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_normal.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_normal.xml new file mode 100644 index 0000000000..2facab39c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_zelda.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_zelda.xml new file mode 100644 index 0000000000..af270c6585 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hs.xml new file mode 100644 index 0000000000..cf5d06e1a2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_human.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_human.xml new file mode 100644 index 0000000000..05795cb332 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ice_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ice_objects.xml new file mode 100644 index 0000000000..c7d059d709 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ik.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ik.xml new file mode 100644 index 0000000000..8a6028f7c0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_im.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_im.xml new file mode 100644 index 0000000000..a628a113a4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_in.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_in.xml new file mode 100644 index 0000000000..84c1140475 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ingate.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ingate.xml new file mode 100644 index 0000000000..e6be42bebf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jj.xml new file mode 100644 index 0000000000..62bae8cb91 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_js.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_js.xml new file mode 100644 index 0000000000..ff7bd3efa1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_door.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_door.xml new file mode 100644 index 0000000000..60a7b37886 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_iron.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_iron.xml new file mode 100644 index 0000000000..c6f6773c6a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_obj.xml new file mode 100644 index 0000000000..a1f19b8066 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ka.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ka.xml new file mode 100644 index 0000000000..eb952732b4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kanban.xml new file mode 100644 index 0000000000..9ffc7a2ceb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kibako2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kibako2.xml new file mode 100644 index 0000000000..a701b294de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kingdodongo.xml new file mode 100644 index 0000000000..5ef07a26f7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_km1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_km1.xml new file mode 100644 index 0000000000..0a918a798e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kusa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kusa.xml new file mode 100644 index 0000000000..67291a5543 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kw1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kw1.xml new file mode 100644 index 0000000000..eab561b1fb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kz.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kz.xml new file mode 100644 index 0000000000..4624fefdb6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_light_ring.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_light_ring.xml new file mode 100644 index 0000000000..babe7d2aa7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightbox.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightbox.xml new file mode 100644 index 0000000000..552a79d7c7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightswitch.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightswitch.xml new file mode 100644 index 0000000000..cfd5dcfb40 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_boy.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_boy.xml new file mode 100644 index 0000000000..6351af5050 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_child.xml new file mode 100644 index 0000000000..0de4003731 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma1.xml new file mode 100644 index 0000000000..63eeb38950 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma2.xml new file mode 100644 index 0000000000..ce5910fb80 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mag.xml new file mode 100644 index 0000000000..063d801a3f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mag.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mamenoki.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mamenoki.xml new file mode 100644 index 0000000000..819d890225 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mastergolon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mastergolon.xml new file mode 100644 index 0000000000..6dd9d16592 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokiri.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokiri.xml new file mode 100644 index 0000000000..af5a9ec153 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokirihead.xml new file mode 100644 index 0000000000..c64aa1c49e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterzoora.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterzoora.xml new file mode 100644 index 0000000000..2c703274e1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mb.xml new file mode 100644 index 0000000000..23c0930c02 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_md.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_md.xml new file mode 100644 index 0000000000..161c73dca1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_medal.xml new file mode 100644 index 0000000000..533872a551 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_menkuri_objects.xml new file mode 100644 index 0000000000..4c2b51df5b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mir_ray.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mir_ray.xml new file mode 100644 index 0000000000..2acc9391ab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mizu_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mizu_objects.xml new file mode 100644 index 0000000000..5a18b95cfe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin.xml new file mode 100644 index 0000000000..daf9b05412 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_dark.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_dark.xml new file mode 100644 index 0000000000..2fa0bdbe4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flame.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flame.xml new file mode 100644 index 0000000000..6274feaee1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flash.xml new file mode 100644 index 0000000000..c1040ea118 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_ice.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_ice.xml new file mode 100644 index 0000000000..1aaeea193d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_oka.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_oka.xml new file mode 100644 index 0000000000..0f823b9237 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_soul.xml new file mode 100644 index 0000000000..6386f7f9ea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_wind.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_wind.xml new file mode 100644 index 0000000000..8bba7eb91b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mk.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mk.xml new file mode 100644 index 0000000000..0b4aaae8aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mm.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mm.xml new file mode 100644 index 0000000000..b27837e57e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mo.xml new file mode 100644 index 0000000000..4c4be74c83 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1.xml new file mode 100644 index 0000000000..bb1b31e2fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1a.xml new file mode 100644 index 0000000000..c750ce20d0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2.xml new file mode 100644 index 0000000000..785b858571 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2a.xml new file mode 100644 index 0000000000..ad1bb4d5f0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_objects.xml new file mode 100644 index 0000000000..58ea8c085c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_tex.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_tex.xml new file mode 100644 index 0000000000..8ba4ff2d34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ms.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ms.xml new file mode 100644 index 0000000000..a87d0e6b36 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mu.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mu.xml new file mode 100644 index 0000000000..7251ff7212 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nb.xml new file mode 100644 index 0000000000..74de9e2859 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_niw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_niw.xml new file mode 100644 index 0000000000..4eafec9566 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nwc.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nwc.xml new file mode 100644 index 0000000000..96ffa32383 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ny.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ny.xml new file mode 100644 index 0000000000..e2e8187ff8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA1.xml new file mode 100644 index 0000000000..1d665f1010 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA10.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA10.xml new file mode 100644 index 0000000000..65d0808349 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA11.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA11.xml new file mode 100644 index 0000000000..92ae474b60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA2.xml new file mode 100644 index 0000000000..ffdcd79896 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA3.xml new file mode 100644 index 0000000000..a492bd8751 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA4.xml new file mode 100644 index 0000000000..dcdbbfff9b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA5.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA5.xml new file mode 100644 index 0000000000..55072176dd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA6.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA6.xml new file mode 100644 index 0000000000..c17a510881 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA7.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA7.xml new file mode 100644 index 0000000000..52c68f6394 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA8.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA8.xml new file mode 100644 index 0000000000..8ed2d3df50 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA9.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA9.xml new file mode 100644 index 0000000000..d5c16abfcd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB1.xml new file mode 100644 index 0000000000..2f50c967b2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB2.xml new file mode 100644 index 0000000000..230783ceae --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB3.xml new file mode 100644 index 0000000000..1c42ddaccc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB4.xml new file mode 100644 index 0000000000..2924c9e753 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1.xml new file mode 100644 index 0000000000..4d5b1663fe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE10.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE10.xml new file mode 100644 index 0000000000..04ce914372 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE11.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE11.xml new file mode 100644 index 0000000000..04f6f186da --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE12.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE12.xml new file mode 100644 index 0000000000..a5fa39fd25 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1s.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1s.xml new file mode 100644 index 0000000000..d311e60104 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE2.xml new file mode 100644 index 0000000000..af62ad6d11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE3.xml new file mode 100644 index 0000000000..95227da384 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4.xml new file mode 100644 index 0000000000..ae48d2adef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4s.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4s.xml new file mode 100644 index 0000000000..6037de52f9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE5.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE5.xml new file mode 100644 index 0000000000..f5edf745aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE6.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE6.xml new file mode 100644 index 0000000000..95bb602b6b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE7.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE7.xml new file mode 100644 index 0000000000..b3e588d4c2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE8.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE8.xml new file mode 100644 index 0000000000..be5de24947 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE9.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE9.xml new file mode 100644 index 0000000000..8ea7ee18c7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE_anime.xml new file mode 100644 index 0000000000..f6b4659e22 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1d_map.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1d_map.xml new file mode 100644 index 0000000000..f14fecd825 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1s.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1s.xml new file mode 100644 index 0000000000..fe41dde630 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_o_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_o_anime.xml new file mode 100644 index 0000000000..4ef4ac44c8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_okuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_okuta.xml new file mode 100644 index 0000000000..b4fccea6f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_opening_demo1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_opening_demo1.xml new file mode 100644 index 0000000000..fd03230279 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os.xml new file mode 100644 index 0000000000..5880a92930 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os_anime.xml new file mode 100644 index 0000000000..f23636343c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ossan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ossan.xml new file mode 100644 index 0000000000..5788e3a20d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ouke_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ouke_haka.xml new file mode 100644 index 0000000000..11da9b26ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_owl.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_owl.xml new file mode 100644 index 0000000000..64fdf64c53 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_peehat.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_peehat.xml new file mode 100644 index 0000000000..42ee66cdef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_composer.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_composer.xml new file mode 100644 index 0000000000..ff995efceb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_field.xml new file mode 100644 index 0000000000..78bc0d65ad --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_sisters.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_sisters.xml new file mode 100644 index 0000000000..b429be2588 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_poh.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_poh.xml new file mode 100644 index 0000000000..be6d6eff4b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ps.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ps.xml new file mode 100644 index 0000000000..9f9c894a60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_pu_box.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_pu_box.xml new file mode 100644 index 0000000000..e1d686e979 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rd.xml new file mode 100644 index 0000000000..22c7d33738 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_reeba.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_reeba.xml new file mode 100644 index 0000000000..32c697bd9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_relay_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_relay_objects.xml new file mode 100644 index 0000000000..47b92fcd2d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rl.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rl.xml new file mode 100644 index 0000000000..2a5ad30f6b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rr.xml new file mode 100644 index 0000000000..98726b14bb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rs.xml new file mode 100644 index 0000000000..152b5489e1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru1.xml new file mode 100644 index 0000000000..3d413619ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru2.xml new file mode 100644 index 0000000000..fedf37d48b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sa.xml new file mode 100644 index 0000000000..ec45ac961d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sb.xml new file mode 100644 index 0000000000..64d3bb005a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sd.xml new file mode 100644 index 0000000000..fb58428c3f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shop_dungen.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shop_dungen.xml new file mode 100644 index 0000000000..594c43d390 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shopnuts.xml new file mode 100644 index 0000000000..7065f8941a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_siofuki.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_siofuki.xml new file mode 100644 index 0000000000..a23240a728 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sk2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sk2.xml new file mode 100644 index 0000000000..f2e7ef6d89 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skb.xml new file mode 100644 index 0000000000..5b5efb4848 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skj.xml new file mode 100644 index 0000000000..74548e5185 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_break.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_break.xml new file mode 100644 index 0000000000..d3be88315f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_objects.xml new file mode 100644 index 0000000000..10fb13aeac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoya.xml new file mode 100644 index 0000000000..d44b944e0e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoyab.xml new file mode 100644 index 0000000000..720f50cd3e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects.xml new file mode 100644 index 0000000000..413e032a9c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects2.xml new file mode 100644 index 0000000000..36741a9492 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot02_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot02_objects.xml new file mode 100644 index 0000000000..65f45ff515 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot03_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot03_object.xml new file mode 100644 index 0000000000..f182e7d99a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot04_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot04_objects.xml new file mode 100644 index 0000000000..66293d7523 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot05_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot05_objects.xml new file mode 100644 index 0000000000..6e70791493 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot06_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot06_objects.xml new file mode 100644 index 0000000000..e3da63b0f0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot07_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot07_object.xml new file mode 100644 index 0000000000..5bc2bfb6bf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot08_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot08_obj.xml new file mode 100644 index 0000000000..4d71f3473f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot09_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot09_obj.xml new file mode 100644 index 0000000000..eb65283931 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot11_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot11_obj.xml new file mode 100644 index 0000000000..257298f7cc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot12_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot12_obj.xml new file mode 100644 index 0000000000..d619c781e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot15_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot15_obj.xml new file mode 100644 index 0000000000..bd59b8cd18 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot16_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot16_obj.xml new file mode 100644 index 0000000000..d39de812a9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot17_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot17_obj.xml new file mode 100644 index 0000000000..d4239d8d28 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot18_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot18_obj.xml new file mode 100644 index 0000000000..cc12b78946 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ssh.xml new file mode 100644 index 0000000000..6283f8e9f2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sst.xml new file mode 100644 index 0000000000..b874b9a418 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_st.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_st.xml new file mode 100644 index 0000000000..983b9e2eab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_stream.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_stream.xml new file mode 100644 index 0000000000..59b0838e47 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_syokudai.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_syokudai.xml new file mode 100644 index 0000000000..c1670edece --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ta.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ta.xml new file mode 100644 index 0000000000..5e446bf5c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_timeblock.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_timeblock.xml new file mode 100644 index 0000000000..1d6b9e698c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tite.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tite.xml new file mode 100644 index 0000000000..1be65c4950 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tk.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tk.xml new file mode 100644 index 0000000000..6b6cce7244 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toki_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toki_objects.xml new file mode 100644 index 0000000000..cd07e60d2b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_torch2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_torch2.xml new file mode 100644 index 0000000000..3388e7d34e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toryo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toryo.xml new file mode 100644 index 0000000000..73f3dcb1e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tp.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tp.xml new file mode 100644 index 0000000000..8ea908825e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tr.xml new file mode 100644 index 0000000000..17ab9ae392 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_trap.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_trap.xml new file mode 100644 index 0000000000..56195cf41b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_triforce_spot.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_triforce_spot.xml new file mode 100644 index 0000000000..87d4494589 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ts.xml new file mode 100644 index 0000000000..567277bc39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tsubo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tsubo.xml new file mode 100644 index 0000000000..ee2c5e1846 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tw.xml new file mode 100644 index 0000000000..c7fd2a60be --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_umajump.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_umajump.xml new file mode 100644 index 0000000000..2ee4ade46a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vali.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vali.xml new file mode 100644 index 0000000000..2bab5efaa6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vase.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vase.xml new file mode 100644 index 0000000000..091d4c51e3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vm.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vm.xml new file mode 100644 index 0000000000..c5b949b36e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wallmaster.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wallmaster.xml new file mode 100644 index 0000000000..fbbc4f4af3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp1.xml new file mode 100644 index 0000000000..1497d7a108 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp2.xml new file mode 100644 index 0000000000..b6d1b3624c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wf.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wf.xml new file mode 100644 index 0000000000..ebfb708d2d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wood02.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wood02.xml new file mode 100644 index 0000000000..47ec342caa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_xc.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_xc.xml new file mode 100644 index 0000000000..bb2bf3e7af --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yabusame_point.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yabusame_point.xml new file mode 100644 index 0000000000..bed9e8a609 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ydan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ydan_objects.xml new file mode 100644 index 0000000000..e2adf307f7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yukabyun.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yukabyun.xml new file mode 100644 index 0000000000..d594ebbb89 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zf.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zf.xml new file mode 100644 index 0000000000..7f20eb7866 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zg.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zg.xml new file mode 100644 index 0000000000..79005516c4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl1.xml new file mode 100644 index 0000000000..001e5be145 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2.xml new file mode 100644 index 0000000000..959a919ec6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime1.xml new file mode 100644 index 0000000000..cada504867 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime2.xml new file mode 100644 index 0000000000..47016e2e00 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl4.xml new file mode 100644 index 0000000000..8e7a2837ed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zo.xml new file mode 100644 index 0000000000..77465760ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 0000000000..ef34ff91e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 0000000000..13bb1b610e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Light.xml new file mode 100644 index 0000000000..6f985a0b1e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 0000000000..c3c809065a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 0000000000..3106fdab5e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 0000000000..ddc03690ed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 0000000000..72b81e798d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 0000000000..802a42bd25 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Sst.xml new file mode 100644 index 0000000000..23093c9f14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Demo_Shd.xml new file mode 100644 index 0000000000..e9d9ba2228 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Bili.xml new file mode 100644 index 0000000000..5db330f6ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 0000000000..ddbf1bb91d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 0000000000..cab7d3ce43 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 0000000000..a4cea2ff90 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Holl.xml new file mode 100644 index 0000000000..0a02bddb1c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 0000000000..de46f6ed32 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Kanban.xml new file mode 100644 index 0000000000..e181840b80 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sda.xml new file mode 100644 index 0000000000..cd24cb8d7b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ssh.xml new file mode 100644 index 0000000000..2e419c8c4f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_St.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_St.xml new file mode 100644 index 0000000000..fecbf6f1ed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sth.xml new file mode 100644 index 0000000000..22f1e683ec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_End_Title.xml new file mode 100644 index 0000000000..7b083bdd20 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_File_Choose.xml new file mode 100644 index 0000000000..6b0b7848de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_File_Choose.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Dark.xml new file mode 100644 index 0000000000..a037bbdf6a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Fire.xml new file mode 100644 index 0000000000..1f42916e2a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Wind.xml new file mode 100644 index 0000000000..19bdd2f32e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 0000000000..ff49072ab3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 0000000000..8e0c6beaca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 0000000000..c35e96db14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 0000000000..a56c505ad5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 0000000000..7d0f5ddc5d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 0000000000..c7513e94c1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/Bmori1.xml new file mode 100644 index 0000000000..373f360303 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 0000000000..89331ecc2f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan.xml new file mode 100644 index 0000000000..e557c80a55 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 0000000000..97401aff65 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 0000000000..d36ac6b774 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HIDAN.xml new file mode 100644 index 0000000000..fa4d784f1a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin.xml new file mode 100644 index 0000000000..00c5aa82dd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 0000000000..99ae2b3efe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan.xml new file mode 100644 index 0000000000..a9e520f4cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan_boss.xml new file mode 100644 index 0000000000..9fccf2c301 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan.xml new file mode 100644 index 0000000000..1446a9c98b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan_boss.xml new file mode 100644 index 0000000000..05633e53e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon.xml new file mode 100644 index 0000000000..f857dbe94e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_boss.xml new file mode 100644 index 0000000000..36c5e81070 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_demo.xml new file mode 100644 index 0000000000..56c98efed7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_final.xml new file mode 100644 index 0000000000..3ec568cfb9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 0000000000..84ef36950c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_tou.xml new file mode 100644 index 0000000000..1ae37b9637 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontika.xml new file mode 100644 index 0000000000..a5ff210ce1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 0000000000..060d4941ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/gerudoway.xml new file mode 100644 index 0000000000..8272776143 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 0000000000..0f1bc3b285 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinboss.xml new file mode 100644 index 0000000000..86c0d317b2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinzou.xml new file mode 100644 index 0000000000..bc14a46ac3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/men.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/men.xml new file mode 100644 index 0000000000..d9e5960e82 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/moribossroom.xml new file mode 100644 index 0000000000..b9959eefab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan.xml new file mode 100644 index 0000000000..aed7d26604 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan_boss.xml new file mode 100644 index 0000000000..7ea240547a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/bowling.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/bowling.xml new file mode 100644 index 0000000000..9a41763a27 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 0000000000..4f9a03fc02 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa.xml new file mode 100644 index 0000000000..06d89f2fe7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 0000000000..6f4c181e0e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hakasitarelay.xml new file mode 100644 index 0000000000..91be63d147 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hut.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hut.xml new file mode 100644 index 0000000000..a4ef5715ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hylia_labo.xml new file mode 100644 index 0000000000..56822e67a7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/impa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/impa.xml new file mode 100644 index 0000000000..db757e3d3c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kakariko.xml new file mode 100644 index 0000000000..e4e9b102c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kenjyanoma.xml new file mode 100644 index 0000000000..4e8a58f3b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home.xml new file mode 100644 index 0000000000..8c0305493a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home3.xml new file mode 100644 index 0000000000..9f36eb41c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home4.xml new file mode 100644 index 0000000000..eb861aedb4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home5.xml new file mode 100644 index 0000000000..974987feda --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/labo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/labo.xml new file mode 100644 index 0000000000..c0a9d2eb8c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/link_home.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/link_home.xml new file mode 100644 index 0000000000..2fb88ae347 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/mahouya.xml new file mode 100644 index 0000000000..8ae462f9db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/malon_stable.xml new file mode 100644 index 0000000000..aff97eeb86 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/miharigoya.xml new file mode 100644 index 0000000000..63f8676ac1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/nakaniwa.xml new file mode 100644 index 0000000000..2fb2d5e6a4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/syatekijyou.xml new file mode 100644 index 0000000000..05243b52ca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/takaraya.xml new file mode 100644 index 0000000000..5b438980b7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tent.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tent.xml new file mode 100644 index 0000000000..de72cc5f45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tokinoma.xml new file mode 100644 index 0000000000..d7878b8951 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 0000000000..3b6dd2dec2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 0000000000..90a8d95d09 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/enrui.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/enrui.xml new file mode 100644 index 0000000000..d8c06e5454 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/entra_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/entra_n.xml new file mode 100644 index 0000000000..5b408ac3a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana.xml new file mode 100644 index 0000000000..e7dc93dd0c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana2.xml new file mode 100644 index 0000000000..2d8ba4906a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana_ouke.xml new file mode 100644 index 0000000000..17f53613e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hiral_demo.xml new file mode 100644 index 0000000000..1331fdd4c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakariko3.xml new file mode 100644 index 0000000000..07b62c44df --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakusiana.xml new file mode 100644 index 0000000000..c3f993ff4f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kinsuta.xml new file mode 100644 index 0000000000..aac0f6c4ea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley.xml new file mode 100644 index 0000000000..c304673032 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley_n.xml new file mode 100644 index 0000000000..65db604113 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_day.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_day.xml new file mode 100644 index 0000000000..00887e69cd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_night.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_night.xml new file mode 100644 index 0000000000..c58e38744e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_ruins.xml new file mode 100644 index 0000000000..f0ec75e759 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine.xml new file mode 100644 index 0000000000..b9ddf2cf70 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_n.xml new file mode 100644 index 0000000000..4878338aa1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_r.xml new file mode 100644 index 0000000000..1220367919 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/turibori.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/turibori.xml new file mode 100644 index 0000000000..0633224d9c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/entra.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/entra.xml new file mode 100644 index 0000000000..92ee57f59a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/souko.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/souko.xml new file mode 100644 index 0000000000..8dd9d9e48a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot00.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot00.xml new file mode 100644 index 0000000000..508d9309b3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot01.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot01.xml new file mode 100644 index 0000000000..eb725afa68 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot02.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot02.xml new file mode 100644 index 0000000000..c7924c29db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot03.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot03.xml new file mode 100644 index 0000000000..9434185f44 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot04.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot04.xml new file mode 100644 index 0000000000..f338604207 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot05.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot05.xml new file mode 100644 index 0000000000..4f7c62b91e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot06.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot06.xml new file mode 100644 index 0000000000..f4af602cfd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot07.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot07.xml new file mode 100644 index 0000000000..eeb976f7f6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot08.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot08.xml new file mode 100644 index 0000000000..86582f0dca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot09.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot09.xml new file mode 100644 index 0000000000..5bb9e059c7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot10.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot10.xml new file mode 100644 index 0000000000..66365e3d86 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot11.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot11.xml new file mode 100644 index 0000000000..76ff3b8223 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot12.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot12.xml new file mode 100644 index 0000000000..e21523b217 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot13.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot13.xml new file mode 100644 index 0000000000..c689130650 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot15.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot15.xml new file mode 100644 index 0000000000..e75f7b6845 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot16.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot16.xml new file mode 100644 index 0000000000..f41b226f8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot17.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot17.xml new file mode 100644 index 0000000000..feb267251e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot18.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot18.xml new file mode 100644 index 0000000000..d70fccf4bb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot20.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot20.xml new file mode 100644 index 0000000000..1381f6ecbe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/alley_shop.xml new file mode 100644 index 0000000000..95548de1bd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/drag.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/drag.xml new file mode 100644 index 0000000000..acb6515fba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/face_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/face_shop.xml new file mode 100644 index 0000000000..16a9746081 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/golon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/golon.xml new file mode 100644 index 0000000000..c586727988 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/kokiri_shop.xml new file mode 100644 index 0000000000..50cd633e57 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/night_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/night_shop.xml new file mode 100644 index 0000000000..5954d9c83d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/shop1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/shop1.xml new file mode 100644 index 0000000000..525a06d633 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/zoora.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/zoora.xml new file mode 100644 index 0000000000..0e4ac18f8c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_field.xml new file mode 100644 index 0000000000..789a554ce8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_ydan.xml new file mode 100644 index 0000000000..f784afcf45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/text/message_data_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/text/message_data_static.xml new file mode 100644 index 0000000000..fc181170ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/backgrounds.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/backgrounds.xml new file mode 100644 index 0000000000..c60ff57a8a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/boss_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/boss_title_cards.xml new file mode 100644 index 0000000000..84f555bd10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/do_action_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/do_action_static.xml new file mode 100644 index 0000000000..efabd54a58 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_24_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_24_static.xml new file mode 100644 index 0000000000..cdb8cc7379 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_dungeon_static.xml new file mode 100644 index 0000000000..873c490fc5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_field_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_field_static.xml new file mode 100644 index 0000000000..ed991406b5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_gameover_static.xml new file mode 100644 index 0000000000..ffd3928680 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_jpn_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_jpn_static.xml new file mode 100644 index 0000000000..f2fe854b8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_nes_static.xml new file mode 100644 index 0000000000..6cd92acfca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_static.xml new file mode 100644 index 0000000000..9e844615b1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/item_name_static.xml new file mode 100644 index 0000000000..1bc074c2ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/kanji.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/kanji.xml new file mode 100644 index 0000000000..5159387a13 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_48x85_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_48x85_static.xml new file mode 100644 index 0000000000..b2ea46340a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_grand_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_grand_static.xml new file mode 100644 index 0000000000..201955bfc3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_i_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_i_static.xml new file mode 100644 index 0000000000..1721f6d848 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_name_static.xml new file mode 100644 index 0000000000..ca4c4c0bd6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_static.xml new file mode 100644 index 0000000000..afdde60def --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_texture_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_texture_static.xml new file mode 100644 index 0000000000..bbf7e1259e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/nes_font_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/nes_font_static.xml new file mode 100644 index 0000000000..f1b80ee045 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/nes_font_static.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/nintendo_rogo_static.xml new file mode 100644 index 0000000000..f09de3b0f9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/parameter_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/parameter_static.xml new file mode 100644 index 0000000000..c51dacf1f6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/place_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/place_title_cards.xml new file mode 100644 index 0000000000..b688cce00c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/skyboxes.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/skyboxes.xml new file mode 100644 index 0000000000..104ffb2a3f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/title_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/title_static.xml new file mode 100644 index 0000000000..5f58c5a820 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml new file mode 100644 index 0000000000..e9f385ca87 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml @@ -0,0 +1,639 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_circle.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_circle.xml new file mode 100644 index 0000000000..e6b4bba124 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_triforce.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_triforce.xml new file mode 100644 index 0000000000..bbc709a4fd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_wipe1.xml new file mode 100644 index 0000000000..9d2e12231a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/sys_matrix.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/sys_matrix.xml new file mode 100644 index 0000000000..1521be9f1e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/misc/link_animetion.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/misc/link_animetion.xml new file mode 100644 index 0000000000..9de1e92d36 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_dangeon_keep.xml new file mode 100644 index 0000000000..5b1a9050d9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_field_keep.xml new file mode 100644 index 0000000000..011e8f7fc7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_keep.xml new file mode 100644 index 0000000000..94eee8845e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_Bb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_Bb.xml new file mode 100644 index 0000000000..5d04bde451 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ahg.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ahg.xml new file mode 100644 index 0000000000..4d37b1b110 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_am.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_am.xml new file mode 100644 index 0000000000..b70c70d709 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ane.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ane.xml new file mode 100644 index 0000000000..1e29b351e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ani.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ani.xml new file mode 100644 index 0000000000..c70621c6f9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_anubice.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_anubice.xml new file mode 100644 index 0000000000..fb029586ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_aob.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_aob.xml new file mode 100644 index 0000000000..e6202d0cf9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_b_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_b_heart.xml new file mode 100644 index 0000000000..00f7cd6773 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bba.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bba.xml new file mode 100644 index 0000000000..ccc5c21365 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdan_objects.xml new file mode 100644 index 0000000000..dcd56d3856 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdoor.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdoor.xml new file mode 100644 index 0000000000..a092f0c23b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bg.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bg.xml new file mode 100644 index 0000000000..791226b71d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bigokuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bigokuta.xml new file mode 100644 index 0000000000..1c7d39e319 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bird.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bird.xml new file mode 100644 index 0000000000..167a5022dc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bji.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bji.xml new file mode 100644 index 0000000000..c665b6b001 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bl.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bl.xml new file mode 100644 index 0000000000..1c2ef4ec63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_blkobj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_blkobj.xml new file mode 100644 index 0000000000..345a8ebd9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bob.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bob.xml new file mode 100644 index 0000000000..289e994e47 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_boj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_boj.xml new file mode 100644 index 0000000000..4be4764ab5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombf.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombf.xml new file mode 100644 index 0000000000..83e60248d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombiwa.xml new file mode 100644 index 0000000000..26ab6b4f33 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bowl.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bowl.xml new file mode 100644 index 0000000000..ffe6d43db7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_box.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_box.xml new file mode 100644 index 0000000000..106d2d3356 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_brob.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_brob.xml new file mode 100644 index 0000000000..718dcd5617 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bubble.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bubble.xml new file mode 100644 index 0000000000..f5de186920 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bv.xml new file mode 100644 index 0000000000..d2ebf275ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bw.xml new file mode 100644 index 0000000000..6fd39fbb1c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bwall.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bwall.xml new file mode 100644 index 0000000000..d4f43ddc14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bxa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bxa.xml new file mode 100644 index 0000000000..fb78c117e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cne.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cne.xml new file mode 100644 index 0000000000..0c14d0bc54 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cob.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cob.xml new file mode 100644 index 0000000000..ba051cfa74 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cow.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cow.xml new file mode 100644 index 0000000000..5d067c329f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_crow.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_crow.xml new file mode 100644 index 0000000000..77337c6445 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cs.xml new file mode 100644 index 0000000000..83804ccaf4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_elevator.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_elevator.xml new file mode 100644 index 0000000000..6be59c154b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_hsblock.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_hsblock.xml new file mode 100644 index 0000000000..4bb50c2b4f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_lift.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_lift.xml new file mode 100644 index 0000000000..2912385190 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_daiku.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_daiku.xml new file mode 100644 index 0000000000..1524c7a26c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ddan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ddan_objects.xml new file mode 100644 index 0000000000..3fc563b96f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekubaba.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekubaba.xml new file mode 100644 index 0000000000..7202a833fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekujr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekujr.xml new file mode 100644 index 0000000000..e906bf61c4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekunuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekunuts.xml new file mode 100644 index 0000000000..5fceef4165 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_6k.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_6k.xml new file mode 100644 index 0000000000..73058d5e46 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_kekkai.xml new file mode 100644 index 0000000000..aa54bc2eef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_tre_lgt.xml new file mode 100644 index 0000000000..9ea19012b7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dh.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dh.xml new file mode 100644 index 0000000000..7a52d7dbe7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dnk.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dnk.xml new file mode 100644 index 0000000000..3bce343048 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dns.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dns.xml new file mode 100644 index 0000000000..8b78ffcf20 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodojr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodojr.xml new file mode 100644 index 0000000000..4dfd7d6e45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodongo.xml new file mode 100644 index 0000000000..779e20e9dc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dog.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dog.xml new file mode 100644 index 0000000000..ef00442b60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_gerudo.xml new file mode 100644 index 0000000000..2f17262041 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_killer.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_killer.xml new file mode 100644 index 0000000000..a37f590d60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds.xml new file mode 100644 index 0000000000..0413a9e2e8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds2.xml new file mode 100644 index 0000000000..683bcc68d4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_du.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_du.xml new file mode 100644 index 0000000000..0babd962b9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dy_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dy_obj.xml new file mode 100644 index 0000000000..5e792edb50 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ec.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ec.xml new file mode 100644 index 0000000000..7ec83e284d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_crystal_light.xml new file mode 100644 index 0000000000..9215b6a394 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_doughnut.xml new file mode 100644 index 0000000000..7f12c56f53 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_erupc.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_erupc.xml new file mode 100644 index 0000000000..800d9535f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_fire_ball.xml new file mode 100644 index 0000000000..2fc65b16ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_flash.xml new file mode 100644 index 0000000000..5f962f162b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_lgt_shower.xml new file mode 100644 index 0000000000..67ef5ce7e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_star_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_star_field.xml new file mode 100644 index 0000000000..00b47c460f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_tw.xml new file mode 100644 index 0000000000..de53765696 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ei.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ei.xml new file mode 100644 index 0000000000..e4132491f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fa.xml new file mode 100644 index 0000000000..2f1bf9a5e8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd.xml new file mode 100644 index 0000000000..2609579670 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd2.xml new file mode 100644 index 0000000000..44b5f5f9c1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fhg.xml new file mode 100644 index 0000000000..669875aaf8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fire.xml new file mode 100644 index 0000000000..49bf620cb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_firefly.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_firefly.xml new file mode 100644 index 0000000000..8c26a43418 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fish.xml new file mode 100644 index 0000000000..f5ad4f6da0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fr.xml new file mode 100644 index 0000000000..25ee2ad42e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fu.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fu.xml new file mode 100644 index 0000000000..82c449e3de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fw.xml new file mode 100644 index 0000000000..ee9821d263 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fz.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fz.xml new file mode 100644 index 0000000000..dad6fec5ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon.xml new file mode 100644 index 0000000000..c654c7fec9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon2.xml new file mode 100644 index 0000000000..7e715dd414 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime1.xml new file mode 100644 index 0000000000..b1016299bc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime2.xml new file mode 100644 index 0000000000..180e5995c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime3.xml new file mode 100644 index 0000000000..be4c4dcb15 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_objects.xml new file mode 100644 index 0000000000..5e32610ffc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ge1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ge1.xml new file mode 100644 index 0000000000..79e0768b81 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geff.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geff.xml new file mode 100644 index 0000000000..f0667743b0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geldb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geldb.xml new file mode 100644 index 0000000000..49b12ef2e5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrow.xml new file mode 100644 index 0000000000..4b58787a9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrowcase.xml new file mode 100644 index 0000000000..267b0a734d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bean.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bean.xml new file mode 100644 index 0000000000..e74247816f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_1.xml new file mode 100644 index 0000000000..bae86c11d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_2.xml new file mode 100644 index 0000000000..1400c4a4d4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bombpouch.xml new file mode 100644 index 0000000000..07134748c3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boomerang.xml new file mode 100644 index 0000000000..3c1a0fe7fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boots_2.xml new file mode 100644 index 0000000000..3bcb6a47ae --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bosskey.xml new file mode 100644 index 0000000000..e5e4bc86c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle.xml new file mode 100644 index 0000000000..3b0884a03f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle_letter.xml new file mode 100644 index 0000000000..443219caf5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bow.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bow.xml new file mode 100644 index 0000000000..946e9c4965 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bracelet.xml new file mode 100644 index 0000000000..5a0b62a60a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_brokensword.xml new file mode 100644 index 0000000000..408741ac54 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_butterfly.xml new file mode 100644 index 0000000000..7b60a77247 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_clothes.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_clothes.xml new file mode 100644 index 0000000000..3f897b6d13 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_coin.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_coin.xml new file mode 100644 index 0000000000..22e29f255f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_compass.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_compass.xml new file mode 100644 index 0000000000..076229b11e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_dekupouch.xml new file mode 100644 index 0000000000..8925e6fa5f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_egg.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_egg.xml new file mode 100644 index 0000000000..2b2e2847db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_eye_lotion.xml new file mode 100644 index 0000000000..5128c5f6ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fire.xml new file mode 100644 index 0000000000..4bfd76a7c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fish.xml new file mode 100644 index 0000000000..edb39dc297 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_frog.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_frog.xml new file mode 100644 index 0000000000..a656c306bd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudo.xml new file mode 100644 index 0000000000..d65daee8e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudomask.xml new file mode 100644 index 0000000000..cfcb878d9b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ghost.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ghost.xml new file mode 100644 index 0000000000..795f0cfd10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_glasses.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_glasses.xml new file mode 100644 index 0000000000..63d32ab5ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gloves.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gloves.xml new file mode 100644 index 0000000000..0e1c4259d5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_goddess.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_goddess.xml new file mode 100644 index 0000000000..50cbdd8918 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_golonmask.xml new file mode 100644 index 0000000000..844d90e714 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_grass.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_grass.xml new file mode 100644 index 0000000000..ae7834201a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hammer.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hammer.xml new file mode 100644 index 0000000000..feb5c8659d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_heart.xml new file mode 100644 index 0000000000..48e78b1b5c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hearts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hearts.xml new file mode 100644 index 0000000000..d2e763e631 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hookshot.xml new file mode 100644 index 0000000000..a6b3b0fdac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hoverboots.xml new file mode 100644 index 0000000000..6d41df8fd0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_insect.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_insect.xml new file mode 100644 index 0000000000..7af5b5b3b2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_jewel.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_jewel.xml new file mode 100644 index 0000000000..e83c651164 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_key.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_key.xml new file mode 100644 index 0000000000..a37d45a71c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 0000000000..46eff7d3e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_letter.xml new file mode 100644 index 0000000000..bea8683390 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_liquid.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_liquid.xml new file mode 100644 index 0000000000..18a5c3d7a2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_longsword.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_longsword.xml new file mode 100644 index 0000000000..7161e42e38 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_m_arrow.xml new file mode 100644 index 0000000000..0fd659ae95 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_magicpot.xml new file mode 100644 index 0000000000..7623e6353e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_map.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_map.xml new file mode 100644 index 0000000000..471c1dab97 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_medal.xml new file mode 100644 index 0000000000..28e5b1e683 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_melody.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_melody.xml new file mode 100644 index 0000000000..b01fca9538 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_milk.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_milk.xml new file mode 100644 index 0000000000..a3e223b3e6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_mushroom.xml new file mode 100644 index 0000000000..5b19bca743 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_niwatori.xml new file mode 100644 index 0000000000..c8389f62c2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_nuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_nuts.xml new file mode 100644 index 0000000000..c59903c43d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina.xml new file mode 100644 index 0000000000..82607677d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina_0.xml new file mode 100644 index 0000000000..2c5f70d984 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_pachinko.xml new file mode 100644 index 0000000000..5f808baf92 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_powder.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_powder.xml new file mode 100644 index 0000000000..fb7dc0155d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_prescription.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_prescription.xml new file mode 100644 index 0000000000..75ae7eb2b7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_purse.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_purse.xml new file mode 100644 index 0000000000..054731dec7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rabit_mask.xml new file mode 100644 index 0000000000..9d4eb9487f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_redead_mask.xml new file mode 100644 index 0000000000..7de08487f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rupy.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rupy.xml new file mode 100644 index 0000000000..0a1af96d0f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_saw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_saw.xml new file mode 100644 index 0000000000..dcc038b7c1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_scale.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_scale.xml new file mode 100644 index 0000000000..1cf5de5b99 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_seed.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_seed.xml new file mode 100644 index 0000000000..82c15c82d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_1.xml new file mode 100644 index 0000000000..2f11e3f6d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_2.xml new file mode 100644 index 0000000000..176ae025fe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_3.xml new file mode 100644 index 0000000000..8d1e5dafd4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_skj_mask.xml new file mode 100644 index 0000000000..e6c90f76f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soldout.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soldout.xml new file mode 100644 index 0000000000..a15b1253e3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soul.xml new file mode 100644 index 0000000000..a68178eba5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_stick.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_stick.xml new file mode 100644 index 0000000000..fed89f4659 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sutaru.xml new file mode 100644 index 0000000000..a2606afbe3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sword_1.xml new file mode 100644 index 0000000000..e1119abca0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ticketstone.xml new file mode 100644 index 0000000000..73bf888d10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_truth_mask.xml new file mode 100644 index 0000000000..3b4edf3dee --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_zoramask.xml new file mode 100644 index 0000000000..e3b1ab10ec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gj.xml new file mode 100644 index 0000000000..ee6dab74f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gjyo_objects.xml new file mode 100644 index 0000000000..ea4f8444fb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gla.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gla.xml new file mode 100644 index 0000000000..499a3720d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gm.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gm.xml new file mode 100644 index 0000000000..91b10cc428 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd.xml new file mode 100644 index 0000000000..3ae3b57f3d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd_magic.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd_magic.xml new file mode 100644 index 0000000000..a88d419d7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gndd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gndd.xml new file mode 100644 index 0000000000..8bf5d770c4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_god_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_god_lgt.xml new file mode 100644 index 0000000000..60df9e4693 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gol.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gol.xml new file mode 100644 index 0000000000..7e04508cb6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goma.xml new file mode 100644 index 0000000000..922678a3cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goroiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goroiwa.xml new file mode 100644 index 0000000000..5d406e9578 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gr.xml new file mode 100644 index 0000000000..5f7360ae57 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gs.xml new file mode 100644 index 0000000000..145be16653 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gt.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gt.xml new file mode 100644 index 0000000000..1d79d4e39e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka.xml new file mode 100644 index 0000000000..f6b263c375 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_door.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_door.xml new file mode 100644 index 0000000000..1376d03569 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_objects.xml new file mode 100644 index 0000000000..3ca6d27c08 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hakach_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hakach_objects.xml new file mode 100644 index 0000000000..0de02aaf15 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hata.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hata.xml new file mode 100644 index 0000000000..b0324c3be3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_heavy_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_heavy_object.xml new file mode 100644 index 0000000000..ecc7953211 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hidan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hidan_objects.xml new file mode 100644 index 0000000000..f41c0ee5ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hintnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hintnuts.xml new file mode 100644 index 0000000000..a7290f3955 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hni.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hni.xml new file mode 100644 index 0000000000..6b317eb7a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse.xml new file mode 100644 index 0000000000..74619e5977 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_ganon.xml new file mode 100644 index 0000000000..0a55462e25 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_link_child.xml new file mode 100644 index 0000000000..146c564f55 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_normal.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_normal.xml new file mode 100644 index 0000000000..2facab39c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_zelda.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_zelda.xml new file mode 100644 index 0000000000..af270c6585 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hs.xml new file mode 100644 index 0000000000..cf5d06e1a2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_human.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_human.xml new file mode 100644 index 0000000000..05795cb332 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ice_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ice_objects.xml new file mode 100644 index 0000000000..c7d059d709 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ik.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ik.xml new file mode 100644 index 0000000000..8a6028f7c0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_im.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_im.xml new file mode 100644 index 0000000000..a628a113a4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_in.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_in.xml new file mode 100644 index 0000000000..84c1140475 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ingate.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ingate.xml new file mode 100644 index 0000000000..e6be42bebf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jj.xml new file mode 100644 index 0000000000..62bae8cb91 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_js.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_js.xml new file mode 100644 index 0000000000..ff7bd3efa1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_door.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_door.xml new file mode 100644 index 0000000000..60a7b37886 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_iron.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_iron.xml new file mode 100644 index 0000000000..c6f6773c6a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_obj.xml new file mode 100644 index 0000000000..a1f19b8066 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ka.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ka.xml new file mode 100644 index 0000000000..eb952732b4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kanban.xml new file mode 100644 index 0000000000..9ffc7a2ceb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kibako2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kibako2.xml new file mode 100644 index 0000000000..a701b294de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kingdodongo.xml new file mode 100644 index 0000000000..5ef07a26f7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_km1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_km1.xml new file mode 100644 index 0000000000..0a918a798e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kusa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kusa.xml new file mode 100644 index 0000000000..67291a5543 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kw1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kw1.xml new file mode 100644 index 0000000000..eab561b1fb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kz.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kz.xml new file mode 100644 index 0000000000..4624fefdb6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_light_ring.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_light_ring.xml new file mode 100644 index 0000000000..babe7d2aa7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightbox.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightbox.xml new file mode 100644 index 0000000000..552a79d7c7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightswitch.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightswitch.xml new file mode 100644 index 0000000000..cfd5dcfb40 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_boy.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_boy.xml new file mode 100644 index 0000000000..6351af5050 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_child.xml new file mode 100644 index 0000000000..0de4003731 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma1.xml new file mode 100644 index 0000000000..63eeb38950 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma2.xml new file mode 100644 index 0000000000..ce5910fb80 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mag.xml new file mode 100644 index 0000000000..6276dee1da --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mag.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mamenoki.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mamenoki.xml new file mode 100644 index 0000000000..819d890225 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mastergolon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mastergolon.xml new file mode 100644 index 0000000000..6dd9d16592 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokiri.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokiri.xml new file mode 100644 index 0000000000..af5a9ec153 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokirihead.xml new file mode 100644 index 0000000000..c64aa1c49e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterzoora.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterzoora.xml new file mode 100644 index 0000000000..2c703274e1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mb.xml new file mode 100644 index 0000000000..23c0930c02 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_md.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_md.xml new file mode 100644 index 0000000000..161c73dca1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_medal.xml new file mode 100644 index 0000000000..533872a551 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_menkuri_objects.xml new file mode 100644 index 0000000000..4c2b51df5b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mir_ray.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mir_ray.xml new file mode 100644 index 0000000000..2acc9391ab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mizu_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mizu_objects.xml new file mode 100644 index 0000000000..5a18b95cfe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin.xml new file mode 100644 index 0000000000..daf9b05412 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_dark.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_dark.xml new file mode 100644 index 0000000000..2fa0bdbe4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flame.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flame.xml new file mode 100644 index 0000000000..6274feaee1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flash.xml new file mode 100644 index 0000000000..c1040ea118 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_ice.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_ice.xml new file mode 100644 index 0000000000..1aaeea193d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_oka.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_oka.xml new file mode 100644 index 0000000000..0f823b9237 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_soul.xml new file mode 100644 index 0000000000..6386f7f9ea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_wind.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_wind.xml new file mode 100644 index 0000000000..8bba7eb91b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mk.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mk.xml new file mode 100644 index 0000000000..0b4aaae8aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mm.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mm.xml new file mode 100644 index 0000000000..b27837e57e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mo.xml new file mode 100644 index 0000000000..4c4be74c83 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1.xml new file mode 100644 index 0000000000..bb1b31e2fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1a.xml new file mode 100644 index 0000000000..c750ce20d0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2.xml new file mode 100644 index 0000000000..785b858571 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2a.xml new file mode 100644 index 0000000000..ad1bb4d5f0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_objects.xml new file mode 100644 index 0000000000..58ea8c085c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_tex.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_tex.xml new file mode 100644 index 0000000000..8ba4ff2d34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ms.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ms.xml new file mode 100644 index 0000000000..a87d0e6b36 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mu.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mu.xml new file mode 100644 index 0000000000..7251ff7212 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nb.xml new file mode 100644 index 0000000000..74de9e2859 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_niw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_niw.xml new file mode 100644 index 0000000000..4eafec9566 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nwc.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nwc.xml new file mode 100644 index 0000000000..96ffa32383 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ny.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ny.xml new file mode 100644 index 0000000000..e2e8187ff8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA1.xml new file mode 100644 index 0000000000..1d665f1010 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA10.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA10.xml new file mode 100644 index 0000000000..65d0808349 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA11.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA11.xml new file mode 100644 index 0000000000..92ae474b60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA2.xml new file mode 100644 index 0000000000..ffdcd79896 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA3.xml new file mode 100644 index 0000000000..a492bd8751 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA4.xml new file mode 100644 index 0000000000..dcdbbfff9b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA5.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA5.xml new file mode 100644 index 0000000000..55072176dd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA6.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA6.xml new file mode 100644 index 0000000000..c17a510881 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA7.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA7.xml new file mode 100644 index 0000000000..52c68f6394 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA8.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA8.xml new file mode 100644 index 0000000000..8ed2d3df50 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA9.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA9.xml new file mode 100644 index 0000000000..d5c16abfcd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB1.xml new file mode 100644 index 0000000000..2f50c967b2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB2.xml new file mode 100644 index 0000000000..230783ceae --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB3.xml new file mode 100644 index 0000000000..1c42ddaccc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB4.xml new file mode 100644 index 0000000000..2924c9e753 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1.xml new file mode 100644 index 0000000000..4d5b1663fe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE10.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE10.xml new file mode 100644 index 0000000000..04ce914372 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE11.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE11.xml new file mode 100644 index 0000000000..04f6f186da --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE12.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE12.xml new file mode 100644 index 0000000000..a5fa39fd25 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1s.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1s.xml new file mode 100644 index 0000000000..d311e60104 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE2.xml new file mode 100644 index 0000000000..af62ad6d11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE3.xml new file mode 100644 index 0000000000..95227da384 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4.xml new file mode 100644 index 0000000000..ae48d2adef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4s.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4s.xml new file mode 100644 index 0000000000..6037de52f9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE5.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE5.xml new file mode 100644 index 0000000000..f5edf745aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE6.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE6.xml new file mode 100644 index 0000000000..95bb602b6b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE7.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE7.xml new file mode 100644 index 0000000000..b3e588d4c2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE8.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE8.xml new file mode 100644 index 0000000000..be5de24947 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE9.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE9.xml new file mode 100644 index 0000000000..8ea7ee18c7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE_anime.xml new file mode 100644 index 0000000000..f6b4659e22 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1d_map.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1d_map.xml new file mode 100644 index 0000000000..f14fecd825 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1s.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1s.xml new file mode 100644 index 0000000000..fe41dde630 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_o_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_o_anime.xml new file mode 100644 index 0000000000..4ef4ac44c8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_okuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_okuta.xml new file mode 100644 index 0000000000..b4fccea6f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_opening_demo1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_opening_demo1.xml new file mode 100644 index 0000000000..fd03230279 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os.xml new file mode 100644 index 0000000000..5880a92930 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os_anime.xml new file mode 100644 index 0000000000..f23636343c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ossan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ossan.xml new file mode 100644 index 0000000000..5788e3a20d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ouke_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ouke_haka.xml new file mode 100644 index 0000000000..11da9b26ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_owl.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_owl.xml new file mode 100644 index 0000000000..64fdf64c53 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_peehat.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_peehat.xml new file mode 100644 index 0000000000..42ee66cdef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_composer.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_composer.xml new file mode 100644 index 0000000000..ff995efceb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_field.xml new file mode 100644 index 0000000000..78bc0d65ad --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_sisters.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_sisters.xml new file mode 100644 index 0000000000..b429be2588 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_poh.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_poh.xml new file mode 100644 index 0000000000..be6d6eff4b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ps.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ps.xml new file mode 100644 index 0000000000..9f9c894a60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_pu_box.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_pu_box.xml new file mode 100644 index 0000000000..e1d686e979 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rd.xml new file mode 100644 index 0000000000..22c7d33738 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_reeba.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_reeba.xml new file mode 100644 index 0000000000..32c697bd9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_relay_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_relay_objects.xml new file mode 100644 index 0000000000..47b92fcd2d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rl.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rl.xml new file mode 100644 index 0000000000..2a5ad30f6b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rr.xml new file mode 100644 index 0000000000..98726b14bb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rs.xml new file mode 100644 index 0000000000..152b5489e1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru1.xml new file mode 100644 index 0000000000..3d413619ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru2.xml new file mode 100644 index 0000000000..fedf37d48b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sa.xml new file mode 100644 index 0000000000..ec45ac961d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sb.xml new file mode 100644 index 0000000000..64d3bb005a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sd.xml new file mode 100644 index 0000000000..fb58428c3f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shop_dungen.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shop_dungen.xml new file mode 100644 index 0000000000..594c43d390 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shopnuts.xml new file mode 100644 index 0000000000..7065f8941a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_siofuki.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_siofuki.xml new file mode 100644 index 0000000000..a23240a728 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sk2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sk2.xml new file mode 100644 index 0000000000..f2e7ef6d89 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skb.xml new file mode 100644 index 0000000000..5b5efb4848 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skj.xml new file mode 100644 index 0000000000..74548e5185 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_break.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_break.xml new file mode 100644 index 0000000000..d3be88315f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_objects.xml new file mode 100644 index 0000000000..10fb13aeac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoya.xml new file mode 100644 index 0000000000..d44b944e0e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoyab.xml new file mode 100644 index 0000000000..720f50cd3e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects.xml new file mode 100644 index 0000000000..413e032a9c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects2.xml new file mode 100644 index 0000000000..36741a9492 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot02_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot02_objects.xml new file mode 100644 index 0000000000..65f45ff515 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot03_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot03_object.xml new file mode 100644 index 0000000000..f182e7d99a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot04_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot04_objects.xml new file mode 100644 index 0000000000..66293d7523 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot05_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot05_objects.xml new file mode 100644 index 0000000000..6e70791493 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot06_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot06_objects.xml new file mode 100644 index 0000000000..e3da63b0f0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot07_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot07_object.xml new file mode 100644 index 0000000000..5bc2bfb6bf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot08_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot08_obj.xml new file mode 100644 index 0000000000..4d71f3473f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot09_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot09_obj.xml new file mode 100644 index 0000000000..eb65283931 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot11_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot11_obj.xml new file mode 100644 index 0000000000..257298f7cc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot12_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot12_obj.xml new file mode 100644 index 0000000000..d619c781e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot15_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot15_obj.xml new file mode 100644 index 0000000000..bd59b8cd18 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot16_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot16_obj.xml new file mode 100644 index 0000000000..d39de812a9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot17_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot17_obj.xml new file mode 100644 index 0000000000..d4239d8d28 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot18_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot18_obj.xml new file mode 100644 index 0000000000..cc12b78946 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ssh.xml new file mode 100644 index 0000000000..6283f8e9f2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sst.xml new file mode 100644 index 0000000000..b874b9a418 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_st.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_st.xml new file mode 100644 index 0000000000..983b9e2eab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_stream.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_stream.xml new file mode 100644 index 0000000000..59b0838e47 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_syokudai.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_syokudai.xml new file mode 100644 index 0000000000..c1670edece --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ta.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ta.xml new file mode 100644 index 0000000000..5e446bf5c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_timeblock.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_timeblock.xml new file mode 100644 index 0000000000..1d6b9e698c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tite.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tite.xml new file mode 100644 index 0000000000..1be65c4950 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tk.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tk.xml new file mode 100644 index 0000000000..6b6cce7244 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toki_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toki_objects.xml new file mode 100644 index 0000000000..cd07e60d2b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_torch2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_torch2.xml new file mode 100644 index 0000000000..3388e7d34e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toryo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toryo.xml new file mode 100644 index 0000000000..73f3dcb1e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tp.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tp.xml new file mode 100644 index 0000000000..8ea908825e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tr.xml new file mode 100644 index 0000000000..17ab9ae392 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_trap.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_trap.xml new file mode 100644 index 0000000000..56195cf41b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_triforce_spot.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_triforce_spot.xml new file mode 100644 index 0000000000..87d4494589 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ts.xml new file mode 100644 index 0000000000..567277bc39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tsubo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tsubo.xml new file mode 100644 index 0000000000..ee2c5e1846 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tw.xml new file mode 100644 index 0000000000..c7fd2a60be --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_umajump.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_umajump.xml new file mode 100644 index 0000000000..2ee4ade46a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vali.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vali.xml new file mode 100644 index 0000000000..2bab5efaa6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vase.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vase.xml new file mode 100644 index 0000000000..091d4c51e3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vm.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vm.xml new file mode 100644 index 0000000000..c5b949b36e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wallmaster.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wallmaster.xml new file mode 100644 index 0000000000..fbbc4f4af3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp1.xml new file mode 100644 index 0000000000..1497d7a108 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp2.xml new file mode 100644 index 0000000000..b6d1b3624c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wf.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wf.xml new file mode 100644 index 0000000000..ebfb708d2d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wood02.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wood02.xml new file mode 100644 index 0000000000..47ec342caa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_xc.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_xc.xml new file mode 100644 index 0000000000..bb2bf3e7af --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yabusame_point.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yabusame_point.xml new file mode 100644 index 0000000000..bed9e8a609 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ydan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ydan_objects.xml new file mode 100644 index 0000000000..e2adf307f7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yukabyun.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yukabyun.xml new file mode 100644 index 0000000000..d594ebbb89 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zf.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zf.xml new file mode 100644 index 0000000000..7f20eb7866 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zg.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zg.xml new file mode 100644 index 0000000000..79005516c4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl1.xml new file mode 100644 index 0000000000..001e5be145 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2.xml new file mode 100644 index 0000000000..959a919ec6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime1.xml new file mode 100644 index 0000000000..cada504867 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime2.xml new file mode 100644 index 0000000000..47016e2e00 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl4.xml new file mode 100644 index 0000000000..8e7a2837ed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zo.xml new file mode 100644 index 0000000000..77465760ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 0000000000..b894516ebd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 0000000000..9337a2fc04 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Light.xml new file mode 100644 index 0000000000..0d5ce829ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 0000000000..0f38621388 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 0000000000..a3fdd07b75 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 0000000000..9e2db033b2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 0000000000..0d2f367206 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 0000000000..d14798ac3c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Sst.xml new file mode 100644 index 0000000000..49909db293 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Demo_Shd.xml new file mode 100644 index 0000000000..b48f36ba0e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Bili.xml new file mode 100644 index 0000000000..7501319f0d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 0000000000..fb53e62242 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 0000000000..c00e7c5b07 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 0000000000..0aa7e71dff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Holl.xml new file mode 100644 index 0000000000..62f8a3375d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 0000000000..ed9f58adc6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Kanban.xml new file mode 100644 index 0000000000..20bea0c8ec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sda.xml new file mode 100644 index 0000000000..f9d5e322c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ssh.xml new file mode 100644 index 0000000000..6d85ff6205 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_St.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_St.xml new file mode 100644 index 0000000000..a41477d9e5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sth.xml new file mode 100644 index 0000000000..187e5ae766 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_End_Title.xml new file mode 100644 index 0000000000..f307aa4466 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_File_Choose.xml new file mode 100644 index 0000000000..5fa7563685 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_File_Choose.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Dark.xml new file mode 100644 index 0000000000..7e1315d50f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Fire.xml new file mode 100644 index 0000000000..22a94dcce2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Wind.xml new file mode 100644 index 0000000000..229cb9eae5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 0000000000..e5aa927a75 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 0000000000..f927d1db2c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 0000000000..d822d5238f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 0000000000..9213b354f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 0000000000..e7ed30c0bf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 0000000000..796db3ee1f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/Bmori1.xml new file mode 100644 index 0000000000..373f360303 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 0000000000..89331ecc2f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan.xml new file mode 100644 index 0000000000..e557c80a55 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 0000000000..97401aff65 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 0000000000..d36ac6b774 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HIDAN.xml new file mode 100644 index 0000000000..fa4d784f1a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin.xml new file mode 100644 index 0000000000..00c5aa82dd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 0000000000..99ae2b3efe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan.xml new file mode 100644 index 0000000000..a9e520f4cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan_boss.xml new file mode 100644 index 0000000000..9fccf2c301 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan.xml new file mode 100644 index 0000000000..1446a9c98b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan_boss.xml new file mode 100644 index 0000000000..05633e53e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon.xml new file mode 100644 index 0000000000..f857dbe94e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_boss.xml new file mode 100644 index 0000000000..36c5e81070 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_demo.xml new file mode 100644 index 0000000000..56c98efed7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_final.xml new file mode 100644 index 0000000000..3ec568cfb9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 0000000000..84ef36950c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_tou.xml new file mode 100644 index 0000000000..1ae37b9637 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontika.xml new file mode 100644 index 0000000000..a5ff210ce1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 0000000000..060d4941ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/gerudoway.xml new file mode 100644 index 0000000000..8272776143 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 0000000000..0f1bc3b285 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinboss.xml new file mode 100644 index 0000000000..86c0d317b2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinzou.xml new file mode 100644 index 0000000000..bc14a46ac3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/men.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/men.xml new file mode 100644 index 0000000000..d9e5960e82 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/moribossroom.xml new file mode 100644 index 0000000000..b9959eefab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan.xml new file mode 100644 index 0000000000..aed7d26604 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan_boss.xml new file mode 100644 index 0000000000..7ea240547a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/bowling.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/bowling.xml new file mode 100644 index 0000000000..9a41763a27 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 0000000000..4f9a03fc02 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa.xml new file mode 100644 index 0000000000..06d89f2fe7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 0000000000..6f4c181e0e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hakasitarelay.xml new file mode 100644 index 0000000000..91be63d147 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hut.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hut.xml new file mode 100644 index 0000000000..a4ef5715ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hylia_labo.xml new file mode 100644 index 0000000000..56822e67a7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/impa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/impa.xml new file mode 100644 index 0000000000..db757e3d3c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kakariko.xml new file mode 100644 index 0000000000..e4e9b102c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kenjyanoma.xml new file mode 100644 index 0000000000..4e8a58f3b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home.xml new file mode 100644 index 0000000000..8c0305493a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home3.xml new file mode 100644 index 0000000000..9f36eb41c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home4.xml new file mode 100644 index 0000000000..eb861aedb4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home5.xml new file mode 100644 index 0000000000..974987feda --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/labo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/labo.xml new file mode 100644 index 0000000000..c0a9d2eb8c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/link_home.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/link_home.xml new file mode 100644 index 0000000000..2fb88ae347 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/mahouya.xml new file mode 100644 index 0000000000..8ae462f9db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/malon_stable.xml new file mode 100644 index 0000000000..aff97eeb86 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/miharigoya.xml new file mode 100644 index 0000000000..63f8676ac1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/nakaniwa.xml new file mode 100644 index 0000000000..2fb2d5e6a4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/syatekijyou.xml new file mode 100644 index 0000000000..05243b52ca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/takaraya.xml new file mode 100644 index 0000000000..5b438980b7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tent.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tent.xml new file mode 100644 index 0000000000..de72cc5f45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tokinoma.xml new file mode 100644 index 0000000000..d7878b8951 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 0000000000..3b6dd2dec2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 0000000000..90a8d95d09 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/enrui.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/enrui.xml new file mode 100644 index 0000000000..d8c06e5454 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/entra_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/entra_n.xml new file mode 100644 index 0000000000..5b408ac3a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana.xml new file mode 100644 index 0000000000..e7dc93dd0c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana2.xml new file mode 100644 index 0000000000..2d8ba4906a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana_ouke.xml new file mode 100644 index 0000000000..17f53613e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hiral_demo.xml new file mode 100644 index 0000000000..1331fdd4c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakariko3.xml new file mode 100644 index 0000000000..07b62c44df --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakusiana.xml new file mode 100644 index 0000000000..c3f993ff4f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kinsuta.xml new file mode 100644 index 0000000000..aac0f6c4ea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley.xml new file mode 100644 index 0000000000..c304673032 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley_n.xml new file mode 100644 index 0000000000..65db604113 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_day.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_day.xml new file mode 100644 index 0000000000..00887e69cd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_night.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_night.xml new file mode 100644 index 0000000000..c58e38744e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_ruins.xml new file mode 100644 index 0000000000..f0ec75e759 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine.xml new file mode 100644 index 0000000000..b9ddf2cf70 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_n.xml new file mode 100644 index 0000000000..4878338aa1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_r.xml new file mode 100644 index 0000000000..1220367919 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/turibori.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/turibori.xml new file mode 100644 index 0000000000..0633224d9c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/entra.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/entra.xml new file mode 100644 index 0000000000..92ee57f59a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/souko.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/souko.xml new file mode 100644 index 0000000000..8dd9d9e48a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot00.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot00.xml new file mode 100644 index 0000000000..508d9309b3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot01.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot01.xml new file mode 100644 index 0000000000..eb725afa68 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot02.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot02.xml new file mode 100644 index 0000000000..c7924c29db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot03.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot03.xml new file mode 100644 index 0000000000..9434185f44 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot04.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot04.xml new file mode 100644 index 0000000000..f338604207 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot05.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot05.xml new file mode 100644 index 0000000000..4f7c62b91e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot06.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot06.xml new file mode 100644 index 0000000000..f4af602cfd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot07.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot07.xml new file mode 100644 index 0000000000..eeb976f7f6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot08.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot08.xml new file mode 100644 index 0000000000..86582f0dca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot09.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot09.xml new file mode 100644 index 0000000000..5bb9e059c7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot10.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot10.xml new file mode 100644 index 0000000000..66365e3d86 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot11.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot11.xml new file mode 100644 index 0000000000..76ff3b8223 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot12.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot12.xml new file mode 100644 index 0000000000..e21523b217 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot13.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot13.xml new file mode 100644 index 0000000000..c689130650 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot15.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot15.xml new file mode 100644 index 0000000000..e75f7b6845 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot16.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot16.xml new file mode 100644 index 0000000000..f41b226f8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot17.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot17.xml new file mode 100644 index 0000000000..feb267251e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot18.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot18.xml new file mode 100644 index 0000000000..d70fccf4bb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot20.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot20.xml new file mode 100644 index 0000000000..1381f6ecbe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/alley_shop.xml new file mode 100644 index 0000000000..95548de1bd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/drag.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/drag.xml new file mode 100644 index 0000000000..acb6515fba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/face_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/face_shop.xml new file mode 100644 index 0000000000..16a9746081 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/golon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/golon.xml new file mode 100644 index 0000000000..c586727988 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/kokiri_shop.xml new file mode 100644 index 0000000000..50cd633e57 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/night_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/night_shop.xml new file mode 100644 index 0000000000..5954d9c83d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/shop1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/shop1.xml new file mode 100644 index 0000000000..525a06d633 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/zoora.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/zoora.xml new file mode 100644 index 0000000000..0e4ac18f8c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_field.xml new file mode 100644 index 0000000000..789a554ce8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_ydan.xml new file mode 100644 index 0000000000..f784afcf45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/message_data_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/message_data_static.xml new file mode 100644 index 0000000000..94948fa8e7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/backgrounds.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/backgrounds.xml new file mode 100644 index 0000000000..c60ff57a8a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/boss_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/boss_title_cards.xml new file mode 100644 index 0000000000..84f555bd10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/do_action_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/do_action_static.xml new file mode 100644 index 0000000000..efabd54a58 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_24_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_24_static.xml new file mode 100644 index 0000000000..cdb8cc7379 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_dungeon_static.xml new file mode 100644 index 0000000000..873c490fc5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_field_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_field_static.xml new file mode 100644 index 0000000000..ed991406b5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_gameover_static.xml new file mode 100644 index 0000000000..ffd3928680 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_jpn_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_jpn_static.xml new file mode 100644 index 0000000000..f2fe854b8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_nes_static.xml new file mode 100644 index 0000000000..6cd92acfca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_static.xml new file mode 100644 index 0000000000..9e844615b1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/item_name_static.xml new file mode 100644 index 0000000000..1bc074c2ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/kanji.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/kanji.xml new file mode 100644 index 0000000000..5159387a13 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_48x85_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_48x85_static.xml new file mode 100644 index 0000000000..b2ea46340a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_grand_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_grand_static.xml new file mode 100644 index 0000000000..201955bfc3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_i_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_i_static.xml new file mode 100644 index 0000000000..1721f6d848 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_name_static.xml new file mode 100644 index 0000000000..ca4c4c0bd6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_static.xml new file mode 100644 index 0000000000..afdde60def --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_texture_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_texture_static.xml new file mode 100644 index 0000000000..bbf7e1259e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nes_font_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nes_font_static.xml new file mode 100644 index 0000000000..b01646cb54 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nes_font_static.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nintendo_rogo_static.xml new file mode 100644 index 0000000000..f09de3b0f9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/parameter_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/parameter_static.xml new file mode 100644 index 0000000000..c51dacf1f6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/place_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/place_title_cards.xml new file mode 100644 index 0000000000..b688cce00c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/skyboxes.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/skyboxes.xml new file mode 100644 index 0000000000..104ffb2a3f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/title_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/title_static.xml new file mode 100644 index 0000000000..5f58c5a820 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml b/soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml new file mode 100644 index 0000000000..e9f385ca87 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml @@ -0,0 +1,639 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_circle.xml b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_circle.xml new file mode 100644 index 0000000000..e6b4bba124 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_triforce.xml b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_triforce.xml new file mode 100644 index 0000000000..bbc709a4fd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_wipe1.xml new file mode 100644 index 0000000000..9d2e12231a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/code/sys_matrix.xml b/soh/assets/xml/GC_NMQ_NTSC_U/code/sys_matrix.xml new file mode 100644 index 0000000000..1521be9f1e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/misc/link_animetion.xml b/soh/assets/xml/GC_NMQ_NTSC_U/misc/link_animetion.xml new file mode 100644 index 0000000000..9de1e92d36 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_dangeon_keep.xml new file mode 100644 index 0000000000..5b1a9050d9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_field_keep.xml new file mode 100644 index 0000000000..011e8f7fc7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_keep.xml new file mode 100644 index 0000000000..94eee8845e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_Bb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_Bb.xml new file mode 100644 index 0000000000..5d04bde451 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ahg.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ahg.xml new file mode 100644 index 0000000000..4d37b1b110 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_am.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_am.xml new file mode 100644 index 0000000000..b70c70d709 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ane.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ane.xml new file mode 100644 index 0000000000..1e29b351e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ani.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ani.xml new file mode 100644 index 0000000000..c70621c6f9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_anubice.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_anubice.xml new file mode 100644 index 0000000000..fb029586ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_aob.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_aob.xml new file mode 100644 index 0000000000..e6202d0cf9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_b_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_b_heart.xml new file mode 100644 index 0000000000..00f7cd6773 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bba.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bba.xml new file mode 100644 index 0000000000..ccc5c21365 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdan_objects.xml new file mode 100644 index 0000000000..dcd56d3856 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdoor.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdoor.xml new file mode 100644 index 0000000000..a092f0c23b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bg.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bg.xml new file mode 100644 index 0000000000..791226b71d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bigokuta.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bigokuta.xml new file mode 100644 index 0000000000..1c7d39e319 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bird.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bird.xml new file mode 100644 index 0000000000..167a5022dc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bji.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bji.xml new file mode 100644 index 0000000000..c665b6b001 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bl.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bl.xml new file mode 100644 index 0000000000..1c2ef4ec63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_blkobj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_blkobj.xml new file mode 100644 index 0000000000..345a8ebd9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bob.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bob.xml new file mode 100644 index 0000000000..289e994e47 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_boj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_boj.xml new file mode 100644 index 0000000000..4be4764ab5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombf.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombf.xml new file mode 100644 index 0000000000..83e60248d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombiwa.xml new file mode 100644 index 0000000000..26ab6b4f33 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bowl.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bowl.xml new file mode 100644 index 0000000000..ffe6d43db7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_box.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_box.xml new file mode 100644 index 0000000000..106d2d3356 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_brob.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_brob.xml new file mode 100644 index 0000000000..718dcd5617 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bubble.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bubble.xml new file mode 100644 index 0000000000..f5de186920 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bv.xml new file mode 100644 index 0000000000..d2ebf275ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bw.xml new file mode 100644 index 0000000000..6fd39fbb1c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bwall.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bwall.xml new file mode 100644 index 0000000000..d4f43ddc14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bxa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bxa.xml new file mode 100644 index 0000000000..fb78c117e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cne.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cne.xml new file mode 100644 index 0000000000..0c14d0bc54 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cob.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cob.xml new file mode 100644 index 0000000000..ba051cfa74 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cow.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cow.xml new file mode 100644 index 0000000000..5d067c329f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_crow.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_crow.xml new file mode 100644 index 0000000000..77337c6445 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cs.xml new file mode 100644 index 0000000000..83804ccaf4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_elevator.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_elevator.xml new file mode 100644 index 0000000000..6be59c154b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_hsblock.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_hsblock.xml new file mode 100644 index 0000000000..4bb50c2b4f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_lift.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_lift.xml new file mode 100644 index 0000000000..2912385190 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_daiku.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_daiku.xml new file mode 100644 index 0000000000..1524c7a26c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ddan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ddan_objects.xml new file mode 100644 index 0000000000..3fc563b96f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekubaba.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekubaba.xml new file mode 100644 index 0000000000..7202a833fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekujr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekujr.xml new file mode 100644 index 0000000000..e906bf61c4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekunuts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekunuts.xml new file mode 100644 index 0000000000..5fceef4165 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_6k.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_6k.xml new file mode 100644 index 0000000000..73058d5e46 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_kekkai.xml new file mode 100644 index 0000000000..aa54bc2eef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_tre_lgt.xml new file mode 100644 index 0000000000..9ea19012b7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dh.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dh.xml new file mode 100644 index 0000000000..7a52d7dbe7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dnk.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dnk.xml new file mode 100644 index 0000000000..3bce343048 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dns.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dns.xml new file mode 100644 index 0000000000..8b78ffcf20 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodojr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodojr.xml new file mode 100644 index 0000000000..4dfd7d6e45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodongo.xml new file mode 100644 index 0000000000..779e20e9dc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dog.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dog.xml new file mode 100644 index 0000000000..ef00442b60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_gerudo.xml new file mode 100644 index 0000000000..2f17262041 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_killer.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_killer.xml new file mode 100644 index 0000000000..a37f590d60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds.xml new file mode 100644 index 0000000000..0413a9e2e8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds2.xml new file mode 100644 index 0000000000..683bcc68d4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_du.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_du.xml new file mode 100644 index 0000000000..0babd962b9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dy_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dy_obj.xml new file mode 100644 index 0000000000..5e792edb50 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ec.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ec.xml new file mode 100644 index 0000000000..7ec83e284d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_crystal_light.xml new file mode 100644 index 0000000000..9215b6a394 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_doughnut.xml new file mode 100644 index 0000000000..7f12c56f53 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_erupc.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_erupc.xml new file mode 100644 index 0000000000..800d9535f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_fire_ball.xml new file mode 100644 index 0000000000..2fc65b16ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_flash.xml new file mode 100644 index 0000000000..5f962f162b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_lgt_shower.xml new file mode 100644 index 0000000000..67ef5ce7e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_star_field.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_star_field.xml new file mode 100644 index 0000000000..00b47c460f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_tw.xml new file mode 100644 index 0000000000..de53765696 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ei.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ei.xml new file mode 100644 index 0000000000..e4132491f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fa.xml new file mode 100644 index 0000000000..2f1bf9a5e8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd.xml new file mode 100644 index 0000000000..2609579670 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd2.xml new file mode 100644 index 0000000000..44b5f5f9c1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fhg.xml new file mode 100644 index 0000000000..669875aaf8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fire.xml new file mode 100644 index 0000000000..49bf620cb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_firefly.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_firefly.xml new file mode 100644 index 0000000000..8c26a43418 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fish.xml new file mode 100644 index 0000000000..f5ad4f6da0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fr.xml new file mode 100644 index 0000000000..25ee2ad42e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fu.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fu.xml new file mode 100644 index 0000000000..82c449e3de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fw.xml new file mode 100644 index 0000000000..ee9821d263 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fz.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fz.xml new file mode 100644 index 0000000000..dad6fec5ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon.xml new file mode 100644 index 0000000000..c654c7fec9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon2.xml new file mode 100644 index 0000000000..7e715dd414 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime1.xml new file mode 100644 index 0000000000..b1016299bc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime2.xml new file mode 100644 index 0000000000..180e5995c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime3.xml new file mode 100644 index 0000000000..be4c4dcb15 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_objects.xml new file mode 100644 index 0000000000..5e32610ffc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ge1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ge1.xml new file mode 100644 index 0000000000..79e0768b81 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geff.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geff.xml new file mode 100644 index 0000000000..f0667743b0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geldb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geldb.xml new file mode 100644 index 0000000000..49b12ef2e5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrow.xml new file mode 100644 index 0000000000..4b58787a9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrowcase.xml new file mode 100644 index 0000000000..267b0a734d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bean.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bean.xml new file mode 100644 index 0000000000..e74247816f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_1.xml new file mode 100644 index 0000000000..bae86c11d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_2.xml new file mode 100644 index 0000000000..1400c4a4d4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bombpouch.xml new file mode 100644 index 0000000000..07134748c3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boomerang.xml new file mode 100644 index 0000000000..3c1a0fe7fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boots_2.xml new file mode 100644 index 0000000000..3bcb6a47ae --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bosskey.xml new file mode 100644 index 0000000000..e5e4bc86c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle.xml new file mode 100644 index 0000000000..3b0884a03f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle_letter.xml new file mode 100644 index 0000000000..443219caf5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bow.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bow.xml new file mode 100644 index 0000000000..946e9c4965 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bracelet.xml new file mode 100644 index 0000000000..5a0b62a60a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_brokensword.xml new file mode 100644 index 0000000000..408741ac54 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_butterfly.xml new file mode 100644 index 0000000000..7b60a77247 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_clothes.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_clothes.xml new file mode 100644 index 0000000000..3f897b6d13 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_coin.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_coin.xml new file mode 100644 index 0000000000..22e29f255f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_compass.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_compass.xml new file mode 100644 index 0000000000..076229b11e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_dekupouch.xml new file mode 100644 index 0000000000..8925e6fa5f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_egg.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_egg.xml new file mode 100644 index 0000000000..2b2e2847db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_eye_lotion.xml new file mode 100644 index 0000000000..5128c5f6ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fire.xml new file mode 100644 index 0000000000..4bfd76a7c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fish.xml new file mode 100644 index 0000000000..edb39dc297 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_frog.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_frog.xml new file mode 100644 index 0000000000..a656c306bd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudo.xml new file mode 100644 index 0000000000..d65daee8e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudomask.xml new file mode 100644 index 0000000000..cfcb878d9b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ghost.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ghost.xml new file mode 100644 index 0000000000..795f0cfd10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_glasses.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_glasses.xml new file mode 100644 index 0000000000..63d32ab5ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gloves.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gloves.xml new file mode 100644 index 0000000000..0e1c4259d5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_goddess.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_goddess.xml new file mode 100644 index 0000000000..50cbdd8918 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_golonmask.xml new file mode 100644 index 0000000000..844d90e714 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_grass.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_grass.xml new file mode 100644 index 0000000000..ae7834201a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hammer.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hammer.xml new file mode 100644 index 0000000000..feb5c8659d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_heart.xml new file mode 100644 index 0000000000..48e78b1b5c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hearts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hearts.xml new file mode 100644 index 0000000000..d2e763e631 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hookshot.xml new file mode 100644 index 0000000000..a6b3b0fdac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hoverboots.xml new file mode 100644 index 0000000000..6d41df8fd0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_insect.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_insect.xml new file mode 100644 index 0000000000..7af5b5b3b2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_jewel.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_jewel.xml new file mode 100644 index 0000000000..e83c651164 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_key.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_key.xml new file mode 100644 index 0000000000..a37d45a71c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 0000000000..46eff7d3e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_letter.xml new file mode 100644 index 0000000000..bea8683390 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_liquid.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_liquid.xml new file mode 100644 index 0000000000..18a5c3d7a2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_longsword.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_longsword.xml new file mode 100644 index 0000000000..7161e42e38 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_m_arrow.xml new file mode 100644 index 0000000000..0fd659ae95 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_magicpot.xml new file mode 100644 index 0000000000..7623e6353e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_map.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_map.xml new file mode 100644 index 0000000000..471c1dab97 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_medal.xml new file mode 100644 index 0000000000..28e5b1e683 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_melody.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_melody.xml new file mode 100644 index 0000000000..b01fca9538 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_milk.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_milk.xml new file mode 100644 index 0000000000..a3e223b3e6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_mushroom.xml new file mode 100644 index 0000000000..5b19bca743 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_niwatori.xml new file mode 100644 index 0000000000..c8389f62c2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_nuts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_nuts.xml new file mode 100644 index 0000000000..c59903c43d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina.xml new file mode 100644 index 0000000000..82607677d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina_0.xml new file mode 100644 index 0000000000..2c5f70d984 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_pachinko.xml new file mode 100644 index 0000000000..5f808baf92 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_powder.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_powder.xml new file mode 100644 index 0000000000..fb7dc0155d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_prescription.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_prescription.xml new file mode 100644 index 0000000000..75ae7eb2b7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_purse.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_purse.xml new file mode 100644 index 0000000000..054731dec7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rabit_mask.xml new file mode 100644 index 0000000000..9d4eb9487f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_redead_mask.xml new file mode 100644 index 0000000000..7de08487f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rupy.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rupy.xml new file mode 100644 index 0000000000..0a1af96d0f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_saw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_saw.xml new file mode 100644 index 0000000000..dcc038b7c1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_scale.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_scale.xml new file mode 100644 index 0000000000..1cf5de5b99 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_seed.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_seed.xml new file mode 100644 index 0000000000..82c15c82d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_1.xml new file mode 100644 index 0000000000..2f11e3f6d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_2.xml new file mode 100644 index 0000000000..176ae025fe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_3.xml new file mode 100644 index 0000000000..8d1e5dafd4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_skj_mask.xml new file mode 100644 index 0000000000..e6c90f76f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soldout.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soldout.xml new file mode 100644 index 0000000000..a15b1253e3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soul.xml new file mode 100644 index 0000000000..a68178eba5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_stick.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_stick.xml new file mode 100644 index 0000000000..fed89f4659 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sutaru.xml new file mode 100644 index 0000000000..a2606afbe3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sword_1.xml new file mode 100644 index 0000000000..e1119abca0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ticketstone.xml new file mode 100644 index 0000000000..73bf888d10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_truth_mask.xml new file mode 100644 index 0000000000..3b4edf3dee --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_zoramask.xml new file mode 100644 index 0000000000..e3b1ab10ec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gj.xml new file mode 100644 index 0000000000..ee6dab74f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gjyo_objects.xml new file mode 100644 index 0000000000..ea4f8444fb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gla.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gla.xml new file mode 100644 index 0000000000..499a3720d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gm.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gm.xml new file mode 100644 index 0000000000..91b10cc428 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd.xml new file mode 100644 index 0000000000..3ae3b57f3d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd_magic.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd_magic.xml new file mode 100644 index 0000000000..a88d419d7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gndd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gndd.xml new file mode 100644 index 0000000000..8bf5d770c4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_god_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_god_lgt.xml new file mode 100644 index 0000000000..60df9e4693 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gol.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gol.xml new file mode 100644 index 0000000000..7e04508cb6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goma.xml new file mode 100644 index 0000000000..922678a3cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goroiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goroiwa.xml new file mode 100644 index 0000000000..5d406e9578 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gr.xml new file mode 100644 index 0000000000..5f7360ae57 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gs.xml new file mode 100644 index 0000000000..145be16653 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gt.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gt.xml new file mode 100644 index 0000000000..1d79d4e39e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka.xml new file mode 100644 index 0000000000..f6b263c375 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_door.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_door.xml new file mode 100644 index 0000000000..1376d03569 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_objects.xml new file mode 100644 index 0000000000..3ca6d27c08 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hakach_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hakach_objects.xml new file mode 100644 index 0000000000..0de02aaf15 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hata.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hata.xml new file mode 100644 index 0000000000..b0324c3be3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_heavy_object.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_heavy_object.xml new file mode 100644 index 0000000000..ecc7953211 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hidan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hidan_objects.xml new file mode 100644 index 0000000000..f41c0ee5ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hintnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hintnuts.xml new file mode 100644 index 0000000000..a7290f3955 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hni.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hni.xml new file mode 100644 index 0000000000..6b317eb7a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse.xml new file mode 100644 index 0000000000..74619e5977 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_ganon.xml new file mode 100644 index 0000000000..0a55462e25 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_link_child.xml new file mode 100644 index 0000000000..146c564f55 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_normal.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_normal.xml new file mode 100644 index 0000000000..2facab39c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_zelda.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_zelda.xml new file mode 100644 index 0000000000..af270c6585 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hs.xml new file mode 100644 index 0000000000..cf5d06e1a2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_human.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_human.xml new file mode 100644 index 0000000000..05795cb332 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ice_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ice_objects.xml new file mode 100644 index 0000000000..c7d059d709 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ik.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ik.xml new file mode 100644 index 0000000000..8a6028f7c0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_im.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_im.xml new file mode 100644 index 0000000000..a628a113a4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_in.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_in.xml new file mode 100644 index 0000000000..84c1140475 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ingate.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ingate.xml new file mode 100644 index 0000000000..e6be42bebf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jj.xml new file mode 100644 index 0000000000..62bae8cb91 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_js.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_js.xml new file mode 100644 index 0000000000..ff7bd3efa1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_door.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_door.xml new file mode 100644 index 0000000000..60a7b37886 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_iron.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_iron.xml new file mode 100644 index 0000000000..c6f6773c6a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_obj.xml new file mode 100644 index 0000000000..a1f19b8066 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ka.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ka.xml new file mode 100644 index 0000000000..eb952732b4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kanban.xml new file mode 100644 index 0000000000..9ffc7a2ceb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kibako2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kibako2.xml new file mode 100644 index 0000000000..a701b294de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kingdodongo.xml new file mode 100644 index 0000000000..5ef07a26f7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_km1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_km1.xml new file mode 100644 index 0000000000..0a918a798e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kusa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kusa.xml new file mode 100644 index 0000000000..67291a5543 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kw1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kw1.xml new file mode 100644 index 0000000000..eab561b1fb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kz.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kz.xml new file mode 100644 index 0000000000..4624fefdb6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_light_ring.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_light_ring.xml new file mode 100644 index 0000000000..babe7d2aa7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightbox.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightbox.xml new file mode 100644 index 0000000000..552a79d7c7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightswitch.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightswitch.xml new file mode 100644 index 0000000000..cfd5dcfb40 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_boy.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_boy.xml new file mode 100644 index 0000000000..6351af5050 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_child.xml new file mode 100644 index 0000000000..0de4003731 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma1.xml new file mode 100644 index 0000000000..63eeb38950 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma2.xml new file mode 100644 index 0000000000..ce5910fb80 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mag.xml new file mode 100644 index 0000000000..84467d76d5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mag.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mamenoki.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mamenoki.xml new file mode 100644 index 0000000000..819d890225 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mastergolon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mastergolon.xml new file mode 100644 index 0000000000..6dd9d16592 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokiri.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokiri.xml new file mode 100644 index 0000000000..af5a9ec153 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokirihead.xml new file mode 100644 index 0000000000..c64aa1c49e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterzoora.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterzoora.xml new file mode 100644 index 0000000000..2c703274e1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mb.xml new file mode 100644 index 0000000000..23c0930c02 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_md.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_md.xml new file mode 100644 index 0000000000..161c73dca1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_medal.xml new file mode 100644 index 0000000000..533872a551 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_menkuri_objects.xml new file mode 100644 index 0000000000..4c2b51df5b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mir_ray.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mir_ray.xml new file mode 100644 index 0000000000..2acc9391ab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mizu_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mizu_objects.xml new file mode 100644 index 0000000000..5a18b95cfe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin.xml new file mode 100644 index 0000000000..daf9b05412 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_dark.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_dark.xml new file mode 100644 index 0000000000..2fa0bdbe4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flame.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flame.xml new file mode 100644 index 0000000000..6274feaee1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flash.xml new file mode 100644 index 0000000000..c1040ea118 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_ice.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_ice.xml new file mode 100644 index 0000000000..1aaeea193d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_oka.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_oka.xml new file mode 100644 index 0000000000..0f823b9237 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_soul.xml new file mode 100644 index 0000000000..6386f7f9ea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_wind.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_wind.xml new file mode 100644 index 0000000000..8bba7eb91b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mk.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mk.xml new file mode 100644 index 0000000000..0b4aaae8aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mm.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mm.xml new file mode 100644 index 0000000000..b27837e57e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mo.xml new file mode 100644 index 0000000000..4c4be74c83 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1.xml new file mode 100644 index 0000000000..bb1b31e2fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1a.xml new file mode 100644 index 0000000000..c750ce20d0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2.xml new file mode 100644 index 0000000000..785b858571 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2a.xml new file mode 100644 index 0000000000..ad1bb4d5f0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_objects.xml new file mode 100644 index 0000000000..58ea8c085c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_tex.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_tex.xml new file mode 100644 index 0000000000..8ba4ff2d34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ms.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ms.xml new file mode 100644 index 0000000000..a87d0e6b36 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mu.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mu.xml new file mode 100644 index 0000000000..7251ff7212 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nb.xml new file mode 100644 index 0000000000..74de9e2859 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_niw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_niw.xml new file mode 100644 index 0000000000..4eafec9566 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nwc.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nwc.xml new file mode 100644 index 0000000000..96ffa32383 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ny.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ny.xml new file mode 100644 index 0000000000..e2e8187ff8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA1.xml new file mode 100644 index 0000000000..1d665f1010 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA10.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA10.xml new file mode 100644 index 0000000000..65d0808349 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA11.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA11.xml new file mode 100644 index 0000000000..92ae474b60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA2.xml new file mode 100644 index 0000000000..ffdcd79896 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA3.xml new file mode 100644 index 0000000000..a492bd8751 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA4.xml new file mode 100644 index 0000000000..dcdbbfff9b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA5.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA5.xml new file mode 100644 index 0000000000..55072176dd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA6.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA6.xml new file mode 100644 index 0000000000..c17a510881 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA7.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA7.xml new file mode 100644 index 0000000000..52c68f6394 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA8.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA8.xml new file mode 100644 index 0000000000..8ed2d3df50 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA9.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA9.xml new file mode 100644 index 0000000000..d5c16abfcd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB1.xml new file mode 100644 index 0000000000..2f50c967b2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB2.xml new file mode 100644 index 0000000000..230783ceae --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB3.xml new file mode 100644 index 0000000000..1c42ddaccc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB4.xml new file mode 100644 index 0000000000..2924c9e753 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1.xml new file mode 100644 index 0000000000..4d5b1663fe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE10.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE10.xml new file mode 100644 index 0000000000..04ce914372 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE11.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE11.xml new file mode 100644 index 0000000000..04f6f186da --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE12.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE12.xml new file mode 100644 index 0000000000..a5fa39fd25 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1s.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1s.xml new file mode 100644 index 0000000000..d311e60104 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE2.xml new file mode 100644 index 0000000000..af62ad6d11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE3.xml new file mode 100644 index 0000000000..95227da384 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4.xml new file mode 100644 index 0000000000..ae48d2adef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4s.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4s.xml new file mode 100644 index 0000000000..6037de52f9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE5.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE5.xml new file mode 100644 index 0000000000..f5edf745aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE6.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE6.xml new file mode 100644 index 0000000000..95bb602b6b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE7.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE7.xml new file mode 100644 index 0000000000..b3e588d4c2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE8.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE8.xml new file mode 100644 index 0000000000..be5de24947 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE9.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE9.xml new file mode 100644 index 0000000000..8ea7ee18c7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE_anime.xml new file mode 100644 index 0000000000..f6b4659e22 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1d_map.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1d_map.xml new file mode 100644 index 0000000000..f14fecd825 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1s.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1s.xml new file mode 100644 index 0000000000..fe41dde630 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_o_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_o_anime.xml new file mode 100644 index 0000000000..4ef4ac44c8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_okuta.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_okuta.xml new file mode 100644 index 0000000000..b4fccea6f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_opening_demo1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_opening_demo1.xml new file mode 100644 index 0000000000..fd03230279 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os.xml new file mode 100644 index 0000000000..5880a92930 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os_anime.xml new file mode 100644 index 0000000000..f23636343c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ossan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ossan.xml new file mode 100644 index 0000000000..5788e3a20d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ouke_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ouke_haka.xml new file mode 100644 index 0000000000..11da9b26ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_owl.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_owl.xml new file mode 100644 index 0000000000..64fdf64c53 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_peehat.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_peehat.xml new file mode 100644 index 0000000000..42ee66cdef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_composer.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_composer.xml new file mode 100644 index 0000000000..ff995efceb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_field.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_field.xml new file mode 100644 index 0000000000..78bc0d65ad --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_sisters.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_sisters.xml new file mode 100644 index 0000000000..b429be2588 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_poh.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_poh.xml new file mode 100644 index 0000000000..be6d6eff4b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ps.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ps.xml new file mode 100644 index 0000000000..9f9c894a60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_pu_box.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_pu_box.xml new file mode 100644 index 0000000000..e1d686e979 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rd.xml new file mode 100644 index 0000000000..22c7d33738 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_reeba.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_reeba.xml new file mode 100644 index 0000000000..32c697bd9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_relay_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_relay_objects.xml new file mode 100644 index 0000000000..47b92fcd2d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rl.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rl.xml new file mode 100644 index 0000000000..2a5ad30f6b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rr.xml new file mode 100644 index 0000000000..98726b14bb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rs.xml new file mode 100644 index 0000000000..152b5489e1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru1.xml new file mode 100644 index 0000000000..3d413619ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru2.xml new file mode 100644 index 0000000000..fedf37d48b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sa.xml new file mode 100644 index 0000000000..ec45ac961d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sb.xml new file mode 100644 index 0000000000..64d3bb005a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sd.xml new file mode 100644 index 0000000000..fb58428c3f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shop_dungen.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shop_dungen.xml new file mode 100644 index 0000000000..594c43d390 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shopnuts.xml new file mode 100644 index 0000000000..7065f8941a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_siofuki.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_siofuki.xml new file mode 100644 index 0000000000..a23240a728 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sk2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sk2.xml new file mode 100644 index 0000000000..f2e7ef6d89 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skb.xml new file mode 100644 index 0000000000..5b5efb4848 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skj.xml new file mode 100644 index 0000000000..74548e5185 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_break.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_break.xml new file mode 100644 index 0000000000..d3be88315f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_objects.xml new file mode 100644 index 0000000000..10fb13aeac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoya.xml new file mode 100644 index 0000000000..d44b944e0e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoyab.xml new file mode 100644 index 0000000000..720f50cd3e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects.xml new file mode 100644 index 0000000000..413e032a9c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects2.xml new file mode 100644 index 0000000000..36741a9492 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot02_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot02_objects.xml new file mode 100644 index 0000000000..65f45ff515 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot03_object.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot03_object.xml new file mode 100644 index 0000000000..f182e7d99a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot04_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot04_objects.xml new file mode 100644 index 0000000000..66293d7523 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot05_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot05_objects.xml new file mode 100644 index 0000000000..6e70791493 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot06_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot06_objects.xml new file mode 100644 index 0000000000..e3da63b0f0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot07_object.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot07_object.xml new file mode 100644 index 0000000000..5bc2bfb6bf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot08_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot08_obj.xml new file mode 100644 index 0000000000..4d71f3473f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot09_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot09_obj.xml new file mode 100644 index 0000000000..eb65283931 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot11_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot11_obj.xml new file mode 100644 index 0000000000..257298f7cc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot12_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot12_obj.xml new file mode 100644 index 0000000000..d619c781e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot15_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot15_obj.xml new file mode 100644 index 0000000000..bd59b8cd18 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot16_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot16_obj.xml new file mode 100644 index 0000000000..d39de812a9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot17_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot17_obj.xml new file mode 100644 index 0000000000..d4239d8d28 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot18_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot18_obj.xml new file mode 100644 index 0000000000..cc12b78946 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ssh.xml new file mode 100644 index 0000000000..6283f8e9f2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sst.xml new file mode 100644 index 0000000000..b874b9a418 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_st.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_st.xml new file mode 100644 index 0000000000..983b9e2eab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_stream.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_stream.xml new file mode 100644 index 0000000000..59b0838e47 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_syokudai.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_syokudai.xml new file mode 100644 index 0000000000..c1670edece --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ta.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ta.xml new file mode 100644 index 0000000000..5e446bf5c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_timeblock.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_timeblock.xml new file mode 100644 index 0000000000..1d6b9e698c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tite.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tite.xml new file mode 100644 index 0000000000..1be65c4950 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tk.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tk.xml new file mode 100644 index 0000000000..6b6cce7244 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toki_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toki_objects.xml new file mode 100644 index 0000000000..cd07e60d2b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_torch2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_torch2.xml new file mode 100644 index 0000000000..3388e7d34e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toryo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toryo.xml new file mode 100644 index 0000000000..73f3dcb1e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tp.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tp.xml new file mode 100644 index 0000000000..8ea908825e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tr.xml new file mode 100644 index 0000000000..17ab9ae392 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_trap.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_trap.xml new file mode 100644 index 0000000000..56195cf41b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_triforce_spot.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_triforce_spot.xml new file mode 100644 index 0000000000..87d4494589 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ts.xml new file mode 100644 index 0000000000..567277bc39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tsubo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tsubo.xml new file mode 100644 index 0000000000..ee2c5e1846 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tw.xml new file mode 100644 index 0000000000..c7fd2a60be --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_umajump.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_umajump.xml new file mode 100644 index 0000000000..2ee4ade46a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vali.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vali.xml new file mode 100644 index 0000000000..2bab5efaa6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vase.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vase.xml new file mode 100644 index 0000000000..091d4c51e3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vm.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vm.xml new file mode 100644 index 0000000000..c5b949b36e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wallmaster.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wallmaster.xml new file mode 100644 index 0000000000..fbbc4f4af3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp1.xml new file mode 100644 index 0000000000..1497d7a108 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp2.xml new file mode 100644 index 0000000000..b6d1b3624c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wf.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wf.xml new file mode 100644 index 0000000000..ebfb708d2d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wood02.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wood02.xml new file mode 100644 index 0000000000..47ec342caa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_xc.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_xc.xml new file mode 100644 index 0000000000..bb2bf3e7af --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yabusame_point.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yabusame_point.xml new file mode 100644 index 0000000000..bed9e8a609 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ydan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ydan_objects.xml new file mode 100644 index 0000000000..e2adf307f7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yukabyun.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yukabyun.xml new file mode 100644 index 0000000000..d594ebbb89 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zf.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zf.xml new file mode 100644 index 0000000000..7f20eb7866 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zg.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zg.xml new file mode 100644 index 0000000000..79005516c4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl1.xml new file mode 100644 index 0000000000..001e5be145 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2.xml new file mode 100644 index 0000000000..959a919ec6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime1.xml new file mode 100644 index 0000000000..cada504867 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime2.xml new file mode 100644 index 0000000000..47016e2e00 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl4.xml new file mode 100644 index 0000000000..8e7a2837ed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zo.xml new file mode 100644 index 0000000000..77465760ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 0000000000..4c562a20d6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 0000000000..9a5798ff0d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Light.xml new file mode 100644 index 0000000000..4f183e0408 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 0000000000..745a1974fe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 0000000000..752a28b0a3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 0000000000..5dba82099f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 0000000000..d69b3d4736 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 0000000000..da1dba0c21 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Sst.xml new file mode 100644 index 0000000000..83576e0ceb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Demo_Shd.xml new file mode 100644 index 0000000000..d898616a71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Bili.xml new file mode 100644 index 0000000000..1e806241eb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 0000000000..e5394879fd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 0000000000..9b59ab5641 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 0000000000..109aa0056a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Holl.xml new file mode 100644 index 0000000000..5118d7a03a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 0000000000..7d25a40152 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Kanban.xml new file mode 100644 index 0000000000..00ef7e06dc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sda.xml new file mode 100644 index 0000000000..13a75e568c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ssh.xml new file mode 100644 index 0000000000..3028aa3f6e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_St.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_St.xml new file mode 100644 index 0000000000..0bbe47ce05 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sth.xml new file mode 100644 index 0000000000..517a476301 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_End_Title.xml new file mode 100644 index 0000000000..5fa2fa107f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_File_Choose.xml new file mode 100644 index 0000000000..9fe7266acb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_File_Choose.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Dark.xml new file mode 100644 index 0000000000..d5579801bc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Fire.xml new file mode 100644 index 0000000000..87a8d3258b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Wind.xml new file mode 100644 index 0000000000..261606e525 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 0000000000..dfc63dca12 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 0000000000..131239ad9a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 0000000000..e32e56a4e5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 0000000000..f31b1201d6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 0000000000..a9bb006578 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 0000000000..1cfceb7a56 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/Bmori1.xml new file mode 100644 index 0000000000..373f360303 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 0000000000..89331ecc2f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan.xml new file mode 100644 index 0000000000..e557c80a55 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 0000000000..97401aff65 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 0000000000..d36ac6b774 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HIDAN.xml new file mode 100644 index 0000000000..fa4d784f1a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin.xml new file mode 100644 index 0000000000..00c5aa82dd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 0000000000..99ae2b3efe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan.xml new file mode 100644 index 0000000000..a9e520f4cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan_boss.xml new file mode 100644 index 0000000000..9fccf2c301 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan.xml new file mode 100644 index 0000000000..1446a9c98b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan_boss.xml new file mode 100644 index 0000000000..05633e53e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon.xml new file mode 100644 index 0000000000..f857dbe94e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_boss.xml new file mode 100644 index 0000000000..36c5e81070 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_demo.xml new file mode 100644 index 0000000000..56c98efed7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_final.xml new file mode 100644 index 0000000000..3ec568cfb9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 0000000000..84ef36950c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_tou.xml new file mode 100644 index 0000000000..1ae37b9637 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontika.xml new file mode 100644 index 0000000000..a5ff210ce1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 0000000000..060d4941ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/gerudoway.xml new file mode 100644 index 0000000000..8272776143 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 0000000000..0f1bc3b285 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinboss.xml new file mode 100644 index 0000000000..86c0d317b2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinzou.xml new file mode 100644 index 0000000000..bc14a46ac3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/men.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/men.xml new file mode 100644 index 0000000000..d9e5960e82 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/moribossroom.xml new file mode 100644 index 0000000000..b9959eefab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan.xml new file mode 100644 index 0000000000..aed7d26604 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan_boss.xml new file mode 100644 index 0000000000..7ea240547a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/bowling.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/bowling.xml new file mode 100644 index 0000000000..9a41763a27 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 0000000000..4f9a03fc02 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa.xml new file mode 100644 index 0000000000..06d89f2fe7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 0000000000..6f4c181e0e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hakasitarelay.xml new file mode 100644 index 0000000000..91be63d147 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hut.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hut.xml new file mode 100644 index 0000000000..a4ef5715ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hylia_labo.xml new file mode 100644 index 0000000000..56822e67a7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/impa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/impa.xml new file mode 100644 index 0000000000..db757e3d3c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kakariko.xml new file mode 100644 index 0000000000..e4e9b102c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kenjyanoma.xml new file mode 100644 index 0000000000..4e8a58f3b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home.xml new file mode 100644 index 0000000000..8c0305493a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home3.xml new file mode 100644 index 0000000000..9f36eb41c9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home4.xml new file mode 100644 index 0000000000..eb861aedb4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home5.xml new file mode 100644 index 0000000000..974987feda --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/labo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/labo.xml new file mode 100644 index 0000000000..c0a9d2eb8c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/link_home.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/link_home.xml new file mode 100644 index 0000000000..2fb88ae347 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/mahouya.xml new file mode 100644 index 0000000000..8ae462f9db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/malon_stable.xml new file mode 100644 index 0000000000..aff97eeb86 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/miharigoya.xml new file mode 100644 index 0000000000..63f8676ac1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/nakaniwa.xml new file mode 100644 index 0000000000..2fb2d5e6a4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/syatekijyou.xml new file mode 100644 index 0000000000..05243b52ca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/takaraya.xml new file mode 100644 index 0000000000..5b438980b7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tent.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tent.xml new file mode 100644 index 0000000000..de72cc5f45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tokinoma.xml new file mode 100644 index 0000000000..d7878b8951 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 0000000000..3b6dd2dec2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 0000000000..90a8d95d09 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/enrui.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/enrui.xml new file mode 100644 index 0000000000..d8c06e5454 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/entra_n.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/entra_n.xml new file mode 100644 index 0000000000..5b408ac3a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana.xml new file mode 100644 index 0000000000..e7dc93dd0c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana2.xml new file mode 100644 index 0000000000..2d8ba4906a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana_ouke.xml new file mode 100644 index 0000000000..17f53613e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hiral_demo.xml new file mode 100644 index 0000000000..1331fdd4c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakariko3.xml new file mode 100644 index 0000000000..07b62c44df --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakusiana.xml new file mode 100644 index 0000000000..c3f993ff4f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kinsuta.xml new file mode 100644 index 0000000000..aac0f6c4ea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley.xml new file mode 100644 index 0000000000..c304673032 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley_n.xml new file mode 100644 index 0000000000..65db604113 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_day.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_day.xml new file mode 100644 index 0000000000..00887e69cd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_night.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_night.xml new file mode 100644 index 0000000000..c58e38744e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_ruins.xml new file mode 100644 index 0000000000..f0ec75e759 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine.xml new file mode 100644 index 0000000000..b9ddf2cf70 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_n.xml new file mode 100644 index 0000000000..4878338aa1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_r.xml new file mode 100644 index 0000000000..1220367919 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/turibori.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/turibori.xml new file mode 100644 index 0000000000..0633224d9c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/entra.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/entra.xml new file mode 100644 index 0000000000..92ee57f59a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/souko.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/souko.xml new file mode 100644 index 0000000000..8dd9d9e48a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot00.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot00.xml new file mode 100644 index 0000000000..508d9309b3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot01.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot01.xml new file mode 100644 index 0000000000..eb725afa68 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot02.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot02.xml new file mode 100644 index 0000000000..c7924c29db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot03.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot03.xml new file mode 100644 index 0000000000..9434185f44 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot04.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot04.xml new file mode 100644 index 0000000000..f338604207 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot05.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot05.xml new file mode 100644 index 0000000000..4f7c62b91e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot06.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot06.xml new file mode 100644 index 0000000000..f4af602cfd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot07.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot07.xml new file mode 100644 index 0000000000..eeb976f7f6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot08.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot08.xml new file mode 100644 index 0000000000..86582f0dca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot09.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot09.xml new file mode 100644 index 0000000000..5bb9e059c7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot10.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot10.xml new file mode 100644 index 0000000000..66365e3d86 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot11.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot11.xml new file mode 100644 index 0000000000..76ff3b8223 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot12.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot12.xml new file mode 100644 index 0000000000..e21523b217 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot13.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot13.xml new file mode 100644 index 0000000000..c689130650 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot15.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot15.xml new file mode 100644 index 0000000000..e75f7b6845 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot16.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot16.xml new file mode 100644 index 0000000000..f41b226f8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot17.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot17.xml new file mode 100644 index 0000000000..feb267251e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot18.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot18.xml new file mode 100644 index 0000000000..d70fccf4bb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot20.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot20.xml new file mode 100644 index 0000000000..1381f6ecbe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/alley_shop.xml new file mode 100644 index 0000000000..95548de1bd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/drag.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/drag.xml new file mode 100644 index 0000000000..acb6515fba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/face_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/face_shop.xml new file mode 100644 index 0000000000..16a9746081 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/golon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/golon.xml new file mode 100644 index 0000000000..c586727988 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/kokiri_shop.xml new file mode 100644 index 0000000000..50cd633e57 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/night_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/night_shop.xml new file mode 100644 index 0000000000..5954d9c83d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/shop1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/shop1.xml new file mode 100644 index 0000000000..525a06d633 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/zoora.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/zoora.xml new file mode 100644 index 0000000000..0e4ac18f8c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_field.xml b/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_field.xml new file mode 100644 index 0000000000..789a554ce8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_ydan.xml new file mode 100644 index 0000000000..f784afcf45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/text/message_data_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/text/message_data_static.xml new file mode 100644 index 0000000000..94948fa8e7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/backgrounds.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/backgrounds.xml new file mode 100644 index 0000000000..c60ff57a8a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/boss_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/boss_title_cards.xml new file mode 100644 index 0000000000..84f555bd10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/do_action_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/do_action_static.xml new file mode 100644 index 0000000000..efabd54a58 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_24_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_24_static.xml new file mode 100644 index 0000000000..cdb8cc7379 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_dungeon_static.xml new file mode 100644 index 0000000000..873c490fc5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_field_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_field_static.xml new file mode 100644 index 0000000000..ed991406b5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_gameover_static.xml new file mode 100644 index 0000000000..ffd3928680 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_jpn_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_jpn_static.xml new file mode 100644 index 0000000000..f2fe854b8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_nes_static.xml new file mode 100644 index 0000000000..6cd92acfca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_static.xml new file mode 100644 index 0000000000..9e844615b1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/item_name_static.xml new file mode 100644 index 0000000000..1bc074c2ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/kanji.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/kanji.xml new file mode 100644 index 0000000000..5159387a13 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_48x85_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_48x85_static.xml new file mode 100644 index 0000000000..b2ea46340a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_grand_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_grand_static.xml new file mode 100644 index 0000000000..201955bfc3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_i_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_i_static.xml new file mode 100644 index 0000000000..1721f6d848 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_name_static.xml new file mode 100644 index 0000000000..ca4c4c0bd6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_static.xml new file mode 100644 index 0000000000..afdde60def --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_texture_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_texture_static.xml new file mode 100644 index 0000000000..bbf7e1259e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/nes_font_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/nes_font_static.xml new file mode 100644 index 0000000000..b01646cb54 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/nes_font_static.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/nintendo_rogo_static.xml new file mode 100644 index 0000000000..f09de3b0f9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/parameter_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/parameter_static.xml new file mode 100644 index 0000000000..c51dacf1f6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/place_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/place_title_cards.xml new file mode 100644 index 0000000000..b688cce00c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/skyboxes.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/skyboxes.xml new file mode 100644 index 0000000000..104ffb2a3f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/title_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/title_static.xml new file mode 100644 index 0000000000..5f58c5a820 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/audio/Audio.xml b/soh/assets/xml/GC_NMQ_PAL_F/audio/Audio.xml index 082ead4439..2c3a6a02a5 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/audio/Audio.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/code/sys_matrix.xml b/soh/assets/xml/GC_NMQ_PAL_F/code/sys_matrix.xml index 486cb244d8..045ad0c76a 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/code/sys_matrix.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml index 5ffc52f655..8824228847 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/assets/xml/N64_NTSC_10/audio/Audio.xml b/soh/assets/xml/N64_NTSC_10/audio/Audio.xml new file mode 100644 index 0000000000..7b00aa9750 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/audio/Audio.xml @@ -0,0 +1,647 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/code/fbdemo_circle.xml b/soh/assets/xml/N64_NTSC_10/code/fbdemo_circle.xml new file mode 100644 index 0000000000..9217b2f278 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/code/fbdemo_triforce.xml b/soh/assets/xml/N64_NTSC_10/code/fbdemo_triforce.xml new file mode 100644 index 0000000000..ac32212346 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/code/fbdemo_wipe1.xml b/soh/assets/xml/N64_NTSC_10/code/fbdemo_wipe1.xml new file mode 100644 index 0000000000..aeb78987d5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/code/sys_matrix.xml b/soh/assets/xml/N64_NTSC_10/code/sys_matrix.xml new file mode 100644 index 0000000000..66bd15b596 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/misc/link_animetion.xml b/soh/assets/xml/N64_NTSC_10/misc/link_animetion.xml new file mode 100644 index 0000000000..9de1e92d36 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/N64_NTSC_10/objects/gameplay_dangeon_keep.xml new file mode 100644 index 0000000000..5b1a9050d9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/gameplay_field_keep.xml b/soh/assets/xml/N64_NTSC_10/objects/gameplay_field_keep.xml new file mode 100644 index 0000000000..011e8f7fc7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/gameplay_keep.xml b/soh/assets/xml/N64_NTSC_10/objects/gameplay_keep.xml new file mode 100644 index 0000000000..94eee8845e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_Bb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_Bb.xml new file mode 100644 index 0000000000..5d04bde451 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ahg.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ahg.xml new file mode 100644 index 0000000000..4d37b1b110 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_am.xml b/soh/assets/xml/N64_NTSC_10/objects/object_am.xml new file mode 100644 index 0000000000..b70c70d709 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ane.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ane.xml new file mode 100644 index 0000000000..1e29b351e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ani.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ani.xml new file mode 100644 index 0000000000..c70621c6f9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_anubice.xml b/soh/assets/xml/N64_NTSC_10/objects/object_anubice.xml new file mode 100644 index 0000000000..fb029586ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_aob.xml b/soh/assets/xml/N64_NTSC_10/objects/object_aob.xml new file mode 100644 index 0000000000..e6202d0cf9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_b_heart.xml b/soh/assets/xml/N64_NTSC_10/objects/object_b_heart.xml new file mode 100644 index 0000000000..00f7cd6773 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bba.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bba.xml new file mode 100644 index 0000000000..ccc5c21365 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bdan_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bdan_objects.xml new file mode 100644 index 0000000000..dcd56d3856 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bdoor.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bdoor.xml new file mode 100644 index 0000000000..a092f0c23b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bg.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bg.xml new file mode 100644 index 0000000000..791226b71d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bigokuta.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bigokuta.xml new file mode 100644 index 0000000000..1c7d39e319 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bird.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bird.xml new file mode 100644 index 0000000000..167a5022dc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bji.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bji.xml new file mode 100644 index 0000000000..c665b6b001 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bl.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bl.xml new file mode 100644 index 0000000000..1c2ef4ec63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_blkobj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_blkobj.xml new file mode 100644 index 0000000000..345a8ebd9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bob.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bob.xml new file mode 100644 index 0000000000..289e994e47 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_boj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_boj.xml new file mode 100644 index 0000000000..4be4764ab5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bombf.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bombf.xml new file mode 100644 index 0000000000..83e60248d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bombiwa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bombiwa.xml new file mode 100644 index 0000000000..26ab6b4f33 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bowl.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bowl.xml new file mode 100644 index 0000000000..ffe6d43db7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_box.xml b/soh/assets/xml/N64_NTSC_10/objects/object_box.xml new file mode 100644 index 0000000000..106d2d3356 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_brob.xml b/soh/assets/xml/N64_NTSC_10/objects/object_brob.xml new file mode 100644 index 0000000000..718dcd5617 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bubble.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bubble.xml new file mode 100644 index 0000000000..f5de186920 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bv.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bv.xml new file mode 100644 index 0000000000..d2ebf275ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bw.xml new file mode 100644 index 0000000000..6fd39fbb1c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bwall.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bwall.xml new file mode 100644 index 0000000000..d4f43ddc14 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bxa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bxa.xml new file mode 100644 index 0000000000..fb78c117e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_cne.xml b/soh/assets/xml/N64_NTSC_10/objects/object_cne.xml new file mode 100644 index 0000000000..0c14d0bc54 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_cob.xml b/soh/assets/xml/N64_NTSC_10/objects/object_cob.xml new file mode 100644 index 0000000000..ba051cfa74 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_cow.xml b/soh/assets/xml/N64_NTSC_10/objects/object_cow.xml new file mode 100644 index 0000000000..5d067c329f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_crow.xml b/soh/assets/xml/N64_NTSC_10/objects/object_crow.xml new file mode 100644 index 0000000000..77337c6445 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_cs.xml b/soh/assets/xml/N64_NTSC_10/objects/object_cs.xml new file mode 100644 index 0000000000..83804ccaf4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_d_elevator.xml b/soh/assets/xml/N64_NTSC_10/objects/object_d_elevator.xml new file mode 100644 index 0000000000..6be59c154b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_d_hsblock.xml b/soh/assets/xml/N64_NTSC_10/objects/object_d_hsblock.xml new file mode 100644 index 0000000000..4bb50c2b4f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_d_lift.xml b/soh/assets/xml/N64_NTSC_10/objects/object_d_lift.xml new file mode 100644 index 0000000000..2912385190 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_daiku.xml b/soh/assets/xml/N64_NTSC_10/objects/object_daiku.xml new file mode 100644 index 0000000000..1524c7a26c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ddan_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ddan_objects.xml new file mode 100644 index 0000000000..3fc563b96f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dekubaba.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dekubaba.xml new file mode 100644 index 0000000000..7202a833fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dekujr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dekujr.xml new file mode 100644 index 0000000000..e906bf61c4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dekunuts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dekunuts.xml new file mode 100644 index 0000000000..5fceef4165 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_demo_6k.xml b/soh/assets/xml/N64_NTSC_10/objects/object_demo_6k.xml new file mode 100644 index 0000000000..73058d5e46 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_demo_kekkai.xml b/soh/assets/xml/N64_NTSC_10/objects/object_demo_kekkai.xml new file mode 100644 index 0000000000..aa54bc2eef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_demo_tre_lgt.xml b/soh/assets/xml/N64_NTSC_10/objects/object_demo_tre_lgt.xml new file mode 100644 index 0000000000..9ea19012b7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dh.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dh.xml new file mode 100644 index 0000000000..7a52d7dbe7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dnk.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dnk.xml new file mode 100644 index 0000000000..3bce343048 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dns.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dns.xml new file mode 100644 index 0000000000..8b78ffcf20 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dodojr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dodojr.xml new file mode 100644 index 0000000000..4dfd7d6e45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dodongo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dodongo.xml new file mode 100644 index 0000000000..779e20e9dc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dog.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dog.xml new file mode 100644 index 0000000000..ef00442b60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_door_gerudo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_door_gerudo.xml new file mode 100644 index 0000000000..2f17262041 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_door_killer.xml b/soh/assets/xml/N64_NTSC_10/objects/object_door_killer.xml new file mode 100644 index 0000000000..a37f590d60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ds.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ds.xml new file mode 100644 index 0000000000..0413a9e2e8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ds2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ds2.xml new file mode 100644 index 0000000000..683bcc68d4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_du.xml b/soh/assets/xml/N64_NTSC_10/objects/object_du.xml new file mode 100644 index 0000000000..0babd962b9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dy_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dy_obj.xml new file mode 100644 index 0000000000..5e792edb50 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ec.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ec.xml new file mode 100644 index 0000000000..7ec83e284d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_crystal_light.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_crystal_light.xml new file mode 100644 index 0000000000..9215b6a394 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_doughnut.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_doughnut.xml new file mode 100644 index 0000000000..7f12c56f53 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_erupc.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_erupc.xml new file mode 100644 index 0000000000..800d9535f1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_fire_ball.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_fire_ball.xml new file mode 100644 index 0000000000..2fc65b16ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_flash.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_flash.xml new file mode 100644 index 0000000000..5f962f162b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_lgt_shower.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_lgt_shower.xml new file mode 100644 index 0000000000..67ef5ce7e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_star_field.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_star_field.xml new file mode 100644 index 0000000000..00b47c460f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_tw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_tw.xml new file mode 100644 index 0000000000..de53765696 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ei.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ei.xml new file mode 100644 index 0000000000..e4132491f4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fa.xml new file mode 100644 index 0000000000..2f1bf9a5e8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fd.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fd.xml new file mode 100644 index 0000000000..2609579670 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fd2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fd2.xml new file mode 100644 index 0000000000..44b5f5f9c1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fhg.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fhg.xml new file mode 100644 index 0000000000..669875aaf8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fire.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fire.xml new file mode 100644 index 0000000000..49bf620cb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_firefly.xml b/soh/assets/xml/N64_NTSC_10/objects/object_firefly.xml new file mode 100644 index 0000000000..8c26a43418 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fish.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fish.xml new file mode 100644 index 0000000000..f5ad4f6da0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fr.xml new file mode 100644 index 0000000000..25ee2ad42e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fu.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fu.xml new file mode 100644 index 0000000000..82c449e3de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fw.xml new file mode 100644 index 0000000000..ee9821d263 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fz.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fz.xml new file mode 100644 index 0000000000..dad6fec5ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon.xml new file mode 100644 index 0000000000..c654c7fec9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon2.xml new file mode 100644 index 0000000000..7e715dd414 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime1.xml new file mode 100644 index 0000000000..b1016299bc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime2.xml new file mode 100644 index 0000000000..180e5995c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime3.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime3.xml new file mode 100644 index 0000000000..be4c4dcb15 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_objects.xml new file mode 100644 index 0000000000..5e32610ffc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ge1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ge1.xml new file mode 100644 index 0000000000..79e0768b81 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_geff.xml b/soh/assets/xml/N64_NTSC_10/objects/object_geff.xml new file mode 100644 index 0000000000..f0667743b0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_geldb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_geldb.xml new file mode 100644 index 0000000000..49b12ef2e5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrow.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrow.xml new file mode 100644 index 0000000000..4b58787a9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrowcase.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrowcase.xml new file mode 100644 index 0000000000..267b0a734d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bean.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bean.xml new file mode 100644 index 0000000000..e74247816f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_1.xml new file mode 100644 index 0000000000..bae86c11d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_2.xml new file mode 100644 index 0000000000..1400c4a4d4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bombpouch.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bombpouch.xml new file mode 100644 index 0000000000..07134748c3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_boomerang.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_boomerang.xml new file mode 100644 index 0000000000..3c1a0fe7fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_boots_2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_boots_2.xml new file mode 100644 index 0000000000..3bcb6a47ae --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bosskey.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bosskey.xml new file mode 100644 index 0000000000..e5e4bc86c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle.xml new file mode 100644 index 0000000000..3b0884a03f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle_letter.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle_letter.xml new file mode 100644 index 0000000000..443219caf5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bow.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bow.xml new file mode 100644 index 0000000000..946e9c4965 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bracelet.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bracelet.xml new file mode 100644 index 0000000000..5a0b62a60a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_brokensword.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_brokensword.xml new file mode 100644 index 0000000000..408741ac54 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_butterfly.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_butterfly.xml new file mode 100644 index 0000000000..7b60a77247 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_clothes.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_clothes.xml new file mode 100644 index 0000000000..3f897b6d13 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_coin.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_coin.xml new file mode 100644 index 0000000000..22e29f255f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_compass.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_compass.xml new file mode 100644 index 0000000000..076229b11e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_dekupouch.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_dekupouch.xml new file mode 100644 index 0000000000..8925e6fa5f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_egg.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_egg.xml new file mode 100644 index 0000000000..2b2e2847db --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_eye_lotion.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_eye_lotion.xml new file mode 100644 index 0000000000..5128c5f6ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_fire.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_fire.xml new file mode 100644 index 0000000000..4bfd76a7c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_fish.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_fish.xml new file mode 100644 index 0000000000..edb39dc297 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_frog.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_frog.xml new file mode 100644 index 0000000000..a656c306bd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudo.xml new file mode 100644 index 0000000000..d65daee8e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudomask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudomask.xml new file mode 100644 index 0000000000..cfcb878d9b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_ghost.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ghost.xml new file mode 100644 index 0000000000..795f0cfd10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_glasses.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_glasses.xml new file mode 100644 index 0000000000..63d32ab5ac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_gloves.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gloves.xml new file mode 100644 index 0000000000..0e1c4259d5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_goddess.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_goddess.xml new file mode 100644 index 0000000000..50cbdd8918 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_golonmask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_golonmask.xml new file mode 100644 index 0000000000..844d90e714 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_grass.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_grass.xml new file mode 100644 index 0000000000..ae7834201a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_hammer.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hammer.xml new file mode 100644 index 0000000000..feb5c8659d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_heart.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_heart.xml new file mode 100644 index 0000000000..48e78b1b5c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_hearts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hearts.xml new file mode 100644 index 0000000000..d2e763e631 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_hookshot.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hookshot.xml new file mode 100644 index 0000000000..a6b3b0fdac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_hoverboots.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hoverboots.xml new file mode 100644 index 0000000000..6d41df8fd0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_insect.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_insect.xml new file mode 100644 index 0000000000..7af5b5b3b2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_jewel.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_jewel.xml new file mode 100644 index 0000000000..e83c651164 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_key.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_key.xml new file mode 100644 index 0000000000..a37d45a71c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 0000000000..46eff7d3e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_letter.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_letter.xml new file mode 100644 index 0000000000..bea8683390 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_liquid.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_liquid.xml new file mode 100644 index 0000000000..18a5c3d7a2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_longsword.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_longsword.xml new file mode 100644 index 0000000000..7161e42e38 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_m_arrow.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_m_arrow.xml new file mode 100644 index 0000000000..0fd659ae95 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_magicpot.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_magicpot.xml new file mode 100644 index 0000000000..7623e6353e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_map.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_map.xml new file mode 100644 index 0000000000..471c1dab97 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_medal.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_medal.xml new file mode 100644 index 0000000000..28e5b1e683 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_melody.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_melody.xml new file mode 100644 index 0000000000..b01fca9538 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_milk.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_milk.xml new file mode 100644 index 0000000000..a3e223b3e6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_mushroom.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_mushroom.xml new file mode 100644 index 0000000000..5b19bca743 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_niwatori.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_niwatori.xml new file mode 100644 index 0000000000..c8389f62c2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_nuts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_nuts.xml new file mode 100644 index 0000000000..c59903c43d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina.xml new file mode 100644 index 0000000000..82607677d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina_0.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina_0.xml new file mode 100644 index 0000000000..2c5f70d984 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_pachinko.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_pachinko.xml new file mode 100644 index 0000000000..5f808baf92 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_powder.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_powder.xml new file mode 100644 index 0000000000..fb7dc0155d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_prescription.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_prescription.xml new file mode 100644 index 0000000000..75ae7eb2b7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_purse.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_purse.xml new file mode 100644 index 0000000000..054731dec7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_rabit_mask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_rabit_mask.xml new file mode 100644 index 0000000000..9d4eb9487f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_redead_mask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_redead_mask.xml new file mode 100644 index 0000000000..7de08487f8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_rupy.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_rupy.xml new file mode 100644 index 0000000000..0a1af96d0f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_saw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_saw.xml new file mode 100644 index 0000000000..dcc038b7c1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_scale.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_scale.xml new file mode 100644 index 0000000000..1cf5de5b99 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_seed.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_seed.xml new file mode 100644 index 0000000000..82c15c82d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_1.xml new file mode 100644 index 0000000000..2f11e3f6d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_2.xml new file mode 100644 index 0000000000..176ae025fe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_3.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_3.xml new file mode 100644 index 0000000000..8d1e5dafd4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_skj_mask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_skj_mask.xml new file mode 100644 index 0000000000..e6c90f76f1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_soldout.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_soldout.xml new file mode 100644 index 0000000000..a15b1253e3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_soul.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_soul.xml new file mode 100644 index 0000000000..a68178eba5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_stick.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_stick.xml new file mode 100644 index 0000000000..fed89f4659 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_sutaru.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_sutaru.xml new file mode 100644 index 0000000000..a2606afbe3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_sword_1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_sword_1.xml new file mode 100644 index 0000000000..e1119abca0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_ticketstone.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ticketstone.xml new file mode 100644 index 0000000000..73bf888d10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_truth_mask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_truth_mask.xml new file mode 100644 index 0000000000..3b4edf3dee --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_zoramask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_zoramask.xml new file mode 100644 index 0000000000..e3b1ab10ec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gj.xml new file mode 100644 index 0000000000..ee6dab74f8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gjyo_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gjyo_objects.xml new file mode 100644 index 0000000000..ea4f8444fb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gla.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gla.xml new file mode 100644 index 0000000000..499a3720d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gm.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gm.xml new file mode 100644 index 0000000000..91b10cc428 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gnd.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gnd.xml new file mode 100644 index 0000000000..3ae3b57f3d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gnd_magic.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gnd_magic.xml new file mode 100644 index 0000000000..a88d419d7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gndd.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gndd.xml new file mode 100644 index 0000000000..8bf5d770c4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_god_lgt.xml b/soh/assets/xml/N64_NTSC_10/objects/object_god_lgt.xml new file mode 100644 index 0000000000..60df9e4693 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gol.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gol.xml new file mode 100644 index 0000000000..7e04508cb6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_goma.xml b/soh/assets/xml/N64_NTSC_10/objects/object_goma.xml new file mode 100644 index 0000000000..922678a3cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_goroiwa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_goroiwa.xml new file mode 100644 index 0000000000..5d406e9578 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gr.xml new file mode 100644 index 0000000000..5f7360ae57 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gs.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gs.xml new file mode 100644 index 0000000000..145be16653 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gt.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gt.xml new file mode 100644 index 0000000000..1d79d4e39e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_haka.xml b/soh/assets/xml/N64_NTSC_10/objects/object_haka.xml new file mode 100644 index 0000000000..f6b263c375 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_haka_door.xml b/soh/assets/xml/N64_NTSC_10/objects/object_haka_door.xml new file mode 100644 index 0000000000..1376d03569 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_haka_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_haka_objects.xml new file mode 100644 index 0000000000..3ca6d27c08 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hakach_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hakach_objects.xml new file mode 100644 index 0000000000..0de02aaf15 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hata.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hata.xml new file mode 100644 index 0000000000..b0324c3be3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_heavy_object.xml b/soh/assets/xml/N64_NTSC_10/objects/object_heavy_object.xml new file mode 100644 index 0000000000..ecc7953211 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hidan_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hidan_objects.xml new file mode 100644 index 0000000000..f41c0ee5ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hintnuts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hintnuts.xml new file mode 100644 index 0000000000..a7290f3955 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hni.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hni.xml new file mode 100644 index 0000000000..6b317eb7a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_horse.xml b/soh/assets/xml/N64_NTSC_10/objects/object_horse.xml new file mode 100644 index 0000000000..74619e5977 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_horse_ganon.xml b/soh/assets/xml/N64_NTSC_10/objects/object_horse_ganon.xml new file mode 100644 index 0000000000..0a55462e25 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_horse_link_child.xml b/soh/assets/xml/N64_NTSC_10/objects/object_horse_link_child.xml new file mode 100644 index 0000000000..146c564f55 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_horse_normal.xml b/soh/assets/xml/N64_NTSC_10/objects/object_horse_normal.xml new file mode 100644 index 0000000000..2facab39c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_horse_zelda.xml b/soh/assets/xml/N64_NTSC_10/objects/object_horse_zelda.xml new file mode 100644 index 0000000000..af270c6585 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hs.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hs.xml new file mode 100644 index 0000000000..cf5d06e1a2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_human.xml b/soh/assets/xml/N64_NTSC_10/objects/object_human.xml new file mode 100644 index 0000000000..05795cb332 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ice_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ice_objects.xml new file mode 100644 index 0000000000..c7d059d709 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ik.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ik.xml new file mode 100644 index 0000000000..8a6028f7c0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_im.xml b/soh/assets/xml/N64_NTSC_10/objects/object_im.xml new file mode 100644 index 0000000000..a628a113a4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_in.xml b/soh/assets/xml/N64_NTSC_10/objects/object_in.xml new file mode 100644 index 0000000000..84c1140475 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ingate.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ingate.xml new file mode 100644 index 0000000000..e6be42bebf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_jj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_jj.xml new file mode 100644 index 0000000000..62bae8cb91 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_js.xml b/soh/assets/xml/N64_NTSC_10/objects/object_js.xml new file mode 100644 index 0000000000..ff7bd3efa1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_jya_door.xml b/soh/assets/xml/N64_NTSC_10/objects/object_jya_door.xml new file mode 100644 index 0000000000..60a7b37886 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_jya_iron.xml b/soh/assets/xml/N64_NTSC_10/objects/object_jya_iron.xml new file mode 100644 index 0000000000..c6f6773c6a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_jya_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_jya_obj.xml new file mode 100644 index 0000000000..a1f19b8066 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ka.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ka.xml new file mode 100644 index 0000000000..eb952732b4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kanban.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kanban.xml new file mode 100644 index 0000000000..9ffc7a2ceb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kibako2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kibako2.xml new file mode 100644 index 0000000000..a701b294de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kingdodongo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kingdodongo.xml new file mode 100644 index 0000000000..5ef07a26f7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_km1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_km1.xml new file mode 100644 index 0000000000..0a918a798e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kusa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kusa.xml new file mode 100644 index 0000000000..67291a5543 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kw1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kw1.xml new file mode 100644 index 0000000000..eab561b1fb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kz.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kz.xml new file mode 100644 index 0000000000..4624fefdb6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_light_ring.xml b/soh/assets/xml/N64_NTSC_10/objects/object_light_ring.xml new file mode 100644 index 0000000000..babe7d2aa7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_lightbox.xml b/soh/assets/xml/N64_NTSC_10/objects/object_lightbox.xml new file mode 100644 index 0000000000..552a79d7c7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_lightswitch.xml b/soh/assets/xml/N64_NTSC_10/objects/object_lightswitch.xml new file mode 100644 index 0000000000..cfd5dcfb40 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_link_boy.xml b/soh/assets/xml/N64_NTSC_10/objects/object_link_boy.xml new file mode 100644 index 0000000000..6351af5050 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_link_child.xml b/soh/assets/xml/N64_NTSC_10/objects/object_link_child.xml new file mode 100644 index 0000000000..0de4003731 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ma1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ma1.xml new file mode 100644 index 0000000000..63eeb38950 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ma2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ma2.xml new file mode 100644 index 0000000000..ce5910fb80 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mag.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mag.xml new file mode 100644 index 0000000000..257f723635 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mag.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mamenoki.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mamenoki.xml new file mode 100644 index 0000000000..819d890225 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mastergolon.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mastergolon.xml new file mode 100644 index 0000000000..6dd9d16592 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_masterkokiri.xml b/soh/assets/xml/N64_NTSC_10/objects/object_masterkokiri.xml new file mode 100644 index 0000000000..af5a9ec153 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_masterkokirihead.xml b/soh/assets/xml/N64_NTSC_10/objects/object_masterkokirihead.xml new file mode 100644 index 0000000000..c64aa1c49e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_masterzoora.xml b/soh/assets/xml/N64_NTSC_10/objects/object_masterzoora.xml new file mode 100644 index 0000000000..2c703274e1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mb.xml new file mode 100644 index 0000000000..23c0930c02 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_md.xml b/soh/assets/xml/N64_NTSC_10/objects/object_md.xml new file mode 100644 index 0000000000..161c73dca1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_medal.xml b/soh/assets/xml/N64_NTSC_10/objects/object_medal.xml new file mode 100644 index 0000000000..533872a551 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_menkuri_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_menkuri_objects.xml new file mode 100644 index 0000000000..4c2b51df5b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mir_ray.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mir_ray.xml new file mode 100644 index 0000000000..2acc9391ab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mizu_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mizu_objects.xml new file mode 100644 index 0000000000..5a18b95cfe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin.xml new file mode 100644 index 0000000000..daf9b05412 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_dark.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_dark.xml new file mode 100644 index 0000000000..2fa0bdbe4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flame.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flame.xml new file mode 100644 index 0000000000..6274feaee1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flash.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flash.xml new file mode 100644 index 0000000000..c1040ea118 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_ice.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_ice.xml new file mode 100644 index 0000000000..1aaeea193d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_oka.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_oka.xml new file mode 100644 index 0000000000..0f823b9237 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_soul.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_soul.xml new file mode 100644 index 0000000000..6386f7f9ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_wind.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_wind.xml new file mode 100644 index 0000000000..8bba7eb91b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mk.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mk.xml new file mode 100644 index 0000000000..0b4aaae8aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mm.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mm.xml new file mode 100644 index 0000000000..b27837e57e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mo.xml new file mode 100644 index 0000000000..4c4be74c83 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1.xml new file mode 100644 index 0000000000..bb1b31e2fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1a.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1a.xml new file mode 100644 index 0000000000..c750ce20d0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2.xml new file mode 100644 index 0000000000..785b858571 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2a.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2a.xml new file mode 100644 index 0000000000..ad1bb4d5f0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_objects.xml new file mode 100644 index 0000000000..58ea8c085c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_tex.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_tex.xml new file mode 100644 index 0000000000..8ba4ff2d34 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ms.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ms.xml new file mode 100644 index 0000000000..a87d0e6b36 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mu.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mu.xml new file mode 100644 index 0000000000..7251ff7212 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_nb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_nb.xml new file mode 100644 index 0000000000..74de9e2859 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_niw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_niw.xml new file mode 100644 index 0000000000..4eafec9566 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_nwc.xml b/soh/assets/xml/N64_NTSC_10/objects/object_nwc.xml new file mode 100644 index 0000000000..96ffa32383 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ny.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ny.xml new file mode 100644 index 0000000000..e2e8187ff8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA1.xml new file mode 100644 index 0000000000..1d665f1010 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA10.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA10.xml new file mode 100644 index 0000000000..65d0808349 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA11.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA11.xml new file mode 100644 index 0000000000..92ae474b60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA2.xml new file mode 100644 index 0000000000..ffdcd79896 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA3.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA3.xml new file mode 100644 index 0000000000..a492bd8751 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA4.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA4.xml new file mode 100644 index 0000000000..dcdbbfff9b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA5.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA5.xml new file mode 100644 index 0000000000..55072176dd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA6.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA6.xml new file mode 100644 index 0000000000..c17a510881 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA7.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA7.xml new file mode 100644 index 0000000000..52c68f6394 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA8.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA8.xml new file mode 100644 index 0000000000..8ed2d3df50 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA9.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA9.xml new file mode 100644 index 0000000000..d5c16abfcd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oB1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oB1.xml new file mode 100644 index 0000000000..2f50c967b2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oB2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oB2.xml new file mode 100644 index 0000000000..230783ceae --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oB3.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oB3.xml new file mode 100644 index 0000000000..1c42ddaccc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oB4.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oB4.xml new file mode 100644 index 0000000000..2924c9e753 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE1.xml new file mode 100644 index 0000000000..4d5b1663fe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE10.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE10.xml new file mode 100644 index 0000000000..04ce914372 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE11.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE11.xml new file mode 100644 index 0000000000..04f6f186da --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE12.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE12.xml new file mode 100644 index 0000000000..a5fa39fd25 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE1s.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE1s.xml new file mode 100644 index 0000000000..d311e60104 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE2.xml new file mode 100644 index 0000000000..af62ad6d11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE3.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE3.xml new file mode 100644 index 0000000000..95227da384 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE4.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE4.xml new file mode 100644 index 0000000000..ae48d2adef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE4s.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE4s.xml new file mode 100644 index 0000000000..6037de52f9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE5.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE5.xml new file mode 100644 index 0000000000..f5edf745aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE6.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE6.xml new file mode 100644 index 0000000000..95bb602b6b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE7.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE7.xml new file mode 100644 index 0000000000..b3e588d4c2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE8.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE8.xml new file mode 100644 index 0000000000..be5de24947 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE9.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE9.xml new file mode 100644 index 0000000000..8ea7ee18c7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE_anime.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE_anime.xml new file mode 100644 index 0000000000..f6b4659e22 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oF1d_map.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oF1d_map.xml new file mode 100644 index 0000000000..f14fecd825 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oF1s.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oF1s.xml new file mode 100644 index 0000000000..fe41dde630 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_o_anime.xml b/soh/assets/xml/N64_NTSC_10/objects/object_o_anime.xml new file mode 100644 index 0000000000..4ef4ac44c8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_okuta.xml b/soh/assets/xml/N64_NTSC_10/objects/object_okuta.xml new file mode 100644 index 0000000000..b4fccea6f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_opening_demo1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_opening_demo1.xml new file mode 100644 index 0000000000..fd03230279 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_os.xml b/soh/assets/xml/N64_NTSC_10/objects/object_os.xml new file mode 100644 index 0000000000..5880a92930 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_os_anime.xml b/soh/assets/xml/N64_NTSC_10/objects/object_os_anime.xml new file mode 100644 index 0000000000..f23636343c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ossan.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ossan.xml new file mode 100644 index 0000000000..5788e3a20d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ouke_haka.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ouke_haka.xml new file mode 100644 index 0000000000..11da9b26ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_owl.xml b/soh/assets/xml/N64_NTSC_10/objects/object_owl.xml new file mode 100644 index 0000000000..64fdf64c53 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_peehat.xml b/soh/assets/xml/N64_NTSC_10/objects/object_peehat.xml new file mode 100644 index 0000000000..42ee66cdef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_po_composer.xml b/soh/assets/xml/N64_NTSC_10/objects/object_po_composer.xml new file mode 100644 index 0000000000..ff995efceb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_po_field.xml b/soh/assets/xml/N64_NTSC_10/objects/object_po_field.xml new file mode 100644 index 0000000000..78bc0d65ad --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_po_sisters.xml b/soh/assets/xml/N64_NTSC_10/objects/object_po_sisters.xml new file mode 100644 index 0000000000..b429be2588 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_poh.xml b/soh/assets/xml/N64_NTSC_10/objects/object_poh.xml new file mode 100644 index 0000000000..be6d6eff4b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ps.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ps.xml new file mode 100644 index 0000000000..9f9c894a60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_pu_box.xml b/soh/assets/xml/N64_NTSC_10/objects/object_pu_box.xml new file mode 100644 index 0000000000..e1d686e979 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_rd.xml b/soh/assets/xml/N64_NTSC_10/objects/object_rd.xml new file mode 100644 index 0000000000..22c7d33738 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_reeba.xml b/soh/assets/xml/N64_NTSC_10/objects/object_reeba.xml new file mode 100644 index 0000000000..32c697bd9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_relay_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_relay_objects.xml new file mode 100644 index 0000000000..47b92fcd2d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_rl.xml b/soh/assets/xml/N64_NTSC_10/objects/object_rl.xml new file mode 100644 index 0000000000..2a5ad30f6b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_rr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_rr.xml new file mode 100644 index 0000000000..98726b14bb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_rs.xml b/soh/assets/xml/N64_NTSC_10/objects/object_rs.xml new file mode 100644 index 0000000000..152b5489e1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ru1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ru1.xml new file mode 100644 index 0000000000..3d413619ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ru2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ru2.xml new file mode 100644 index 0000000000..fedf37d48b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_sa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_sa.xml new file mode 100644 index 0000000000..ec45ac961d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_sb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_sb.xml new file mode 100644 index 0000000000..64d3bb005a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_sd.xml b/soh/assets/xml/N64_NTSC_10/objects/object_sd.xml new file mode 100644 index 0000000000..fb58428c3f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_shop_dungen.xml b/soh/assets/xml/N64_NTSC_10/objects/object_shop_dungen.xml new file mode 100644 index 0000000000..594c43d390 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_shopnuts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_shopnuts.xml new file mode 100644 index 0000000000..7065f8941a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_siofuki.xml b/soh/assets/xml/N64_NTSC_10/objects/object_siofuki.xml new file mode 100644 index 0000000000..a23240a728 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_sk2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_sk2.xml new file mode 100644 index 0000000000..f2e7ef6d89 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_skb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_skb.xml new file mode 100644 index 0000000000..5b5efb4848 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_skj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_skj.xml new file mode 100644 index 0000000000..74548e5185 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot00_break.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot00_break.xml new file mode 100644 index 0000000000..d3be88315f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot00_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot00_objects.xml new file mode 100644 index 0000000000..10fb13aeac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoya.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoya.xml new file mode 100644 index 0000000000..d44b944e0e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoyab.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoyab.xml new file mode 100644 index 0000000000..720f50cd3e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects.xml new file mode 100644 index 0000000000..413e032a9c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects2.xml new file mode 100644 index 0000000000..36741a9492 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot02_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot02_objects.xml new file mode 100644 index 0000000000..65f45ff515 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot03_object.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot03_object.xml new file mode 100644 index 0000000000..f182e7d99a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot04_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot04_objects.xml new file mode 100644 index 0000000000..66293d7523 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot05_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot05_objects.xml new file mode 100644 index 0000000000..6e70791493 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot06_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot06_objects.xml new file mode 100644 index 0000000000..e3da63b0f0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot07_object.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot07_object.xml new file mode 100644 index 0000000000..5bc2bfb6bf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot08_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot08_obj.xml new file mode 100644 index 0000000000..4d71f3473f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot09_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot09_obj.xml new file mode 100644 index 0000000000..eb65283931 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot11_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot11_obj.xml new file mode 100644 index 0000000000..257298f7cc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot12_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot12_obj.xml new file mode 100644 index 0000000000..d619c781e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot15_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot15_obj.xml new file mode 100644 index 0000000000..bd59b8cd18 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot16_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot16_obj.xml new file mode 100644 index 0000000000..d39de812a9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot17_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot17_obj.xml new file mode 100644 index 0000000000..d4239d8d28 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot18_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot18_obj.xml new file mode 100644 index 0000000000..cc12b78946 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ssh.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ssh.xml new file mode 100644 index 0000000000..6283f8e9f2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_sst.xml b/soh/assets/xml/N64_NTSC_10/objects/object_sst.xml new file mode 100644 index 0000000000..b874b9a418 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_st.xml b/soh/assets/xml/N64_NTSC_10/objects/object_st.xml new file mode 100644 index 0000000000..983b9e2eab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_stream.xml b/soh/assets/xml/N64_NTSC_10/objects/object_stream.xml new file mode 100644 index 0000000000..59b0838e47 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_syokudai.xml b/soh/assets/xml/N64_NTSC_10/objects/object_syokudai.xml new file mode 100644 index 0000000000..c1670edece --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ta.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ta.xml new file mode 100644 index 0000000000..5e446bf5c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_timeblock.xml b/soh/assets/xml/N64_NTSC_10/objects/object_timeblock.xml new file mode 100644 index 0000000000..1d6b9e698c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tite.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tite.xml new file mode 100644 index 0000000000..1be65c4950 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tk.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tk.xml new file mode 100644 index 0000000000..6b6cce7244 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_toki_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_toki_objects.xml new file mode 100644 index 0000000000..cd07e60d2b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_torch2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_torch2.xml new file mode 100644 index 0000000000..3388e7d34e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_toryo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_toryo.xml new file mode 100644 index 0000000000..73f3dcb1e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tp.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tp.xml new file mode 100644 index 0000000000..8ea908825e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tr.xml new file mode 100644 index 0000000000..17ab9ae392 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_trap.xml b/soh/assets/xml/N64_NTSC_10/objects/object_trap.xml new file mode 100644 index 0000000000..56195cf41b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_triforce_spot.xml b/soh/assets/xml/N64_NTSC_10/objects/object_triforce_spot.xml new file mode 100644 index 0000000000..87d4494589 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ts.xml new file mode 100644 index 0000000000..567277bc39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tsubo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tsubo.xml new file mode 100644 index 0000000000..ee2c5e1846 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tw.xml new file mode 100644 index 0000000000..c7fd2a60be --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_umajump.xml b/soh/assets/xml/N64_NTSC_10/objects/object_umajump.xml new file mode 100644 index 0000000000..2ee4ade46a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_vali.xml b/soh/assets/xml/N64_NTSC_10/objects/object_vali.xml new file mode 100644 index 0000000000..2bab5efaa6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_vase.xml b/soh/assets/xml/N64_NTSC_10/objects/object_vase.xml new file mode 100644 index 0000000000..091d4c51e3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_vm.xml b/soh/assets/xml/N64_NTSC_10/objects/object_vm.xml new file mode 100644 index 0000000000..c5b949b36e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_wallmaster.xml b/soh/assets/xml/N64_NTSC_10/objects/object_wallmaster.xml new file mode 100644 index 0000000000..fbbc4f4af3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_warp1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_warp1.xml new file mode 100644 index 0000000000..1497d7a108 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_warp2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_warp2.xml new file mode 100644 index 0000000000..b6d1b3624c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_wf.xml b/soh/assets/xml/N64_NTSC_10/objects/object_wf.xml new file mode 100644 index 0000000000..ebfb708d2d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_wood02.xml b/soh/assets/xml/N64_NTSC_10/objects/object_wood02.xml new file mode 100644 index 0000000000..47ec342caa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_xc.xml b/soh/assets/xml/N64_NTSC_10/objects/object_xc.xml new file mode 100644 index 0000000000..bb2bf3e7af --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_yabusame_point.xml b/soh/assets/xml/N64_NTSC_10/objects/object_yabusame_point.xml new file mode 100644 index 0000000000..bed9e8a609 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ydan_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ydan_objects.xml new file mode 100644 index 0000000000..e2adf307f7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_yukabyun.xml b/soh/assets/xml/N64_NTSC_10/objects/object_yukabyun.xml new file mode 100644 index 0000000000..d594ebbb89 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zf.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zf.xml new file mode 100644 index 0000000000..7f20eb7866 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zg.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zg.xml new file mode 100644 index 0000000000..79005516c4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zl1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zl1.xml new file mode 100644 index 0000000000..001e5be145 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zl2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zl2.xml new file mode 100644 index 0000000000..959a919ec6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime1.xml new file mode 100644 index 0000000000..cada504867 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime2.xml new file mode 100644 index 0000000000..47016e2e00 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zl4.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zl4.xml new file mode 100644 index 0000000000..8e7a2837ed --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zo.xml new file mode 100644 index 0000000000..77465760ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 0000000000..a92c788b11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 0000000000..1b6bdb3ea7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Light.xml new file mode 100644 index 0000000000..eb21fa1998 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 0000000000..2bb0ffa27f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 0000000000..c853b0050d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 0000000000..8c90332402 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 0000000000..4e799c180c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 0000000000..86a2ec4967 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Sst.xml new file mode 100644 index 0000000000..c966abf2a8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Demo_Shd.xml new file mode 100644 index 0000000000..ed1893f485 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Bili.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Bili.xml new file mode 100644 index 0000000000..841bacb54e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 0000000000..422eab05ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 0000000000..e3e231614f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 0000000000..dbb80db7fa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Holl.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Holl.xml new file mode 100644 index 0000000000..d2e1411f52 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 0000000000..47435e670b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Kanban.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Kanban.xml new file mode 100644 index 0000000000..3b327d96fb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sda.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sda.xml new file mode 100644 index 0000000000..755bbb834f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ssh.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ssh.xml new file mode 100644 index 0000000000..0c0c21667d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_St.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_St.xml new file mode 100644 index 0000000000..07e49caf00 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sth.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sth.xml new file mode 100644 index 0000000000..4d22847a4e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_End_Title.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_End_Title.xml new file mode 100644 index 0000000000..6bead07a59 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_File_Choose.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_File_Choose.xml new file mode 100644 index 0000000000..dba3fe1bb0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_File_Choose.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Dark.xml new file mode 100644 index 0000000000..f62ff8f764 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Fire.xml new file mode 100644 index 0000000000..3cd0cf1270 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Wind.xml new file mode 100644 index 0000000000..612714ddba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 0000000000..74ee6fb575 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 0000000000..96b2a24df4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 0000000000..f2ba83827f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 0000000000..d5ef928e81 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 0000000000..5ff3cebac7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 0000000000..f6c728a49b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/Bmori1.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/Bmori1.xml new file mode 100644 index 0000000000..ad43114260 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 0000000000..89331ecc2f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan.xml new file mode 100644 index 0000000000..e557c80a55 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 0000000000..97401aff65 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 0000000000..d36ac6b774 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HIDAN.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HIDAN.xml new file mode 100644 index 0000000000..fa4d784f1a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin.xml new file mode 100644 index 0000000000..00c5aa82dd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 0000000000..99ae2b3efe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan.xml new file mode 100644 index 0000000000..a9e520f4cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan_boss.xml new file mode 100644 index 0000000000..9fccf2c301 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan.xml new file mode 100644 index 0000000000..1446a9c98b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan_boss.xml new file mode 100644 index 0000000000..6b22223cd5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon.xml new file mode 100644 index 0000000000..f857dbe94e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_boss.xml new file mode 100644 index 0000000000..36c5e81070 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_demo.xml new file mode 100644 index 0000000000..56c98efed7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_final.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_final.xml new file mode 100644 index 0000000000..3ec568cfb9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 0000000000..84ef36950c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_tou.xml new file mode 100644 index 0000000000..1ae37b9637 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontika.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontika.xml new file mode 100644 index 0000000000..a5ff210ce1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 0000000000..060d4941ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/gerudoway.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/gerudoway.xml new file mode 100644 index 0000000000..8272776143 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 0000000000..b279628898 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinboss.xml new file mode 100644 index 0000000000..86c0d317b2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinzou.xml new file mode 100644 index 0000000000..bc14a46ac3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/men.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/men.xml new file mode 100644 index 0000000000..d9e5960e82 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/moribossroom.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/moribossroom.xml new file mode 100644 index 0000000000..b9959eefab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan.xml new file mode 100644 index 0000000000..aed7d26604 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan_boss.xml new file mode 100644 index 0000000000..7ea240547a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/bowling.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/bowling.xml new file mode 100644 index 0000000000..9a41763a27 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 0000000000..4f9a03fc02 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa.xml new file mode 100644 index 0000000000..06d89f2fe7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 0000000000..6f4c181e0e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hakasitarelay.xml new file mode 100644 index 0000000000..91be63d147 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/hut.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hut.xml new file mode 100644 index 0000000000..a4ef5715ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/hylia_labo.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hylia_labo.xml new file mode 100644 index 0000000000..56822e67a7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/impa.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/impa.xml new file mode 100644 index 0000000000..db757e3d3c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kakariko.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kakariko.xml new file mode 100644 index 0000000000..e4e9b102c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kenjyanoma.xml new file mode 100644 index 0000000000..4e8a58f3b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home.xml new file mode 100644 index 0000000000..8c0305493a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home3.xml new file mode 100644 index 0000000000..9f36eb41c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home4.xml new file mode 100644 index 0000000000..eb861aedb4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home5.xml new file mode 100644 index 0000000000..974987feda --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/labo.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/labo.xml new file mode 100644 index 0000000000..c0a9d2eb8c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/link_home.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/link_home.xml new file mode 100644 index 0000000000..2fb88ae347 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/mahouya.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/mahouya.xml new file mode 100644 index 0000000000..8ae462f9db --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/malon_stable.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/malon_stable.xml new file mode 100644 index 0000000000..aff97eeb86 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/miharigoya.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/miharigoya.xml new file mode 100644 index 0000000000..63f8676ac1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/nakaniwa.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/nakaniwa.xml new file mode 100644 index 0000000000..2fb2d5e6a4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/syatekijyou.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/syatekijyou.xml new file mode 100644 index 0000000000..05243b52ca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/takaraya.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/takaraya.xml new file mode 100644 index 0000000000..5b438980b7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/tent.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/tent.xml new file mode 100644 index 0000000000..de72cc5f45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/tokinoma.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/tokinoma.xml new file mode 100644 index 0000000000..d7878b8951 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 0000000000..3b6dd2dec2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 0000000000..90a8d95d09 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/enrui.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/enrui.xml new file mode 100644 index 0000000000..d8c06e5454 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/entra_n.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/entra_n.xml new file mode 100644 index 0000000000..5b408ac3a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana.xml new file mode 100644 index 0000000000..e7dc93dd0c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana2.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana2.xml new file mode 100644 index 0000000000..2d8ba4906a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana_ouke.xml new file mode 100644 index 0000000000..17f53613e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/hiral_demo.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/hiral_demo.xml new file mode 100644 index 0000000000..1331fdd4c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/kakariko3.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/kakariko3.xml new file mode 100644 index 0000000000..07b62c44df --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/kakusiana.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/kakusiana.xml new file mode 100644 index 0000000000..c3f993ff4f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/kinsuta.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/kinsuta.xml new file mode 100644 index 0000000000..aac0f6c4ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley.xml new file mode 100644 index 0000000000..c304673032 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley_n.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley_n.xml new file mode 100644 index 0000000000..65db604113 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/market_day.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_day.xml new file mode 100644 index 0000000000..00887e69cd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/market_night.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_night.xml new file mode 100644 index 0000000000..c58e38744e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/market_ruins.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_ruins.xml new file mode 100644 index 0000000000..f0ec75e759 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine.xml new file mode 100644 index 0000000000..b9ddf2cf70 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_n.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_n.xml new file mode 100644 index 0000000000..4878338aa1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_r.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_r.xml new file mode 100644 index 0000000000..1220367919 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/turibori.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/turibori.xml new file mode 100644 index 0000000000..0633224d9c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/entra.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/entra.xml new file mode 100644 index 0000000000..92ee57f59a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/souko.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/souko.xml new file mode 100644 index 0000000000..8dd9d9e48a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot00.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot00.xml new file mode 100644 index 0000000000..508d9309b3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot01.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot01.xml new file mode 100644 index 0000000000..dcee38761f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot02.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot02.xml new file mode 100644 index 0000000000..54a8ea321f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot03.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot03.xml new file mode 100644 index 0000000000..9434185f44 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot04.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot04.xml new file mode 100644 index 0000000000..ccff0d05bf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot05.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot05.xml new file mode 100644 index 0000000000..4f7c62b91e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot06.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot06.xml new file mode 100644 index 0000000000..f4af602cfd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot07.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot07.xml new file mode 100644 index 0000000000..eeb976f7f6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot08.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot08.xml new file mode 100644 index 0000000000..86582f0dca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot09.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot09.xml new file mode 100644 index 0000000000..58f1f75020 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot10.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot10.xml new file mode 100644 index 0000000000..66365e3d86 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot11.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot11.xml new file mode 100644 index 0000000000..76ff3b8223 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot12.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot12.xml new file mode 100644 index 0000000000..e21523b217 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot13.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot13.xml new file mode 100644 index 0000000000..c689130650 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot15.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot15.xml new file mode 100644 index 0000000000..e75f7b6845 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot16.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot16.xml new file mode 100644 index 0000000000..6c059858be --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot17.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot17.xml new file mode 100644 index 0000000000..c50cacdb36 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot18.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot18.xml new file mode 100644 index 0000000000..d70fccf4bb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot20.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot20.xml new file mode 100644 index 0000000000..1381f6ecbe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/alley_shop.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/alley_shop.xml new file mode 100644 index 0000000000..95548de1bd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/drag.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/drag.xml new file mode 100644 index 0000000000..acb6515fba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/face_shop.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/face_shop.xml new file mode 100644 index 0000000000..16a9746081 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/golon.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/golon.xml new file mode 100644 index 0000000000..c586727988 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/kokiri_shop.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/kokiri_shop.xml new file mode 100644 index 0000000000..50cd633e57 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/night_shop.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/night_shop.xml new file mode 100644 index 0000000000..5954d9c83d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/shop1.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/shop1.xml new file mode 100644 index 0000000000..525a06d633 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/zoora.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/zoora.xml new file mode 100644 index 0000000000..0e4ac18f8c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/text/elf_message_field.xml b/soh/assets/xml/N64_NTSC_10/text/elf_message_field.xml new file mode 100644 index 0000000000..789a554ce8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/text/elf_message_ydan.xml b/soh/assets/xml/N64_NTSC_10/text/elf_message_ydan.xml new file mode 100644 index 0000000000..f784afcf45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/text/message_data_static.xml b/soh/assets/xml/N64_NTSC_10/text/message_data_static.xml new file mode 100644 index 0000000000..dc08d4e023 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/backgrounds.xml b/soh/assets/xml/N64_NTSC_10/textures/backgrounds.xml new file mode 100644 index 0000000000..c60ff57a8a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/boss_title_cards.xml b/soh/assets/xml/N64_NTSC_10/textures/boss_title_cards.xml new file mode 100644 index 0000000000..84f555bd10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/textures/do_action_static.xml b/soh/assets/xml/N64_NTSC_10/textures/do_action_static.xml new file mode 100644 index 0000000000..efabd54a58 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_24_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_24_static.xml new file mode 100644 index 0000000000..cdb8cc7379 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_dungeon_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_dungeon_static.xml new file mode 100644 index 0000000000..873c490fc5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_field_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_field_static.xml new file mode 100644 index 0000000000..ed991406b5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_gameover_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_gameover_static.xml new file mode 100644 index 0000000000..ffd3928680 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_jpn_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_jpn_static.xml new file mode 100644 index 0000000000..f2fe854b8e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_nes_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_nes_static.xml new file mode 100644 index 0000000000..6cd92acfca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_static.xml new file mode 100644 index 0000000000..9e844615b1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/item_name_static.xml b/soh/assets/xml/N64_NTSC_10/textures/item_name_static.xml new file mode 100644 index 0000000000..1bc074c2ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/kanji.xml b/soh/assets/xml/N64_NTSC_10/textures/kanji.xml new file mode 100644 index 0000000000..5159387a13 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/textures/map_48x85_static.xml b/soh/assets/xml/N64_NTSC_10/textures/map_48x85_static.xml new file mode 100644 index 0000000000..b2ea46340a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/textures/map_grand_static.xml b/soh/assets/xml/N64_NTSC_10/textures/map_grand_static.xml new file mode 100644 index 0000000000..201955bfc3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/map_i_static.xml b/soh/assets/xml/N64_NTSC_10/textures/map_i_static.xml new file mode 100644 index 0000000000..1721f6d848 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/map_name_static.xml b/soh/assets/xml/N64_NTSC_10/textures/map_name_static.xml new file mode 100644 index 0000000000..ca4c4c0bd6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/message_static.xml b/soh/assets/xml/N64_NTSC_10/textures/message_static.xml new file mode 100644 index 0000000000..afdde60def --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/message_texture_static.xml b/soh/assets/xml/N64_NTSC_10/textures/message_texture_static.xml new file mode 100644 index 0000000000..bbf7e1259e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/nes_font_static.xml b/soh/assets/xml/N64_NTSC_10/textures/nes_font_static.xml new file mode 100644 index 0000000000..f1b80ee045 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/nes_font_static.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/nintendo_rogo_static.xml b/soh/assets/xml/N64_NTSC_10/textures/nintendo_rogo_static.xml new file mode 100644 index 0000000000..aa5c7c9ea6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/parameter_static.xml b/soh/assets/xml/N64_NTSC_10/textures/parameter_static.xml new file mode 100644 index 0000000000..c51dacf1f6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/place_title_cards.xml b/soh/assets/xml/N64_NTSC_10/textures/place_title_cards.xml new file mode 100644 index 0000000000..b688cce00c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/skyboxes.xml b/soh/assets/xml/N64_NTSC_10/textures/skyboxes.xml new file mode 100644 index 0000000000..104ffb2a3f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/title_static.xml b/soh/assets/xml/N64_NTSC_10/textures/title_static.xml new file mode 100644 index 0000000000..5f58c5a820 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/audio/Audio.xml b/soh/assets/xml/N64_NTSC_11/audio/Audio.xml new file mode 100644 index 0000000000..c2794f3616 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/audio/Audio.xml @@ -0,0 +1,647 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/code/fbdemo_circle.xml b/soh/assets/xml/N64_NTSC_11/code/fbdemo_circle.xml new file mode 100644 index 0000000000..0d4f5766fa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/code/fbdemo_triforce.xml b/soh/assets/xml/N64_NTSC_11/code/fbdemo_triforce.xml new file mode 100644 index 0000000000..f7d695946c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/code/fbdemo_wipe1.xml b/soh/assets/xml/N64_NTSC_11/code/fbdemo_wipe1.xml new file mode 100644 index 0000000000..61a6da3858 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/code/sys_matrix.xml b/soh/assets/xml/N64_NTSC_11/code/sys_matrix.xml new file mode 100644 index 0000000000..3760c930cd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/misc/link_animetion.xml b/soh/assets/xml/N64_NTSC_11/misc/link_animetion.xml new file mode 100644 index 0000000000..9de1e92d36 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/N64_NTSC_11/objects/gameplay_dangeon_keep.xml new file mode 100644 index 0000000000..5b1a9050d9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/gameplay_field_keep.xml b/soh/assets/xml/N64_NTSC_11/objects/gameplay_field_keep.xml new file mode 100644 index 0000000000..011e8f7fc7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/gameplay_keep.xml b/soh/assets/xml/N64_NTSC_11/objects/gameplay_keep.xml new file mode 100644 index 0000000000..94eee8845e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_Bb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_Bb.xml new file mode 100644 index 0000000000..5d04bde451 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ahg.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ahg.xml new file mode 100644 index 0000000000..4d37b1b110 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_am.xml b/soh/assets/xml/N64_NTSC_11/objects/object_am.xml new file mode 100644 index 0000000000..b70c70d709 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ane.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ane.xml new file mode 100644 index 0000000000..1e29b351e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ani.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ani.xml new file mode 100644 index 0000000000..c70621c6f9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_anubice.xml b/soh/assets/xml/N64_NTSC_11/objects/object_anubice.xml new file mode 100644 index 0000000000..fb029586ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_aob.xml b/soh/assets/xml/N64_NTSC_11/objects/object_aob.xml new file mode 100644 index 0000000000..e6202d0cf9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_b_heart.xml b/soh/assets/xml/N64_NTSC_11/objects/object_b_heart.xml new file mode 100644 index 0000000000..00f7cd6773 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bba.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bba.xml new file mode 100644 index 0000000000..ccc5c21365 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bdan_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bdan_objects.xml new file mode 100644 index 0000000000..dcd56d3856 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bdoor.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bdoor.xml new file mode 100644 index 0000000000..a092f0c23b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bg.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bg.xml new file mode 100644 index 0000000000..791226b71d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bigokuta.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bigokuta.xml new file mode 100644 index 0000000000..1c7d39e319 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bird.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bird.xml new file mode 100644 index 0000000000..167a5022dc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bji.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bji.xml new file mode 100644 index 0000000000..c665b6b001 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bl.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bl.xml new file mode 100644 index 0000000000..1c2ef4ec63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_blkobj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_blkobj.xml new file mode 100644 index 0000000000..345a8ebd9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bob.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bob.xml new file mode 100644 index 0000000000..289e994e47 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_boj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_boj.xml new file mode 100644 index 0000000000..4be4764ab5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bombf.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bombf.xml new file mode 100644 index 0000000000..83e60248d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bombiwa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bombiwa.xml new file mode 100644 index 0000000000..26ab6b4f33 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bowl.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bowl.xml new file mode 100644 index 0000000000..ffe6d43db7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_box.xml b/soh/assets/xml/N64_NTSC_11/objects/object_box.xml new file mode 100644 index 0000000000..106d2d3356 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_brob.xml b/soh/assets/xml/N64_NTSC_11/objects/object_brob.xml new file mode 100644 index 0000000000..718dcd5617 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bubble.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bubble.xml new file mode 100644 index 0000000000..f5de186920 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bv.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bv.xml new file mode 100644 index 0000000000..d2ebf275ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bw.xml new file mode 100644 index 0000000000..6fd39fbb1c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bwall.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bwall.xml new file mode 100644 index 0000000000..d4f43ddc14 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bxa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bxa.xml new file mode 100644 index 0000000000..fb78c117e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_cne.xml b/soh/assets/xml/N64_NTSC_11/objects/object_cne.xml new file mode 100644 index 0000000000..0c14d0bc54 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_cob.xml b/soh/assets/xml/N64_NTSC_11/objects/object_cob.xml new file mode 100644 index 0000000000..ba051cfa74 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_cow.xml b/soh/assets/xml/N64_NTSC_11/objects/object_cow.xml new file mode 100644 index 0000000000..5d067c329f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_crow.xml b/soh/assets/xml/N64_NTSC_11/objects/object_crow.xml new file mode 100644 index 0000000000..77337c6445 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_cs.xml b/soh/assets/xml/N64_NTSC_11/objects/object_cs.xml new file mode 100644 index 0000000000..83804ccaf4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_d_elevator.xml b/soh/assets/xml/N64_NTSC_11/objects/object_d_elevator.xml new file mode 100644 index 0000000000..6be59c154b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_d_hsblock.xml b/soh/assets/xml/N64_NTSC_11/objects/object_d_hsblock.xml new file mode 100644 index 0000000000..4bb50c2b4f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_d_lift.xml b/soh/assets/xml/N64_NTSC_11/objects/object_d_lift.xml new file mode 100644 index 0000000000..2912385190 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_daiku.xml b/soh/assets/xml/N64_NTSC_11/objects/object_daiku.xml new file mode 100644 index 0000000000..1524c7a26c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ddan_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ddan_objects.xml new file mode 100644 index 0000000000..3fc563b96f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dekubaba.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dekubaba.xml new file mode 100644 index 0000000000..7202a833fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dekujr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dekujr.xml new file mode 100644 index 0000000000..e906bf61c4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dekunuts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dekunuts.xml new file mode 100644 index 0000000000..5fceef4165 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_demo_6k.xml b/soh/assets/xml/N64_NTSC_11/objects/object_demo_6k.xml new file mode 100644 index 0000000000..73058d5e46 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_demo_kekkai.xml b/soh/assets/xml/N64_NTSC_11/objects/object_demo_kekkai.xml new file mode 100644 index 0000000000..aa54bc2eef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_demo_tre_lgt.xml b/soh/assets/xml/N64_NTSC_11/objects/object_demo_tre_lgt.xml new file mode 100644 index 0000000000..9ea19012b7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dh.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dh.xml new file mode 100644 index 0000000000..7a52d7dbe7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dnk.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dnk.xml new file mode 100644 index 0000000000..3bce343048 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dns.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dns.xml new file mode 100644 index 0000000000..8b78ffcf20 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dodojr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dodojr.xml new file mode 100644 index 0000000000..4dfd7d6e45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dodongo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dodongo.xml new file mode 100644 index 0000000000..779e20e9dc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dog.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dog.xml new file mode 100644 index 0000000000..ef00442b60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_door_gerudo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_door_gerudo.xml new file mode 100644 index 0000000000..2f17262041 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_door_killer.xml b/soh/assets/xml/N64_NTSC_11/objects/object_door_killer.xml new file mode 100644 index 0000000000..a37f590d60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ds.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ds.xml new file mode 100644 index 0000000000..0413a9e2e8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ds2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ds2.xml new file mode 100644 index 0000000000..683bcc68d4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_du.xml b/soh/assets/xml/N64_NTSC_11/objects/object_du.xml new file mode 100644 index 0000000000..0babd962b9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dy_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dy_obj.xml new file mode 100644 index 0000000000..5e792edb50 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ec.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ec.xml new file mode 100644 index 0000000000..7ec83e284d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_crystal_light.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_crystal_light.xml new file mode 100644 index 0000000000..9215b6a394 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_doughnut.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_doughnut.xml new file mode 100644 index 0000000000..7f12c56f53 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_erupc.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_erupc.xml new file mode 100644 index 0000000000..800d9535f1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_fire_ball.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_fire_ball.xml new file mode 100644 index 0000000000..2fc65b16ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_flash.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_flash.xml new file mode 100644 index 0000000000..5f962f162b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_lgt_shower.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_lgt_shower.xml new file mode 100644 index 0000000000..67ef5ce7e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_star_field.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_star_field.xml new file mode 100644 index 0000000000..00b47c460f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_tw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_tw.xml new file mode 100644 index 0000000000..de53765696 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ei.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ei.xml new file mode 100644 index 0000000000..e4132491f4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fa.xml new file mode 100644 index 0000000000..2f1bf9a5e8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fd.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fd.xml new file mode 100644 index 0000000000..2609579670 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fd2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fd2.xml new file mode 100644 index 0000000000..44b5f5f9c1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fhg.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fhg.xml new file mode 100644 index 0000000000..669875aaf8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fire.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fire.xml new file mode 100644 index 0000000000..49bf620cb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_firefly.xml b/soh/assets/xml/N64_NTSC_11/objects/object_firefly.xml new file mode 100644 index 0000000000..8c26a43418 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fish.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fish.xml new file mode 100644 index 0000000000..f5ad4f6da0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fr.xml new file mode 100644 index 0000000000..25ee2ad42e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fu.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fu.xml new file mode 100644 index 0000000000..82c449e3de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fw.xml new file mode 100644 index 0000000000..ee9821d263 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fz.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fz.xml new file mode 100644 index 0000000000..dad6fec5ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon.xml new file mode 100644 index 0000000000..c654c7fec9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon2.xml new file mode 100644 index 0000000000..7e715dd414 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime1.xml new file mode 100644 index 0000000000..b1016299bc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime2.xml new file mode 100644 index 0000000000..180e5995c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime3.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime3.xml new file mode 100644 index 0000000000..be4c4dcb15 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_objects.xml new file mode 100644 index 0000000000..5e32610ffc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ge1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ge1.xml new file mode 100644 index 0000000000..79e0768b81 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_geff.xml b/soh/assets/xml/N64_NTSC_11/objects/object_geff.xml new file mode 100644 index 0000000000..f0667743b0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_geldb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_geldb.xml new file mode 100644 index 0000000000..49b12ef2e5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrow.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrow.xml new file mode 100644 index 0000000000..4b58787a9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrowcase.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrowcase.xml new file mode 100644 index 0000000000..267b0a734d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bean.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bean.xml new file mode 100644 index 0000000000..e74247816f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_1.xml new file mode 100644 index 0000000000..bae86c11d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_2.xml new file mode 100644 index 0000000000..1400c4a4d4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bombpouch.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bombpouch.xml new file mode 100644 index 0000000000..07134748c3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_boomerang.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_boomerang.xml new file mode 100644 index 0000000000..3c1a0fe7fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_boots_2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_boots_2.xml new file mode 100644 index 0000000000..3bcb6a47ae --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bosskey.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bosskey.xml new file mode 100644 index 0000000000..e5e4bc86c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle.xml new file mode 100644 index 0000000000..3b0884a03f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle_letter.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle_letter.xml new file mode 100644 index 0000000000..443219caf5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bow.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bow.xml new file mode 100644 index 0000000000..946e9c4965 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bracelet.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bracelet.xml new file mode 100644 index 0000000000..5a0b62a60a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_brokensword.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_brokensword.xml new file mode 100644 index 0000000000..408741ac54 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_butterfly.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_butterfly.xml new file mode 100644 index 0000000000..7b60a77247 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_clothes.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_clothes.xml new file mode 100644 index 0000000000..3f897b6d13 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_coin.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_coin.xml new file mode 100644 index 0000000000..22e29f255f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_compass.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_compass.xml new file mode 100644 index 0000000000..076229b11e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_dekupouch.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_dekupouch.xml new file mode 100644 index 0000000000..8925e6fa5f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_egg.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_egg.xml new file mode 100644 index 0000000000..2b2e2847db --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_eye_lotion.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_eye_lotion.xml new file mode 100644 index 0000000000..5128c5f6ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_fire.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_fire.xml new file mode 100644 index 0000000000..4bfd76a7c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_fish.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_fish.xml new file mode 100644 index 0000000000..edb39dc297 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_frog.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_frog.xml new file mode 100644 index 0000000000..a656c306bd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudo.xml new file mode 100644 index 0000000000..d65daee8e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudomask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudomask.xml new file mode 100644 index 0000000000..cfcb878d9b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_ghost.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ghost.xml new file mode 100644 index 0000000000..795f0cfd10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_glasses.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_glasses.xml new file mode 100644 index 0000000000..63d32ab5ac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_gloves.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gloves.xml new file mode 100644 index 0000000000..0e1c4259d5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_goddess.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_goddess.xml new file mode 100644 index 0000000000..50cbdd8918 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_golonmask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_golonmask.xml new file mode 100644 index 0000000000..844d90e714 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_grass.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_grass.xml new file mode 100644 index 0000000000..ae7834201a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_hammer.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hammer.xml new file mode 100644 index 0000000000..feb5c8659d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_heart.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_heart.xml new file mode 100644 index 0000000000..48e78b1b5c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_hearts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hearts.xml new file mode 100644 index 0000000000..d2e763e631 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_hookshot.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hookshot.xml new file mode 100644 index 0000000000..a6b3b0fdac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_hoverboots.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hoverboots.xml new file mode 100644 index 0000000000..6d41df8fd0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_insect.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_insect.xml new file mode 100644 index 0000000000..7af5b5b3b2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_jewel.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_jewel.xml new file mode 100644 index 0000000000..e83c651164 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_key.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_key.xml new file mode 100644 index 0000000000..a37d45a71c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 0000000000..46eff7d3e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_letter.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_letter.xml new file mode 100644 index 0000000000..bea8683390 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_liquid.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_liquid.xml new file mode 100644 index 0000000000..18a5c3d7a2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_longsword.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_longsword.xml new file mode 100644 index 0000000000..7161e42e38 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_m_arrow.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_m_arrow.xml new file mode 100644 index 0000000000..0fd659ae95 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_magicpot.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_magicpot.xml new file mode 100644 index 0000000000..7623e6353e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_map.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_map.xml new file mode 100644 index 0000000000..471c1dab97 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_medal.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_medal.xml new file mode 100644 index 0000000000..28e5b1e683 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_melody.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_melody.xml new file mode 100644 index 0000000000..b01fca9538 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_milk.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_milk.xml new file mode 100644 index 0000000000..a3e223b3e6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_mushroom.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_mushroom.xml new file mode 100644 index 0000000000..5b19bca743 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_niwatori.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_niwatori.xml new file mode 100644 index 0000000000..c8389f62c2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_nuts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_nuts.xml new file mode 100644 index 0000000000..c59903c43d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina.xml new file mode 100644 index 0000000000..82607677d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina_0.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina_0.xml new file mode 100644 index 0000000000..2c5f70d984 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_pachinko.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_pachinko.xml new file mode 100644 index 0000000000..5f808baf92 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_powder.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_powder.xml new file mode 100644 index 0000000000..fb7dc0155d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_prescription.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_prescription.xml new file mode 100644 index 0000000000..75ae7eb2b7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_purse.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_purse.xml new file mode 100644 index 0000000000..054731dec7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_rabit_mask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_rabit_mask.xml new file mode 100644 index 0000000000..9d4eb9487f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_redead_mask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_redead_mask.xml new file mode 100644 index 0000000000..7de08487f8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_rupy.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_rupy.xml new file mode 100644 index 0000000000..0a1af96d0f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_saw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_saw.xml new file mode 100644 index 0000000000..dcc038b7c1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_scale.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_scale.xml new file mode 100644 index 0000000000..1cf5de5b99 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_seed.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_seed.xml new file mode 100644 index 0000000000..82c15c82d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_1.xml new file mode 100644 index 0000000000..2f11e3f6d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_2.xml new file mode 100644 index 0000000000..176ae025fe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_3.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_3.xml new file mode 100644 index 0000000000..8d1e5dafd4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_skj_mask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_skj_mask.xml new file mode 100644 index 0000000000..e6c90f76f1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_soldout.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_soldout.xml new file mode 100644 index 0000000000..a15b1253e3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_soul.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_soul.xml new file mode 100644 index 0000000000..a68178eba5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_stick.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_stick.xml new file mode 100644 index 0000000000..fed89f4659 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_sutaru.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_sutaru.xml new file mode 100644 index 0000000000..a2606afbe3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_sword_1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_sword_1.xml new file mode 100644 index 0000000000..e1119abca0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_ticketstone.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ticketstone.xml new file mode 100644 index 0000000000..73bf888d10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_truth_mask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_truth_mask.xml new file mode 100644 index 0000000000..3b4edf3dee --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_zoramask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_zoramask.xml new file mode 100644 index 0000000000..e3b1ab10ec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gj.xml new file mode 100644 index 0000000000..ee6dab74f8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gjyo_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gjyo_objects.xml new file mode 100644 index 0000000000..ea4f8444fb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gla.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gla.xml new file mode 100644 index 0000000000..499a3720d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gm.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gm.xml new file mode 100644 index 0000000000..91b10cc428 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gnd.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gnd.xml new file mode 100644 index 0000000000..3ae3b57f3d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gnd_magic.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gnd_magic.xml new file mode 100644 index 0000000000..a88d419d7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gndd.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gndd.xml new file mode 100644 index 0000000000..8bf5d770c4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_god_lgt.xml b/soh/assets/xml/N64_NTSC_11/objects/object_god_lgt.xml new file mode 100644 index 0000000000..60df9e4693 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gol.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gol.xml new file mode 100644 index 0000000000..7e04508cb6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_goma.xml b/soh/assets/xml/N64_NTSC_11/objects/object_goma.xml new file mode 100644 index 0000000000..922678a3cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_goroiwa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_goroiwa.xml new file mode 100644 index 0000000000..5d406e9578 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gr.xml new file mode 100644 index 0000000000..5f7360ae57 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gs.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gs.xml new file mode 100644 index 0000000000..145be16653 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gt.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gt.xml new file mode 100644 index 0000000000..1d79d4e39e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_haka.xml b/soh/assets/xml/N64_NTSC_11/objects/object_haka.xml new file mode 100644 index 0000000000..f6b263c375 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_haka_door.xml b/soh/assets/xml/N64_NTSC_11/objects/object_haka_door.xml new file mode 100644 index 0000000000..1376d03569 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_haka_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_haka_objects.xml new file mode 100644 index 0000000000..3ca6d27c08 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hakach_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hakach_objects.xml new file mode 100644 index 0000000000..0de02aaf15 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hata.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hata.xml new file mode 100644 index 0000000000..b0324c3be3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_heavy_object.xml b/soh/assets/xml/N64_NTSC_11/objects/object_heavy_object.xml new file mode 100644 index 0000000000..ecc7953211 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hidan_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hidan_objects.xml new file mode 100644 index 0000000000..f41c0ee5ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hintnuts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hintnuts.xml new file mode 100644 index 0000000000..a7290f3955 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hni.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hni.xml new file mode 100644 index 0000000000..6b317eb7a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_horse.xml b/soh/assets/xml/N64_NTSC_11/objects/object_horse.xml new file mode 100644 index 0000000000..74619e5977 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_horse_ganon.xml b/soh/assets/xml/N64_NTSC_11/objects/object_horse_ganon.xml new file mode 100644 index 0000000000..0a55462e25 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_horse_link_child.xml b/soh/assets/xml/N64_NTSC_11/objects/object_horse_link_child.xml new file mode 100644 index 0000000000..146c564f55 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_horse_normal.xml b/soh/assets/xml/N64_NTSC_11/objects/object_horse_normal.xml new file mode 100644 index 0000000000..2facab39c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_horse_zelda.xml b/soh/assets/xml/N64_NTSC_11/objects/object_horse_zelda.xml new file mode 100644 index 0000000000..af270c6585 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hs.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hs.xml new file mode 100644 index 0000000000..cf5d06e1a2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_human.xml b/soh/assets/xml/N64_NTSC_11/objects/object_human.xml new file mode 100644 index 0000000000..05795cb332 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ice_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ice_objects.xml new file mode 100644 index 0000000000..c7d059d709 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ik.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ik.xml new file mode 100644 index 0000000000..8a6028f7c0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_im.xml b/soh/assets/xml/N64_NTSC_11/objects/object_im.xml new file mode 100644 index 0000000000..a628a113a4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_in.xml b/soh/assets/xml/N64_NTSC_11/objects/object_in.xml new file mode 100644 index 0000000000..84c1140475 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ingate.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ingate.xml new file mode 100644 index 0000000000..e6be42bebf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_jj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_jj.xml new file mode 100644 index 0000000000..62bae8cb91 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_js.xml b/soh/assets/xml/N64_NTSC_11/objects/object_js.xml new file mode 100644 index 0000000000..ff7bd3efa1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_jya_door.xml b/soh/assets/xml/N64_NTSC_11/objects/object_jya_door.xml new file mode 100644 index 0000000000..60a7b37886 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_jya_iron.xml b/soh/assets/xml/N64_NTSC_11/objects/object_jya_iron.xml new file mode 100644 index 0000000000..c6f6773c6a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_jya_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_jya_obj.xml new file mode 100644 index 0000000000..a1f19b8066 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ka.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ka.xml new file mode 100644 index 0000000000..eb952732b4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kanban.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kanban.xml new file mode 100644 index 0000000000..9ffc7a2ceb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kibako2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kibako2.xml new file mode 100644 index 0000000000..a701b294de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kingdodongo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kingdodongo.xml new file mode 100644 index 0000000000..5ef07a26f7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_km1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_km1.xml new file mode 100644 index 0000000000..0a918a798e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kusa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kusa.xml new file mode 100644 index 0000000000..67291a5543 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kw1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kw1.xml new file mode 100644 index 0000000000..eab561b1fb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kz.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kz.xml new file mode 100644 index 0000000000..4624fefdb6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_light_ring.xml b/soh/assets/xml/N64_NTSC_11/objects/object_light_ring.xml new file mode 100644 index 0000000000..babe7d2aa7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_lightbox.xml b/soh/assets/xml/N64_NTSC_11/objects/object_lightbox.xml new file mode 100644 index 0000000000..552a79d7c7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_lightswitch.xml b/soh/assets/xml/N64_NTSC_11/objects/object_lightswitch.xml new file mode 100644 index 0000000000..cfd5dcfb40 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_link_boy.xml b/soh/assets/xml/N64_NTSC_11/objects/object_link_boy.xml new file mode 100644 index 0000000000..6351af5050 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_link_child.xml b/soh/assets/xml/N64_NTSC_11/objects/object_link_child.xml new file mode 100644 index 0000000000..0de4003731 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ma1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ma1.xml new file mode 100644 index 0000000000..63eeb38950 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ma2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ma2.xml new file mode 100644 index 0000000000..ce5910fb80 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mag.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mag.xml new file mode 100644 index 0000000000..257f723635 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mag.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mamenoki.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mamenoki.xml new file mode 100644 index 0000000000..819d890225 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mastergolon.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mastergolon.xml new file mode 100644 index 0000000000..6dd9d16592 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_masterkokiri.xml b/soh/assets/xml/N64_NTSC_11/objects/object_masterkokiri.xml new file mode 100644 index 0000000000..af5a9ec153 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_masterkokirihead.xml b/soh/assets/xml/N64_NTSC_11/objects/object_masterkokirihead.xml new file mode 100644 index 0000000000..c64aa1c49e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_masterzoora.xml b/soh/assets/xml/N64_NTSC_11/objects/object_masterzoora.xml new file mode 100644 index 0000000000..2c703274e1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mb.xml new file mode 100644 index 0000000000..23c0930c02 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_md.xml b/soh/assets/xml/N64_NTSC_11/objects/object_md.xml new file mode 100644 index 0000000000..161c73dca1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_medal.xml b/soh/assets/xml/N64_NTSC_11/objects/object_medal.xml new file mode 100644 index 0000000000..533872a551 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_menkuri_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_menkuri_objects.xml new file mode 100644 index 0000000000..4c2b51df5b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mir_ray.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mir_ray.xml new file mode 100644 index 0000000000..2acc9391ab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mizu_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mizu_objects.xml new file mode 100644 index 0000000000..5a18b95cfe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin.xml new file mode 100644 index 0000000000..daf9b05412 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_dark.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_dark.xml new file mode 100644 index 0000000000..2fa0bdbe4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flame.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flame.xml new file mode 100644 index 0000000000..6274feaee1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flash.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flash.xml new file mode 100644 index 0000000000..c1040ea118 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_ice.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_ice.xml new file mode 100644 index 0000000000..1aaeea193d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_oka.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_oka.xml new file mode 100644 index 0000000000..0f823b9237 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_soul.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_soul.xml new file mode 100644 index 0000000000..6386f7f9ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_wind.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_wind.xml new file mode 100644 index 0000000000..8bba7eb91b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mk.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mk.xml new file mode 100644 index 0000000000..0b4aaae8aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mm.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mm.xml new file mode 100644 index 0000000000..b27837e57e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mo.xml new file mode 100644 index 0000000000..4c4be74c83 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1.xml new file mode 100644 index 0000000000..bb1b31e2fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1a.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1a.xml new file mode 100644 index 0000000000..c750ce20d0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2.xml new file mode 100644 index 0000000000..785b858571 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2a.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2a.xml new file mode 100644 index 0000000000..ad1bb4d5f0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_objects.xml new file mode 100644 index 0000000000..58ea8c085c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_tex.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_tex.xml new file mode 100644 index 0000000000..8ba4ff2d34 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ms.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ms.xml new file mode 100644 index 0000000000..a87d0e6b36 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mu.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mu.xml new file mode 100644 index 0000000000..7251ff7212 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_nb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_nb.xml new file mode 100644 index 0000000000..74de9e2859 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_niw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_niw.xml new file mode 100644 index 0000000000..4eafec9566 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_nwc.xml b/soh/assets/xml/N64_NTSC_11/objects/object_nwc.xml new file mode 100644 index 0000000000..96ffa32383 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ny.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ny.xml new file mode 100644 index 0000000000..e2e8187ff8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA1.xml new file mode 100644 index 0000000000..1d665f1010 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA10.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA10.xml new file mode 100644 index 0000000000..65d0808349 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA11.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA11.xml new file mode 100644 index 0000000000..92ae474b60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA2.xml new file mode 100644 index 0000000000..ffdcd79896 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA3.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA3.xml new file mode 100644 index 0000000000..a492bd8751 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA4.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA4.xml new file mode 100644 index 0000000000..dcdbbfff9b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA5.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA5.xml new file mode 100644 index 0000000000..55072176dd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA6.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA6.xml new file mode 100644 index 0000000000..c17a510881 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA7.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA7.xml new file mode 100644 index 0000000000..52c68f6394 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA8.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA8.xml new file mode 100644 index 0000000000..8ed2d3df50 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA9.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA9.xml new file mode 100644 index 0000000000..d5c16abfcd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oB1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oB1.xml new file mode 100644 index 0000000000..2f50c967b2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oB2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oB2.xml new file mode 100644 index 0000000000..230783ceae --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oB3.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oB3.xml new file mode 100644 index 0000000000..1c42ddaccc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oB4.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oB4.xml new file mode 100644 index 0000000000..2924c9e753 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE1.xml new file mode 100644 index 0000000000..4d5b1663fe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE10.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE10.xml new file mode 100644 index 0000000000..04ce914372 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE11.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE11.xml new file mode 100644 index 0000000000..04f6f186da --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE12.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE12.xml new file mode 100644 index 0000000000..a5fa39fd25 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE1s.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE1s.xml new file mode 100644 index 0000000000..d311e60104 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE2.xml new file mode 100644 index 0000000000..af62ad6d11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE3.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE3.xml new file mode 100644 index 0000000000..95227da384 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE4.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE4.xml new file mode 100644 index 0000000000..ae48d2adef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE4s.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE4s.xml new file mode 100644 index 0000000000..6037de52f9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE5.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE5.xml new file mode 100644 index 0000000000..f5edf745aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE6.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE6.xml new file mode 100644 index 0000000000..95bb602b6b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE7.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE7.xml new file mode 100644 index 0000000000..b3e588d4c2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE8.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE8.xml new file mode 100644 index 0000000000..be5de24947 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE9.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE9.xml new file mode 100644 index 0000000000..8ea7ee18c7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE_anime.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE_anime.xml new file mode 100644 index 0000000000..f6b4659e22 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oF1d_map.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oF1d_map.xml new file mode 100644 index 0000000000..f14fecd825 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oF1s.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oF1s.xml new file mode 100644 index 0000000000..fe41dde630 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_o_anime.xml b/soh/assets/xml/N64_NTSC_11/objects/object_o_anime.xml new file mode 100644 index 0000000000..4ef4ac44c8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_okuta.xml b/soh/assets/xml/N64_NTSC_11/objects/object_okuta.xml new file mode 100644 index 0000000000..b4fccea6f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_opening_demo1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_opening_demo1.xml new file mode 100644 index 0000000000..fd03230279 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_os.xml b/soh/assets/xml/N64_NTSC_11/objects/object_os.xml new file mode 100644 index 0000000000..5880a92930 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_os_anime.xml b/soh/assets/xml/N64_NTSC_11/objects/object_os_anime.xml new file mode 100644 index 0000000000..f23636343c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ossan.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ossan.xml new file mode 100644 index 0000000000..5788e3a20d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ouke_haka.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ouke_haka.xml new file mode 100644 index 0000000000..11da9b26ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_owl.xml b/soh/assets/xml/N64_NTSC_11/objects/object_owl.xml new file mode 100644 index 0000000000..64fdf64c53 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_peehat.xml b/soh/assets/xml/N64_NTSC_11/objects/object_peehat.xml new file mode 100644 index 0000000000..42ee66cdef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_po_composer.xml b/soh/assets/xml/N64_NTSC_11/objects/object_po_composer.xml new file mode 100644 index 0000000000..ff995efceb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_po_field.xml b/soh/assets/xml/N64_NTSC_11/objects/object_po_field.xml new file mode 100644 index 0000000000..78bc0d65ad --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_po_sisters.xml b/soh/assets/xml/N64_NTSC_11/objects/object_po_sisters.xml new file mode 100644 index 0000000000..b429be2588 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_poh.xml b/soh/assets/xml/N64_NTSC_11/objects/object_poh.xml new file mode 100644 index 0000000000..be6d6eff4b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ps.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ps.xml new file mode 100644 index 0000000000..9f9c894a60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_pu_box.xml b/soh/assets/xml/N64_NTSC_11/objects/object_pu_box.xml new file mode 100644 index 0000000000..e1d686e979 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_rd.xml b/soh/assets/xml/N64_NTSC_11/objects/object_rd.xml new file mode 100644 index 0000000000..22c7d33738 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_reeba.xml b/soh/assets/xml/N64_NTSC_11/objects/object_reeba.xml new file mode 100644 index 0000000000..32c697bd9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_relay_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_relay_objects.xml new file mode 100644 index 0000000000..47b92fcd2d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_rl.xml b/soh/assets/xml/N64_NTSC_11/objects/object_rl.xml new file mode 100644 index 0000000000..2a5ad30f6b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_rr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_rr.xml new file mode 100644 index 0000000000..98726b14bb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_rs.xml b/soh/assets/xml/N64_NTSC_11/objects/object_rs.xml new file mode 100644 index 0000000000..152b5489e1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ru1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ru1.xml new file mode 100644 index 0000000000..3d413619ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ru2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ru2.xml new file mode 100644 index 0000000000..fedf37d48b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_sa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_sa.xml new file mode 100644 index 0000000000..ec45ac961d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_sb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_sb.xml new file mode 100644 index 0000000000..64d3bb005a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_sd.xml b/soh/assets/xml/N64_NTSC_11/objects/object_sd.xml new file mode 100644 index 0000000000..fb58428c3f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_shop_dungen.xml b/soh/assets/xml/N64_NTSC_11/objects/object_shop_dungen.xml new file mode 100644 index 0000000000..594c43d390 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_shopnuts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_shopnuts.xml new file mode 100644 index 0000000000..7065f8941a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_siofuki.xml b/soh/assets/xml/N64_NTSC_11/objects/object_siofuki.xml new file mode 100644 index 0000000000..a23240a728 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_sk2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_sk2.xml new file mode 100644 index 0000000000..f2e7ef6d89 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_skb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_skb.xml new file mode 100644 index 0000000000..5b5efb4848 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_skj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_skj.xml new file mode 100644 index 0000000000..74548e5185 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot00_break.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot00_break.xml new file mode 100644 index 0000000000..d3be88315f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot00_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot00_objects.xml new file mode 100644 index 0000000000..10fb13aeac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoya.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoya.xml new file mode 100644 index 0000000000..d44b944e0e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoyab.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoyab.xml new file mode 100644 index 0000000000..720f50cd3e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects.xml new file mode 100644 index 0000000000..413e032a9c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects2.xml new file mode 100644 index 0000000000..36741a9492 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot02_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot02_objects.xml new file mode 100644 index 0000000000..65f45ff515 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot03_object.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot03_object.xml new file mode 100644 index 0000000000..f182e7d99a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot04_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot04_objects.xml new file mode 100644 index 0000000000..66293d7523 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot05_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot05_objects.xml new file mode 100644 index 0000000000..6e70791493 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot06_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot06_objects.xml new file mode 100644 index 0000000000..e3da63b0f0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot07_object.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot07_object.xml new file mode 100644 index 0000000000..5bc2bfb6bf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot08_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot08_obj.xml new file mode 100644 index 0000000000..4d71f3473f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot09_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot09_obj.xml new file mode 100644 index 0000000000..eb65283931 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot11_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot11_obj.xml new file mode 100644 index 0000000000..257298f7cc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot12_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot12_obj.xml new file mode 100644 index 0000000000..d619c781e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot15_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot15_obj.xml new file mode 100644 index 0000000000..bd59b8cd18 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot16_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot16_obj.xml new file mode 100644 index 0000000000..d39de812a9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot17_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot17_obj.xml new file mode 100644 index 0000000000..d4239d8d28 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot18_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot18_obj.xml new file mode 100644 index 0000000000..cc12b78946 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ssh.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ssh.xml new file mode 100644 index 0000000000..6283f8e9f2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_sst.xml b/soh/assets/xml/N64_NTSC_11/objects/object_sst.xml new file mode 100644 index 0000000000..b874b9a418 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_st.xml b/soh/assets/xml/N64_NTSC_11/objects/object_st.xml new file mode 100644 index 0000000000..983b9e2eab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_stream.xml b/soh/assets/xml/N64_NTSC_11/objects/object_stream.xml new file mode 100644 index 0000000000..59b0838e47 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_syokudai.xml b/soh/assets/xml/N64_NTSC_11/objects/object_syokudai.xml new file mode 100644 index 0000000000..c1670edece --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ta.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ta.xml new file mode 100644 index 0000000000..5e446bf5c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_timeblock.xml b/soh/assets/xml/N64_NTSC_11/objects/object_timeblock.xml new file mode 100644 index 0000000000..1d6b9e698c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tite.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tite.xml new file mode 100644 index 0000000000..1be65c4950 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tk.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tk.xml new file mode 100644 index 0000000000..6b6cce7244 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_toki_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_toki_objects.xml new file mode 100644 index 0000000000..cd07e60d2b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_torch2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_torch2.xml new file mode 100644 index 0000000000..3388e7d34e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_toryo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_toryo.xml new file mode 100644 index 0000000000..73f3dcb1e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tp.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tp.xml new file mode 100644 index 0000000000..8ea908825e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tr.xml new file mode 100644 index 0000000000..17ab9ae392 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_trap.xml b/soh/assets/xml/N64_NTSC_11/objects/object_trap.xml new file mode 100644 index 0000000000..56195cf41b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_triforce_spot.xml b/soh/assets/xml/N64_NTSC_11/objects/object_triforce_spot.xml new file mode 100644 index 0000000000..87d4494589 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ts.xml new file mode 100644 index 0000000000..567277bc39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tsubo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tsubo.xml new file mode 100644 index 0000000000..ee2c5e1846 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tw.xml new file mode 100644 index 0000000000..c7fd2a60be --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_umajump.xml b/soh/assets/xml/N64_NTSC_11/objects/object_umajump.xml new file mode 100644 index 0000000000..2ee4ade46a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_vali.xml b/soh/assets/xml/N64_NTSC_11/objects/object_vali.xml new file mode 100644 index 0000000000..2bab5efaa6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_vase.xml b/soh/assets/xml/N64_NTSC_11/objects/object_vase.xml new file mode 100644 index 0000000000..091d4c51e3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_vm.xml b/soh/assets/xml/N64_NTSC_11/objects/object_vm.xml new file mode 100644 index 0000000000..c5b949b36e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_wallmaster.xml b/soh/assets/xml/N64_NTSC_11/objects/object_wallmaster.xml new file mode 100644 index 0000000000..fbbc4f4af3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_warp1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_warp1.xml new file mode 100644 index 0000000000..1497d7a108 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_warp2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_warp2.xml new file mode 100644 index 0000000000..b6d1b3624c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_wf.xml b/soh/assets/xml/N64_NTSC_11/objects/object_wf.xml new file mode 100644 index 0000000000..ebfb708d2d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_wood02.xml b/soh/assets/xml/N64_NTSC_11/objects/object_wood02.xml new file mode 100644 index 0000000000..47ec342caa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_xc.xml b/soh/assets/xml/N64_NTSC_11/objects/object_xc.xml new file mode 100644 index 0000000000..bb2bf3e7af --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_yabusame_point.xml b/soh/assets/xml/N64_NTSC_11/objects/object_yabusame_point.xml new file mode 100644 index 0000000000..bed9e8a609 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ydan_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ydan_objects.xml new file mode 100644 index 0000000000..e2adf307f7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_yukabyun.xml b/soh/assets/xml/N64_NTSC_11/objects/object_yukabyun.xml new file mode 100644 index 0000000000..d594ebbb89 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zf.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zf.xml new file mode 100644 index 0000000000..7f20eb7866 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zg.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zg.xml new file mode 100644 index 0000000000..79005516c4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zl1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zl1.xml new file mode 100644 index 0000000000..001e5be145 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zl2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zl2.xml new file mode 100644 index 0000000000..959a919ec6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime1.xml new file mode 100644 index 0000000000..cada504867 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime2.xml new file mode 100644 index 0000000000..47016e2e00 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zl4.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zl4.xml new file mode 100644 index 0000000000..8e7a2837ed --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zo.xml new file mode 100644 index 0000000000..77465760ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 0000000000..73ca01696d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 0000000000..fb7e2e0784 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Light.xml new file mode 100644 index 0000000000..93ffad996e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 0000000000..2d32a87728 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 0000000000..8182ca3da8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 0000000000..605d6a73e1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 0000000000..e6fcdab9eb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 0000000000..2c5dd60e8d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Sst.xml new file mode 100644 index 0000000000..a18a449dcd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Demo_Shd.xml new file mode 100644 index 0000000000..6df7aff6d7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Bili.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Bili.xml new file mode 100644 index 0000000000..bd4f305f76 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 0000000000..79feadafc2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 0000000000..8c8bcc3299 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 0000000000..96ae1b093d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Holl.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Holl.xml new file mode 100644 index 0000000000..9f2042ae52 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 0000000000..f6fb08be67 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Kanban.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Kanban.xml new file mode 100644 index 0000000000..ce21430e1f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sda.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sda.xml new file mode 100644 index 0000000000..d3aeb19589 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ssh.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ssh.xml new file mode 100644 index 0000000000..9dc8c7814f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_St.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_St.xml new file mode 100644 index 0000000000..5f76146ccc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sth.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sth.xml new file mode 100644 index 0000000000..ad65bc77d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_End_Title.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_End_Title.xml new file mode 100644 index 0000000000..4fd2822e9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_File_Choose.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_File_Choose.xml new file mode 100644 index 0000000000..dba3fe1bb0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_File_Choose.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Dark.xml new file mode 100644 index 0000000000..f3b41cbfff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Fire.xml new file mode 100644 index 0000000000..06dc7a0489 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Wind.xml new file mode 100644 index 0000000000..e7cd35c2c7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 0000000000..8755d12b8d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 0000000000..8aeb6aef91 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 0000000000..56e3a9ea4a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 0000000000..2b68cc893c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 0000000000..5515d4585c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 0000000000..24902b2a87 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/Bmori1.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/Bmori1.xml new file mode 100644 index 0000000000..ad43114260 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 0000000000..89331ecc2f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan.xml new file mode 100644 index 0000000000..e557c80a55 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 0000000000..97401aff65 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 0000000000..d36ac6b774 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HIDAN.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HIDAN.xml new file mode 100644 index 0000000000..fa4d784f1a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin.xml new file mode 100644 index 0000000000..00c5aa82dd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 0000000000..99ae2b3efe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan.xml new file mode 100644 index 0000000000..a9e520f4cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan_boss.xml new file mode 100644 index 0000000000..9fccf2c301 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan.xml new file mode 100644 index 0000000000..1446a9c98b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan_boss.xml new file mode 100644 index 0000000000..6b22223cd5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon.xml new file mode 100644 index 0000000000..f857dbe94e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_boss.xml new file mode 100644 index 0000000000..36c5e81070 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_demo.xml new file mode 100644 index 0000000000..56c98efed7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_final.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_final.xml new file mode 100644 index 0000000000..3ec568cfb9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 0000000000..84ef36950c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_tou.xml new file mode 100644 index 0000000000..1ae37b9637 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontika.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontika.xml new file mode 100644 index 0000000000..a5ff210ce1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 0000000000..060d4941ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/gerudoway.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/gerudoway.xml new file mode 100644 index 0000000000..8272776143 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 0000000000..b279628898 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinboss.xml new file mode 100644 index 0000000000..86c0d317b2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinzou.xml new file mode 100644 index 0000000000..bc14a46ac3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/men.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/men.xml new file mode 100644 index 0000000000..d9e5960e82 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/moribossroom.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/moribossroom.xml new file mode 100644 index 0000000000..b9959eefab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan.xml new file mode 100644 index 0000000000..aed7d26604 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan_boss.xml new file mode 100644 index 0000000000..7ea240547a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/bowling.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/bowling.xml new file mode 100644 index 0000000000..9a41763a27 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 0000000000..4f9a03fc02 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa.xml new file mode 100644 index 0000000000..06d89f2fe7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 0000000000..6f4c181e0e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hakasitarelay.xml new file mode 100644 index 0000000000..91be63d147 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/hut.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hut.xml new file mode 100644 index 0000000000..a4ef5715ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/hylia_labo.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hylia_labo.xml new file mode 100644 index 0000000000..56822e67a7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/impa.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/impa.xml new file mode 100644 index 0000000000..db757e3d3c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kakariko.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kakariko.xml new file mode 100644 index 0000000000..e4e9b102c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kenjyanoma.xml new file mode 100644 index 0000000000..4e8a58f3b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home.xml new file mode 100644 index 0000000000..8c0305493a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home3.xml new file mode 100644 index 0000000000..9f36eb41c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home4.xml new file mode 100644 index 0000000000..eb861aedb4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home5.xml new file mode 100644 index 0000000000..974987feda --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/labo.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/labo.xml new file mode 100644 index 0000000000..c0a9d2eb8c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/link_home.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/link_home.xml new file mode 100644 index 0000000000..2fb88ae347 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/mahouya.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/mahouya.xml new file mode 100644 index 0000000000..8ae462f9db --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/malon_stable.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/malon_stable.xml new file mode 100644 index 0000000000..aff97eeb86 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/miharigoya.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/miharigoya.xml new file mode 100644 index 0000000000..63f8676ac1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/nakaniwa.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/nakaniwa.xml new file mode 100644 index 0000000000..2fb2d5e6a4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/syatekijyou.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/syatekijyou.xml new file mode 100644 index 0000000000..05243b52ca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/takaraya.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/takaraya.xml new file mode 100644 index 0000000000..5b438980b7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/tent.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/tent.xml new file mode 100644 index 0000000000..de72cc5f45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/tokinoma.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/tokinoma.xml new file mode 100644 index 0000000000..d7878b8951 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 0000000000..3b6dd2dec2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 0000000000..90a8d95d09 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/enrui.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/enrui.xml new file mode 100644 index 0000000000..d8c06e5454 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/entra_n.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/entra_n.xml new file mode 100644 index 0000000000..5b408ac3a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana.xml new file mode 100644 index 0000000000..e7dc93dd0c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana2.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana2.xml new file mode 100644 index 0000000000..2d8ba4906a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana_ouke.xml new file mode 100644 index 0000000000..17f53613e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/hiral_demo.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/hiral_demo.xml new file mode 100644 index 0000000000..1331fdd4c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/kakariko3.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/kakariko3.xml new file mode 100644 index 0000000000..07b62c44df --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/kakusiana.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/kakusiana.xml new file mode 100644 index 0000000000..c3f993ff4f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/kinsuta.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/kinsuta.xml new file mode 100644 index 0000000000..aac0f6c4ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley.xml new file mode 100644 index 0000000000..c304673032 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley_n.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley_n.xml new file mode 100644 index 0000000000..65db604113 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/market_day.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_day.xml new file mode 100644 index 0000000000..00887e69cd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/market_night.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_night.xml new file mode 100644 index 0000000000..c58e38744e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/market_ruins.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_ruins.xml new file mode 100644 index 0000000000..f0ec75e759 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine.xml new file mode 100644 index 0000000000..b9ddf2cf70 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_n.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_n.xml new file mode 100644 index 0000000000..4878338aa1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_r.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_r.xml new file mode 100644 index 0000000000..1220367919 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/turibori.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/turibori.xml new file mode 100644 index 0000000000..0633224d9c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/entra.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/entra.xml new file mode 100644 index 0000000000..92ee57f59a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/souko.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/souko.xml new file mode 100644 index 0000000000..8dd9d9e48a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot00.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot00.xml new file mode 100644 index 0000000000..508d9309b3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot01.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot01.xml new file mode 100644 index 0000000000..dcee38761f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot02.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot02.xml new file mode 100644 index 0000000000..c7924c29db --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot03.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot03.xml new file mode 100644 index 0000000000..9434185f44 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot04.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot04.xml new file mode 100644 index 0000000000..ccff0d05bf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot05.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot05.xml new file mode 100644 index 0000000000..4f7c62b91e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot06.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot06.xml new file mode 100644 index 0000000000..f4af602cfd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot07.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot07.xml new file mode 100644 index 0000000000..eeb976f7f6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot08.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot08.xml new file mode 100644 index 0000000000..86582f0dca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot09.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot09.xml new file mode 100644 index 0000000000..58f1f75020 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot10.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot10.xml new file mode 100644 index 0000000000..66365e3d86 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot11.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot11.xml new file mode 100644 index 0000000000..76ff3b8223 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot12.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot12.xml new file mode 100644 index 0000000000..e21523b217 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot13.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot13.xml new file mode 100644 index 0000000000..c689130650 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot15.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot15.xml new file mode 100644 index 0000000000..e75f7b6845 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot16.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot16.xml new file mode 100644 index 0000000000..6c059858be --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot17.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot17.xml new file mode 100644 index 0000000000..c50cacdb36 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot18.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot18.xml new file mode 100644 index 0000000000..d70fccf4bb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot20.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot20.xml new file mode 100644 index 0000000000..1381f6ecbe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/alley_shop.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/alley_shop.xml new file mode 100644 index 0000000000..95548de1bd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/drag.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/drag.xml new file mode 100644 index 0000000000..acb6515fba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/face_shop.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/face_shop.xml new file mode 100644 index 0000000000..16a9746081 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/golon.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/golon.xml new file mode 100644 index 0000000000..c586727988 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/kokiri_shop.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/kokiri_shop.xml new file mode 100644 index 0000000000..50cd633e57 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/night_shop.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/night_shop.xml new file mode 100644 index 0000000000..5954d9c83d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/shop1.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/shop1.xml new file mode 100644 index 0000000000..525a06d633 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/zoora.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/zoora.xml new file mode 100644 index 0000000000..0e4ac18f8c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/text/elf_message_field.xml b/soh/assets/xml/N64_NTSC_11/text/elf_message_field.xml new file mode 100644 index 0000000000..789a554ce8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/text/elf_message_ydan.xml b/soh/assets/xml/N64_NTSC_11/text/elf_message_ydan.xml new file mode 100644 index 0000000000..f784afcf45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/text/message_data_static.xml b/soh/assets/xml/N64_NTSC_11/text/message_data_static.xml new file mode 100644 index 0000000000..ca67ce4a07 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/backgrounds.xml b/soh/assets/xml/N64_NTSC_11/textures/backgrounds.xml new file mode 100644 index 0000000000..c60ff57a8a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/boss_title_cards.xml b/soh/assets/xml/N64_NTSC_11/textures/boss_title_cards.xml new file mode 100644 index 0000000000..84f555bd10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/textures/do_action_static.xml b/soh/assets/xml/N64_NTSC_11/textures/do_action_static.xml new file mode 100644 index 0000000000..efabd54a58 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_24_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_24_static.xml new file mode 100644 index 0000000000..cdb8cc7379 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_dungeon_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_dungeon_static.xml new file mode 100644 index 0000000000..873c490fc5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_field_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_field_static.xml new file mode 100644 index 0000000000..ed991406b5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_gameover_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_gameover_static.xml new file mode 100644 index 0000000000..ffd3928680 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_jpn_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_jpn_static.xml new file mode 100644 index 0000000000..f2fe854b8e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_nes_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_nes_static.xml new file mode 100644 index 0000000000..6cd92acfca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_static.xml new file mode 100644 index 0000000000..9e844615b1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/item_name_static.xml b/soh/assets/xml/N64_NTSC_11/textures/item_name_static.xml new file mode 100644 index 0000000000..1bc074c2ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/kanji.xml b/soh/assets/xml/N64_NTSC_11/textures/kanji.xml new file mode 100644 index 0000000000..5159387a13 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/textures/map_48x85_static.xml b/soh/assets/xml/N64_NTSC_11/textures/map_48x85_static.xml new file mode 100644 index 0000000000..b2ea46340a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/textures/map_grand_static.xml b/soh/assets/xml/N64_NTSC_11/textures/map_grand_static.xml new file mode 100644 index 0000000000..201955bfc3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/map_i_static.xml b/soh/assets/xml/N64_NTSC_11/textures/map_i_static.xml new file mode 100644 index 0000000000..1721f6d848 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/map_name_static.xml b/soh/assets/xml/N64_NTSC_11/textures/map_name_static.xml new file mode 100644 index 0000000000..ca4c4c0bd6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/message_static.xml b/soh/assets/xml/N64_NTSC_11/textures/message_static.xml new file mode 100644 index 0000000000..afdde60def --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/message_texture_static.xml b/soh/assets/xml/N64_NTSC_11/textures/message_texture_static.xml new file mode 100644 index 0000000000..bbf7e1259e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/nes_font_static.xml b/soh/assets/xml/N64_NTSC_11/textures/nes_font_static.xml new file mode 100644 index 0000000000..f1b80ee045 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/nes_font_static.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/nintendo_rogo_static.xml b/soh/assets/xml/N64_NTSC_11/textures/nintendo_rogo_static.xml new file mode 100644 index 0000000000..f09de3b0f9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/parameter_static.xml b/soh/assets/xml/N64_NTSC_11/textures/parameter_static.xml new file mode 100644 index 0000000000..c51dacf1f6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/place_title_cards.xml b/soh/assets/xml/N64_NTSC_11/textures/place_title_cards.xml new file mode 100644 index 0000000000..b688cce00c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/skyboxes.xml b/soh/assets/xml/N64_NTSC_11/textures/skyboxes.xml new file mode 100644 index 0000000000..104ffb2a3f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/title_static.xml b/soh/assets/xml/N64_NTSC_11/textures/title_static.xml new file mode 100644 index 0000000000..5f58c5a820 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/audio/Audio.xml b/soh/assets/xml/N64_NTSC_12/audio/Audio.xml new file mode 100644 index 0000000000..d66d3cf925 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/audio/Audio.xml @@ -0,0 +1,639 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/code/fbdemo_circle.xml b/soh/assets/xml/N64_NTSC_12/code/fbdemo_circle.xml new file mode 100644 index 0000000000..b7e54845ad --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/code/fbdemo_triforce.xml b/soh/assets/xml/N64_NTSC_12/code/fbdemo_triforce.xml new file mode 100644 index 0000000000..a0886ab521 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/code/fbdemo_wipe1.xml b/soh/assets/xml/N64_NTSC_12/code/fbdemo_wipe1.xml new file mode 100644 index 0000000000..7c5aad68e3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/code/sys_matrix.xml b/soh/assets/xml/N64_NTSC_12/code/sys_matrix.xml new file mode 100644 index 0000000000..25d8331f34 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/misc/link_animetion.xml b/soh/assets/xml/N64_NTSC_12/misc/link_animetion.xml new file mode 100644 index 0000000000..9de1e92d36 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/N64_NTSC_12/objects/gameplay_dangeon_keep.xml new file mode 100644 index 0000000000..5b1a9050d9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/gameplay_field_keep.xml b/soh/assets/xml/N64_NTSC_12/objects/gameplay_field_keep.xml new file mode 100644 index 0000000000..011e8f7fc7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/gameplay_keep.xml b/soh/assets/xml/N64_NTSC_12/objects/gameplay_keep.xml new file mode 100644 index 0000000000..94eee8845e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_Bb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_Bb.xml new file mode 100644 index 0000000000..5d04bde451 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ahg.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ahg.xml new file mode 100644 index 0000000000..4d37b1b110 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_am.xml b/soh/assets/xml/N64_NTSC_12/objects/object_am.xml new file mode 100644 index 0000000000..b70c70d709 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ane.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ane.xml new file mode 100644 index 0000000000..1e29b351e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ani.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ani.xml new file mode 100644 index 0000000000..c70621c6f9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_anubice.xml b/soh/assets/xml/N64_NTSC_12/objects/object_anubice.xml new file mode 100644 index 0000000000..fb029586ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_aob.xml b/soh/assets/xml/N64_NTSC_12/objects/object_aob.xml new file mode 100644 index 0000000000..e6202d0cf9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_b_heart.xml b/soh/assets/xml/N64_NTSC_12/objects/object_b_heart.xml new file mode 100644 index 0000000000..00f7cd6773 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bba.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bba.xml new file mode 100644 index 0000000000..ccc5c21365 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bdan_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bdan_objects.xml new file mode 100644 index 0000000000..dcd56d3856 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bdoor.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bdoor.xml new file mode 100644 index 0000000000..a092f0c23b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bg.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bg.xml new file mode 100644 index 0000000000..791226b71d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bigokuta.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bigokuta.xml new file mode 100644 index 0000000000..1c7d39e319 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bird.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bird.xml new file mode 100644 index 0000000000..167a5022dc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bji.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bji.xml new file mode 100644 index 0000000000..c665b6b001 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bl.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bl.xml new file mode 100644 index 0000000000..1c2ef4ec63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_blkobj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_blkobj.xml new file mode 100644 index 0000000000..345a8ebd9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bob.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bob.xml new file mode 100644 index 0000000000..289e994e47 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_boj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_boj.xml new file mode 100644 index 0000000000..4be4764ab5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bombf.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bombf.xml new file mode 100644 index 0000000000..83e60248d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bombiwa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bombiwa.xml new file mode 100644 index 0000000000..26ab6b4f33 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bowl.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bowl.xml new file mode 100644 index 0000000000..ffe6d43db7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_box.xml b/soh/assets/xml/N64_NTSC_12/objects/object_box.xml new file mode 100644 index 0000000000..106d2d3356 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_brob.xml b/soh/assets/xml/N64_NTSC_12/objects/object_brob.xml new file mode 100644 index 0000000000..718dcd5617 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bubble.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bubble.xml new file mode 100644 index 0000000000..f5de186920 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bv.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bv.xml new file mode 100644 index 0000000000..d2ebf275ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bw.xml new file mode 100644 index 0000000000..6fd39fbb1c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bwall.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bwall.xml new file mode 100644 index 0000000000..d4f43ddc14 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bxa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bxa.xml new file mode 100644 index 0000000000..fb78c117e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_cne.xml b/soh/assets/xml/N64_NTSC_12/objects/object_cne.xml new file mode 100644 index 0000000000..0c14d0bc54 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_cob.xml b/soh/assets/xml/N64_NTSC_12/objects/object_cob.xml new file mode 100644 index 0000000000..ba051cfa74 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_cow.xml b/soh/assets/xml/N64_NTSC_12/objects/object_cow.xml new file mode 100644 index 0000000000..5d067c329f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_crow.xml b/soh/assets/xml/N64_NTSC_12/objects/object_crow.xml new file mode 100644 index 0000000000..77337c6445 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_cs.xml b/soh/assets/xml/N64_NTSC_12/objects/object_cs.xml new file mode 100644 index 0000000000..83804ccaf4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_d_elevator.xml b/soh/assets/xml/N64_NTSC_12/objects/object_d_elevator.xml new file mode 100644 index 0000000000..6be59c154b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_d_hsblock.xml b/soh/assets/xml/N64_NTSC_12/objects/object_d_hsblock.xml new file mode 100644 index 0000000000..4bb50c2b4f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_d_lift.xml b/soh/assets/xml/N64_NTSC_12/objects/object_d_lift.xml new file mode 100644 index 0000000000..2912385190 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_daiku.xml b/soh/assets/xml/N64_NTSC_12/objects/object_daiku.xml new file mode 100644 index 0000000000..1524c7a26c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ddan_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ddan_objects.xml new file mode 100644 index 0000000000..3fc563b96f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dekubaba.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dekubaba.xml new file mode 100644 index 0000000000..7202a833fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dekujr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dekujr.xml new file mode 100644 index 0000000000..e906bf61c4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dekunuts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dekunuts.xml new file mode 100644 index 0000000000..5fceef4165 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_demo_6k.xml b/soh/assets/xml/N64_NTSC_12/objects/object_demo_6k.xml new file mode 100644 index 0000000000..73058d5e46 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_demo_kekkai.xml b/soh/assets/xml/N64_NTSC_12/objects/object_demo_kekkai.xml new file mode 100644 index 0000000000..aa54bc2eef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_demo_tre_lgt.xml b/soh/assets/xml/N64_NTSC_12/objects/object_demo_tre_lgt.xml new file mode 100644 index 0000000000..9ea19012b7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dh.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dh.xml new file mode 100644 index 0000000000..7a52d7dbe7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dnk.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dnk.xml new file mode 100644 index 0000000000..3bce343048 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dns.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dns.xml new file mode 100644 index 0000000000..8b78ffcf20 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dodojr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dodojr.xml new file mode 100644 index 0000000000..4dfd7d6e45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dodongo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dodongo.xml new file mode 100644 index 0000000000..779e20e9dc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dog.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dog.xml new file mode 100644 index 0000000000..ef00442b60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_door_gerudo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_door_gerudo.xml new file mode 100644 index 0000000000..2f17262041 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_door_killer.xml b/soh/assets/xml/N64_NTSC_12/objects/object_door_killer.xml new file mode 100644 index 0000000000..a37f590d60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ds.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ds.xml new file mode 100644 index 0000000000..0413a9e2e8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ds2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ds2.xml new file mode 100644 index 0000000000..683bcc68d4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_du.xml b/soh/assets/xml/N64_NTSC_12/objects/object_du.xml new file mode 100644 index 0000000000..0babd962b9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dy_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dy_obj.xml new file mode 100644 index 0000000000..5e792edb50 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ec.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ec.xml new file mode 100644 index 0000000000..7ec83e284d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_crystal_light.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_crystal_light.xml new file mode 100644 index 0000000000..9215b6a394 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_doughnut.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_doughnut.xml new file mode 100644 index 0000000000..7f12c56f53 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_erupc.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_erupc.xml new file mode 100644 index 0000000000..800d9535f1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_fire_ball.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_fire_ball.xml new file mode 100644 index 0000000000..2fc65b16ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_flash.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_flash.xml new file mode 100644 index 0000000000..5f962f162b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_lgt_shower.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_lgt_shower.xml new file mode 100644 index 0000000000..67ef5ce7e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_star_field.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_star_field.xml new file mode 100644 index 0000000000..00b47c460f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_tw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_tw.xml new file mode 100644 index 0000000000..de53765696 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ei.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ei.xml new file mode 100644 index 0000000000..e4132491f4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fa.xml new file mode 100644 index 0000000000..2f1bf9a5e8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fd.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fd.xml new file mode 100644 index 0000000000..2609579670 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fd2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fd2.xml new file mode 100644 index 0000000000..44b5f5f9c1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fhg.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fhg.xml new file mode 100644 index 0000000000..669875aaf8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fire.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fire.xml new file mode 100644 index 0000000000..49bf620cb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_firefly.xml b/soh/assets/xml/N64_NTSC_12/objects/object_firefly.xml new file mode 100644 index 0000000000..8c26a43418 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fish.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fish.xml new file mode 100644 index 0000000000..f5ad4f6da0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fr.xml new file mode 100644 index 0000000000..25ee2ad42e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fu.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fu.xml new file mode 100644 index 0000000000..82c449e3de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fw.xml new file mode 100644 index 0000000000..ee9821d263 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fz.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fz.xml new file mode 100644 index 0000000000..dad6fec5ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon.xml new file mode 100644 index 0000000000..c654c7fec9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon2.xml new file mode 100644 index 0000000000..7e715dd414 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime1.xml new file mode 100644 index 0000000000..b1016299bc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime2.xml new file mode 100644 index 0000000000..180e5995c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime3.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime3.xml new file mode 100644 index 0000000000..be4c4dcb15 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_objects.xml new file mode 100644 index 0000000000..5e32610ffc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ge1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ge1.xml new file mode 100644 index 0000000000..79e0768b81 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_geff.xml b/soh/assets/xml/N64_NTSC_12/objects/object_geff.xml new file mode 100644 index 0000000000..f0667743b0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_geldb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_geldb.xml new file mode 100644 index 0000000000..49b12ef2e5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrow.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrow.xml new file mode 100644 index 0000000000..4b58787a9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrowcase.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrowcase.xml new file mode 100644 index 0000000000..267b0a734d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bean.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bean.xml new file mode 100644 index 0000000000..e74247816f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_1.xml new file mode 100644 index 0000000000..bae86c11d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_2.xml new file mode 100644 index 0000000000..1400c4a4d4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bombpouch.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bombpouch.xml new file mode 100644 index 0000000000..07134748c3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_boomerang.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_boomerang.xml new file mode 100644 index 0000000000..3c1a0fe7fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_boots_2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_boots_2.xml new file mode 100644 index 0000000000..3bcb6a47ae --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bosskey.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bosskey.xml new file mode 100644 index 0000000000..e5e4bc86c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle.xml new file mode 100644 index 0000000000..3b0884a03f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle_letter.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle_letter.xml new file mode 100644 index 0000000000..443219caf5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bow.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bow.xml new file mode 100644 index 0000000000..946e9c4965 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bracelet.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bracelet.xml new file mode 100644 index 0000000000..5a0b62a60a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_brokensword.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_brokensword.xml new file mode 100644 index 0000000000..408741ac54 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_butterfly.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_butterfly.xml new file mode 100644 index 0000000000..7b60a77247 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_clothes.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_clothes.xml new file mode 100644 index 0000000000..3f897b6d13 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_coin.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_coin.xml new file mode 100644 index 0000000000..22e29f255f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_compass.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_compass.xml new file mode 100644 index 0000000000..076229b11e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_dekupouch.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_dekupouch.xml new file mode 100644 index 0000000000..8925e6fa5f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_egg.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_egg.xml new file mode 100644 index 0000000000..2b2e2847db --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_eye_lotion.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_eye_lotion.xml new file mode 100644 index 0000000000..5128c5f6ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_fire.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_fire.xml new file mode 100644 index 0000000000..4bfd76a7c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_fish.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_fish.xml new file mode 100644 index 0000000000..edb39dc297 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_frog.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_frog.xml new file mode 100644 index 0000000000..a656c306bd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudo.xml new file mode 100644 index 0000000000..d65daee8e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudomask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudomask.xml new file mode 100644 index 0000000000..cfcb878d9b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_ghost.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ghost.xml new file mode 100644 index 0000000000..795f0cfd10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_glasses.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_glasses.xml new file mode 100644 index 0000000000..63d32ab5ac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_gloves.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gloves.xml new file mode 100644 index 0000000000..0e1c4259d5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_goddess.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_goddess.xml new file mode 100644 index 0000000000..50cbdd8918 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_golonmask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_golonmask.xml new file mode 100644 index 0000000000..844d90e714 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_grass.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_grass.xml new file mode 100644 index 0000000000..ae7834201a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_hammer.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hammer.xml new file mode 100644 index 0000000000..feb5c8659d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_heart.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_heart.xml new file mode 100644 index 0000000000..48e78b1b5c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_hearts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hearts.xml new file mode 100644 index 0000000000..d2e763e631 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_hookshot.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hookshot.xml new file mode 100644 index 0000000000..a6b3b0fdac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_hoverboots.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hoverboots.xml new file mode 100644 index 0000000000..6d41df8fd0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_insect.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_insect.xml new file mode 100644 index 0000000000..7af5b5b3b2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_jewel.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_jewel.xml new file mode 100644 index 0000000000..e83c651164 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_key.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_key.xml new file mode 100644 index 0000000000..a37d45a71c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 0000000000..46eff7d3e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_letter.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_letter.xml new file mode 100644 index 0000000000..bea8683390 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_liquid.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_liquid.xml new file mode 100644 index 0000000000..18a5c3d7a2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_longsword.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_longsword.xml new file mode 100644 index 0000000000..7161e42e38 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_m_arrow.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_m_arrow.xml new file mode 100644 index 0000000000..0fd659ae95 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_magicpot.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_magicpot.xml new file mode 100644 index 0000000000..7623e6353e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_map.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_map.xml new file mode 100644 index 0000000000..471c1dab97 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_medal.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_medal.xml new file mode 100644 index 0000000000..28e5b1e683 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_melody.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_melody.xml new file mode 100644 index 0000000000..b01fca9538 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_milk.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_milk.xml new file mode 100644 index 0000000000..a3e223b3e6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_mushroom.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_mushroom.xml new file mode 100644 index 0000000000..5b19bca743 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_niwatori.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_niwatori.xml new file mode 100644 index 0000000000..c8389f62c2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_nuts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_nuts.xml new file mode 100644 index 0000000000..c59903c43d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina.xml new file mode 100644 index 0000000000..82607677d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina_0.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina_0.xml new file mode 100644 index 0000000000..2c5f70d984 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_pachinko.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_pachinko.xml new file mode 100644 index 0000000000..5f808baf92 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_powder.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_powder.xml new file mode 100644 index 0000000000..fb7dc0155d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_prescription.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_prescription.xml new file mode 100644 index 0000000000..75ae7eb2b7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_purse.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_purse.xml new file mode 100644 index 0000000000..054731dec7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_rabit_mask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_rabit_mask.xml new file mode 100644 index 0000000000..9d4eb9487f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_redead_mask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_redead_mask.xml new file mode 100644 index 0000000000..7de08487f8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_rupy.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_rupy.xml new file mode 100644 index 0000000000..0a1af96d0f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_saw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_saw.xml new file mode 100644 index 0000000000..dcc038b7c1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_scale.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_scale.xml new file mode 100644 index 0000000000..1cf5de5b99 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_seed.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_seed.xml new file mode 100644 index 0000000000..82c15c82d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_1.xml new file mode 100644 index 0000000000..2f11e3f6d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_2.xml new file mode 100644 index 0000000000..176ae025fe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_3.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_3.xml new file mode 100644 index 0000000000..8d1e5dafd4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_skj_mask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_skj_mask.xml new file mode 100644 index 0000000000..e6c90f76f1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_soldout.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_soldout.xml new file mode 100644 index 0000000000..a15b1253e3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_soul.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_soul.xml new file mode 100644 index 0000000000..a68178eba5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_stick.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_stick.xml new file mode 100644 index 0000000000..fed89f4659 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_sutaru.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_sutaru.xml new file mode 100644 index 0000000000..a2606afbe3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_sword_1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_sword_1.xml new file mode 100644 index 0000000000..e1119abca0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_ticketstone.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ticketstone.xml new file mode 100644 index 0000000000..73bf888d10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_truth_mask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_truth_mask.xml new file mode 100644 index 0000000000..3b4edf3dee --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_zoramask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_zoramask.xml new file mode 100644 index 0000000000..e3b1ab10ec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gj.xml new file mode 100644 index 0000000000..ee6dab74f8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gjyo_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gjyo_objects.xml new file mode 100644 index 0000000000..ea4f8444fb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gla.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gla.xml new file mode 100644 index 0000000000..499a3720d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gm.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gm.xml new file mode 100644 index 0000000000..91b10cc428 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gnd.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gnd.xml new file mode 100644 index 0000000000..3ae3b57f3d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gnd_magic.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gnd_magic.xml new file mode 100644 index 0000000000..a88d419d7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gndd.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gndd.xml new file mode 100644 index 0000000000..8bf5d770c4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_god_lgt.xml b/soh/assets/xml/N64_NTSC_12/objects/object_god_lgt.xml new file mode 100644 index 0000000000..60df9e4693 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gol.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gol.xml new file mode 100644 index 0000000000..7e04508cb6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_goma.xml b/soh/assets/xml/N64_NTSC_12/objects/object_goma.xml new file mode 100644 index 0000000000..922678a3cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_goroiwa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_goroiwa.xml new file mode 100644 index 0000000000..5d406e9578 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gr.xml new file mode 100644 index 0000000000..5f7360ae57 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gs.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gs.xml new file mode 100644 index 0000000000..145be16653 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gt.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gt.xml new file mode 100644 index 0000000000..1d79d4e39e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_haka.xml b/soh/assets/xml/N64_NTSC_12/objects/object_haka.xml new file mode 100644 index 0000000000..f6b263c375 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_haka_door.xml b/soh/assets/xml/N64_NTSC_12/objects/object_haka_door.xml new file mode 100644 index 0000000000..1376d03569 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_haka_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_haka_objects.xml new file mode 100644 index 0000000000..3ca6d27c08 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hakach_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hakach_objects.xml new file mode 100644 index 0000000000..0de02aaf15 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hata.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hata.xml new file mode 100644 index 0000000000..b0324c3be3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_heavy_object.xml b/soh/assets/xml/N64_NTSC_12/objects/object_heavy_object.xml new file mode 100644 index 0000000000..ecc7953211 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hidan_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hidan_objects.xml new file mode 100644 index 0000000000..f41c0ee5ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hintnuts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hintnuts.xml new file mode 100644 index 0000000000..a7290f3955 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hni.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hni.xml new file mode 100644 index 0000000000..6b317eb7a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_horse.xml b/soh/assets/xml/N64_NTSC_12/objects/object_horse.xml new file mode 100644 index 0000000000..74619e5977 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_horse_ganon.xml b/soh/assets/xml/N64_NTSC_12/objects/object_horse_ganon.xml new file mode 100644 index 0000000000..0a55462e25 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_horse_link_child.xml b/soh/assets/xml/N64_NTSC_12/objects/object_horse_link_child.xml new file mode 100644 index 0000000000..146c564f55 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_horse_normal.xml b/soh/assets/xml/N64_NTSC_12/objects/object_horse_normal.xml new file mode 100644 index 0000000000..2facab39c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_horse_zelda.xml b/soh/assets/xml/N64_NTSC_12/objects/object_horse_zelda.xml new file mode 100644 index 0000000000..af270c6585 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hs.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hs.xml new file mode 100644 index 0000000000..cf5d06e1a2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_human.xml b/soh/assets/xml/N64_NTSC_12/objects/object_human.xml new file mode 100644 index 0000000000..05795cb332 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ice_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ice_objects.xml new file mode 100644 index 0000000000..c7d059d709 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ik.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ik.xml new file mode 100644 index 0000000000..8a6028f7c0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_im.xml b/soh/assets/xml/N64_NTSC_12/objects/object_im.xml new file mode 100644 index 0000000000..a628a113a4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_in.xml b/soh/assets/xml/N64_NTSC_12/objects/object_in.xml new file mode 100644 index 0000000000..84c1140475 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ingate.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ingate.xml new file mode 100644 index 0000000000..e6be42bebf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_jj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_jj.xml new file mode 100644 index 0000000000..62bae8cb91 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_js.xml b/soh/assets/xml/N64_NTSC_12/objects/object_js.xml new file mode 100644 index 0000000000..ff7bd3efa1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_jya_door.xml b/soh/assets/xml/N64_NTSC_12/objects/object_jya_door.xml new file mode 100644 index 0000000000..60a7b37886 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_jya_iron.xml b/soh/assets/xml/N64_NTSC_12/objects/object_jya_iron.xml new file mode 100644 index 0000000000..c6f6773c6a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_jya_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_jya_obj.xml new file mode 100644 index 0000000000..a1f19b8066 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ka.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ka.xml new file mode 100644 index 0000000000..eb952732b4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kanban.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kanban.xml new file mode 100644 index 0000000000..9ffc7a2ceb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kibako2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kibako2.xml new file mode 100644 index 0000000000..a701b294de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kingdodongo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kingdodongo.xml new file mode 100644 index 0000000000..5ef07a26f7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_km1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_km1.xml new file mode 100644 index 0000000000..0a918a798e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kusa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kusa.xml new file mode 100644 index 0000000000..67291a5543 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kw1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kw1.xml new file mode 100644 index 0000000000..eab561b1fb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kz.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kz.xml new file mode 100644 index 0000000000..4624fefdb6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_light_ring.xml b/soh/assets/xml/N64_NTSC_12/objects/object_light_ring.xml new file mode 100644 index 0000000000..babe7d2aa7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_lightbox.xml b/soh/assets/xml/N64_NTSC_12/objects/object_lightbox.xml new file mode 100644 index 0000000000..552a79d7c7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_lightswitch.xml b/soh/assets/xml/N64_NTSC_12/objects/object_lightswitch.xml new file mode 100644 index 0000000000..cfd5dcfb40 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_link_boy.xml b/soh/assets/xml/N64_NTSC_12/objects/object_link_boy.xml new file mode 100644 index 0000000000..6351af5050 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_link_child.xml b/soh/assets/xml/N64_NTSC_12/objects/object_link_child.xml new file mode 100644 index 0000000000..0de4003731 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ma1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ma1.xml new file mode 100644 index 0000000000..63eeb38950 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ma2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ma2.xml new file mode 100644 index 0000000000..ce5910fb80 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mag.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mag.xml new file mode 100644 index 0000000000..257f723635 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mag.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mamenoki.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mamenoki.xml new file mode 100644 index 0000000000..819d890225 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mastergolon.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mastergolon.xml new file mode 100644 index 0000000000..6dd9d16592 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_masterkokiri.xml b/soh/assets/xml/N64_NTSC_12/objects/object_masterkokiri.xml new file mode 100644 index 0000000000..af5a9ec153 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_masterkokirihead.xml b/soh/assets/xml/N64_NTSC_12/objects/object_masterkokirihead.xml new file mode 100644 index 0000000000..c64aa1c49e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_masterzoora.xml b/soh/assets/xml/N64_NTSC_12/objects/object_masterzoora.xml new file mode 100644 index 0000000000..2c703274e1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mb.xml new file mode 100644 index 0000000000..23c0930c02 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_md.xml b/soh/assets/xml/N64_NTSC_12/objects/object_md.xml new file mode 100644 index 0000000000..161c73dca1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_medal.xml b/soh/assets/xml/N64_NTSC_12/objects/object_medal.xml new file mode 100644 index 0000000000..533872a551 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_menkuri_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_menkuri_objects.xml new file mode 100644 index 0000000000..4c2b51df5b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mir_ray.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mir_ray.xml new file mode 100644 index 0000000000..2acc9391ab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mizu_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mizu_objects.xml new file mode 100644 index 0000000000..5a18b95cfe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin.xml new file mode 100644 index 0000000000..daf9b05412 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_dark.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_dark.xml new file mode 100644 index 0000000000..2fa0bdbe4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flame.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flame.xml new file mode 100644 index 0000000000..6274feaee1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flash.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flash.xml new file mode 100644 index 0000000000..c1040ea118 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_ice.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_ice.xml new file mode 100644 index 0000000000..1aaeea193d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_oka.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_oka.xml new file mode 100644 index 0000000000..0f823b9237 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_soul.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_soul.xml new file mode 100644 index 0000000000..6386f7f9ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_wind.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_wind.xml new file mode 100644 index 0000000000..8bba7eb91b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mk.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mk.xml new file mode 100644 index 0000000000..0b4aaae8aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mm.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mm.xml new file mode 100644 index 0000000000..b27837e57e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mo.xml new file mode 100644 index 0000000000..4c4be74c83 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1.xml new file mode 100644 index 0000000000..bb1b31e2fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1a.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1a.xml new file mode 100644 index 0000000000..c750ce20d0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2.xml new file mode 100644 index 0000000000..785b858571 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2a.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2a.xml new file mode 100644 index 0000000000..ad1bb4d5f0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_objects.xml new file mode 100644 index 0000000000..58ea8c085c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_tex.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_tex.xml new file mode 100644 index 0000000000..8ba4ff2d34 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ms.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ms.xml new file mode 100644 index 0000000000..a87d0e6b36 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mu.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mu.xml new file mode 100644 index 0000000000..7251ff7212 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_nb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_nb.xml new file mode 100644 index 0000000000..74de9e2859 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_niw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_niw.xml new file mode 100644 index 0000000000..4eafec9566 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_nwc.xml b/soh/assets/xml/N64_NTSC_12/objects/object_nwc.xml new file mode 100644 index 0000000000..96ffa32383 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ny.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ny.xml new file mode 100644 index 0000000000..e2e8187ff8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA1.xml new file mode 100644 index 0000000000..1d665f1010 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA10.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA10.xml new file mode 100644 index 0000000000..65d0808349 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA11.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA11.xml new file mode 100644 index 0000000000..92ae474b60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA2.xml new file mode 100644 index 0000000000..ffdcd79896 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA3.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA3.xml new file mode 100644 index 0000000000..a492bd8751 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA4.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA4.xml new file mode 100644 index 0000000000..dcdbbfff9b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA5.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA5.xml new file mode 100644 index 0000000000..55072176dd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA6.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA6.xml new file mode 100644 index 0000000000..c17a510881 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA7.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA7.xml new file mode 100644 index 0000000000..52c68f6394 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA8.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA8.xml new file mode 100644 index 0000000000..8ed2d3df50 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA9.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA9.xml new file mode 100644 index 0000000000..d5c16abfcd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oB1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oB1.xml new file mode 100644 index 0000000000..2f50c967b2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oB2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oB2.xml new file mode 100644 index 0000000000..230783ceae --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oB3.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oB3.xml new file mode 100644 index 0000000000..1c42ddaccc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oB4.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oB4.xml new file mode 100644 index 0000000000..2924c9e753 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE1.xml new file mode 100644 index 0000000000..4d5b1663fe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE10.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE10.xml new file mode 100644 index 0000000000..04ce914372 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE11.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE11.xml new file mode 100644 index 0000000000..04f6f186da --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE12.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE12.xml new file mode 100644 index 0000000000..a5fa39fd25 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE1s.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE1s.xml new file mode 100644 index 0000000000..d311e60104 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE2.xml new file mode 100644 index 0000000000..af62ad6d11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE3.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE3.xml new file mode 100644 index 0000000000..95227da384 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE4.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE4.xml new file mode 100644 index 0000000000..ae48d2adef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE4s.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE4s.xml new file mode 100644 index 0000000000..6037de52f9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE5.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE5.xml new file mode 100644 index 0000000000..f5edf745aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE6.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE6.xml new file mode 100644 index 0000000000..95bb602b6b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE7.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE7.xml new file mode 100644 index 0000000000..b3e588d4c2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE8.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE8.xml new file mode 100644 index 0000000000..be5de24947 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE9.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE9.xml new file mode 100644 index 0000000000..8ea7ee18c7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE_anime.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE_anime.xml new file mode 100644 index 0000000000..f6b4659e22 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oF1d_map.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oF1d_map.xml new file mode 100644 index 0000000000..f14fecd825 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oF1s.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oF1s.xml new file mode 100644 index 0000000000..fe41dde630 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_o_anime.xml b/soh/assets/xml/N64_NTSC_12/objects/object_o_anime.xml new file mode 100644 index 0000000000..4ef4ac44c8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_okuta.xml b/soh/assets/xml/N64_NTSC_12/objects/object_okuta.xml new file mode 100644 index 0000000000..b4fccea6f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_opening_demo1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_opening_demo1.xml new file mode 100644 index 0000000000..fd03230279 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_os.xml b/soh/assets/xml/N64_NTSC_12/objects/object_os.xml new file mode 100644 index 0000000000..5880a92930 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_os_anime.xml b/soh/assets/xml/N64_NTSC_12/objects/object_os_anime.xml new file mode 100644 index 0000000000..f23636343c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ossan.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ossan.xml new file mode 100644 index 0000000000..5788e3a20d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ouke_haka.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ouke_haka.xml new file mode 100644 index 0000000000..11da9b26ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_owl.xml b/soh/assets/xml/N64_NTSC_12/objects/object_owl.xml new file mode 100644 index 0000000000..64fdf64c53 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_peehat.xml b/soh/assets/xml/N64_NTSC_12/objects/object_peehat.xml new file mode 100644 index 0000000000..42ee66cdef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_po_composer.xml b/soh/assets/xml/N64_NTSC_12/objects/object_po_composer.xml new file mode 100644 index 0000000000..ff995efceb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_po_field.xml b/soh/assets/xml/N64_NTSC_12/objects/object_po_field.xml new file mode 100644 index 0000000000..78bc0d65ad --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_po_sisters.xml b/soh/assets/xml/N64_NTSC_12/objects/object_po_sisters.xml new file mode 100644 index 0000000000..b429be2588 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_poh.xml b/soh/assets/xml/N64_NTSC_12/objects/object_poh.xml new file mode 100644 index 0000000000..be6d6eff4b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ps.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ps.xml new file mode 100644 index 0000000000..9f9c894a60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_pu_box.xml b/soh/assets/xml/N64_NTSC_12/objects/object_pu_box.xml new file mode 100644 index 0000000000..e1d686e979 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_rd.xml b/soh/assets/xml/N64_NTSC_12/objects/object_rd.xml new file mode 100644 index 0000000000..22c7d33738 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_reeba.xml b/soh/assets/xml/N64_NTSC_12/objects/object_reeba.xml new file mode 100644 index 0000000000..32c697bd9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_relay_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_relay_objects.xml new file mode 100644 index 0000000000..47b92fcd2d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_rl.xml b/soh/assets/xml/N64_NTSC_12/objects/object_rl.xml new file mode 100644 index 0000000000..2a5ad30f6b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_rr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_rr.xml new file mode 100644 index 0000000000..98726b14bb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_rs.xml b/soh/assets/xml/N64_NTSC_12/objects/object_rs.xml new file mode 100644 index 0000000000..152b5489e1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ru1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ru1.xml new file mode 100644 index 0000000000..3d413619ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ru2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ru2.xml new file mode 100644 index 0000000000..fedf37d48b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_sa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_sa.xml new file mode 100644 index 0000000000..ec45ac961d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_sb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_sb.xml new file mode 100644 index 0000000000..64d3bb005a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_sd.xml b/soh/assets/xml/N64_NTSC_12/objects/object_sd.xml new file mode 100644 index 0000000000..fb58428c3f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_shop_dungen.xml b/soh/assets/xml/N64_NTSC_12/objects/object_shop_dungen.xml new file mode 100644 index 0000000000..594c43d390 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_shopnuts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_shopnuts.xml new file mode 100644 index 0000000000..7065f8941a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_siofuki.xml b/soh/assets/xml/N64_NTSC_12/objects/object_siofuki.xml new file mode 100644 index 0000000000..a23240a728 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_sk2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_sk2.xml new file mode 100644 index 0000000000..f2e7ef6d89 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_skb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_skb.xml new file mode 100644 index 0000000000..5b5efb4848 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_skj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_skj.xml new file mode 100644 index 0000000000..74548e5185 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot00_break.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot00_break.xml new file mode 100644 index 0000000000..d3be88315f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot00_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot00_objects.xml new file mode 100644 index 0000000000..10fb13aeac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoya.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoya.xml new file mode 100644 index 0000000000..d44b944e0e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoyab.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoyab.xml new file mode 100644 index 0000000000..720f50cd3e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects.xml new file mode 100644 index 0000000000..413e032a9c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects2.xml new file mode 100644 index 0000000000..36741a9492 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot02_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot02_objects.xml new file mode 100644 index 0000000000..65f45ff515 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot03_object.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot03_object.xml new file mode 100644 index 0000000000..f182e7d99a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot04_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot04_objects.xml new file mode 100644 index 0000000000..66293d7523 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot05_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot05_objects.xml new file mode 100644 index 0000000000..6e70791493 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot06_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot06_objects.xml new file mode 100644 index 0000000000..e3da63b0f0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot07_object.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot07_object.xml new file mode 100644 index 0000000000..5bc2bfb6bf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot08_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot08_obj.xml new file mode 100644 index 0000000000..4d71f3473f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot09_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot09_obj.xml new file mode 100644 index 0000000000..eb65283931 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot11_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot11_obj.xml new file mode 100644 index 0000000000..257298f7cc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot12_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot12_obj.xml new file mode 100644 index 0000000000..d619c781e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot15_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot15_obj.xml new file mode 100644 index 0000000000..bd59b8cd18 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot16_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot16_obj.xml new file mode 100644 index 0000000000..d39de812a9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot17_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot17_obj.xml new file mode 100644 index 0000000000..d4239d8d28 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot18_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot18_obj.xml new file mode 100644 index 0000000000..cc12b78946 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ssh.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ssh.xml new file mode 100644 index 0000000000..6283f8e9f2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_sst.xml b/soh/assets/xml/N64_NTSC_12/objects/object_sst.xml new file mode 100644 index 0000000000..b874b9a418 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_st.xml b/soh/assets/xml/N64_NTSC_12/objects/object_st.xml new file mode 100644 index 0000000000..983b9e2eab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_stream.xml b/soh/assets/xml/N64_NTSC_12/objects/object_stream.xml new file mode 100644 index 0000000000..59b0838e47 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_syokudai.xml b/soh/assets/xml/N64_NTSC_12/objects/object_syokudai.xml new file mode 100644 index 0000000000..c1670edece --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ta.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ta.xml new file mode 100644 index 0000000000..5e446bf5c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_timeblock.xml b/soh/assets/xml/N64_NTSC_12/objects/object_timeblock.xml new file mode 100644 index 0000000000..1d6b9e698c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tite.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tite.xml new file mode 100644 index 0000000000..1be65c4950 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tk.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tk.xml new file mode 100644 index 0000000000..6b6cce7244 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_toki_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_toki_objects.xml new file mode 100644 index 0000000000..cd07e60d2b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_torch2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_torch2.xml new file mode 100644 index 0000000000..3388e7d34e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_toryo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_toryo.xml new file mode 100644 index 0000000000..73f3dcb1e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tp.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tp.xml new file mode 100644 index 0000000000..8ea908825e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tr.xml new file mode 100644 index 0000000000..17ab9ae392 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_trap.xml b/soh/assets/xml/N64_NTSC_12/objects/object_trap.xml new file mode 100644 index 0000000000..56195cf41b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_triforce_spot.xml b/soh/assets/xml/N64_NTSC_12/objects/object_triforce_spot.xml new file mode 100644 index 0000000000..87d4494589 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ts.xml new file mode 100644 index 0000000000..567277bc39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tsubo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tsubo.xml new file mode 100644 index 0000000000..ee2c5e1846 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tw.xml new file mode 100644 index 0000000000..c7fd2a60be --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_umajump.xml b/soh/assets/xml/N64_NTSC_12/objects/object_umajump.xml new file mode 100644 index 0000000000..2ee4ade46a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_vali.xml b/soh/assets/xml/N64_NTSC_12/objects/object_vali.xml new file mode 100644 index 0000000000..2bab5efaa6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_vase.xml b/soh/assets/xml/N64_NTSC_12/objects/object_vase.xml new file mode 100644 index 0000000000..091d4c51e3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_vm.xml b/soh/assets/xml/N64_NTSC_12/objects/object_vm.xml new file mode 100644 index 0000000000..c5b949b36e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_wallmaster.xml b/soh/assets/xml/N64_NTSC_12/objects/object_wallmaster.xml new file mode 100644 index 0000000000..fbbc4f4af3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_warp1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_warp1.xml new file mode 100644 index 0000000000..1497d7a108 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_warp2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_warp2.xml new file mode 100644 index 0000000000..b6d1b3624c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_wf.xml b/soh/assets/xml/N64_NTSC_12/objects/object_wf.xml new file mode 100644 index 0000000000..ebfb708d2d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_wood02.xml b/soh/assets/xml/N64_NTSC_12/objects/object_wood02.xml new file mode 100644 index 0000000000..47ec342caa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_xc.xml b/soh/assets/xml/N64_NTSC_12/objects/object_xc.xml new file mode 100644 index 0000000000..bb2bf3e7af --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_yabusame_point.xml b/soh/assets/xml/N64_NTSC_12/objects/object_yabusame_point.xml new file mode 100644 index 0000000000..bed9e8a609 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ydan_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ydan_objects.xml new file mode 100644 index 0000000000..e2adf307f7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_yukabyun.xml b/soh/assets/xml/N64_NTSC_12/objects/object_yukabyun.xml new file mode 100644 index 0000000000..d594ebbb89 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zf.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zf.xml new file mode 100644 index 0000000000..7f20eb7866 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zg.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zg.xml new file mode 100644 index 0000000000..79005516c4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zl1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zl1.xml new file mode 100644 index 0000000000..001e5be145 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zl2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zl2.xml new file mode 100644 index 0000000000..959a919ec6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime1.xml new file mode 100644 index 0000000000..cada504867 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime2.xml new file mode 100644 index 0000000000..47016e2e00 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zl4.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zl4.xml new file mode 100644 index 0000000000..8e7a2837ed --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zo.xml new file mode 100644 index 0000000000..77465760ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 0000000000..841be4f894 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 0000000000..811002bc81 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Light.xml new file mode 100644 index 0000000000..56243b5fcb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 0000000000..5e2d16753c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 0000000000..c23bf356cb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 0000000000..741842575d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 0000000000..70cf49d2d9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 0000000000..ad3e1bcc7e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Sst.xml new file mode 100644 index 0000000000..937e71fcc6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Demo_Shd.xml new file mode 100644 index 0000000000..b0444edb64 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Bili.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Bili.xml new file mode 100644 index 0000000000..109b5d5128 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 0000000000..eadc2c0d7b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 0000000000..65e8669015 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 0000000000..3bc27ac6f6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Holl.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Holl.xml new file mode 100644 index 0000000000..1cb407a30b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 0000000000..fc48deac35 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Kanban.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Kanban.xml new file mode 100644 index 0000000000..dd00b76647 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sda.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sda.xml new file mode 100644 index 0000000000..b651595887 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ssh.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ssh.xml new file mode 100644 index 0000000000..5105ef63e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_St.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_St.xml new file mode 100644 index 0000000000..3350277474 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sth.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sth.xml new file mode 100644 index 0000000000..81bbc8de46 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_End_Title.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_End_Title.xml new file mode 100644 index 0000000000..b2c9cf3f69 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_File_Choose.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_File_Choose.xml new file mode 100644 index 0000000000..dba3fe1bb0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_File_Choose.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Dark.xml new file mode 100644 index 0000000000..2522b97ac9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Fire.xml new file mode 100644 index 0000000000..8cb56a1585 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Wind.xml new file mode 100644 index 0000000000..e09b58a502 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 0000000000..b5b809a6a0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 0000000000..d2ff95ab3d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 0000000000..97e85cbb35 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 0000000000..9a94efde09 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 0000000000..c675cba2fe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 0000000000..bdd1b567df --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/Bmori1.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/Bmori1.xml new file mode 100644 index 0000000000..ad43114260 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 0000000000..89331ecc2f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan.xml new file mode 100644 index 0000000000..e557c80a55 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 0000000000..97401aff65 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 0000000000..d36ac6b774 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HIDAN.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HIDAN.xml new file mode 100644 index 0000000000..fa4d784f1a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin.xml new file mode 100644 index 0000000000..00c5aa82dd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 0000000000..99ae2b3efe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan.xml new file mode 100644 index 0000000000..a9e520f4cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan_boss.xml new file mode 100644 index 0000000000..9fccf2c301 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan.xml new file mode 100644 index 0000000000..1446a9c98b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan_boss.xml new file mode 100644 index 0000000000..05633e53e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon.xml new file mode 100644 index 0000000000..f857dbe94e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_boss.xml new file mode 100644 index 0000000000..36c5e81070 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_demo.xml new file mode 100644 index 0000000000..56c98efed7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_final.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_final.xml new file mode 100644 index 0000000000..3ec568cfb9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 0000000000..84ef36950c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_tou.xml new file mode 100644 index 0000000000..1ae37b9637 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontika.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontika.xml new file mode 100644 index 0000000000..a5ff210ce1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 0000000000..060d4941ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/gerudoway.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/gerudoway.xml new file mode 100644 index 0000000000..8272776143 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 0000000000..0f1bc3b285 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinboss.xml new file mode 100644 index 0000000000..86c0d317b2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinzou.xml new file mode 100644 index 0000000000..bc14a46ac3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/men.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/men.xml new file mode 100644 index 0000000000..d9e5960e82 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/moribossroom.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/moribossroom.xml new file mode 100644 index 0000000000..b9959eefab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan.xml new file mode 100644 index 0000000000..aed7d26604 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan_boss.xml new file mode 100644 index 0000000000..7ea240547a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/bowling.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/bowling.xml new file mode 100644 index 0000000000..9a41763a27 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 0000000000..4f9a03fc02 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa.xml new file mode 100644 index 0000000000..06d89f2fe7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 0000000000..6f4c181e0e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hakasitarelay.xml new file mode 100644 index 0000000000..91be63d147 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/hut.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hut.xml new file mode 100644 index 0000000000..a4ef5715ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/hylia_labo.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hylia_labo.xml new file mode 100644 index 0000000000..56822e67a7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/impa.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/impa.xml new file mode 100644 index 0000000000..db757e3d3c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kakariko.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kakariko.xml new file mode 100644 index 0000000000..e4e9b102c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kenjyanoma.xml new file mode 100644 index 0000000000..4e8a58f3b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home.xml new file mode 100644 index 0000000000..8c0305493a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home3.xml new file mode 100644 index 0000000000..9f36eb41c9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home4.xml new file mode 100644 index 0000000000..eb861aedb4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home5.xml new file mode 100644 index 0000000000..974987feda --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/labo.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/labo.xml new file mode 100644 index 0000000000..c0a9d2eb8c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/link_home.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/link_home.xml new file mode 100644 index 0000000000..2fb88ae347 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/mahouya.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/mahouya.xml new file mode 100644 index 0000000000..8ae462f9db --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/malon_stable.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/malon_stable.xml new file mode 100644 index 0000000000..aff97eeb86 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/miharigoya.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/miharigoya.xml new file mode 100644 index 0000000000..63f8676ac1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/nakaniwa.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/nakaniwa.xml new file mode 100644 index 0000000000..2fb2d5e6a4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/syatekijyou.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/syatekijyou.xml new file mode 100644 index 0000000000..05243b52ca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/takaraya.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/takaraya.xml new file mode 100644 index 0000000000..5b438980b7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/tent.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/tent.xml new file mode 100644 index 0000000000..de72cc5f45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/tokinoma.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/tokinoma.xml new file mode 100644 index 0000000000..d7878b8951 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 0000000000..3b6dd2dec2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 0000000000..90a8d95d09 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/enrui.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/enrui.xml new file mode 100644 index 0000000000..d8c06e5454 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/entra_n.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/entra_n.xml new file mode 100644 index 0000000000..5b408ac3a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana.xml new file mode 100644 index 0000000000..e7dc93dd0c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana2.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana2.xml new file mode 100644 index 0000000000..2d8ba4906a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana_ouke.xml new file mode 100644 index 0000000000..17f53613e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/hiral_demo.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/hiral_demo.xml new file mode 100644 index 0000000000..1331fdd4c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/kakariko3.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/kakariko3.xml new file mode 100644 index 0000000000..07b62c44df --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/kakusiana.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/kakusiana.xml new file mode 100644 index 0000000000..c3f993ff4f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/kinsuta.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/kinsuta.xml new file mode 100644 index 0000000000..aac0f6c4ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley.xml new file mode 100644 index 0000000000..c304673032 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley_n.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley_n.xml new file mode 100644 index 0000000000..65db604113 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/market_day.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_day.xml new file mode 100644 index 0000000000..00887e69cd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/market_night.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_night.xml new file mode 100644 index 0000000000..c58e38744e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/market_ruins.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_ruins.xml new file mode 100644 index 0000000000..f0ec75e759 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine.xml new file mode 100644 index 0000000000..b9ddf2cf70 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_n.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_n.xml new file mode 100644 index 0000000000..4878338aa1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_r.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_r.xml new file mode 100644 index 0000000000..1220367919 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/turibori.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/turibori.xml new file mode 100644 index 0000000000..0633224d9c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/entra.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/entra.xml new file mode 100644 index 0000000000..92ee57f59a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/souko.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/souko.xml new file mode 100644 index 0000000000..8dd9d9e48a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot00.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot00.xml new file mode 100644 index 0000000000..508d9309b3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot01.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot01.xml new file mode 100644 index 0000000000..eb725afa68 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot02.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot02.xml new file mode 100644 index 0000000000..c7924c29db --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot03.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot03.xml new file mode 100644 index 0000000000..9434185f44 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot04.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot04.xml new file mode 100644 index 0000000000..f338604207 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot05.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot05.xml new file mode 100644 index 0000000000..4f7c62b91e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot06.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot06.xml new file mode 100644 index 0000000000..f4af602cfd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot07.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot07.xml new file mode 100644 index 0000000000..eeb976f7f6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot08.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot08.xml new file mode 100644 index 0000000000..86582f0dca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot09.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot09.xml new file mode 100644 index 0000000000..5bb9e059c7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot10.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot10.xml new file mode 100644 index 0000000000..66365e3d86 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot11.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot11.xml new file mode 100644 index 0000000000..76ff3b8223 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot12.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot12.xml new file mode 100644 index 0000000000..e21523b217 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot13.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot13.xml new file mode 100644 index 0000000000..c689130650 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot15.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot15.xml new file mode 100644 index 0000000000..e75f7b6845 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot16.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot16.xml new file mode 100644 index 0000000000..f41b226f8e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot17.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot17.xml new file mode 100644 index 0000000000..feb267251e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot18.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot18.xml new file mode 100644 index 0000000000..d70fccf4bb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot20.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot20.xml new file mode 100644 index 0000000000..1381f6ecbe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/alley_shop.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/alley_shop.xml new file mode 100644 index 0000000000..95548de1bd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/drag.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/drag.xml new file mode 100644 index 0000000000..acb6515fba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/face_shop.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/face_shop.xml new file mode 100644 index 0000000000..16a9746081 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/golon.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/golon.xml new file mode 100644 index 0000000000..c586727988 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/kokiri_shop.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/kokiri_shop.xml new file mode 100644 index 0000000000..50cd633e57 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/night_shop.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/night_shop.xml new file mode 100644 index 0000000000..5954d9c83d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/shop1.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/shop1.xml new file mode 100644 index 0000000000..525a06d633 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/zoora.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/zoora.xml new file mode 100644 index 0000000000..0e4ac18f8c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/text/elf_message_field.xml b/soh/assets/xml/N64_NTSC_12/text/elf_message_field.xml new file mode 100644 index 0000000000..789a554ce8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/text/elf_message_ydan.xml b/soh/assets/xml/N64_NTSC_12/text/elf_message_ydan.xml new file mode 100644 index 0000000000..f784afcf45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/text/message_data_static.xml b/soh/assets/xml/N64_NTSC_12/text/message_data_static.xml new file mode 100644 index 0000000000..7315e03a4b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/backgrounds.xml b/soh/assets/xml/N64_NTSC_12/textures/backgrounds.xml new file mode 100644 index 0000000000..c60ff57a8a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/boss_title_cards.xml b/soh/assets/xml/N64_NTSC_12/textures/boss_title_cards.xml new file mode 100644 index 0000000000..84f555bd10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/textures/do_action_static.xml b/soh/assets/xml/N64_NTSC_12/textures/do_action_static.xml new file mode 100644 index 0000000000..efabd54a58 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_24_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_24_static.xml new file mode 100644 index 0000000000..cdb8cc7379 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_dungeon_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_dungeon_static.xml new file mode 100644 index 0000000000..873c490fc5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_field_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_field_static.xml new file mode 100644 index 0000000000..ed991406b5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_gameover_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_gameover_static.xml new file mode 100644 index 0000000000..ffd3928680 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_jpn_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_jpn_static.xml new file mode 100644 index 0000000000..f2fe854b8e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_nes_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_nes_static.xml new file mode 100644 index 0000000000..6cd92acfca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_static.xml new file mode 100644 index 0000000000..9e844615b1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/item_name_static.xml b/soh/assets/xml/N64_NTSC_12/textures/item_name_static.xml new file mode 100644 index 0000000000..1bc074c2ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/kanji.xml b/soh/assets/xml/N64_NTSC_12/textures/kanji.xml new file mode 100644 index 0000000000..5159387a13 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/textures/map_48x85_static.xml b/soh/assets/xml/N64_NTSC_12/textures/map_48x85_static.xml new file mode 100644 index 0000000000..b2ea46340a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/textures/map_grand_static.xml b/soh/assets/xml/N64_NTSC_12/textures/map_grand_static.xml new file mode 100644 index 0000000000..201955bfc3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/map_i_static.xml b/soh/assets/xml/N64_NTSC_12/textures/map_i_static.xml new file mode 100644 index 0000000000..1721f6d848 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/map_name_static.xml b/soh/assets/xml/N64_NTSC_12/textures/map_name_static.xml new file mode 100644 index 0000000000..ca4c4c0bd6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/message_static.xml b/soh/assets/xml/N64_NTSC_12/textures/message_static.xml new file mode 100644 index 0000000000..afdde60def --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/message_texture_static.xml b/soh/assets/xml/N64_NTSC_12/textures/message_texture_static.xml new file mode 100644 index 0000000000..bbf7e1259e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/nes_font_static.xml b/soh/assets/xml/N64_NTSC_12/textures/nes_font_static.xml new file mode 100644 index 0000000000..f1b80ee045 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/nes_font_static.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/nintendo_rogo_static.xml b/soh/assets/xml/N64_NTSC_12/textures/nintendo_rogo_static.xml new file mode 100644 index 0000000000..f09de3b0f9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/parameter_static.xml b/soh/assets/xml/N64_NTSC_12/textures/parameter_static.xml new file mode 100644 index 0000000000..c51dacf1f6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/place_title_cards.xml b/soh/assets/xml/N64_NTSC_12/textures/place_title_cards.xml new file mode 100644 index 0000000000..b688cce00c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/skyboxes.xml b/soh/assets/xml/N64_NTSC_12/textures/skyboxes.xml new file mode 100644 index 0000000000..104ffb2a3f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/title_static.xml b/soh/assets/xml/N64_NTSC_12/textures/title_static.xml new file mode 100644 index 0000000000..5f58c5a820 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_PAL_10/audio/Audio.xml b/soh/assets/xml/N64_PAL_10/audio/Audio.xml index b2e32ab26c..382a078a9e 100644 --- a/soh/assets/xml/N64_PAL_10/audio/Audio.xml +++ b/soh/assets/xml/N64_PAL_10/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/N64_PAL_10/code/sys_matrix.xml b/soh/assets/xml/N64_PAL_10/code/sys_matrix.xml index 7877d0bdf6..61886ffbe4 100644 --- a/soh/assets/xml/N64_PAL_10/code/sys_matrix.xml +++ b/soh/assets/xml/N64_PAL_10/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/assets/xml/N64_PAL_10/objects/gameplay_keep.xml b/soh/assets/xml/N64_PAL_10/objects/gameplay_keep.xml index 5ffc52f655..8824228847 100644 --- a/soh/assets/xml/N64_PAL_10/objects/gameplay_keep.xml +++ b/soh/assets/xml/N64_PAL_10/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/assets/xml/N64_PAL_11/audio/Audio.xml b/soh/assets/xml/N64_PAL_11/audio/Audio.xml index f830ef6481..ece8393c89 100644 --- a/soh/assets/xml/N64_PAL_11/audio/Audio.xml +++ b/soh/assets/xml/N64_PAL_11/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/N64_PAL_11/code/sys_matrix.xml b/soh/assets/xml/N64_PAL_11/code/sys_matrix.xml index cee1835e9b..3c50f90123 100644 --- a/soh/assets/xml/N64_PAL_11/code/sys_matrix.xml +++ b/soh/assets/xml/N64_PAL_11/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/assets/xml/N64_PAL_11/objects/gameplay_keep.xml b/soh/assets/xml/N64_PAL_11/objects/gameplay_keep.xml index 5ffc52f655..8824228847 100644 --- a/soh/assets/xml/N64_PAL_11/objects/gameplay_keep.xml +++ b/soh/assets/xml/N64_PAL_11/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/include/boost_custom/container_hash/detail/hash_mix_32.hpp b/soh/include/boost_custom/container_hash/detail/hash_mix_32.hpp deleted file mode 100644 index 95cfdcd778..0000000000 --- a/soh/include/boost_custom/container_hash/detail/hash_mix_32.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// 32 bit implementation based off of Boost hash - -#ifndef BOOST_HASH_DETAIL_HASH_MIX_32_HPP -#define BOOST_HASH_DETAIL_HASH_MIX_32_HPP - -#include -#include -#include - -namespace boost -{ -namespace hash_detail -{ - -template struct hash_mix_impl_32; - -// hash_mix for 32 bit -// -// We use the "best xmxmx" implementation from -// https://github.com/skeeto/hash-prospector/issues/19 - -template<> struct hash_mix_impl_32<32> -{ - inline static boost::uint32_t fn( boost::uint32_t x ) - { - boost::uint32_t const m1 = 0x21f0aaad; - boost::uint32_t const m2 = 0x735a2d97; - - x ^= x >> 16; - x *= m1; - x ^= x >> 15; - x *= m2; - x ^= x >> 15; - - return x; - } -}; - -inline uint32_t hash_mix_32( uint32_t v ) -{ - return hash_mix_impl_32<32>::fn( v ); -} - -} // namespace hash_detail -} // namespace boost - -#endif // #ifndef BOOST_HASH_DETAIL_HASH_MIX_32_HPP diff --git a/soh/include/boost_custom/container_hash/detail/hash_range_32.hpp b/soh/include/boost_custom/container_hash/detail/hash_range_32.hpp deleted file mode 100644 index cfa0a2a2d2..0000000000 --- a/soh/include/boost_custom/container_hash/detail/hash_range_32.hpp +++ /dev/null @@ -1,128 +0,0 @@ -// 32 bit implementation based off of Boost hash -// Only implementing 32 bit version of char based ranges - -#ifndef BOOST_HASH_DETAIL_HASH_RANGE_32_HPP -#define BOOST_HASH_DETAIL_HASH_RANGE_32_HPP - -#include -#include - -#if BOOST_VERSION_HAS_HASH_RANGE -#include -#else -#include -#include -#include -#include -#include -#include -#include -#endif // #if BOOST_VERSION_HAS_HASH_RANGE - -namespace boost -{ -namespace hash_detail -{ - -#if !BOOST_VERSION_HAS_HASH_RANGE - -template struct is_char_type: public boost::false_type {}; - -#if CHAR_BIT == 8 - -template<> struct is_char_type: public boost::true_type {}; -template<> struct is_char_type: public boost::true_type {}; -template<> struct is_char_type: public boost::true_type {}; - -#if defined(__cpp_char8_t) && __cpp_char8_t >= 201811L -template<> struct is_char_type: public boost::true_type {}; -#endif - -#if defined(__cpp_lib_byte) && __cpp_lib_byte >= 201603L -template<> struct is_char_type: public boost::true_type {}; -#endif - -#endif - -#endif // #if !BOOST_VERSION_HAS_HASH_RANGE - -#if BOOST_USE_STD_TYPES -#define BOOST_ENABLE_IF std::enable_if -#define BOOST_IS_SAME std::is_same -#else -#define BOOST_ENABLE_IF boost::enable_if_ -#define BOOST_IS_SAME is_same -#endif - -template -inline typename BOOST_ENABLE_IF< - is_char_type::value_type>::value && - BOOST_IS_SAME::iterator_category, std::random_access_iterator_tag>::value, -std::size_t>::type - hash_range_32( uint32_t seed, It first, It last ) -{ - std::size_t n = static_cast( last - first ); - - for( ; n >= 4; first += 4, n -= 4 ) - { - // clang 5+, gcc 5+ figure out this pattern and use a single mov on x86 - // gcc on s390x and power BE even knows how to use load-reverse - - boost::uint32_t w = - static_cast( static_cast( first[0] ) ) | - static_cast( static_cast( first[1] ) ) << 8 | - static_cast( static_cast( first[2] ) ) << 16 | - static_cast( static_cast( first[3] ) ) << 24; - - hash_combine_32( seed, w ); - } - - { - // add a trailing suffix byte of 0x01 because otherwise sequences of - // trailing zeroes are indistinguishable from end of string - - boost::uint32_t w = 0x01u; - - switch( n ) - { - case 1: - - w = - static_cast( static_cast( first[0] ) ) | - 0x0100u; - - break; - - case 2: - - w = - static_cast( static_cast( first[0] ) ) | - static_cast( static_cast( first[1] ) ) << 8 | - 0x010000u; - - break; - - case 3: - - w = - static_cast( static_cast( first[0] ) ) | - static_cast( static_cast( first[1] ) ) << 8 | - static_cast( static_cast( first[2] ) ) << 16 | - 0x01000000u; - - break; - } - - hash_combine_32( seed, w ); - } - - return seed; -} - -} // namespace hash_detail -} // namespace boost - -#undef BOOST_ENABLE_IF -#undef BOOST_IS_SAME - -#endif // #ifndef BOOST_HASH_DETAIL_HASH_RANGE_32_HPP diff --git a/soh/include/boost_custom/container_hash/hash_32.hpp b/soh/include/boost_custom/container_hash/hash_32.hpp deleted file mode 100644 index eaf459a343..0000000000 --- a/soh/include/boost_custom/container_hash/hash_32.hpp +++ /dev/null @@ -1,188 +0,0 @@ -// 32 bit implementation based off of Boost hash -// Only implementing 32 bit versions integral and string based hashes - -#ifndef BOOST_FUNCTIONAL_HASH_HASH_32_HPP -#define BOOST_FUNCTIONAL_HASH_HASH_32_HPP - -#include -#include -#include -#include -#include - -#if !BOOST_VERSION_HAS_HASH_RANGE -#include -#include - -#if BOOST_WORKAROUND(__GNUC__, < 3) \ - && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) -#define BOOST_HASH_CHAR_TRAITS string_char_traits -#else -#define BOOST_HASH_CHAR_TRAITS char_traits -#endif - -#endif // #if !BOOST_VERSION_HAS_HASH_RANGE - -#if BOOST_USE_STD_TYPES -#define BOOST_ENABLE_IF std::enable_if -#define BOOST_IS_INTEGRAL hash_detail::is_integral -#define BOOST_IS_UNSIGNED is_unsigned -#define BOOST_MAKE_UNSIGNED make_unsigned -#else -#define BOOST_ENABLE_IF boost::enable_if_ -#define BOOST_IS_INTEGRAL boost::is_integral -#define BOOST_IS_UNSIGNED boost::is_unsigned -#define BOOST_MAKE_UNSIGNED boost::make_unsigned -#endif - -namespace boost -{ - - // - // boost::hash_value - // - - // integral types - - namespace hash_detail - { - template sizeof(uint32_t)), - bool is_unsigned = BOOST_IS_UNSIGNED::value, - std::size_t size_t_bits = sizeof(uint32_t) * CHAR_BIT, - std::size_t type_bits = sizeof(T) * CHAR_BIT> - struct hash_integral_impl_32; - - template struct hash_integral_impl_32 - { - static uint32_t fn( T v ) - { - return static_cast( v ); - } - }; - - template struct hash_integral_impl_32 - { - static uint32_t fn( T v ) - { - typedef typename BOOST_MAKE_UNSIGNED::type U; - - if( v >= 0 ) - { - return hash_integral_impl_32::fn( static_cast( v ) ); - } - else - { - return ~hash_integral_impl_32::fn( static_cast( ~static_cast( v ) ) ); - } - } - }; - - template struct hash_integral_impl_32 - { - static uint32_t fn( T v ) - { - uint32_t seed = 0; - - seed = static_cast( v >> 32 ) + hash_detail::hash_mix_32( seed ); - seed = static_cast( v ) + hash_detail::hash_mix_32( seed ); - - return seed; - } - }; - - template struct hash_integral_impl_32 - { - static uint32_t fn( T v ) - { - uint32_t seed = 0; - - seed = static_cast( v >> 96 ) + hash_detail::hash_mix_32( seed ); - seed = static_cast( v >> 64 ) + hash_detail::hash_mix_32( seed ); - seed = static_cast( v >> 32 ) + hash_detail::hash_mix_32( seed ); - seed = static_cast( v ) + hash_detail::hash_mix_32( seed ); - - return seed; - } - }; - - } // namespace hash_detail - - template - typename BOOST_ENABLE_IF::value, uint32_t>::type - hash_value_32( T v ) - { - return hash_detail::hash_integral_impl_32::fn( v ); - } - - // contiguous ranges (string, vector, array) -#if BOOST_VERSION_HAS_HASH_RANGE - template - typename BOOST_ENABLE_IF::value, uint32_t>::type - hash_value_32( T const& v ) - { - return boost::hash_range_32( v.data(), v.data() + v.size() ); - } -#else - template - inline uint32_t hash_value_32( - std::basic_string, A> const& v) - { - return boost::hash_range_32( v.data(), v.data() + v.size() ); - } -#endif - - // - // boost::hash_combine - // - - template - inline void hash_combine_32( uint32_t& seed, T const& v ) - { - seed = boost::hash_detail::hash_mix_32( seed + 0x9e3779b9 + boost::hash_32()( v ) ); - } - - // - // boost::hash_range - // - - template - inline void hash_range_32( uint32_t& seed, It first, It last ) - { - seed = hash_detail::hash_range_32( seed, first, last ); - } - - template - inline uint32_t hash_range_32( It first, It last ) - { - uint32_t seed = 0; - - hash_range_32( seed, first, last ); - - return seed; - } - - // - // boost::hash - // - - template struct hash_32 - { - typedef T argument_type; - typedef uint32_t result_type; - - uint32_t operator()( T const& val ) const - { - return hash_value_32( val ); - } - }; - -} // namespace boost - -#undef BOOST_HASH_CHAR_TRAITS -#undef BOOST_ENABLE_IF -#undef BOOST_IS_INTEGRAL -#undef BOOST_IS_UNSIGNED -#undef BOOST_MAKE_UNSIGNED - -#endif // #ifndef BOOST_FUNCTIONAL_HASH_HASH_32_HPP diff --git a/soh/include/boost_custom/container_hash/hash_fwd_32.hpp b/soh/include/boost_custom/container_hash/hash_fwd_32.hpp deleted file mode 100644 index 2ad101f2bb..0000000000 --- a/soh/include/boost_custom/container_hash/hash_fwd_32.hpp +++ /dev/null @@ -1,25 +0,0 @@ -// 32 bit implementation based off of Boost hash - -#ifndef BOOST_FUNCTIONAL_HASH_FWD_32_HPP -#define BOOST_FUNCTIONAL_HASH_FWD_32_HPP - -#include - -namespace boost -{ - -namespace container_hash -{ - -} // namespace container_hash - -template struct hash_32; - -template void hash_combine_32( uint32_t& seed, T const& v ); - -template void hash_range_32( uint32_t&, It, It ); -template uint32_t hash_range_32( It, It ); - -} // namespace boost - -#endif // #ifndef BOOST_FUNCTIONAL_HASH_FWD_32_HPP diff --git a/soh/include/boost_custom/container_hash/version.hpp b/soh/include/boost_custom/container_hash/version.hpp deleted file mode 100644 index 3863b507c8..0000000000 --- a/soh/include/boost_custom/container_hash/version.hpp +++ /dev/null @@ -1,11 +0,0 @@ - -#ifndef BOOST_CONTAINER_HASH_VERSION_HPP -#define BOOST_CONTAINER_HASH_VERSION_HPP - -#include - -#define BOOST_VERSION_HAS_HASH_RANGE ((BOOST_VERSION / 100 % 1000) >= 81) - -#define BOOST_USE_STD_TYPES ((BOOST_VERSION / 100 % 1000) >= 84) - -#endif // #ifndef BOOST_CONTAINER_HASH_VERSION_HPP diff --git a/soh/include/functions.h b/soh/include/functions.h index 147500c660..8deb369534 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -12,10 +12,9 @@ extern "C" #include "luslog.h" #include -#include #if defined(INCLUDE_GAME_PRINTF) && defined(_DEBUG) -#define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__) +#define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, ##__VA_ARGS__) #else #define osSyncPrintf(fmt, ...) osSyncPrintfUnused(fmt, ##__VA_ARGS__) #endif @@ -901,9 +900,8 @@ s32 Jpeg_Decode(void* data, void* zbuffer, void* workBuff, u32 workSize); void KaleidoSetup_Update(PlayState* play); void KaleidoSetup_Init(PlayState* play); void KaleidoSetup_Destroy(PlayState* play); -void func_8006EE50(Font* font, u16 arg1, u16 arg2); +void Font_LoadCharWide(Font* font, u16 arg1, u16 arg2); void Font_LoadChar(Font* font, u8 character, u16 codePointIndex); -void* Font_FetchCharTexture(u8 character); void Font_LoadMessageBoxIcon(Font* font, u16 icon); void Font_LoadOrderedFont(Font* font); s32 func_8006F0A0(s32 arg0); @@ -1045,6 +1043,7 @@ VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec); VecSph* OLib_Vec3fToVecSphGeo(VecSph* arg0, Vec3f* arg1); VecSph* OLib_Vec3fDiffToVecSphGeo(VecSph* arg0, Vec3f* a, Vec3f* b); Vec3f* OLib_Vec3fDiffRad(Vec3f* dest, Vec3f* a, Vec3f* b); +void OnePointCutscene_SetCsCamPoints(Camera* camera, s16 actionParameters, s16 initTimer, CutsceneCameraPoint* atPoints, CutsceneCameraPoint* eyePoints); s16 OnePointCutscene_Init(PlayState* play, s16 csId, s16 timer, Actor* actor, s16 camIdx); s16 OnePointCutscene_EndCutscene(PlayState* play, s16 camIdx); s32 OnePointCutscene_Attention(PlayState* play, Actor* actor); @@ -1103,6 +1102,7 @@ void FrameAdvance_Init(FrameAdvanceContext* frameAdvCtx); s32 FrameAdvance_Update(FrameAdvanceContext* frameAdvCtx, Input* input); u8 PlayerGrounded(Player* player); void Player_SetBootData(PlayState* play, Player* player); +void Player_StartAnimMovement(PlayState* play, Player* player, s32 flags); s32 Player_InBlockingCsMode(PlayState* play, Player* player); s32 Player_TryCsAction(PlayState* play, Actor* actor, s32 csAction); s32 Player_InCsMode(PlayState* play); @@ -1377,7 +1377,7 @@ void func_800AA0B4(); void func_800AA0F0(void); u32 func_800AA148(); void func_800AA15C(); -void func_800AA16C(); +void Rumble_ClearRequests(); void func_800AA178(u32); View* View_New(GraphicsContext* gfxCtx); void View_Free(View* view); @@ -2418,7 +2418,6 @@ u8 Message_GetState(MessageContext* msgCtx); void Message_Draw(PlayState* play); void Message_Update(PlayState* play); void Message_SetTables(void); -f32 Message_GetCharacterWidth(unsigned char characterIndex); void GameOver_Init(PlayState* play); void GameOver_FadeInLights(PlayState* play); void GameOver_Update(PlayState* play); @@ -2447,9 +2446,13 @@ void Message_OpenText(PlayState* play, u16 textId); void Message_Decode(PlayState* play); void Message_DrawText(PlayState* play, Gfx** gfxP); +// #region SOH [NTSC Support] +s32 Kanji_OffsetFromShiftJIS(u32 arg0); +void Font_LoadOrderedFontNTSC(Font* font); +// #endregion + // #region SOH [General] -void Interface_CreateQuadVertexGroup(Vtx* vtxList, s32 xStart, s32 yStart, s32 width, s32 height, u8 flippedH); void Interface_RandoRestoreSwordless(void); s32 Ship_CalcShouldDrawAndUpdate(PlayState* play, Actor* actor, Vec3f* projectedPos, f32 projectedW, bool* shouldDraw, bool* shouldUpdate); diff --git a/soh/include/macros.h b/soh/include/macros.h index 302e3755de..325fb91b6a 100644 --- a/soh/include/macros.h +++ b/soh/include/macros.h @@ -8,6 +8,10 @@ // #define __attribute__(x) // #endif +// this was removed from the LUS rcp.h in https://github.com/Kenix3/libultraship/pull/833/ +// it is still used in graph.c and fault.c +#define HW_REG(reg, type) *(volatile type*)((reg) | 0xA0000000) + // SoH [Port] Always use the AVOID_UB version (we don't set AVOID_UB while building yet) /* #ifndef AVOID_UB diff --git a/soh/include/message_data_fmt.h b/soh/include/message_data_fmt.h index fffac116c8..5506268e9d 100644 --- a/soh/include/message_data_fmt.h +++ b/soh/include/message_data_fmt.h @@ -173,6 +173,40 @@ #define MESSAGE_FISH_INFO HEX(CTRL_FISH_INFO) #define MESSAGE_HIGHSCORE HEX(CTRL_HIGHSCORE) #define MESSAGE_TIME HEX(CTRL_TIME) + +#define MESSAGE_NEWLINE_JPN 0x000A +#define MESSAGE_END_JPN 0x8170 +#define MESSAGE_BOX_BREAK_JPN 0x81A5 +#define MESSAGE_COLOR_JPN 0x000B +#define MESSAGE_SHIFT_JPN 0x86C7 +#define MESSAGE_TEXTID_JPN 0x81CB +#define MESSAGE_QUICKTEXT_ENABLE_JPN 0x8189 +#define MESSAGE_QUICKTEXT_DISABLE_JPN 0x818A +#define MESSAGE_PERSISTENT_JPN 0x86C8 +#define MESSAGE_EVENT_JPN 0x819F +#define MESSAGE_BOX_BREAK_DELAYED_JPN 0x81A3 +#define MESSAGE_AWAIT_BUTTON_PRESS_JPN 0x81A4 +#define MESSAGE_FADE_JPN 0x819E +#define MESSAGE_NAME_JPN 0x874F +#define MESSAGE_OCARINA_JPN 0x81F0 +#define MESSAGE_FADE2_JPN 0x81F4 +#define MESSAGE_SFX_JPN 0x81F3 +#define MESSAGE_ITEM_ICON_JPN 0x819A +#define MESSAGE_TEXT_SPEED_JPN 0x86C9 +#define MESSAGE_BACKGROUND_JPN 0x86B3 +#define MESSAGE_MARATHON_TIME_JPN 0x8791 +#define MESSAGE_RACE_TIME_JPN 0x8792 +#define MESSAGE_POINTS_JPN 0x879B +#define MESSAGE_TOKENS_JPN 0x86A3 +#define MESSAGE_UNSKIPPABLE_JPN 0x8199 +#define MESSAGE_TWO_CHOICE_JPN 0x81BC +#define MESSAGE_THREE_CHOICE_JPN 0x81B8 +#define MESSAGE_FISH_INFO_JPN 0x86A4 +#define MESSAGE_HIGHSCORE_JPN 0x869F +#define MESSAGE_TIME_JPN 0x81A1 + +#define MESSAGE_SPACE_JPN 0x8140 + #endif #endif diff --git a/soh/include/variables.h b/soh/include/variables.h index e3408eef60..27ad4584d2 100644 --- a/soh/include/variables.h +++ b/soh/include/variables.h @@ -45,12 +45,12 @@ extern "C" extern OSViContext* __osViNext; extern OSViMode osViModeFpalLan1; extern u32 __additional_scanline; - extern u8 gBuildVersion[]; + extern const char gBuildVersion[]; extern u16 gBuildVersionMajor; extern u16 gBuildVersionMinor; extern u16 gBuildVersionPatch; - extern u8 gGitBranch[]; - extern u8 gGitCommitHash[]; + extern const char gGitBranch[]; + extern const char gGitCommitHash[]; extern u8 gGitCommitTag[]; extern u8 gBuildTeam[]; extern u8 gBuildDate[]; diff --git a/soh/include/z64.h b/soh/include/z64.h index 882d3dd9a2..79ecdabcd4 100644 --- a/soh/include/z64.h +++ b/soh/include/z64.h @@ -540,9 +540,12 @@ typedef enum { LANGUAGE_ENG, LANGUAGE_GER, LANGUAGE_FRA, + LANGUAGE_JPN, LANGUAGE_MAX } Language; +#define TODO_TRANSLATE "TranslateThis" + // TODO get these properties from the textures themselves #define FONT_CHAR_TEX_WIDTH 16 #define FONT_CHAR_TEX_HEIGHT 16 @@ -662,7 +665,10 @@ typedef struct { /* 0xE300 */ s32 msgLength; // original name : "msg_data" /* 0xE304 */ u8 msgMode; // original name: "msg_mode" /* 0xE305 */ char unk_E305[0x1]; - /* 0xE306 */ u8 msgBufDecoded[200]; // decoded message buffer, may be smaller than this + /* 0xE306 */ union { + u8 msgBufDecoded[200]; + u16 msgBufDecodedWide[100]; + }; // decoded message buffer, may be smaller than this /* 0xE3CE */ u16 msgBufPos; // original name : "rdp" /* 0xE3D0 */ u16 unk_E3D0; // unused, only ever set to 0 /* 0xE3D2 */ u16 textDrawPos; // draw all decoded characters up to this buffer position @@ -1327,12 +1333,15 @@ typedef struct { } SceneSelectLoadingMessages; typedef struct { + /* */ char* japaneseAge; /* */ char* englishAge; /* */ char* germanAge; /* */ char* frenchAge; } BetterSceneSelectAgeLabels; + typedef struct { + /* */ char* japaneseName; /* */ char* englishName; /* */ char* germanName; /* */ char* frenchName; @@ -1341,6 +1350,7 @@ typedef struct { } BetterSceneSelectEntrancePair; typedef struct { + /* */ char* japaneseName; /* */ char* englishName; /* */ char* germanName; /* */ char* frenchName; diff --git a/soh/include/z64actor.h b/soh/include/z64actor.h index 6d8fd3ca07..77172bda4a 100644 --- a/soh/include/z64actor.h +++ b/soh/include/z64actor.h @@ -266,9 +266,6 @@ typedef struct Actor { /* 0x134 */ ActorFunc draw; // Draw Routine. Called by `Actor_Draw` /* 0x138 */ ActorResetFunc reset; /* 0x13C */ char dbgPad[0x10]; // Padding that only exists in the debug rom - // #region SOH [General] - /* */ u8 maximumHealth; // Max health value for use with health bars, set on actor init - // #endregion } Actor; // size = 0x14C typedef enum { diff --git a/soh/include/z64animation.h b/soh/include/z64animation.h index b61627a27f..3edba982d0 100755 --- a/soh/include/z64animation.h +++ b/soh/include/z64animation.h @@ -245,27 +245,30 @@ typedef void (*PostCurveLimbDraw)(struct PlayState* play, SkelAnimeCurve* skelCu typedef s32 (*AnimUpdateFunc)(); typedef struct SkelAnime { - /* 0x00 */ u8 limbCount; // Number of limbs in the skeleton - /* 0x01 */ u8 mode; // See `AnimationMode` - /* 0x02 */ u8 dListCount; // Number of display lists in a flexible skeleton - /* 0x03 */ s8 taper; // Tapering to use when morphing between animations. Only used by Door_Warp1. - /* 0x04 */ void** skeleton; // An array of pointers to limbs. Can be StandardLimb, LodLimb, or SkinLimb. - /* 0x08 */ void* animation; // Can be an AnimationHeader or LinkAnimationHeader. - /* 0x0C */ f32 startFrame; // In mode ANIMMODE_LOOP_PARTIAL*, start of partial loop. - /* 0x10 */ f32 endFrame; // In mode ANIMMODE_ONCE*, Update returns true when curFrame is equal to this. In mode ANIMMODE_LOOP_PARTIAL*, end of partial loop. - /* 0x14 */ f32 animLength; // Total number of frames in the current animation. - /* 0x18 */ f32 curFrame; // Current frame in the animation - /* 0x1C */ f32 playSpeed; // Multiplied by R_UPDATE_RATE / 3 to get the animation's frame rate. + /* 0x00 */ u8 limbCount; // Number of limbs in the skeleton + /* 0x01 */ u8 mode; // See `AnimationMode` + /* 0x02 */ u8 dListCount; // Number of display lists in a flexible skeleton + /* 0x03 */ s8 taper; // Tapering to use when morphing between animations. Only used by Door_Warp1. + /* 0x04 */ void** skeleton; // An array of pointers to limbs. Can be StandardLimb, LodLimb, or SkinLimb. + /* 0x08 */ void* animation; // Can be an AnimationHeader or LinkAnimationHeader. + /* 0x0C */ f32 startFrame; // In mode ANIMMODE_LOOP_PARTIAL*, start of partial loop. + /* 0x10 */ f32 endFrame; // In mode ANIMMODE_ONCE*, Update returns true when curFrame is equal to this. In mode ANIMMODE_LOOP_PARTIAL*, end of partial loop. + /* 0x14 */ f32 animLength; // Total number of frames in the current animation. + /* 0x18 */ f32 curFrame; // Current frame in the animation + /* 0x1C */ f32 playSpeed; // Multiplied by R_UPDATE_RATE / 3 to get the animation's frame rate. /* 0x20 */ Vec3s* jointTable; // Current translation of model and rotations of all limbs /* 0x24 */ Vec3s* morphTable; // Table of values used to morph between animations - /* 0x28 */ f32 morphWeight; // Weight of the current animation morph as a fraction in [0,1] - /* 0x2C */ f32 morphRate; // Reciprocal of the number of frames in the morph - /* 0x30 */ s32 (*update)(); // Can be Loop, Partial loop, Play once, Morph, or Tapered morph. Link only has Loop, Play once, and Morph. - /* 0x34 */ s8 initFlags; // Flags used when initializing Link's skeleton - /* 0x35 */ u8 moveFlags; // Flags used for animations that move the actor in worldspace. - /* 0x36 */ s16 prevRot; // Previous rotation in worldspace. - /* 0x38 */ Vec3s prevTransl; // Previous modelspace translation. - /* 0x3E */ Vec3s baseTransl; // Base modelspace translation. + /* 0x28 */ f32 morphWeight; // Weight of the current animation morph as a fraction in [0,1] + /* 0x2C */ f32 morphRate; // Reciprocal of the number of frames in the morph + /* 0x30 */ union { + s32 (*normal)(struct SkelAnime*); // Can be Loop, Partial loop, Play once, Morph, or Tapered morph + s32 (*link)(struct PlayState*, struct SkelAnime*); // Can be Loop, Play once, or Morph + } update; + /* 0x34 */ s8 initFlags; // Flags used when initializing Link's skeleton + /* 0x35 */ u8 movementFlags; // Flags used for animations that move the actor in worldspace. + /* 0x36 */ s16 prevRot; // Previous rotation in worldspace. + /* 0x38 */ Vec3s prevTransl; // Previous modelspace translation. + /* 0x3E */ Vec3s baseTransl; // Base modelspace translation. SkeletonHeader* skeletonHeader; } SkelAnime; // size = 0x44 diff --git a/soh/include/z64audio.h b/soh/include/z64audio.h index 81775feba3..c562b820fc 100644 --- a/soh/include/z64audio.h +++ b/soh/include/z64audio.h @@ -1,6 +1,10 @@ #ifndef Z64_AUDIO_H #define Z64_AUDIO_H +#ifdef __cplusplus +extern "C" { +#endif + #include #define MK_CMD(b0,b1,b2,b3) ((((b0) & 0xFF) << 0x18) | (((b1) & 0xFF) << 0x10) | (((b2) & 0xFF) << 0x8) | (((b3) & 0xFF) << 0)) @@ -24,8 +28,8 @@ //#define MAX_SEQUENCES 0x800 extern size_t sequenceMapSize; - -extern char* fontMap[256]; +extern size_t fontMapSize; +extern char** fontMap; #define MAX_AUTHENTIC_SEQID 110 @@ -54,7 +58,8 @@ typedef enum { /* 2 */ CODEC_S16_INMEMORY, /* 3 */ CODEC_SMALL_ADPCM, /* 4 */ CODEC_REVERB, - /* 5 */ CODEC_S16 + /* 5 */ CODEC_S16, + /* 6 */ CODEC_OPUS, } SampleCodec; typedef enum { @@ -117,13 +122,14 @@ typedef struct { /* 0x2 */ s16 arg; } AdsrEnvelope; // size = 0x4 -typedef struct { - /* 0x00 */ uintptr_t start; - /* 0x04 */ uintptr_t end; - /* 0x08 */ u32 count; - /* 0x0C */ char unk_0C[0x4]; - /* 0x10 */ s16 state[16]; // only exists if count != 0. 8-byte aligned -} AdpcmLoop; // size = 0x30 (or 0x10) +typedef struct AdpcmLoop { + /* 0x00 */ u32 start; + /* 0x04 */ u32 loopEnd; // numSamples position into the sample where the loop ends + /* 0x08 */ u32 count; // The number of times the loop is played before the sound completes. Setting count to -1 + // indicates that the loop should play indefinitely. + /* 0x0C */ u32 sampleEnd; // total number of s16-samples in the sample audio clip + /* 0x10 */ s16 predictorState[16]; // only exists if count != 0. 8-byte aligned +} AdpcmLoop; // size = 0x30 (or 0x10) typedef struct { /* 0x00 */ s32 order; @@ -131,24 +137,23 @@ typedef struct { /* 0x08 */ s16* book; // size 8 * order * npredictors. 8-byte aligned } AdpcmBook; // size >= 0x8 -typedef struct -{ +typedef struct SoundFontSample { union { struct { - /* 0x00 */ u32 codec : 4; - /* 0x00 */ u32 medium : 2; - /* 0x00 */ u32 unk_bit26 : 1; - /* 0x00 */ u32 unk_bit25 : 1; // this has been named isRelocated in zret - /* 0x01 */ u32 size : 24; + ///* 0x0 */ u32 unk_0 : 1; + /* 0x0 */ u32 codec : 4; // The state of compression or decompression, See `SampleCodec` + /* 0x0 */ u32 medium : 2; // Medium where sample is currently stored. See `SampleMedium` + /* 0x0 */ u32 unk_bit26 : 1; + /* 0x0 */ u32 isRelocated : 1; // Has the sample header been relocated (offsets to pointers) + }; u32 asU32; }; - - /* 0x04 */ u8* sampleAddr; - /* 0x08 */ AdpcmLoop* loop; - /* 0x0C */ AdpcmBook* book; - u32 sampleRateMagicValue; // For wav samples only... - s32 sampleRate; // For wav samples only... + /* 0x1 */ u32 size; // Size of the sample + u32 fileSize; + /* 0x4 */ u8* sampleAddr; // Raw sample data. Offset from the start of the sample bank or absolute address to either rom or ram + /* 0x8 */ AdpcmLoop* loop; // Adpcm loop parameters used by the sample. Offset from the start of the sound font / pointer to ram + /* 0xC */ AdpcmBook* book; // Adpcm book parameters used by the sample. Offset from the start of the sound font / pointer to ram } SoundFontSample; // size = 0x10 typedef struct { @@ -465,6 +470,8 @@ typedef struct { /* 0x00F0 */ s16 dummyResampleState[0x10]; } NoteSynthesisBuffers; // size = 0x110 +struct OggOpusFile; + typedef struct { /* 0x00 */ u8 restart; /* 0x01 */ u8 sampleDmaIndex; @@ -483,6 +490,7 @@ typedef struct { /* 0x1A */ u8 unk_1A; /* 0x1C */ u16 unk_1C; /* 0x1E */ u16 unk_1E; + struct OggOpusFile* opusFile; // Only for streamed opus audio } NoteSynthesisState; // size = 0x20 typedef struct { @@ -917,7 +925,7 @@ typedef struct { /* 0x3420 */ AudioPoolSplit3 persistentCommonPoolSplit; /* 0x342C */ AudioPoolSplit3 temporaryCommonPoolSplit; /* 0x3438 */ u8 sampleFontLoadStatus[0x30]; - /* 0x3468 */ u8 fontLoadStatus[0x30]; + /* 0x3468 */ u8* fontLoadStatus; /* 0x3498 */ u8* seqLoadStatus; /* 0x3518 */ volatile u8 resetStatus; /* 0x3519 */ u8 audioResetSpecIdToLoad; @@ -1119,10 +1127,6 @@ typedef struct { uint8_t fonts[16]; } SequenceData; -#ifdef __cplusplus -extern "C" { -#endif - void Audio_SetGameVolume(int player_id, f32 volume); float Audio_GetGameVolume(int player_id); diff --git a/soh/include/z64save.h b/soh/include/z64save.h index f7873031f3..63a9b1d10d 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -5,7 +5,6 @@ #include "z64math.h" #include "z64audio.h" #include "soh/Enhancements/randomizer/randomizerTypes.h" -#include "soh/Enhancements/randomizer/randomizer_inf.h" #include "soh/Enhancements/gameplaystats.h" #include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "soh/Enhancements/boss-rush/BossRushTypes.h" @@ -186,6 +185,7 @@ typedef struct ShipSaveContextData { FaroresWindData backupFW; ShipQuestSaveContextData quest; u8 maskMemory; + u8 filenameLanguage; //TODO: Move non-rando specific flags to a new sohInf and move the remaining randomizerInf to ShipRandomizerSaveContextData u16 randomizerInf[(RAND_INF_MAX + 15) / 16]; } ShipSaveContextData; @@ -202,7 +202,7 @@ typedef struct { /* 0x0018 */ s32 bgsDayCount; // increments with totalDays, can be cleared with `Environment_ClearBgsDayCount` /* 0x001C */ char newf[6]; // string "ZELDAZ". start of `info` substruct, originally called "information" /* 0x0022 */ u16 deaths; - /* 0x0024 */ char playerName[8]; + /* 0x0024 */ u8 playerName[8]; /* 0x002C */ s16 n64ddFlag; /* 0x002E */ s16 healthCapacity; // "max_life" /* 0x0030 */ s16 health; // "now_life" @@ -260,17 +260,17 @@ typedef struct { /* 0x13C8 */ s16 nayrusLoveTimer; /* 0x13CA */ char unk_13CA[0x0002]; /* 0x13CC */ s16 rupeeAccumulator; - /* 0x13CE */ s16 timer1State; - /* 0x13D0 */ s16 timer1Value; - /* 0x13D2 */ s16 timer2State; - /* 0x13D4 */ s16 timer2Value; + /* 0x13CE */ s16 timerState; + /* 0x13D0 */ s16 timerSeconds; + /* 0x13D2 */ s16 subTimerState; + /* 0x13D4 */ s16 subTimerSeconds; /* 0x13D6 */ s16 timerX[2]; /* 0x13DA */ s16 timerY[2]; /* 0x13DE */ char unk_13DE[0x0002]; /* 0x13E0 */ u8 seqId; /* 0x13E1 */ u8 natureAmbienceId; /* 0x13E2 */ u8 buttonStatus[9]; // SOH [Enhancements] Changed from 5 to 9 to support Dpad equips - /* 0x13E7 */ u8 unk_13E7; // alpha related + /* 0x13E7 */ u8 forceRisingButtonAlphas; // alpha related /* 0x13E8 */ u16 unk_13E8; // alpha type? /* 0x13EA */ u16 unk_13EA; // also alpha type? /* 0x13EC */ u16 unk_13EC; // alpha type counter? diff --git a/soh/platform/pathconf.c b/soh/platform/pathconf.c index 9e4111db3e..a52d313a5e 100644 --- a/soh/platform/pathconf.c +++ b/soh/platform/pathconf.c @@ -1,5 +1,5 @@ #include -long pathconf(const char *path, int name) { +long pathconf(const char* path, int name) { return -1; } \ No newline at end of file diff --git a/soh/resource.h b/soh/resource.h index 8a193b3e8a..771a9af38b 100644 --- a/soh/resource.h +++ b/soh/resource.h @@ -2,15 +2,15 @@ // Microsoft Visual C++ generated include file. // Used by Resource.rc // -#define IDI_ICON1 111 +#define IDI_ICON1 111 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 113 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 +#define _APS_NEXT_RESOURCE_VALUE 113 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/soh/soh/AboutWindow.cpp b/soh/soh/AboutWindow.cpp deleted file mode 100644 index e5d51300cb..0000000000 --- a/soh/soh/AboutWindow.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include "AboutWindow.h" -#include -#include -#include "soh/ResourceManagerHelpers.h" - -extern "C" { -#include "variables.h" -} - -AboutWindow::~AboutWindow() { - SPDLOG_TRACE("destruct about window"); -} - -void AboutWindow::InitElement() { - mIsTaggedVersion = gGitCommitTag[0] != 0; - - strncpy(mGitCommitHashTruncated, (char*)gGitCommitHash, 7); - mGitCommitHashTruncated[7] = 0; -} - -void AboutWindow::Draw() { - if (!IsVisible()) { - return; - } - - ImGuiWindowFlags windowFlags = ImGuiWindowFlags_AlwaysAutoResize | - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_NoDocking | - ImGuiWindowFlags_NoScrollWithMouse | - ImGuiWindowFlags_NoScrollbar; - - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(16 * ImGui::GetIO().FontGlobalScale, 8 * ImGui::GetIO().FontGlobalScale)); - - if (!ImGui::Begin(GetName().c_str(), &mIsVisible, windowFlags)) { - ImGui::End(); - } else { - DrawElement(); - ImGui::End(); - } - - ImGui::PopStyleVar(); - - // Sync up the IsVisible flag if it was changed by ImGui - SyncVisibilityConsoleVariable(); -} - -const char* AboutWindow::GetGameVersionString(uint32_t index) { - uint32_t gameVersion = ResourceMgr_GetGameVersion(index); - switch (gameVersion) { - case OOT_NTSC_US_10: - return "NTSC-U 1.0"; - case OOT_NTSC_US_11: - return "NTSC-U 1.1"; - case OOT_NTSC_US_12: - return "NTSC-U 1.2"; - case OOT_PAL_10: - return "PAL 1.0"; - case OOT_PAL_11: - return "PAL 1.1"; - case OOT_PAL_GC: - return "PAL GC"; - case OOT_PAL_MQ: - return "PAL MQ"; - case OOT_PAL_GC_DBG1: - case OOT_PAL_GC_DBG2: - return "PAL GC-D"; - case OOT_PAL_GC_MQ_DBG: - return "PAL MQ-D"; - case OOT_IQUE_CN: - return "IQUE CN"; - case OOT_IQUE_TW: - return "IQUE TW"; - default: - return "UNKNOWN"; - } -} - -void AboutWindow::DrawElement() { - // The icon is already padded - adjust for that - ImVec2 cursorPos = ImGui::GetCursorScreenPos(); - cursorPos.x -= 16 * ImGui::GetIO().FontGlobalScale; - ImGui::SetCursorScreenPos(cursorPos); - - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Game_Icon"), ImVec2(64.0f * ImGui::GetIO().FontGlobalScale, 64.0f * ImGui::GetIO().FontGlobalScale)); - - ImGui::SameLine(); - - ImGui::BeginGroup(); - ImGui::Text("Ship of Harkinian"); - if (mIsTaggedVersion) { - ImGui::Text("%s", gBuildVersion); - } else { - ImGui::Text("%s", gGitBranch); - ImGui::Text("%s", mGitCommitHashTruncated); - } - ImGui::EndGroup(); - - ImGui::Dummy(ImVec2(0, 2 * ImGui::GetIO().FontGlobalScale)); - ImGui::Text("Game Archives:"); - for (uint32_t i = 0; i < ResourceMgr_GetNumGameVersions(); i++) { - ImGui::BulletText(GetGameVersionString(i)); - } -} diff --git a/soh/soh/AboutWindow.h b/soh/soh/AboutWindow.h deleted file mode 100644 index 5a731fdc17..0000000000 --- a/soh/soh/AboutWindow.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include - -class AboutWindow : public Ship::GuiWindow { - public: - using GuiWindow::GuiWindow; - ~AboutWindow(); - - private: - void InitElement() override; - void Draw() override; - void DrawElement() override; - void UpdateElement() override {}; - - const char* GetGameVersionString(uint32_t index); - - bool mIsTaggedVersion; - char mGitCommitHashTruncated[8]; -}; diff --git a/soh/soh/ActorDB.cpp b/soh/soh/ActorDB.cpp index 880b2dab97..70ea29675e 100644 --- a/soh/soh/ActorDB.cpp +++ b/soh/soh/ActorDB.cpp @@ -4,7 +4,6 @@ ActorDB* ActorDB::Instance; - #define DEFINE_ACTOR(name, _1, _2) extern "C" ActorInit name##_InitVars; #define DEFINE_ACTOR_INTERNAL(name, _1, _2) extern "C" ActorInit name##_InitVars; #define DEFINE_ACTOR_UNSET(_0) @@ -462,9 +461,10 @@ static constexpr std::pair actorDescriptionData[] = { { ACTOR_EN_ZL4, "Zelda (Child)" }, { ACTOR_EN_MM2, "Running Man (Adult Era)" }, { ACTOR_BG_JYA_BLOCK, "Silver Block (Child Era)" }, - { ACTOR_OBJ_WARP2BLOCK, "Navi Infospot (Green, Time Block)" } + { ACTOR_OBJ_WARP2BLOCK, "Navi Infospot (Green, Time Block)" }, }; -static std::unordered_map actorDescriptions = std::unordered_map(std::begin(actorDescriptionData), std::end(actorDescriptionData)); +static std::unordered_map actorDescriptions = + std::unordered_map(std::begin(actorDescriptionData), std::end(actorDescriptionData)); ActorDB::ActorDB() { db.reserve(ACTOR_NUMBER_MAX); // reserve size for all initial entries so we don't do it for each @@ -475,7 +475,8 @@ ActorDB::ActorDB() { // Adds an actor at the given index. The name must be unique. ActorDB::Entry& ActorDB::AddEntry(const std::string& name, const std::string& desc, size_t index) { - assert(!nameTable.contains(name)); // TODO this should maybe throw instead. We'll need to think about error handling for mods that try to declare the same actor. + assert(!nameTable.contains(name)); // TODO this should maybe throw instead. We'll need to think about error handling + // for mods that try to declare the same actor. if (db.size() < (index + 1)) { db.resize(index + 1); @@ -513,7 +514,8 @@ ActorDB::Entry& ActorDB::AddEntry(const std::string& name, const std::string& de return entry; } -// Adds an actor with the new ActorDBInit struct. The id assigned to the actor is dynamic. Use the return Entry or RetrieveId to get it. +// Adds an actor with the new ActorDBInit struct. The id assigned to the actor is dynamic. Use the return Entry or +// RetrieveId to get it. ActorDB::Entry& ActorDB::AddEntry(const ActorDBInit& init) { Entry& entry = AddEntry(init.name, init.desc, nextFreeId); @@ -598,7 +600,8 @@ static ActorDBInit EnPartnerInit = { "En_Partner", "Ivan", ACTORCAT_ITEMACTION, - (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER | ACTOR_FLAG_CAN_PRESS_SWITCHES), + (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER | + ACTOR_FLAG_CAN_PRESS_SWITCHES), OBJECT_GAMEPLAY_KEEP, sizeof(EnPartner), (ActorFunc)EnPartner_Init, diff --git a/soh/soh/ActorDB.h b/soh/soh/ActorDB.h index 8bcbb3f6a7..dd8ecf9015 100644 --- a/soh/soh/ActorDB.h +++ b/soh/soh/ActorDB.h @@ -39,7 +39,7 @@ struct ActorDBInit { }; class ActorDB { -public: + public: static ActorDB* Instance; ActorDB(); @@ -65,7 +65,8 @@ public: static void AddBuiltInCustomActors(); int GetEntryCount(); -private: + + private: Entry& AddEntry(const std::string& name, const std::string& desc, size_t index); Entry& AddEntry(const std::string& name, const std::string& desc, const ActorInit& init); diff --git a/soh/soh/CrashHandlerExp.h b/soh/soh/CrashHandlerExp.h index fd57bba42f..8cda6e61e8 100644 --- a/soh/soh/CrashHandlerExp.h +++ b/soh/soh/CrashHandlerExp.h @@ -1,11 +1,10 @@ #include - #ifdef __cplusplus extern "C" { #endif -void CrashHandler_PrintSohData(char* buffer, size_t* pos); +void CrashHandler_PrintSohData(char* buffer, size_t* pos); #ifdef __cplusplus } diff --git a/soh/soh/CrashHandlerExt.cpp b/soh/soh/CrashHandlerExt.cpp index c4a535f121..cc9c7b1ee4 100644 --- a/soh/soh/CrashHandlerExt.cpp +++ b/soh/soh/CrashHandlerExt.cpp @@ -22,7 +22,7 @@ static std::array sCatToStrArray{ #define DEFINE_SCENE(_1, _2, enumName, _4, _5, _6) #enumName static std::array sSceneIdToStrArray{ - #include "tables/scene_table.h" +#include "tables/scene_table.h" }; #undef DEFINE_SCENE @@ -46,7 +46,7 @@ static void CrashHandler_WriteActorData(char* buffer, size_t* pos) { ActorListEntry* entry = &gPlayState->actorCtx.actorLists[i]; Actor* cur; - if(entry->length == 0) { + if (entry->length == 0) { continue; } WRITE_VAR_LINE(buffer, pos, "Actor Cat: ", sCatToStrArray[i]); @@ -76,7 +76,7 @@ extern "C" void CrashHandler_PrintSohData(char* buffer, size_t* pos) { if (gPlayState != nullptr) { append_line(buffer, pos, "Actors:"); CrashHandler_WriteActorData(buffer, pos); - + WRITE_VAR_LINE(buffer, pos, "Scene: ", sSceneIdToStrArray[gPlayState->sceneNum]); snprintf(intCharBuffer, sizeof(intCharBuffer), "%i", gPlayState->roomCtx.curRoom.num); diff --git a/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp b/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp index 3a52312c9a..1ca5a7c19f 100644 --- a/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp +++ b/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp @@ -16,10 +16,9 @@ static u16 sItemButtons[] = { BTN_B, BTN_CLEFT, BTN_CDOWN, BTN_CRIGHT, BTN_DUP, void UseTunicBoots(Player* player, PlayState* play, Input* input) { // Boots and tunics equip despite state - if ( - player->stateFlags1 & (PLAYER_STATE1_INPUT_DISABLED | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE | PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD) || - player->stateFlags2 & PLAYER_STATE2_OCARINA_PLAYING - ) { + if (player->stateFlags1 & (PLAYER_STATE1_INPUT_DISABLED | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE | + PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD) || + player->stateFlags2 & PLAYER_STATE2_OCARINA_PLAYING) { return; } @@ -40,7 +39,8 @@ void UseTunicBoots(Player* player, PlayState* play, Input* input) { Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, bootsValue); } Player_SetEquipmentData(play, player); - func_808328EC(player, CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == EQUIP_VALUE_BOOTS_IRON ? NA_SE_PL_WALK_HEAVYBOOTS : NA_SE_PL_CHANGE_ARMS); + func_808328EC(player, CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == EQUIP_VALUE_BOOTS_IRON ? NA_SE_PL_WALK_HEAVYBOOTS + : NA_SE_PL_CHANGE_ARMS); } else { u16 tunicValue = item - ITEM_TUNIC_KOKIRI + 1; if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == tunicValue) { @@ -87,6 +87,28 @@ void RegisterAssignableTunicsBoots() { } }); + // don't throw items when the pressed button is a tunic or boots + COND_VB_SHOULD(VB_THROW_OR_PUT_DOWN_HELD_ITEM, CVAR_TUNICBOOTS_VALUE != CVAR_TUNICBOOTS_DEFAULT, { + // if the vanilla condition doesn't want us to throw/put down the item, early return + if (!*should) { + return; + } + + Input* input = va_arg(args, Input*); + + s32 item = ITEM_NONE; + for (s32 i = 0; i < ARRAY_COUNT(sItemButtons); i++) { + if (CHECK_BTN_ALL(input->press.button, sItemButtons[i])) { + item = Player_GetItemOnButton(gPlayState, i); + break; + } + } + + if (item >= ITEM_TUNIC_KOKIRI && item <= ITEM_BOOTS_HOVER) { + *should = false; + } + }); + // do something when the player presses a button to use the tunics/boots COND_VB_SHOULD(VB_EXECUTE_PLAYER_ACTION_FUNC, CVAR_TUNICBOOTS_VALUE != CVAR_TUNICBOOTS_DEFAULT, { // if the vanilla condition doesn't want us to run the actionFunc, don't do any of this diff --git a/soh/soh/Enhancements/BootToDebugWarpScreen.cpp b/soh/soh/Enhancements/BootToDebugWarpScreen.cpp new file mode 100644 index 0000000000..a2b8c6b60f --- /dev/null +++ b/soh/soh/Enhancements/BootToDebugWarpScreen.cpp @@ -0,0 +1,47 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" +#include "functions.h" + +extern "C" { +#include "z64.h" +#include "overlays/gamestates/ovl_file_choose/file_choose.h" +} + +static constexpr int32_t CVAR_DEBUG_ENABLED_DEFAULT = 0; +#define CVAR_DEBUG_ENABLED_NAME CVAR_DEVELOPER_TOOLS("DebugEnabled") +#define CVAR_DEBUG_ENABLED_VALUE CVarGetInteger(CVAR_DEBUG_ENABLED_NAME, CVAR_DEBUG_ENABLED_DEFAULT) + +static constexpr int32_t CVAR_BOOT_TO_DEBUG_WARP_SCREEN_DEFAULT = 0; +#define CVAR_BOOT_TO_DEBUG_WARP_SCREEN_NAME CVAR_DEVELOPER_TOOLS("BootToDebugWarpScreen") +#define CVAR_BOOT_TO_DEBUG_WARP_SCREEN_VALUE \ + CVarGetInteger(CVAR_BOOT_TO_DEBUG_WARP_SCREEN_NAME, CVAR_BOOT_TO_DEBUG_WARP_SCREEN_DEFAULT) + +void OnFileChooseMainBootToDebugWarpScreen(void* gameState) { + FileChooseContext* fileChooseContext = (FileChooseContext*)gameState; + fileChooseContext->buttonIndex = 0xFF; + fileChooseContext->menuMode = FS_MENU_MODE_SELECT; + fileChooseContext->selectMode = SM_LOAD_GAME; +} + +void OnZTitleUpdateBootToDebugWarpScreen(void* gameState) { + TitleContext* titleContext = (TitleContext*)gameState; + + gSaveContext.seqId = (u8)NA_BGM_DISABLED; + gSaveContext.natureAmbienceId = 0xFF; + gSaveContext.gameMode = GAMEMODE_FILE_SELECT; + titleContext->state.running = false; + + SET_NEXT_GAMESTATE(&titleContext->state, FileChoose_Init, FileChooseContext); +} + +void RegisterBootToDebugWarpScreen() { + COND_HOOK(OnFileChooseMain, CVAR_DEBUG_ENABLED_VALUE && CVAR_BOOT_TO_DEBUG_WARP_SCREEN_VALUE, + OnFileChooseMainBootToDebugWarpScreen); + COND_HOOK(OnZTitleUpdate, CVAR_DEBUG_ENABLED_VALUE && CVAR_BOOT_TO_DEBUG_WARP_SCREEN_VALUE, + OnZTitleUpdateBootToDebugWarpScreen); +} + +static RegisterShipInitFunc initFunc_BootToDebugWarpScreen(RegisterBootToDebugWarpScreen, + { CVAR_DEBUG_ENABLED_NAME, + CVAR_BOOT_TO_DEBUG_WARP_SCREEN_NAME }); diff --git a/soh/soh/Enhancements/Cheats/DekuStick.cpp b/soh/soh/Enhancements/Cheats/DekuStick.cpp index 8afa0e3303..6798780711 100644 --- a/soh/soh/Enhancements/Cheats/DekuStick.cpp +++ b/soh/soh/Enhancements/Cheats/DekuStick.cpp @@ -13,13 +13,13 @@ extern PlayState* gPlayState; #define CVAR_DEKU_STICK_VALUE CVarGetInteger(CVAR_DEKU_STICK_NAME, CVAR_DEKU_STICK_DEFAULT) void RegisterDekuStickCheats() { - COND_VB_SHOULD(VB_DEKU_STICK_BREAK, CVAR_DEKU_STICK_VALUE != DEKU_STICK_NORMAL, { *should = false; }); - COND_VB_SHOULD(VB_DEKU_STICK_BURN_OUT, CVAR_DEKU_STICK_VALUE != DEKU_STICK_NORMAL, { *should = false; }); + COND_VB_SHOULD(VB_DEKU_STICK_BREAK, CVAR_DEKU_STICK_VALUE != DEKU_STICK_NORMAL, { *should = false; }); + COND_VB_SHOULD(VB_DEKU_STICK_BURN_OUT, CVAR_DEKU_STICK_VALUE != DEKU_STICK_NORMAL, { *should = false; }); COND_VB_SHOULD(VB_DEKU_STICK_BURN_DOWN, CVAR_DEKU_STICK_VALUE != DEKU_STICK_NORMAL, { *should = false; }); COND_VB_SHOULD(VB_DEKU_STICK_BE_ON_FIRE, CVAR_DEKU_STICK_VALUE == DEKU_STICK_UNBREAKABLE_AND_ALWAYS_ON_FIRE, { Player* player = GET_PLAYER(gPlayState); - player->unk_860 = 200; // Keeps the stick's flame lit - player->unk_85C = 1.0f; // Ensures the stick is the proper length + player->unk_860 = 200; // Keeps the stick's flame lit + player->unk_85C = 1.0f; // Ensures the stick is the proper length *should = true; }); } diff --git a/soh/soh/Enhancements/Cheats/FreezeTime.cpp b/soh/soh/Enhancements/Cheats/FreezeTime.cpp index 2296c4fc9d..a3028d7dab 100644 --- a/soh/soh/Enhancements/Cheats/FreezeTime.cpp +++ b/soh/soh/Enhancements/Cheats/FreezeTime.cpp @@ -30,7 +30,8 @@ void RegisterFreezeTime() { GameInteractor::Instance->UnregisterGameHook(hookId); hookId = 0; if (CVAR_FREEZE_TIME_VALUE) { - hookId = GameInteractor::Instance->RegisterGameHook(OnGameFrameUpdateFreezeTime); + hookId = + GameInteractor::Instance->RegisterGameHook(OnGameFrameUpdateFreezeTime); } else { CVarClear(CVAR_PREV_TIME_NAME); } diff --git a/soh/soh/Enhancements/Cheats/Infinite/Money.cpp b/soh/soh/Enhancements/Cheats/Infinite/Money.cpp index 292f65065f..38b402d6d2 100644 --- a/soh/soh/Enhancements/Cheats/Infinite/Money.cpp +++ b/soh/soh/Enhancements/Cheats/Infinite/Money.cpp @@ -15,10 +15,7 @@ extern s32 Flags_GetRandomizerInf(RandomizerInf flag); #define CVAR_INFINITE_MONEY_VALUE CVarGetInteger(CVAR_INFINITE_MONEY_NAME, CVAR_INFINITE_MONEY_DEFAULT) void OnGameFrameUpdateInfiniteMoney() { - if ( - !GameInteractor::IsSaveLoaded(true) || - (IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET)) - ) { + if (!GameInteractor::IsSaveLoaded(true) || (IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET))) { return; } diff --git a/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp b/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp index 0bea9afc98..f3ff5fe043 100644 --- a/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp +++ b/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp @@ -7,7 +7,8 @@ extern "C" SaveContext gSaveContext; #define CVAR_INFINITE_NAYRUS_LOVE_NAME CVAR_CHEAT("InfiniteNayru") #define CVAR_INFINITE_NAYRUS_LOVE_DEFAULT 0 -#define CVAR_INFINITE_NAYRUS_LOVE_VALUE CVarGetInteger(CVAR_INFINITE_NAYRUS_LOVE_NAME, CVAR_INFINITE_NAYRUS_LOVE_DEFAULT) +#define CVAR_INFINITE_NAYRUS_LOVE_VALUE \ + CVarGetInteger(CVAR_INFINITE_NAYRUS_LOVE_NAME, CVAR_INFINITE_NAYRUS_LOVE_DEFAULT) void OnGameFrameUpdateInfiniteNayrusLove() { if (!GameInteractor::IsSaveLoaded(true)) { diff --git a/soh/soh/Enhancements/Cheats/NoKeeseGuayTarget.cpp b/soh/soh/Enhancements/Cheats/NoKeeseGuayTarget.cpp new file mode 100644 index 0000000000..911f3cd257 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/NoKeeseGuayTarget.cpp @@ -0,0 +1,23 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "macros.h" +} + +static constexpr int32_t CVAR_NOKEESEGUAYTARGET_DEFAULT = 0; +#define CVAR_NOKEESEGUAYTARGET_NAME CVAR_CHEAT("NoKeeseGuayTarget") +#define CVAR_NOKEESEGUAYTARGET_VALUE CVarGetInteger(CVAR_NOKEESEGUAYTARGET_NAME, CVAR_NOKEESEGUAYTARGET_DEFAULT) + +void RegisterNoKeeseGuayTarget() { + // Dive Attack + COND_VB_SHOULD(VB_KEESE_DO_DIVE_ATTACK, CVAR_NOKEESEGUAYTARGET_VALUE, { *should = false; }); + COND_VB_SHOULD(VB_GUAY_DO_DIVE_ATTACK, CVAR_NOKEESEGUAYTARGET_VALUE, { *should = false; }); + + // Force Fly Away + COND_VB_SHOULD(VB_KEESE_FORCE_FLY_AWAY, CVAR_NOKEESEGUAYTARGET_VALUE, { *should = true; }); + COND_VB_SHOULD(VB_GUAY_FORCE_FLY_AWAY, CVAR_NOKEESEGUAYTARGET_VALUE, { *should = true; }); +} + +static RegisterShipInitFunc initFunc_NoKeeseGuayTarget(RegisterNoKeeseGuayTarget, { CVAR_NOKEESEGUAYTARGET_NAME }); diff --git a/soh/soh/Enhancements/Cheats/NoRedeadFreeze.cpp b/soh/soh/Enhancements/Cheats/NoRedeadFreeze.cpp new file mode 100644 index 0000000000..ccc406104f --- /dev/null +++ b/soh/soh/Enhancements/Cheats/NoRedeadFreeze.cpp @@ -0,0 +1,17 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "macros.h" +} + +static constexpr int32_t CVAR_NOREDEADFREEZE_DEFAULT = 0; +#define CVAR_NOREDEADFREEZE_NAME CVAR_CHEAT("NoRedeadFreeze") +#define CVAR_NOREDEADFREEZE_VALUE CVarGetInteger(CVAR_NOREDEADFREEZE_NAME, CVAR_NOREDEADFREEZE_DEFAULT) + +void RegisterNoRedeadFreeze() { + COND_VB_SHOULD(VB_REDEAD_GIBDO_FREEZE_LINK, CVAR_NOREDEADFREEZE_VALUE, { *should = false; }); +} + +static RegisterShipInitFunc initFunc_NoRedeadFreeze(RegisterNoRedeadFreeze, { CVAR_NOREDEADFREEZE_NAME }); diff --git a/soh/soh/Enhancements/CuccosToReturn.cpp b/soh/soh/Enhancements/CuccosToReturn.cpp new file mode 100644 index 0000000000..2de929fd30 --- /dev/null +++ b/soh/soh/Enhancements/CuccosToReturn.cpp @@ -0,0 +1,18 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +extern PlayState* gPlayState; +#include "src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.h" +} + +void RegisterCuccosToReturn() { + COND_VB_SHOULD(VB_SET_CUCCO_COUNT, CVarGetInteger(CVAR_ENHANCEMENT("CuccosToReturn"), 7) != 7, { + EnNiwLady* enNiwLady = va_arg(args, EnNiwLady*); + // Override starting Cucco count using setting value + enNiwLady->cuccosInPen = 7 - CVarGetInteger(CVAR_ENHANCEMENT("CuccosToReturn"), 7); + *should = false; + }); +} + +static RegisterShipInitFunc initFunc(RegisterCuccosToReturn, { CVAR_ENHANCEMENT("CuccosToReturn") }); diff --git a/soh/soh/Enhancements/DampeFire.cpp b/soh/soh/Enhancements/DampeFire.cpp new file mode 100644 index 0000000000..1378ecb044 --- /dev/null +++ b/soh/soh/Enhancements/DampeFire.cpp @@ -0,0 +1,48 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "soh/Enhancements/enhancementTypes.h" + +extern "C" { +extern PlayState* gPlayState; +#include "src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.h" +} + +void RegisterDampeFire() { + COND_VB_SHOULD(VB_DAMPE_DROP_FLAME, CVarGetInteger(CVAR_ENHANCEMENT("DampeDropRate"), DAMPE_NORMAL) != DAMPE_NORMAL, + { + double chance; + int cooldown = 9; + switch (CVarGetInteger(CVAR_ENHANCEMENT("DampeDropRate"), DAMPE_NORMAL)) { + case DAMPE_NONE: + *should = false; + return; + default: + case DAMPE_NORMAL: + return; + case DAMPE_JALAPENO: + chance = 0.03; + break; + case DAMPE_CHIPOTLE: + chance = 0.1; + break; + case DAMPE_SCOTCH_BONNET: + chance = 0.2; + break; + case DAMPE_GHOST_PEPPER: + chance = 0.5; + cooldown = 4; + break; + case DAMPE_INFERNO: + *should = true; + return; + } + + EnPoRelay* actor = va_arg(args, EnPoRelay*); + if (actor->actionTimer > cooldown) { + actor->actionTimer = cooldown; + } + *should = actor->actionTimer == 0 && Rand_ZeroOne() < chance; + }); +} + +static RegisterShipInitFunc initFunc(RegisterDampeFire, { CVAR_ENHANCEMENT("DampeDropRate") }); diff --git a/soh/soh/Enhancements/ExtraModes/RupeeDash.cpp b/soh/soh/Enhancements/ExtraModes/RupeeDash.cpp new file mode 100644 index 0000000000..3e7660b84e --- /dev/null +++ b/soh/soh/Enhancements/ExtraModes/RupeeDash.cpp @@ -0,0 +1,42 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "functions.h" +#include "macros.h" +#include "variables.h" + +extern "C" PlayState* gPlayState; + +static constexpr int32_t CVAR_RUPEE_DASH_DEFAULT = 0; +#define CVAR_RUPEE_DASH_NAME CVAR_ENHANCEMENT("RupeeDash") +#define CVAR_RUPEE_DASH_VALUE CVarGetInteger(CVAR_RUPEE_DASH_NAME, CVAR_RUPEE_DASH_DEFAULT) + +static constexpr int32_t CVAR_RUPEE_DASH_INTERVAL_DEFAULT = 5; +#define CVAR_RUPEE_DASH_INTERVAL_NAME CVAR_ENHANCEMENT("RupeeDashInterval") +#define CVAR_RUPEE_DASH_INTERVAL_TIME \ + CVarGetInteger(CVAR_RUPEE_DASH_INTERVAL_NAME, CVAR_RUPEE_DASH_INTERVAL_DEFAULT) * 20 + +void UpdateRupeeDash() { + // Initialize Timer + static uint16_t rupeeDashTimer = 0; + + // Did time change by DashInterval? + if (rupeeDashTimer < CVAR_RUPEE_DASH_INTERVAL_TIME) { + rupeeDashTimer++; + return; + } + + rupeeDashTimer = 0; + if (gSaveContext.rupees > 0) { + uint16_t walletSize = (CUR_UPG_VALUE(UPG_WALLET) + 1) * -1; + Rupees_ChangeBy(walletSize); + } else { + Health_ChangeBy(gPlayState, -16); + } +} + +void RegisterRupeeDash() { + COND_HOOK(OnPlayerUpdate, CVAR_RUPEE_DASH_VALUE, UpdateRupeeDash); +} + +static RegisterShipInitFunc initFunc_RupeeDash(RegisterRupeeDash, { CVAR_RUPEE_DASH_NAME }); diff --git a/soh/soh/Enhancements/ExtraModes/ShadowTag.cpp b/soh/soh/Enhancements/ExtraModes/ShadowTag.cpp new file mode 100644 index 0000000000..dc85534c8d --- /dev/null +++ b/soh/soh/Enhancements/ExtraModes/ShadowTag.cpp @@ -0,0 +1,50 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "functions.h" + +extern "C" PlayState* gPlayState; + +static constexpr int32_t CVAR_SHADOW_TAG_DEFAULT = 0; +#define CVAR_SHADOW_TAG_NAME CVAR_ENHANCEMENT("ShadowTag") +#define CVAR_SHADOW_TAG_VALUE CVarGetInteger(CVAR_SHADOW_TAG_NAME, CVAR_SHADOW_TAG_DEFAULT) + +static bool shouldSpawn = false; +static uint16_t delayTimer = 60; + +static constexpr s8 ROOM_GREEN_POE = 16; +static constexpr s8 ROOM_BLUE_POE = 13; +static constexpr s8 ROOM_RED_POE = 12; + +void OnPlayerUpdateShadowTag() { + if (gPlayState->sceneNum == SCENE_FOREST_TEMPLE) { + switch (gPlayState->roomCtx.curRoom.num) { + case ROOM_GREEN_POE: + case ROOM_BLUE_POE: + case ROOM_RED_POE: + return; + default: + break; + } + } + + if (shouldSpawn && (delayTimer <= 0)) { + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_WALLMAS, 0, 0, 0, 0, 0, 0, 3, false); + shouldSpawn = false; + } else { + delayTimer--; + } +} + +void ResetShadowTagSpawnTimer() { + shouldSpawn = true; + delayTimer = 60; +} + +void RegisterShadowTag() { + COND_HOOK(OnPlayerUpdate, CVAR_SHADOW_TAG_VALUE, OnPlayerUpdateShadowTag); + COND_HOOK(OnSceneSpawnActors, true, []() { ResetShadowTagSpawnTimer(); }); + COND_HOOK(OnSceneInit, true, [](int16_t) { ResetShadowTagSpawnTimer(); }); +} + +static RegisterShipInitFunc initFunc_ShadowTag(RegisterShadowTag, { CVAR_SHADOW_TAG_NAME }); diff --git a/soh/soh/Enhancements/ExtraTraps.cpp b/soh/soh/Enhancements/ExtraTraps.cpp index 4de771006c..155b1af713 100644 --- a/soh/soh/Enhancements/ExtraTraps.cpp +++ b/soh/soh/Enhancements/ExtraTraps.cpp @@ -36,23 +36,19 @@ static int statusTimer = -1; static int eventTimer = -1; const char* altTrapTypeCvars[] = { - CVAR_ENHANCEMENT("ExtraTraps.Ice"), - CVAR_ENHANCEMENT("ExtraTraps.Burn"), - CVAR_ENHANCEMENT("ExtraTraps.Shock"), - CVAR_ENHANCEMENT("ExtraTraps.Knockback"), - CVAR_ENHANCEMENT("ExtraTraps.Speed"), - CVAR_ENHANCEMENT("ExtraTraps.Bomb"), - CVAR_ENHANCEMENT("ExtraTraps.Void"), - CVAR_ENHANCEMENT("ExtraTraps.Ammo"), - CVAR_ENHANCEMENT("ExtraTraps.Kill"), - CVAR_ENHANCEMENT("ExtraTraps.Teleport") + CVAR_ENHANCEMENT("ExtraTraps.Ice"), CVAR_ENHANCEMENT("ExtraTraps.Burn"), + CVAR_ENHANCEMENT("ExtraTraps.Shock"), CVAR_ENHANCEMENT("ExtraTraps.Knockback"), + CVAR_ENHANCEMENT("ExtraTraps.Speed"), CVAR_ENHANCEMENT("ExtraTraps.Bomb"), + CVAR_ENHANCEMENT("ExtraTraps.Void"), CVAR_ENHANCEMENT("ExtraTraps.Ammo"), + CVAR_ENHANCEMENT("ExtraTraps.Kill"), CVAR_ENHANCEMENT("ExtraTraps.Teleport"), }; -std::vector getEnabledAddTraps () { +std::vector getEnabledAddTraps() { std::vector enabledAddTraps; for (int i = 0; i < ADD_TRAP_MAX; i++) { if (CVarGetInteger(altTrapTypeCvars[i], 0)) { - if (gSaveContext.equips.buttonItems[0] == ITEM_FISHING_POLE && (i == ADD_VOID_TRAP || i == ADD_TELEPORT_TRAP)) { + if (gSaveContext.equips.buttonItems[0] == ITEM_FISHING_POLE && + (i == ADD_VOID_TRAP || i == ADD_TELEPORT_TRAP)) { continue; // don't add void or teleport if you're holding the fishing pole, as this causes issues } enabledAddTraps.push_back(static_cast(i)); @@ -65,7 +61,8 @@ std::vector getEnabledAddTraps () { }; static void RollRandomTrap(uint32_t seed) { - uint32_t finalSeed = seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); + uint32_t finalSeed = seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() + : static_cast(gSaveContext.ship.stats.fileCreatedAt)); Random_Init(finalSeed); roll = RandomElement(getEnabledAddTraps()); @@ -83,7 +80,8 @@ static void RollRandomTrap(uint32_t seed) { eventTimer = 3; break; case ADD_SPEED_TRAP: - Audio_PlaySoundGeneral(NA_SE_VO_KZ_MOVE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Audio_PlaySoundGeneral(NA_SE_VO_KZ_MOVE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); GameInteractor::State::MovementSpeedMultiplier = 0.5f; statusTimer = 200; Notification::Emit({ .message = "Speed Decreased!" }); @@ -92,7 +90,8 @@ static void RollRandomTrap(uint32_t seed) { eventTimer = 3; break; case ADD_VOID_TRAP: - Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); eventTimer = 3; break; case ADD_AMMO_TRAP: @@ -127,13 +126,14 @@ static void OnPlayerUpdate() { Play_TriggerRespawn(gPlayState); break; case ADD_AMMO_TRAP: - AMMO(ITEM_STICK) = AMMO(ITEM_STICK) * 0.5; - AMMO(ITEM_NUT) = AMMO(ITEM_NUT) * 0.5; - AMMO(ITEM_SLINGSHOT) = AMMO(ITEM_SLINGSHOT) * 0.5; - AMMO(ITEM_BOW) = AMMO(ITEM_BOW) * 0.5; - AMMO(ITEM_BOMB) = AMMO(ITEM_BOMB) * 0.5; - AMMO(ITEM_BOMBCHU) = AMMO(ITEM_BOMBCHU) * 0.5; - Audio_PlaySoundGeneral(NA_SE_VO_FR_SMILE_0, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + AMMO(ITEM_STICK) = static_cast(floor(AMMO(ITEM_STICK) * 0.5f)); + AMMO(ITEM_NUT) = static_cast(floor(AMMO(ITEM_NUT) * 0.5f)); + AMMO(ITEM_SLINGSHOT) = static_cast(floor(AMMO(ITEM_SLINGSHOT) * 0.5f)); + AMMO(ITEM_BOW) = static_cast(floor(AMMO(ITEM_BOW) * 0.5f)); + AMMO(ITEM_BOMB) = static_cast(floor(AMMO(ITEM_BOMB) * 0.5f)); + AMMO(ITEM_BOMBCHU) = static_cast(floor(AMMO(ITEM_BOMBCHU) * 0.5f)); + Audio_PlaySoundGeneral(NA_SE_VO_FR_SMILE_0, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); break; case ADD_TELEPORT_TRAP: { int entrance; @@ -199,5 +199,3 @@ void RegisterExtraTraps() { } static RegisterShipInitFunc initFunc(RegisterExtraTraps, { CVAR_EXTRA_TRAPS_NAME }); - - diff --git a/soh/soh/Enhancements/FileSelectEnhancements.cpp b/soh/soh/Enhancements/FileSelectEnhancements.cpp index 84cff9d121..ec8810d020 100644 --- a/soh/soh/Enhancements/FileSelectEnhancements.cpp +++ b/soh/soh/Enhancements/FileSelectEnhancements.cpp @@ -6,12 +6,12 @@ #include #include -std::array RandomizerSettingsMenuText[RSM_MAX] = { +std::array RandomizerSettingsMenuText[RSM_MAX] = { { // English "Start Randomizer", // German - "Start Randomizer", + "Randomizer starten", // French "Commencer le Randomizer", }, @@ -19,7 +19,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // English "Generate New Randomizer Seed", // German - "Generate New Randomizer Seed", + "Neuen Randomizer Seed generieren", // French "Générer une nouvelle seed pour le Randomizer", }, @@ -27,7 +27,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // English "Open Randomizer Settings", // German - "Open Randomizer Settings", + "Randomizer Optionen öffnen", // French "Ouvrir les paramètres du Randomizer", }, @@ -35,32 +35,31 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // English "Generating...", // German - "Generating...", + "Generiere...", // French "Génération en cours...", }, - { - // English - "No randomizer seed loaded.\nPlease generate one first" - #if defined(__WIIU__) || defined(__SWITCH__) - ".", - #else - ",\nor drop a spoiler log on the game window.", - #endif - // German - "No randomizer seed loaded.\nPlease generate one first" - #if defined(__WIIU__) || defined(__SWITCH__) - ".", - #else - ",\nor drop a spoiler log on the game window.", - #endif - // French - "Aucune Seed de Randomizer actuellement disponible.\nGénérez-en une dans les \"Randomizer Settings\"" - #if (defined(__WIIU__) || defined(__SWITCH__)) - "." - #else - "\nou glissez un spoilerlog sur la fenêtre du jeu." - #endif + { // English + "No randomizer seed loaded.\nPlease generate one first" +#if defined(__WIIU__) || defined(__SWITCH__) + ".", +#else + ",\nor drop a spoiler log on the game window.", +#endif + // German + "Kein Randomizer Seed gefunden.\nBitte generiere zuerst einen" +#if defined(__WIIU__) || defined(__SWITCH__) + ".", +#else + ",\noder ziehe ein Spoiler Log\nauf das Spielfenster.", +#endif + // French + "Aucune Seed de Randomizer actuellement disponible.\nGénérez-en une dans les \"Randomizer Settings\"" +#if (defined(__WIIU__) || defined(__SWITCH__)) + "." +#else + "\nou glissez un spoilerlog sur la fenêtre du jeu." +#endif }, }; diff --git a/soh/soh/Enhancements/Presets/Presets.cpp b/soh/soh/Enhancements/Presets/Presets.cpp new file mode 100644 index 0000000000..b84cb95ca1 --- /dev/null +++ b/soh/soh/Enhancements/Presets/Presets.cpp @@ -0,0 +1,446 @@ +#include "Presets.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "soh/OTRGlobals.h" +#include "soh/SohGui/MenuTypes.h" +#include "soh/SohGui/SohMenu.h" +#include "soh/SohGui/SohGui.hpp" +#include "soh/Enhancements/randomizer/randomizer_settings_window.h" +#include "soh/Enhancements/randomizer/randomizer_check_tracker.h" +#include "soh/Enhancements/randomizer/randomizer_entrance_tracker.h" +#include "soh/Enhancements/randomizer/randomizer_item_tracker.h" + +namespace fs = std::filesystem; + +namespace SohGui { +extern std::shared_ptr mSohMenu; +extern std::shared_ptr mRandomizerSettingsWindow; +} // namespace SohGui + +struct PresetInfo { + nlohmann::json presetValues; + std::string fileName; + bool apply[PRESET_SECTION_MAX]; + bool isBuiltIn = false; +}; + +struct BlockInfo { + std::vector sections; + const char* icon; + std::string names[2]; +}; + +static std::map presets; +static std::string presetFolder; + +void BlankButton() { + ImGui::PushStyleColor(ImGuiCol_Button, { 0, 0, 0, 0 }); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, { 0, 0, 0, 0 }); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, { 0, 0, 0, 0 }); + ImGui::PushStyleColor(ImGuiCol_Border, { 0, 0, 0, 0 }); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(8.0f, 8.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 5.0f); +} + +void PresetCheckboxStyle(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.0f, 0.0f, 0.0f, 0.3f)); + ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(1.0f, 1.0f, 1.0f, 0.7f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6.0f, 6.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 5.0f); +} + +static BlockInfo blockInfo[PRESET_SECTION_MAX] = { + { { CVAR_PREFIX_SETTING, CVAR_PREFIX_WINDOW }, ICON_FA_COG, { "Settings", "settings" } }, + { { CVAR_PREFIX_ENHANCEMENT, CVAR_PREFIX_RANDOMIZER_ENHANCEMENT, CVAR_PREFIX_CHEAT }, + ICON_FA_PLUS_CIRCLE, + { "Enhancements", "enhancements" } }, + { { CVAR_PREFIX_AUDIO }, ICON_FA_MUSIC, { "Audio", "audio" } }, + { { CVAR_PREFIX_COSMETIC }, ICON_FA_PAINT_BRUSH, { "Cosmetics", "cosmetics" } }, + { { CVAR_PREFIX_RANDOMIZER_SETTING }, ICON_FA_RANDOM, { "Rando Settings", "rando" } }, + { { CVAR_PREFIX_TRACKER }, ICON_FA_MAP, { "Trackers", "trackers" } }, + { { CVAR_PREFIX_REMOTE }, ICON_FA_WIFI, { "Network", "network" } }, +}; + +std::string FormatPresetPath(std::string name) { + return fmt::format("{}/{}.json", presetFolder, name); +} + +void applyPreset(std::string presetName, std::vector includeSections) { + auto& info = presets[presetName]; + for (int i = PRESET_SECTION_SETTINGS; i < PRESET_SECTION_MAX; i++) { + if (info.apply[i] && info.presetValues["blocks"].contains(blockInfo[i].names[1])) { + if (!includeSections.empty() && + std::find(includeSections.begin(), includeSections.end(), i) == includeSections.end()) { + continue; + } + if (i == PRESET_SECTION_TRACKERS) { + ItemTracker_LoadFromPreset(info.presetValues["blocks"][blockInfo[i].names[1]]["windows"]); + if (info.presetValues["blocks"][blockInfo[i].names[1]]["windows"].contains("Check Tracker")) { + CheckTracker::CheckTracker_LoadFromPreset( + info.presetValues["blocks"][blockInfo[i].names[1]]["windows"]["Check Tracker"]); + } + if (info.presetValues["blocks"][blockInfo[i].names[1]]["windows"].contains("Entrance Tracker")) { + EntranceTracker_LoadFromPreset( + info.presetValues["blocks"][blockInfo[i].names[1]]["windows"]["Entrance Tracker"]); + } + } + auto section = info.presetValues["blocks"][blockInfo[i].names[1]]; + for (auto& item : section.items()) { + if (section[item.key()].is_null()) { + CVarClearBlock(item.key().c_str()); + } else { + Ship::Context::GetInstance()->GetConfig()->SetBlock(fmt::format("{}.{}", "CVars", item.key()), + item.value()); + Ship::Context::GetInstance()->GetConsoleVariables()->Load(); + } + } + if (i == PRESET_SECTION_RANDOMIZER) { + SohGui::mRandomizerSettingsWindow->SetNeedsUpdate(); + } + } + } + ShipInit::InitAll(); +} + +void DrawPresetSelector(std::vector includeSections, std::string presetLoc, bool disabled) { + std::vector includedPresets; + for (auto& [name, info] : presets) { + for (auto& section : includeSections) { + if (info.apply[section]) { + includedPresets.push_back(name); + } + } + } + ImGui::Text("Presets"); + if (includedPresets.empty()) { + ImGui::PushStyleColor(ImGuiCol_Text, UIWidgets::ColorValues.at(UIWidgets::Colors::Orange)); + ImGui::Text("No presets with rando options. Make some in Settings -> Presets"); + ImGui::PopStyleColor(); + return; + } + std::string selectorCvar = fmt::format(CVAR_GENERAL("{}SelectedPreset"), presetLoc); + std::string currentIndex = CVarGetString(selectorCvar.c_str(), includedPresets[0].c_str()); + if (!presets.contains(currentIndex)) { + currentIndex = *includedPresets.begin(); + CVarSetString(selectorCvar.c_str(), currentIndex.c_str()); + } + UIWidgets::PushStyleCombobox(THEME_COLOR); + if (ImGui::BeginCombo("##PresetsComboBox", currentIndex.c_str())) { + for (auto iter = includedPresets.begin(); iter != includedPresets.end(); ++iter) { + if (ImGui::Selectable(iter->c_str(), *iter == currentIndex)) { + CVarSetString(selectorCvar.c_str(), iter->c_str()); + currentIndex = *iter; + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + } + + ImGui::EndCombo(); + } + UIWidgets::PopStyleCombobox(); + // UIWidgets::Tooltip(comboboxTooltip.c_str()); + + UIWidgets::PushStyleButton(THEME_COLOR); + if (UIWidgets::Button( + ("Apply Preset##" + selectorCvar).c_str(), + UIWidgets::ButtonOptions({ { .disabled = disabled } }).Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { + applyPreset(currentIndex, includeSections); + } + UIWidgets::PopStyleButton(); +} + +void DrawSectionCheck(const std::string& name, bool empty, bool* pointer, std::string section) { + ImGui::AlignTextToFramePadding(); + if (empty) { + ImGui::PushStyleColor(ImGuiCol_Text, { 1.0f, 0.0f, 0.0f, 0.7f }); + BlankButton(); + ImGui::BeginDisabled(); + ImGui::Button((ICON_FA_TIMES + std::string("##") + name + section).c_str()); + ImGui::EndDisabled(); + UIWidgets::PopStyleButton(); + ImGui::PopStyleColor(); + } else { + ImGui::PushFont(OTRGlobals::Instance->fontMono); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::GetStyle().FramePadding.y)); + UIWidgets::Checkbox(("##" + name + section).c_str(), pointer, + { .defaultValue = true, .padding = { 6.0f, 6.0f }, .color = THEME_COLOR }); + ImGui::PopFont(); + } +} + +void ParsePreset(nlohmann::json& json, std::string name) { + try { + presets[json["presetName"]].presetValues = json; + presets[json["presetName"]].fileName = name; + if (json.contains("isBuiltIn")) { + presets[json["presetName"]].isBuiltIn = json["isBuiltIn"]; + } + for (int i = 0; i < PRESET_SECTION_MAX; i++) { + if (presets[json["presetName"]].presetValues["blocks"].contains(blockInfo[i].names[1])) { + presets[json["presetName"]].apply[i] = true; + } + } + } catch (...) {} +} + +void LoadPresets() { + if (!presets.empty()) { + presets.clear(); + } + if (fs::exists(presetFolder)) { + for (auto const& preset : fs::directory_iterator(presetFolder)) { + std::ifstream ifs(preset.path()); + + auto json = nlohmann::json::parse(ifs); + if (!json.contains("presetName")) { + spdlog::error(fmt::format("Attempted to load file {} as a preset, but was not a preset file.", + preset.path().filename().string())); + } else { + ParsePreset(json, preset.path().filename().stem().string()); + } + ifs.close(); + } + } + auto initData = std::make_shared(); + initData->Format = RESOURCE_FORMAT_BINARY; + initData->Type = static_cast(Ship::ResourceType::Json); + initData->ResourceVersion = 0; + std::string folder = "presets/*"; + auto builtIns = Ship::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->ListFiles(folder); + size_t start = std::string(folder).size() - 1; + for (size_t i = 0; i < builtIns->size(); i++) { + std::string filePath = builtIns->at(i); + auto json = std::static_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResource(filePath, true, initData)); + + std::string fileName = filePath.substr(start, filePath.size() - start - 5); // 5 for length of ".json" + ParsePreset(json->Data, fileName); + } +} + +void SavePreset(std::string& presetName) { + if (!fs::exists(presetFolder)) { + fs::create_directory(presetFolder); + } + presets[presetName].presetValues["presetName"] = presetName; + std::ofstream file( + fmt::format("{}/{}.json", Ship::Context::GetInstance()->LocateFileAcrossAppDirs("presets"), presetName)); + file << presets[presetName].presetValues.dump(4); + file.close(); + LoadPresets(); +} + +static std::string newPresetName; +static bool saveSection[PRESET_SECTION_MAX]; + +void DrawNewPresetPopup() { + bool nameExists = presets.contains(newPresetName); + UIWidgets::InputString("Preset Name", &newPresetName, + UIWidgets::InputOptions() + .Color(THEME_COLOR) + .Size({ 200, 40 }) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right) + .LabelPosition(UIWidgets::LabelPositions::Near) + .ErrorText("Preset name already exists") + .HasError(nameExists)); + nameExists = presets.contains(newPresetName); + bool noneSelected = true; + for (int i = PRESET_SECTION_SETTINGS; i < PRESET_SECTION_MAX; i++) { + if (saveSection[i]) { + noneSelected = false; + break; + } + } + const char* disabledTooltip = + (newPresetName.empty() ? "Preset name is empty" + : (noneSelected ? "No sections selected" : "Preset name already exists")); + for (int i = PRESET_SECTION_SETTINGS; i < PRESET_SECTION_MAX; i++) { + UIWidgets::Checkbox(fmt::format("Save {}", blockInfo[i].names[0]).c_str(), &saveSection[i], + UIWidgets::CheckboxOptions().Color(THEME_COLOR).Padding({ 6.0f, 6.0f })); + } + if (UIWidgets::Button( + "Save", UIWidgets::ButtonOptions({ { .disabled = (nameExists || noneSelected || newPresetName.empty()), + .disabledTooltip = disabledTooltip } }) + .Padding({ 6.0f, 6.0f }) + .Color(THEME_COLOR))) { + presets[newPresetName] = {}; + auto config = Ship::Context::GetInstance()->GetConfig()->GetNestedJson(); + for (int i = PRESET_SECTION_SETTINGS; i < PRESET_SECTION_MAX; i++) { + if (saveSection[i]) { + for (int j = 0; j < blockInfo[i].sections.size(); j++) { + presets[newPresetName].presetValues["blocks"][blockInfo[i].names[1]][blockInfo[i].sections[j]] = + config["CVars"][blockInfo[i].sections[j]]; + } + } + } + if (saveSection[PRESET_SECTION_TRACKERS]) { + for (auto id : itemTrackerWindowIDs) { + auto window = ImGui::FindWindowByName(id); + if (window != nullptr) { + auto size = window->Size; + auto pos = window->Pos; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]] + ["windows"][id]["size"]["width"] = size.x; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]] + ["windows"][id]["size"]["height"] = size.y; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]] + ["windows"][id]["pos"]["x"] = pos.x; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]] + ["windows"][id]["pos"]["y"] = pos.y; + } + } + + auto window = ImGui::FindWindowByName("Entrance Tracker"); + if (window != nullptr) { + auto size = window->Size; + auto pos = window->Pos; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]]["windows"] + ["Entrance Tracker"]["size"]["width"] = size.x; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]]["windows"] + ["Entrance Tracker"]["size"]["height"] = size.y; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]]["windows"] + ["Entrance Tracker"]["pos"]["x"] = pos.x; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]]["windows"] + ["Entrance Tracker"]["pos"]["y"] = pos.y; + } + + window = ImGui::FindWindowByName("Check Tracker"); + if (window != nullptr) { + auto size = window->Size; + auto pos = window->Pos; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]]["windows"] + ["Check Tracker"]["size"]["width"] = size.x; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]]["windows"] + ["Check Tracker"]["size"]["height"] = size.y; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]]["windows"] + ["Check Tracker"]["pos"]["x"] = pos.x; + presets[newPresetName].presetValues["blocks"][blockInfo[PRESET_SECTION_TRACKERS].names[1]]["windows"] + ["Check Tracker"]["pos"]["y"] = pos.y; + } + } + presets[newPresetName].fileName = newPresetName; + std::fill_n(presets[newPresetName].apply, PRESET_SECTION_MAX, true); + SavePreset(newPresetName); + newPresetName = ""; + ImGui::CloseCurrentPopup(); + } + if (UIWidgets::Button("Cancel", UIWidgets::ButtonOptions().Padding({ 6.0f, 6.0f }).Color(THEME_COLOR))) { + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); +} + +void PresetsCustomWidget(WidgetInfo& info) { + ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest); + if (UIWidgets::Button("New Preset", UIWidgets::ButtonOptions( + { { .disabled = (CVarGetInteger(CVAR_SETTING("DisableChanges"), 0) != 0), + .disabledTooltip = "Disabled because of race lockout" } }) + .Size(UIWidgets::Sizes::Inline) + .Color(THEME_COLOR))) { + ImGui::OpenPopup("newPreset"); + } + if (ImGui::BeginPopup("newPreset", ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | + ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoTitleBar)) { + DrawNewPresetPopup(); + } + ImGui::SameLine(); + UIWidgets::CVarCheckbox("Hide built-in presets", CVAR_GENERAL("HideBuiltInPresets"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + bool hideBuiltIn = CVarGetInteger(CVAR_GENERAL("HideBuiltInPresets"), 0); + UIWidgets::PushStyleTabs(THEME_COLOR); + if (ImGui::BeginTable("PresetWidgetTable", PRESET_SECTION_MAX + 3)) { + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 250); + for (int i = PRESET_SECTION_SETTINGS; i < PRESET_SECTION_MAX; i++) { + ImGui::TableSetupColumn(blockInfo[i].names[0].c_str()); + } + ImGui::TableSetupColumn("Apply", ImGuiTableColumnFlags_WidthFixed, + ImGui::CalcTextSize("Apply").x + ImGui::GetStyle().FramePadding.x * 2); + ImGui::TableSetupColumn("Delete", ImGuiTableColumnFlags_WidthFixed, + ImGui::CalcTextSize("Delete").x + ImGui::GetStyle().FramePadding.x * 2); + BlankButton(); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + for (int i = PRESET_SECTION_SETTINGS; i < PRESET_SECTION_MAX; i++) { + ImGui::TableNextColumn(); + ImGui::Button(fmt::format("{}##header{}", blockInfo[i].icon, blockInfo[i].names[1]).c_str()); + UIWidgets::Tooltip(blockInfo[i].names[0].c_str()); + } + UIWidgets::PopStyleButton(); + + if (presets.empty()) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); + ImGui::Text("No presets found."); + ImGui::EndTable(); + UIWidgets::PopStyleTabs(); + ImGui::PopFont(); + return; + } + for (auto& [name, info] : presets) { + if (hideBuiltIn && info.isBuiltIn) { + continue; + } + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); + ImGui::Text(name.c_str()); + for (int i = PRESET_SECTION_SETTINGS; i < PRESET_SECTION_MAX; i++) { + ImGui::TableNextColumn(); + DrawSectionCheck(name, !info.presetValues["blocks"].contains(blockInfo[i].names[1]), &info.apply[i], + blockInfo[i].names[1]); + } + ImGui::TableNextColumn(); + UIWidgets::PushStyleButton(THEME_COLOR); + if (UIWidgets::Button( + ("Apply##" + name).c_str(), + UIWidgets::ButtonOptions({ { .disabled = (CVarGetInteger(CVAR_SETTING("DisableChanges"), 0) != 0), + .disabledTooltip = "Disabled because of race lockout" } }) + .Padding({ 6.0f, 6.0f }))) { + applyPreset(name); + } + UIWidgets::PopStyleButton(); + ImGui::TableNextColumn(); + UIWidgets::PushStyleButton(THEME_COLOR); + if (!info.isBuiltIn) { + if (UIWidgets::Button(("Delete##" + name).c_str(), + UIWidgets::ButtonOptions().Padding({ 6.0f, 6.0f }))) { + auto path = FormatPresetPath(info.fileName); + if (fs::exists(path)) { + fs::remove(path); + } + presets.erase(name); + UIWidgets::PopStyleButton(); + break; + } + } + UIWidgets::PopStyleButton(); + } + + ImGui::EndTable(); + } + ImGui::PopFont(); + UIWidgets::PopStyleTabs(); +} + +void RegisterPresetsWidgets() { + SohGui::mSohMenu->AddSidebarEntry("Settings", "Presets", 1); + WidgetPath path = { "Settings", "Presets", SECTION_COLUMN_1 }; + SohGui::mSohMenu->AddWidget(path, "PresetsWidget", WIDGET_CUSTOM).CustomFunction(PresetsCustomWidget); + presetFolder = Ship::Context::GetInstance()->GetPathRelativeToAppDirectory("presets"); + std::fill_n(saveSection, PRESET_SECTION_MAX, true); + LoadPresets(); +} + +static RegisterMenuInitFunc initFunc(RegisterPresetsWidgets); diff --git a/soh/soh/Enhancements/Presets/Presets.h b/soh/soh/Enhancements/Presets/Presets.h new file mode 100644 index 0000000000..5edb265a3e --- /dev/null +++ b/soh/soh/Enhancements/Presets/Presets.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +enum PresetSection { + PRESET_SECTION_SETTINGS, + PRESET_SECTION_ENHANCEMENTS, + PRESET_SECTION_AUDIO, + PRESET_SECTION_COSMETICS, + PRESET_SECTION_RANDOMIZER, + PRESET_SECTION_TRACKERS, + PRESET_SECTION_NETWORK, + PRESET_SECTION_MAX, +}; + +void DrawPresetSelector(std::vector includeSections, std::string currentIndex, bool disabled); +void applyPreset(std::string presetName, std::vector includeSections = {}); diff --git a/soh/soh/Enhancements/QoL/DaytimeGS.cpp b/soh/soh/Enhancements/QoL/DaytimeGS.cpp new file mode 100644 index 0000000000..869945cb53 --- /dev/null +++ b/soh/soh/Enhancements/QoL/DaytimeGS.cpp @@ -0,0 +1,70 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "functions.h" +#include "macros.h" + +extern "C" { +extern PlayState* gPlayState; +extern SaveContext gSaveContext; +} + +static constexpr int32_t CVAR_DAYTIME_GS_DEFAULT = 0; +#define CVAR_DAYTIME_GS_NAME CVAR_ENHANCEMENT("NightGSAlwaysSpawn") +#define CVAR_DAYTIME_GS_VALUE CVarGetInteger(CVAR_DAYTIME_GS_NAME, CVAR_DAYTIME_GS_DEFAULT) + +struct DayTimeGoldSkulltulas { + uint16_t scene; + uint16_t room; + bool forChild; + std::vector actorEntries; +}; + +using DayTimeGoldSkulltulasList = std::vector; + +void OnSpawnNighttimeGoldSkulltula() { + // Gold Skulltulas that are not part of the scene actor list during the day + // Actor values copied from the night time scene actor list + static const DayTimeGoldSkulltulasList dayTimeGoldSkulltulas = { + // Graveyard + { SCENE_GRAVEYARD, 1, true, { { ACTOR_EN_SW, { 156, 315, 795 }, { 16384, -32768, 0 }, -20096 } } }, + // ZF + { SCENE_ZORAS_FOUNTAIN, 0, true, { { ACTOR_EN_SW, { -1891, 187, 1911 }, { 16384, 18022, 0 }, -19964 } } }, + // GF + { SCENE_GERUDOS_FORTRESS, 0, false, { { ACTOR_EN_SW, { 1598, 999, -2008 }, { 16384, -16384, 0 }, -19198 } } }, + { SCENE_GERUDOS_FORTRESS, 1, false, { { ACTOR_EN_SW, { 3377, 1734, -4935 }, { 16384, 0, 0 }, -19199 } } }, + // Kak + { SCENE_KAKARIKO_VILLAGE, 0, false, { { ACTOR_EN_SW, { -18, 540, 1800 }, { 0, -32768, 0 }, -20160 } } }, + { SCENE_KAKARIKO_VILLAGE, + 0, + true, + { { ACTOR_EN_SW, { -465, 377, -888 }, { 0, 28217, 0 }, -20222 }, + { ACTOR_EN_SW, { 5, 686, -171 }, { 0, -32768, 0 }, -20220 }, + { ACTOR_EN_SW, { 324, 270, 905 }, { 16384, 0, 0 }, -20216 }, + { ACTOR_EN_SW, { -602, 120, 1120 }, { 16384, 0, 0 }, -20208 } } }, + // LLR + { SCENE_LON_LON_RANCH, + 0, + true, + { { ACTOR_EN_SW, { -2344, 180, 672 }, { 16384, 22938, 0 }, -29695 }, + { ACTOR_EN_SW, { 808, 48, 326 }, { 16384, 0, 0 }, -29694 }, + { ACTOR_EN_SW, { 997, 286, -2698 }, { 16384, -16384, 0 }, -29692 } } }, + }; + + for (const auto& dayTimeGS : dayTimeGoldSkulltulas) { + if (IS_DAY && dayTimeGS.forChild == LINK_IS_CHILD && dayTimeGS.scene == gPlayState->sceneNum && + dayTimeGS.room == gPlayState->roomCtx.curRoom.num) { + for (const auto& actorEntry : dayTimeGS.actorEntries) { + Actor_Spawn(&gPlayState->actorCtx, gPlayState, actorEntry.id, actorEntry.pos.x, actorEntry.pos.y, + actorEntry.pos.z, actorEntry.rot.x, actorEntry.rot.y, actorEntry.rot.z, actorEntry.params, + false); + } + } + } +} + +void RegisterDaytimeGoldSkultullas() { + COND_HOOK(OnSceneSpawnActors, CVAR_DAYTIME_GS_VALUE, OnSpawnNighttimeGoldSkulltula); +} + +static RegisterShipInitFunc initFunc_DaytimeGoldSkulltulas(RegisterDaytimeGoldSkultullas, { CVAR_DAYTIME_GS_NAME }); diff --git a/soh/soh/Enhancements/RebottleBlueFire.cpp b/soh/soh/Enhancements/RebottleBlueFire.cpp new file mode 100644 index 0000000000..8ca11e4e62 --- /dev/null +++ b/soh/soh/Enhancements/RebottleBlueFire.cpp @@ -0,0 +1,25 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "src/overlays/actors/ovl_En_Ice_Hono/z_en_ice_hono.h" +void EnIceHono_CapturableFlame(EnIceHono* thisx, PlayState* play); +u32 EnIceHono_InBottleRange(EnIceHono* thisx, PlayState* play); +} + +extern PlayState* gPlayState; + +void OnEnIceHonoUpdate(void* actor) { + EnIceHono* thisx = (EnIceHono*)actor; + if (thisx->actionFunc != EnIceHono_CapturableFlame && EnIceHono_InBottleRange(thisx, gPlayState)) { + // GI_MAX in this case allows the player to catch the actor in a bottle + Actor_OfferGetItem(&thisx->actor, gPlayState, GI_MAX, 60.0f, 100.0f); + } +} + +void RegisterRebottleBlueFire() { + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_ICE_HONO, CVarGetInteger(CVAR_ENHANCEMENT("RebottleBlueFire"), 0), + OnEnIceHonoUpdate); +} + +static RegisterShipInitFunc initFunc(RegisterRebottleBlueFire, { CVAR_ENHANCEMENT("RebottleBlueFire") }); \ No newline at end of file diff --git a/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp b/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp index 20beb193a2..9658170301 100644 --- a/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp +++ b/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp @@ -10,6 +10,12 @@ void Custom_EnMThunder_Update(Actor* thisx, PlayState* play) { f32 blueRadius; s32 redGreen; + // If thunder effect doesn't exist (aka player doesn't have magic), + // don't do anything. + if (enMThunder->actionFunc == nullptr) { + return; + } + enMThunder->actionFunc(enMThunder, play); // don't call this part, it's what makes the spin attack darkness happen // func_80A9F314(play, this->unk_1BC); @@ -27,10 +33,13 @@ void OnEnMThunderInitReplaceUpdateWithCustom(void* thunder) { #define CVAR_REMOVESPINATTACKDARKNESS_NAME CVAR_ENHANCEMENT("RemoveSpinAttackDarkness") #define CVAR_REMOVESPINATTACKDARKNESS_DEFAULT 0 -#define CVAR_REMOVESPINATTACKDARKNESS_VALUE CVarGetInteger(CVAR_REMOVESPINATTACKDARKNESS_NAME, CVAR_REMOVESPINATTACKDARKNESS_DEFAULT) +#define CVAR_REMOVESPINATTACKDARKNESS_VALUE \ + CVarGetInteger(CVAR_REMOVESPINATTACKDARKNESS_NAME, CVAR_REMOVESPINATTACKDARKNESS_DEFAULT) void RegisterCustomEnMThunderUpdate() { - COND_ID_HOOK(OnActorInit, ACTOR_EN_M_THUNDER, CVAR_REMOVESPINATTACKDARKNESS_VALUE != CVAR_REMOVESPINATTACKDARKNESS_DEFAULT, OnEnMThunderInitReplaceUpdateWithCustom); + COND_ID_HOOK(OnActorInit, ACTOR_EN_M_THUNDER, + CVAR_REMOVESPINATTACKDARKNESS_VALUE != CVAR_REMOVESPINATTACKDARKNESS_DEFAULT, + OnEnMThunderInitReplaceUpdateWithCustom); } static RegisterShipInitFunc initFunc(RegisterCustomEnMThunderUpdate, { CVAR_REMOVESPINATTACKDARKNESS_NAME }); diff --git a/soh/soh/Enhancements/Restorations/BottleAdventure.cpp b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp new file mode 100644 index 0000000000..22cc74e679 --- /dev/null +++ b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp @@ -0,0 +1,481 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "variables.h" +} + +// gSaveContext.inventory.items +void HandleBAInventoryItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.items[itemOnCRight]; +} + +void HandleRBAInventoryItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.items[itemOnCRight] = itemToPutInBottle; +} + +// gSaveContext.inventory.ammo +void HandleBAInventoryAmmo() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.ammo[itemOnCRight - ITEM_FAIRY]; +} + +void HandleRBAInventoryAmmo(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.ammo[itemOnCRight - ITEM_FAIRY] = itemToPutInBottle; +} + +// gSaveContext.inventory.equipment +void HandleBAInventoryEquipment() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_MASK_GORON) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.equipment >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_MASK_ZORA) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.equipment & 0xFF; + } +} + +void HandleRBAInventoryEquipment(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_MASK_GORON) { + gSaveContext.inventory.equipment = (itemToPutInBottle << 8) | (gSaveContext.inventory.equipment & 0x00FF); + } else if (itemOnCRight == ITEM_MASK_ZORA) { + gSaveContext.inventory.equipment = itemToPutInBottle | (gSaveContext.inventory.equipment & 0xFF00); + } +} + +// gSaveContext.inventory.upgrades +void HandleBAInventoryUpgrades() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SOLD_OUT) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 24) & 0xFF; + } else if (itemOnCRight == ITEM_POCKET_EGG) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 16) & 0xFF; + } else if (itemOnCRight == ITEM_POCKET_CUCCO) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_COJIRO) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.upgrades & 0xFF; + } +} + +void HandleRBAInventoryUpgrades(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SOLD_OUT) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 24) | (gSaveContext.inventory.upgrades & 0x00FFFFFF); + } else if (itemOnCRight == ITEM_POCKET_EGG) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 16) | (gSaveContext.inventory.upgrades & 0xFF00FFFF); + } else if (itemOnCRight == ITEM_POCKET_CUCCO) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 8) | (gSaveContext.inventory.upgrades & 0xFFFF00FF); + } else if (itemOnCRight == ITEM_COJIRO) { + gSaveContext.inventory.upgrades = itemToPutInBottle | (gSaveContext.inventory.upgrades & 0xFFFFFF00); + } +} + +// gSaveContext.inventory.questItems +void HandleBAInventoryQuestItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_ODD_MUSHROOM) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 24) & 0xFF; + } else if (itemOnCRight == ITEM_ODD_POTION) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 16) & 0xFF; + } else if (itemOnCRight == ITEM_SAW) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_SWORD_BROKEN) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.questItems & 0xFF; + } +} + +void HandleRBAInventoryQuestItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_ODD_MUSHROOM) { + gSaveContext.inventory.questItems = + (itemToPutInBottle << 24) | (gSaveContext.inventory.questItems & 0x00FFFFFF); + } else if (itemOnCRight == ITEM_ODD_POTION) { + gSaveContext.inventory.questItems = + (itemToPutInBottle << 16) | (gSaveContext.inventory.questItems & 0xFF00FFFF); + } else if (itemOnCRight == ITEM_SAW) { + gSaveContext.inventory.questItems = (itemToPutInBottle << 8) | (gSaveContext.inventory.questItems & 0xFFFF00FF); + } else if (itemOnCRight == ITEM_SWORD_BROKEN) { + gSaveContext.inventory.questItems = itemToPutInBottle | (gSaveContext.inventory.questItems & 0xFFFFFF00); + } +} + +// gSaveContext.inventory.dungeonItems +void HandleBAInventoryDungeonItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.dungeonItems[itemOnCRight - ITEM_PRESCRIPTION]; +} + +void HandleRBAInventoryDungeonItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.dungeonItems[itemOnCRight - ITEM_PRESCRIPTION] = itemToPutInBottle; +} + +// gSaveContext.inventory.dungeonKeys +void HandleBAInventoryDungeonKeys() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.dungeonKeys[itemOnCRight - ITEM_BULLET_BAG_40]; +} + +void HandleRBAInventoryDungeonKeys(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.dungeonKeys[itemOnCRight - ITEM_BULLET_BAG_40] = itemToPutInBottle; +} + +// gSaveContext.inventory.defenseHearts +void HandleBAInventoryDefenseHearts() { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.defenseHearts; +} + +void HandleRBAInventoryDefenseHearts(uint8_t itemToPutInBottle) { + gSaveContext.inventory.defenseHearts = itemToPutInBottle; +} + +// gSaveContext.inventory.gsTokens +void HandleBAInventoryGSTokens() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SONG_SERENADE) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.gsTokens >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_SONG_REQUIEM) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.gsTokens & 0xFF; + } +} + +void HandleRBAInventoryGSTokens(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SONG_SERENADE) { + gSaveContext.inventory.gsTokens = (itemToPutInBottle << 8) | (gSaveContext.inventory.gsTokens & 0x00FF); + } else if (itemOnCRight == ITEM_SONG_REQUIEM) { + gSaveContext.inventory.gsTokens = itemToPutInBottle | (gSaveContext.inventory.gsTokens & 0xFF00); + } +} + +// gSaveContext.sceneFlags +void HandleBASceneFlags() { + // The rest of the items fall into the saved scene flags. Let's calculate the scene and which field it pulls from + u32 offset = gSaveContext.equips.buttonItems[3] - ITEM_SONG_LULLABY; + u32 scene = offset / sizeof(SavedSceneFlags); + switch (offset % sizeof(SavedSceneFlags)) { + case 0: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 24) & 0xFF; + break; + case 1: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 16) & 0xFF; + break; + case 2: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 8) & 0xFF; + break; + case 3: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].chest & 0xFF; + break; + case 4: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 24) & 0xFF; + break; + case 5: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 16) & 0xFF; + break; + case 6: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 8) & 0xFF; + break; + case 7: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].swch & 0xFF; + break; + case 8: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 24) & 0xFF; + break; + case 9: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 16) & 0xFF; + break; + case 10: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 8) & 0xFF; + break; + case 11: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].clear & 0xFF; + break; + case 12: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 24) & 0xFF; + break; + case 13: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 16) & 0xFF; + break; + case 14: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 8) & 0xFF; + break; + case 15: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].collect & 0xFF; + break; + case 16: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 24) & 0xFF; + break; + case 17: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 16) & 0xFF; + break; + case 18: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 8) & 0xFF; + break; + case 19: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].unk & 0xFF; + break; + case 20: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 24) & 0xFF; + break; + case 21: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 16) & 0xFF; + break; + case 22: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 8) & 0xFF; + break; + case 23: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].rooms & 0xFF; + break; + case 24: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 24) & 0xFF; + break; + case 25: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 16) & 0xFF; + break; + case 26: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 8) & 0xFF; + break; + case 27: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].floors & 0xFF; + break; + } +} + +void HandleRBASceneFlags(uint8_t itemToPutInBottle) { + // The rest of the items fall into the saved scene flags. Let's calculate the scene and which field it sets + u32 offset = gSaveContext.equips.buttonItems[3] - ITEM_SONG_LULLABY; + u32 scene = offset / sizeof(SavedSceneFlags); + switch (offset % sizeof(SavedSceneFlags)) { + case 0: + gSaveContext.sceneFlags[scene].chest = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].chest & 0x00FFFFFF); + break; + case 1: + gSaveContext.sceneFlags[scene].chest = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].chest & 0xFF00FFFF); + break; + case 2: + gSaveContext.sceneFlags[scene].chest = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].chest & 0xFFFF00FF); + break; + case 3: + gSaveContext.sceneFlags[scene].chest = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].chest & 0xFFFFFF00); + break; + case 4: + gSaveContext.sceneFlags[scene].swch = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].swch & 0x00FFFFFF); + break; + case 5: + gSaveContext.sceneFlags[scene].swch = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].swch & 0xFF00FFFF); + break; + case 6: + gSaveContext.sceneFlags[scene].swch = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].swch & 0xFFFF00FF); + break; + case 7: + gSaveContext.sceneFlags[scene].swch = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].swch & 0xFFFFFF00); + break; + case 8: + gSaveContext.sceneFlags[scene].clear = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].clear & 0x00FFFFFF); + break; + case 9: + gSaveContext.sceneFlags[scene].clear = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].clear & 0xFF00FFFF); + break; + case 10: + gSaveContext.sceneFlags[scene].clear = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].clear & 0xFFFF00FF); + break; + case 11: + gSaveContext.sceneFlags[scene].clear = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].clear & 0xFFFFFF00); + break; + case 12: + gSaveContext.sceneFlags[scene].collect = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].collect & 0x00FFFFFF); + break; + case 13: + gSaveContext.sceneFlags[scene].collect = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].collect & 0xFF00FFFF); + break; + case 14: + gSaveContext.sceneFlags[scene].collect = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].collect & 0xFFFF00FF); + break; + case 15: + gSaveContext.sceneFlags[scene].collect = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].collect & 0xFFFFFF00); + break; + case 16: + gSaveContext.sceneFlags[scene].unk = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].unk & 0x00FFFFFF); + break; + case 17: + gSaveContext.sceneFlags[scene].unk = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].unk & 0xFF00FFFF); + break; + case 18: + gSaveContext.sceneFlags[scene].unk = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].unk & 0xFFFF00FF); + break; + case 19: + gSaveContext.sceneFlags[scene].unk = itemToPutInBottle | (gSaveContext.sceneFlags[scene].unk & 0xFFFFFF00); + break; + case 20: + gSaveContext.sceneFlags[scene].rooms = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].rooms & 0x00FFFFFF); + break; + case 21: + gSaveContext.sceneFlags[scene].rooms = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].rooms & 0xFF00FFFF); + break; + case 22: + gSaveContext.sceneFlags[scene].rooms = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].rooms & 0xFFFF00FF); + break; + case 23: + gSaveContext.sceneFlags[scene].rooms = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].rooms & 0xFFFFFF00); + break; + case 24: + gSaveContext.sceneFlags[scene].floors = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].floors & 0x00FFFFFF); + break; + case 25: + gSaveContext.sceneFlags[scene].floors = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].floors & 0xFF00FFFF); + break; + case 26: + gSaveContext.sceneFlags[scene].floors = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].floors & 0xFFFF00FF); + break; + case 27: + gSaveContext.sceneFlags[scene].floors = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].floors & 0xFFFFFF00); + break; + } +} + +// padding bytes +void HandleBAPaddingBytes() { + // Reading from padding bytes is not implemented + gSaveContext.equips.buttonItems[0] = 0; +} + +void HandleRBAPaddingBytes() { + // Writing to padding bytes is not implemented +} + +// Bottle Adventure +void DoBA() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight >= ITEM_STICK && itemOnCRight <= ITEM_POTION_BLUE) { + HandleBAInventoryItems(); + } else if (itemOnCRight >= ITEM_FAIRY && itemOnCRight <= ITEM_MASK_BUNNY) { + HandleBAInventoryAmmo(); + } else if (itemOnCRight == ITEM_MASK_GORON || itemOnCRight == ITEM_MASK_ZORA) { + HandleBAInventoryEquipment(); + } else if (itemOnCRight == ITEM_MASK_GERUDO || itemOnCRight == ITEM_MASK_TRUTH) { + HandleBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SOLD_OUT && itemOnCRight <= ITEM_COJIRO) { + HandleBAInventoryUpgrades(); + } else if (itemOnCRight >= ITEM_ODD_MUSHROOM && itemOnCRight <= ITEM_SWORD_BROKEN) { + HandleBAInventoryQuestItems(); + } else if (itemOnCRight >= ITEM_PRESCRIPTION && itemOnCRight <= ITEM_BULLET_BAG_30) { + HandleBAInventoryDungeonItems(); + } else if (itemOnCRight >= ITEM_BULLET_BAG_40 && itemOnCRight <= ITEM_SWORD_KNIFE) { + HandleBAInventoryDungeonKeys(); + } else if (itemOnCRight == ITEM_SONG_BOLERO) { + HandleBAInventoryDefenseHearts(); + } else if (itemOnCRight == ITEM_SONG_SERENADE || itemOnCRight == ITEM_SONG_REQUIEM) { + HandleBAInventoryGSTokens(); + } else if (itemOnCRight == ITEM_SONG_NOCTURNE || itemOnCRight == ITEM_SONG_PRELUDE) { + HandleBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SONG_LULLABY) { + HandleBASceneFlags(); + } +} + +// Reverse Bottle Adventure +void DoRBA(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight >= ITEM_STICK && itemOnCRight <= ITEM_POTION_BLUE) { + HandleRBAInventoryItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_FAIRY && itemOnCRight <= ITEM_MASK_BUNNY) { + HandleRBAInventoryAmmo(itemToPutInBottle); + } else if (itemOnCRight == ITEM_MASK_GORON || itemOnCRight == ITEM_MASK_ZORA) { + HandleRBAInventoryEquipment(itemToPutInBottle); + } else if (itemOnCRight == ITEM_MASK_GERUDO || itemOnCRight == ITEM_MASK_TRUTH) { + HandleRBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SOLD_OUT && itemOnCRight <= ITEM_COJIRO) { + HandleRBAInventoryUpgrades(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_ODD_MUSHROOM && itemOnCRight <= ITEM_SWORD_BROKEN) { + HandleRBAInventoryQuestItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_PRESCRIPTION && itemOnCRight <= ITEM_BULLET_BAG_30) { + HandleRBAInventoryDungeonItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_BULLET_BAG_40 && itemOnCRight <= ITEM_SWORD_KNIFE) { + HandleRBAInventoryDungeonKeys(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_BOLERO) { + HandleRBAInventoryDefenseHearts(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_SERENADE || itemOnCRight == ITEM_SONG_REQUIEM) { + HandleRBAInventoryGSTokens(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_NOCTURNE || itemOnCRight == ITEM_SONG_PRELUDE) { + HandleRBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SONG_LULLABY) { + HandleRBASceneFlags(itemToPutInBottle); + } +} + +void RegisterBottleAdventure() { + REGISTER_VB_SHOULD(VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, { + // if we aren't dealing with the b button, early return + auto button = static_cast(va_arg(args, int32_t)); + if (button != 0) { + return; + } + + *should = false; + DoBA(); + }); + + REGISTER_VB_SHOULD(VB_UPDATE_BOTTLE_ITEM, { + // if we aren't dealing with a bottle on b, early return + auto buttonBottleIsOn = static_cast(va_arg(args, int32_t)); + if (buttonBottleIsOn != 0) { + return; + } + + *should = false; + + auto itemToPutInBottle = static_cast(va_arg(args, int32_t)); + DoRBA(itemToPutInBottle); + }); +} + +static RegisterShipInitFunc initFunc(RegisterBottleAdventure); diff --git a/soh/soh/Enhancements/Restorations/N64WeirdFrames/N64WeirdFrames.cpp b/soh/soh/Enhancements/Restorations/N64WeirdFrames/N64WeirdFrames.cpp new file mode 100644 index 0000000000..0e6b1cbf38 --- /dev/null +++ b/soh/soh/Enhancements/Restorations/N64WeirdFrames/N64WeirdFrames.cpp @@ -0,0 +1,170 @@ +#include "public/bridge/consolevariablebridge.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" + +#include +#include + +#include "WeirdAnimation.h" + +extern "C" { +#include "macros.h" +#include "z64player.h" + +#include "objects/gameplay_keep/gameplay_keep.h" + +int ResourceMgr_OTRSigCheck(char* imgData); +AnimationHeaderCommon* ResourceMgr_LoadAnimByName(const char* path); +} + +#define CVAR_NAME CVAR_ENHANCEMENT("N64WeirdFrames") +#define CVAR_DEFAULT 0 +#define CVAR_VALUE CVarGetInteger(CVAR_NAME, CVAR_DEFAULT) + +// A list of weird animations to contruct. These can either be an index out of bounds before +// the start of the animation or past the end of it. In either case you add a list of animations' +// data that are neighboring before or after the target animation. If more weird frame data is +// required then add more of the neighboring animations in ROM. +static std::vector weirdAnimations{ + // For weirdshots. + { gPlayerAnim_link_bow_side_walk, + PLAYER_LIMB_MAX, + IndexDirection::BACKWARD, + { + "__OTR__misc/link_animetion/gPlayerAnimData_0940E0", + "__OTR__misc/link_animetion/gPlayerAnimData_096370", + "__OTR__misc/link_animetion/gPlayerAnimData_096610", + "__OTR__misc/link_animetion/gPlayerAnimData_097650", + "__OTR__misc/link_animetion/gPlayerAnimData_097FC0", + } }, + // For weirdslides. + { gPlayerAnim_link_normal_side_walk, + PLAYER_LIMB_MAX, + IndexDirection::BACKWARD, + { + "__OTR__misc/link_animetion/gPlayerAnimData_1AFDD0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B0E10", + "__OTR__misc/link_animetion/gPlayerAnimData_1B1910", + "__OTR__misc/link_animetion/gPlayerAnimData_1B20F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B25B0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B2B80", + "__OTR__misc/link_animetion/gPlayerAnimData_1B3600", + "__OTR__misc/link_animetion/gPlayerAnimData_1B4080", + "__OTR__misc/link_animetion/gPlayerAnimData_1B4B00", + "__OTR__misc/link_animetion/gPlayerAnimData_1B51D0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B5BD0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B6C10", + "__OTR__misc/link_animetion/gPlayerAnimData_1B72E0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B7B40", + } }, + // For weirdslides. + { gPlayerAnim_link_normal_side_walk, + PLAYER_LIMB_MAX, + IndexDirection::FORWARD, + { + "__OTR__misc/link_animetion/gPlayerAnimData_1B92D0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B9B30", + "__OTR__misc/link_animetion/gPlayerAnimData_1BA390", + "__OTR__misc/link_animetion/gPlayerAnimData_1BB2C0", + "__OTR__misc/link_animetion/gPlayerAnimData_1BC6B0", + "__OTR__misc/link_animetion/gPlayerAnimData_1BCA60", + "__OTR__misc/link_animetion/gPlayerAnimData_1BDC30", + "__OTR__misc/link_animetion/gPlayerAnimData_1BE410", + "__OTR__misc/link_animetion/gPlayerAnimData_1BF6F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C01F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C0CF0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C1230", + } }, + // For weirdslides. + { gPlayerAnim_link_normal_side_walk_free, + PLAYER_LIMB_MAX, + IndexDirection::BACKWARD, + { + "__OTR__misc/link_animetion/gPlayerAnimData_1B1910", + "__OTR__misc/link_animetion/gPlayerAnimData_1B20F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B25B0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B2B80", + "__OTR__misc/link_animetion/gPlayerAnimData_1B3600", + "__OTR__misc/link_animetion/gPlayerAnimData_1B4080", + "__OTR__misc/link_animetion/gPlayerAnimData_1B4B00", + "__OTR__misc/link_animetion/gPlayerAnimData_1B51D0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B5BD0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B6C10", + "__OTR__misc/link_animetion/gPlayerAnimData_1B72E0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B7B40", + "__OTR__misc/link_animetion/gPlayerAnimData_1B83A0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B92D0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B9B30", + } }, + // For weirdslides. + { gPlayerAnim_link_normal_side_walk_free, + PLAYER_LIMB_MAX, + IndexDirection::FORWARD, + { + "__OTR__misc/link_animetion/gPlayerAnimData_1BB2C0", + "__OTR__misc/link_animetion/gPlayerAnimData_1BC6B0", + "__OTR__misc/link_animetion/gPlayerAnimData_1BCA60", + "__OTR__misc/link_animetion/gPlayerAnimData_1BDC30", + "__OTR__misc/link_animetion/gPlayerAnimData_1BE410", + "__OTR__misc/link_animetion/gPlayerAnimData_1BF6F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C01F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C0CF0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C1230", + "__OTR__misc/link_animetion/gPlayerAnimData_1C1C30", + "__OTR__misc/link_animetion/gPlayerAnimData_1C2630", + } }, +}; + +void RegisterN64WeirdFrames() { + COND_VB_SHOULD(VB_LOAD_PLAYER_ANIMATION_FRAME, CVAR_VALUE, { + const auto entry = va_arg(args, AnimationEntry*); + if (entry == nullptr) { + return; + } + + auto animation = va_arg(args, LinkAnimationHeader*); + auto frame = va_arg(args, s32); + const auto limbCount = va_arg(args, s32); + const auto frameTable = va_arg(args, Vec3s*); + + std::optional animationName; + + if (ResourceMgr_OTRSigCheck(reinterpret_cast(animation)) != 0) { + animationName = reinterpret_cast(animation); + animation = reinterpret_cast(ResourceMgr_LoadAnimByName(*animationName)); + } + + const auto playerAnimHeader = + static_cast(SEGMENTED_TO_VIRTUAL(static_cast(animation))); + + if (frame < 0 || frame >= playerAnimHeader->common.frameCount) { + const auto direction = frame < 0 ? IndexDirection::BACKWARD : IndexDirection::FORWARD; + + if (animationName.has_value()) { + for (auto& weirdAnimation : weirdAnimations) { + if (weirdAnimation.GetDirection() == direction && + weirdAnimation.GetTargetAnimation() == *animationName) { + if (const auto frameData = weirdAnimation.GetFrame(frame, playerAnimHeader->common.frameCount); + frameData != nullptr) { + *should = false; + + SPDLOG_DEBUG("Weird animation for \"{}\": frame {}", weirdAnimation.GetTargetAnimation(), + frame); + std::memcpy(frameTable, frameData, sizeof(Vec3s) * limbCount + sizeof(s16)); + } else { + SPDLOG_WARN("Weird Frame {} not included in weird animation for \"{}\"", frame, + weirdAnimation.GetTargetAnimation()); + } + + return; + } + } + } + + SPDLOG_WARN("Weird Animation not present for \"{}\" but frame {} is out of bounds", + animationName.has_value() ? *animationName : "", frame); + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterN64WeirdFrames, { CVAR_NAME }); diff --git a/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.cpp b/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.cpp new file mode 100644 index 0000000000..bd812c658a --- /dev/null +++ b/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.cpp @@ -0,0 +1,65 @@ +#include "WeirdAnimation.h" + +#include "resource/ResourceManager.h" +#include "Context.h" + +#include +#include +#include + +extern "C" { +#include "z64math.h" +} + +const void* WeirdAnimation::GetFrame(s32 frame, s32 targetAnimationFrameCount) { + if (!animationData.has_value()) { + Build(); + } + + if (direction == IndexDirection::BACKWARD) { + const auto frameData = std::end(*animationData) + (((sizeof(Vec3s) * limbCount + sizeof(s16)) * frame)); + + return frameData >= std::begin(*animationData) ? &*frameData : nullptr; + } else if (direction == IndexDirection::FORWARD) { + const auto frameData = std::begin(*animationData) + + (((sizeof(Vec3s) * limbCount + sizeof(s16)) * (frame - targetAnimationFrameCount))); + + return frameData < std::end(*animationData) ? &*frameData : nullptr; + } else { + SPDLOG_ERROR("Expected valid IndexDirection, got: {}", static_cast(direction)); + assert(false); + return nullptr; + } +} + +void WeirdAnimation::Build() { + auto& animation = animationData.emplace(); + + for (const auto& neighborName : neighborAnimations) { + const auto neighbor = Ship::Context::GetInstance()->GetResourceManager()->LoadResource(neighborName); + + const auto prevSize = animation.size(); + animation.resize(prevSize + neighbor->GetPointerSize()); + std::memcpy(animation.data() + prevSize, neighbor->GetRawPointer(), neighbor->GetPointerSize()); + + // Animation data in ROM is padded to 0x10 bytes. Align the buffer the same way. + animation.resize((animation.size() + 0xF) & ~0xF); + } + + const auto frameCount = animation.size() / (sizeof(Vec3s) * limbCount + sizeof(s16)); + const auto directionStr = [this] { + switch (direction) { + case IndexDirection::BACKWARD: + return "backward"; + case IndexDirection::FORWARD: + return "forward"; + default: + SPDLOG_ERROR("Expected valid IndexDirection, got: {}", static_cast(direction)); + assert(false); + return "???"; + } + }(); + + SPDLOG_DEBUG("Weird animation built for \"{}\": frameCount = {}, direction = {}", targetAnimation, frameCount, + directionStr); +} diff --git a/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.h b/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.h new file mode 100644 index 0000000000..e8c3537200 --- /dev/null +++ b/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include + +enum class IndexDirection { + BACKWARD, + FORWARD, +}; + +class WeirdAnimation { + public: + WeirdAnimation(std::string targetAnimation, s32 limbCount, IndexDirection direction, + std::vector neighborAnimations) + : targetAnimation(std::move(targetAnimation)), limbCount(limbCount), direction(direction), + neighborAnimations(std::move(neighborAnimations)) { + } + + const std::string& GetTargetAnimation() { + return targetAnimation; + } + + IndexDirection GetDirection() { + return direction; + } + + const void* GetFrame(s32 frame, s32 targetAnimationFrameCount); + + private: + std::string targetAnimation; + s32 limbCount; + IndexDirection direction; + std::vector neighborAnimations; + + std::optional> animationData; + + void Build(); +}; diff --git a/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp b/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp index 373d481ef9..090c46a60e 100644 --- a/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp +++ b/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp @@ -31,8 +31,9 @@ void RegisterPauseBufferInputs() { COND_VB_SHOULD(VB_KALEIDO_UNPAUSE_CLOSE, CVAR_BUFFER_VALUE || CVAR_INCLUDE_VALUE, { Input* input = &gPlayState->state.input[0]; - // STEP #3: If the user opts to include held inputs in the buffer window, store the currnently held inputs, minus - // the held inputs when the pause menu was opened. This only applies to the first frame of the buffer window + // STEP #3: If the user opts to include held inputs in the buffer window, store the currnently held inputs, + // minus the held inputs when the pause menu was opened. This only applies to the first frame of the buffer + // window if (CVAR_INCLUDE_VALUE && inputBufferTimer == 0) { pauseInputs |= input->cur.button & ~prePauseInputs; prePauseInputs = 0; @@ -56,16 +57,15 @@ void RegisterPauseBufferInputs() { Input* input = &gPlayState->state.input[0]; PauseContext* pauseCtx = &gPlayState->pauseCtx; - // STEP #1: If the user opts to include held inputs in the buffer window, store the held inputs at the beginning + // STEP #1: If the user opts to include held inputs in the buffer window, store the held inputs at the beginning // of the pause process, minus the START input if (pauseCtx->state == PAUSE_STATE_OPENING_1 && CVAR_INCLUDE_VALUE) { prePauseInputs = input->cur.button & ~BTN_START; } // STEP #2: The unpause process has begun, so let's reset the input buffer timer - if (pauseCtx->state == PAUSE_STATE_UNPAUSE_SETUP || ( - pauseCtx->state == PAUSE_STATE_SAVEPROMPT && (pauseCtx->unk_1EC == 2 || pauseCtx->unk_1EC == 5) - )) { + if (pauseCtx->state == PAUSE_STATE_UNPAUSE_SETUP || + (pauseCtx->state == PAUSE_STATE_SAVEPROMPT && (pauseCtx->unk_1EC == 2 || pauseCtx->unk_1EC == 5))) { inputBufferTimer = 0; } diff --git a/soh/soh/Enhancements/SkipAmyPuzzle.cpp b/soh/soh/Enhancements/SkipAmyPuzzle.cpp new file mode 100644 index 0000000000..27486e04cd --- /dev/null +++ b/soh/soh/Enhancements/SkipAmyPuzzle.cpp @@ -0,0 +1,8 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" + +void RegisterSkipAmyPuzzle() { + COND_VB_SHOULD(VB_AMY_SOLVE, CVarGetInteger(CVAR_ENHANCEMENT("SkipAmyPuzzle"), 0), { *should = true; }); +} + +static RegisterShipInitFunc initFunc(RegisterSkipAmyPuzzle, { CVAR_ENHANCEMENT("SkipAmyPuzzle") }); \ No newline at end of file diff --git a/soh/soh/Enhancements/SwitchTimerMultiplier.cpp b/soh/soh/Enhancements/SwitchTimerMultiplier.cpp new file mode 100644 index 0000000000..94982837d8 --- /dev/null +++ b/soh/soh/Enhancements/SwitchTimerMultiplier.cpp @@ -0,0 +1,29 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +extern PlayState* gPlayState; +} + +void RegisterSwitchTimerMultiplier() { + COND_VB_SHOULD(VB_SWITCH_TIMER_TICK, CVarGetInteger(CVAR_ENHANCEMENT("SwitchTimerMultiplier"), 0) != 0, { + int multiplier = CVarGetInteger(CVAR_ENHANCEMENT("SwitchTimerMultiplier"), 0); + if (multiplier != 0) { + Actor* actor = va_arg(args, Actor*); + if (multiplier < -3 && actor->id == ACTOR_OBJ_SYOKUDAI) { + multiplier = -3; + } else if (multiplier < -4 && actor->id == ACTOR_BG_GND_DARKMEIRO) { + multiplier = -4; + } + + if (multiplier > 0 && gPlayState->gameplayFrames % (multiplier + 1) != 0) { + *should = false; + } else if (gPlayState->gameplayFrames % (6 + multiplier) == 0) { + s16* timer = va_arg(args, s16*); + *timer -= *timer > 1; + } + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterSwitchTimerMultiplier, { CVAR_ENHANCEMENT("SwitchTimerMultiplier") }); diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp index 05e03dae16..8f1f0ac402 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp @@ -37,10 +37,10 @@ const static std::vector> digitList = { }; const std::vector timeDisplayList = { - { DISPLAY_IN_GAME_TIMER, "Display Gameplay Timer", CVAR_ENHANCEMENT("TimeDisplay.Timers.InGameTimer") }, - { DISPLAY_TIME_OF_DAY, "Display Time of Day", CVAR_ENHANCEMENT("TimeDisplay.Timers.TimeofDay") }, - { DISPLAY_CONDITIONAL_TIMER, "Display Conditional Timer", CVAR_ENHANCEMENT("TimeDisplay.Timers.HotWater") }, - { DISPLAY_NAVI_TIMER, "Display Navi Timer", CVAR_ENHANCEMENT("TimeDisplay.Timers.NaviTimer") } + { DISPLAY_IN_GAME_TIMER, "Display Gameplay Timer", CVAR_TIME_DISPLAY("Timers.InGameTimer") }, + { DISPLAY_TIME_OF_DAY, "Display Time of Day", CVAR_TIME_DISPLAY("Timers.TimeofDay") }, + { DISPLAY_CONDITIONAL_TIMER, "Display Conditional Timer", CVAR_TIME_DISPLAY("Timers.HotWater") }, + { DISPLAY_NAVI_TIMER, "Display Navi Timer", CVAR_TIME_DISPLAY("Timers.NaviTimer") } }; static std::vector activeTimers; @@ -81,7 +81,7 @@ static void TimeDisplayGetTimer(uint32_t timeID) { textColor = COLOR_WHITE; Player* player = GET_PLAYER(gPlayState); - uint32_t timer1 = gSaveContext.timer1Value; + uint32_t timer1 = gSaveContext.timerSeconds; switch (timeID) { case DISPLAY_IN_GAME_TIMER: @@ -99,20 +99,20 @@ static void TimeDisplayGetTimer(uint32_t timeID) { timeDisplayTime = convertDayTime(gSaveContext.dayTime).c_str(); break; case DISPLAY_CONDITIONAL_TIMER: - if (gSaveContext.timer1State > 0) { - timeDisplayTime = formatHotWaterDisplay(gSaveContext.timer1Value).c_str(); + if (gSaveContext.timerState > 0) { + timeDisplayTime = formatHotWaterDisplay(gSaveContext.timerSeconds).c_str(); textColor = - gSaveContext.timer1State <= 4 + gSaveContext.timerState <= 4 ? (gPlayState->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_3 ? COLOR_LIGHT_RED : COLOR_LIGHT_BLUE) : COLOR_WHITE; - if (gSaveContext.timer1State <= 4) { + if (gSaveContext.timerState <= 4) { textureDisplay = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( gPlayState->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_3 ? itemMapping[ITEM_TUNIC_GORON].name : itemMapping[ITEM_TUNIC_ZORA].name); } - if (gSaveContext.timer1State >= 6) { + if (gSaveContext.timerState >= 6) { textureDisplay = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( itemMapping[ITEM_SWORD_MASTER].name); } @@ -147,18 +147,18 @@ void TimeDisplayUpdateDisplayOptions() { } } - //if (pushBack) { - // activeTimers.push_back(timeDisplayList[timeID]); - //} else { - // uint32_t index = 0; - // for (auto& check : activeTimers) { - // if (check.timeID == timeID) { - // activeTimers.erase(activeTimers.begin() + index); - // return; - // } - // index++; - // } - //} + // if (pushBack) { + // activeTimers.push_back(timeDisplayList[timeID]); + // } else { + // uint32_t index = 0; + // for (auto& check : activeTimers) { + // if (check.timeID == timeID) { + // activeTimers.erase(activeTimers.begin() + index); + // return; + // } + // index++; + // } + // } } void TimeDisplayWindow::Draw() { @@ -174,9 +174,9 @@ void TimeDisplayWindow::Draw() { ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); ImGui::Begin("TimerDisplay", nullptr, - ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoFocusOnAppearing | - ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar); + ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoFocusOnAppearing | + ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar); ImGui::SetWindowFontScale(fontScale); if (activeTimers.size() == 0) { ImGui::Text("No Enabled Timers..."); @@ -227,11 +227,11 @@ void TimeDisplayWindow::Draw() { } void TimeDisplayInitSettings() { - fontScale = CVarGetFloat(CVAR_ENHANCEMENT("TimeDisplay.FontScale"), 1.0f); + fontScale = CVarGetFloat(CVAR_TIME_DISPLAY("FontScale"), 1.0f); if (fontScale < 1.0f) { fontScale = 1.0f; } - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeDisplay.ShowWindowBG"), 0)) { + if (CVarGetInteger(CVAR_TIME_DISPLAY("ShowWindowBG"), 0)) { windowBG = ImVec4(0, 0, 0, 0); } else { windowBG = ImVec4(0, 0, 0, 0.5f); @@ -247,13 +247,17 @@ static void TimeDisplayInitTimers() { } void TimeDisplayWindow::InitElement() { - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("GAMEPLAY_TIMER", gClockIconTex, ImVec4(1, 1, 1, 1)); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("DAY_TIME_TIMER", gSunIconTex, ImVec4(1, 1, 1, 1)); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("NIGHT_TIME_TIMER", gMoonIconTex, ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("GAMEPLAY_TIMER", gClockIconTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("DAY_TIME_TIMER", gSunIconTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("NIGHT_TIME_TIMER", gMoonIconTex, + ImVec4(1, 1, 1, 1)); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("NAVI_TIMER", gNaviIconTex, ImVec4(1, 1, 1, 1)); for (auto& load : digitList) { - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(load.first.c_str(), load.second, ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(load.first.c_str(), load.second, + ImVec4(1, 1, 1, 1)); } TimeDisplayInitSettings(); diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h index 090ac2901f..c6635b5a77 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h @@ -1,32 +1,32 @@ #include -class TimeDisplayWindow : public Ship::GuiWindow { +class TimeDisplayWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void InitElement() override; - void DrawElement() override {}; + void DrawElement() override{}; void Draw() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; void TimeDisplayUpdateDisplayOptions(); void TimeDisplayInitSettings(); -typedef enum { +typedef enum TimerDisplay { DISPLAY_IN_GAME_TIMER, DISPLAY_TIME_OF_DAY, DISPLAY_CONDITIONAL_TIMER, - DISPLAY_NAVI_TIMER -}; + DISPLAY_NAVI_TIMER, +} TimerDisplay; -typedef enum { +typedef enum NaviTimerValues { NAVI_PREPARE = 600, NAVI_ACTIVE = 3000, NAVI_COOLDOWN = 25800, DAY_BEGINS = 17759, NIGHT_BEGINS = 49155 -}; +} NaviTimerValues; typedef struct { uint32_t timeID; @@ -34,4 +34,4 @@ typedef struct { const char* timeEnable; } TimeObject; -extern const std::vector timeDisplayList; \ No newline at end of file +extern const std::vector timeDisplayList; diff --git a/soh/soh/Enhancements/TimeSavers/CrawlSpeed.cpp b/soh/soh/Enhancements/TimeSavers/CrawlSpeed.cpp new file mode 100644 index 0000000000..896f07973c --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/CrawlSpeed.cpp @@ -0,0 +1,110 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "global.h" + +extern "C" { +#include "functions.h" +#include "objects/gameplay_keep/gameplay_keep.h" +extern PlayState* gPlayState; +} + +#define CVAR_CRAWL_SPEED_NAME CVAR_ENHANCEMENT("CrawlSpeed") +#define CVAR_CRAWL_SPEED_DEFAULT 1 +#define CVAR_CRAWL_SPEED_VALUE CVarGetInteger(CVAR_CRAWL_SPEED_NAME, CVAR_CRAWL_SPEED_DEFAULT) +#define CVAR_GLITCH_AIDING_NAME CVAR_ENHANCEMENT("GlitchAidingCrawlspaces") +#define CVAR_GLITCH_AIDING_DEFAULT 0 +#define CVAR_GLITCH_AIDING_VALUE CVarGetInteger(CVAR_GLITCH_AIDING_NAME, CVAR_GLITCH_AIDING_DEFAULT) + +extern "C" void ExitCrawlspace(Player* player, PlayState* play) { + LinkAnimationHeader* animExit = (LinkAnimationHeader*)gPlayerAnim_link_child_tunnel_end; + LinkAnimationHeader* animEnter = (LinkAnimationHeader*)gPlayerAnim_link_child_tunnel_start; + + if (player->linearVelocity > 0.0f) { + // Leaving a crawlspace forwards + player->actor.shape.rot.y = player->actor.wallYaw + 0x8000; + LinkAnimation_Change(play, &player->skelAnime, animExit, ((CVAR_CRAWL_SPEED_VALUE + 1.0f) / 2.0f), 0.0f, + Animation_GetLastFrame(animExit), ANIMMODE_ONCE, 0.0f); + Player_StartAnimMovement(play, player, 0x9D); + OnePointCutscene_Init(play, 9601, 999, NULL, MAIN_CAM); + } else { + // Leaving a crawlspace backwards + player->actor.shape.rot.y = player->actor.wallYaw; + LinkAnimation_Change(play, &player->skelAnime, animEnter, -1.0f * ((CVAR_CRAWL_SPEED_VALUE + 1.0f) / 2.0f), + Animation_GetLastFrame(animEnter), 0.0f, ANIMMODE_ONCE, 0.0f); + Player_StartAnimMovement(play, player, 0x9D); + OnePointCutscene_Init(play, 9602, 999, NULL, MAIN_CAM); + } +} + +extern "C" void ExitCrawlspaceCS(PlayState* play, Camera* csCam, int16_t actionParameters, int16_t initTimer, + CutsceneCameraPoint* atPoints, CutsceneCameraPoint* eyePoints) { + s16 camCrawlTemp = CVAR_CRAWL_SPEED_VALUE; + s16 camCrawlTimer = initTimer / camCrawlTemp; + + OnePointCutscene_SetCsCamPoints(csCam, actionParameters | 0x1000, camCrawlTimer, atPoints, eyePoints); +} + +extern "C" void EnterCrawlspace(Player* player, PlayState* play) { + LinkAnimationHeader* anim = (LinkAnimationHeader*)gPlayerAnim_link_child_tunnel_start; + + LinkAnimation_Change(play, &player->skelAnime, anim, ((CVAR_CRAWL_SPEED_VALUE + 1.0f) / 2.0f), 0.0f, + Animation_GetLastFrame(anim), ANIMMODE_ONCE, 0.0f); +} + +extern "C" void IncreaseCrawlSpeed(Player* player, PlayState* play) { + Input* sControlInput = &play->state.input[0]; + player->linearVelocity = sControlInput->rel.stick_y * 0.03f * CVAR_CRAWL_SPEED_VALUE; +} + +void CrawlSpeed_Register() { + bool shouldRegister = CVAR_CRAWL_SPEED_VALUE > 1; + + COND_VB_SHOULD(VB_CRAWL_SPEED_EXIT, shouldRegister, { + Player* player = GET_PLAYER(gPlayState); + bool excludeWellBackroom = (player->actor.world.pos.x > 950.0f) && (player->actor.world.pos.x < 1025.0f) && + (player->actor.world.pos.z > -1510.0f) && (player->actor.world.pos.z < -1490.0f) && + gPlayState->sceneNum == SCENE_BOTTOM_OF_THE_WELL; + bool excludeGlitchAiding = CVAR_GLITCH_AIDING_VALUE; + if (excludeGlitchAiding && excludeWellBackroom) { + *should = true; + } else { + ExitCrawlspace(player, gPlayState); + *should = false; + } + }); + + COND_VB_SHOULD(VB_CRAWL_SPEED_EXIT_CS, shouldRegister, { + Player* player = GET_PLAYER(gPlayState); + Camera* csCam = va_arg(args, Camera*); + s16 csId = static_cast(va_arg(args, int)); + s16 actionParameters = static_cast(va_arg(args, int)); + s16 initTimer = static_cast(va_arg(args, int)); + CutsceneCameraPoint* atPoints = va_arg(args, CutsceneCameraPoint*); + CutsceneCameraPoint* eyePoints = va_arg(args, CutsceneCameraPoint*); + bool excludeWellBackroom = (player->actor.world.pos.x > 950.0f) && (player->actor.world.pos.x < 1025.0f) && + (player->actor.world.pos.z > -1510.0f) && (player->actor.world.pos.z < -1490.0f) && + gPlayState->sceneNum == SCENE_BOTTOM_OF_THE_WELL; + bool excludeGlitchAiding = CVAR_GLITCH_AIDING_VALUE; + if (excludeGlitchAiding && excludeWellBackroom) { + *should = true; + } else { + ExitCrawlspaceCS(gPlayState, csCam, actionParameters, initTimer, atPoints, eyePoints); + *should = false; + } + }); + + COND_VB_SHOULD(VB_CRAWL_SPEED_ENTER, shouldRegister, { + Player* player = GET_PLAYER(gPlayState); + EnterCrawlspace(player, gPlayState); + *should = false; + }); + + COND_VB_SHOULD(VB_CRAWL_SPEED_INCREASE, shouldRegister, { + Player* player = GET_PLAYER(gPlayState); + IncreaseCrawlSpeed(player, gPlayState); + *should = false; + }); +} + +static RegisterShipInitFunc initSpeed(CrawlSpeed_Register, { CVAR_CRAWL_SPEED_NAME }); \ No newline at end of file diff --git a/soh/soh/Enhancements/TimeSavers/FasterBeanSkulltula.cpp b/soh/soh/Enhancements/TimeSavers/FasterBeanSkulltula.cpp new file mode 100644 index 0000000000..20011bba31 --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/FasterBeanSkulltula.cpp @@ -0,0 +1,13 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "z64save.h" +} + +void RegisterFasterBeanSkulltula() { + COND_VB_SHOULD(VB_SPAWN_BEAN_SKULLTULA, CVarGetInteger(CVAR_ENHANCEMENT("FasterBeanSkull"), 0), + { *should = true; }); +} + +static RegisterShipInitFunc initFunc(RegisterFasterBeanSkulltula, { CVAR_ENHANCEMENT("FasterBeanSkull") }); diff --git a/soh/soh/Enhancements/TimeSavers/FasterBottleEmpty.cpp b/soh/soh/Enhancements/TimeSavers/FasterBottleEmpty.cpp new file mode 100644 index 0000000000..47b6b7461e --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/FasterBottleEmpty.cpp @@ -0,0 +1,19 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "z64save.h" +} + +void RegisterFasterEmptyBottle() { + COND_VB_SHOULD(VB_EMPTYING_BOTTLE, CVarGetInteger(CVAR_ENHANCEMENT("FasterBottleEmpty"), 0), { + Player* player = va_arg(args, Player*); + if (player->skelAnime.curFrame <= 60.0f) { + player->skelAnime.playSpeed = 3.0f; + } else { + player->skelAnime.playSpeed = 1.0f; + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterFasterEmptyBottle, { CVAR_ENHANCEMENT("FasterBottleEmpty") }); diff --git a/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp b/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp index 73909cbdad..05a98fd808 100644 --- a/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp +++ b/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp @@ -1,58 +1,56 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" -#include "spdlog/spdlog.h" +#include "soh/ShipInit.hpp" extern "C" { - #include "z64save.h" - #include "macros.h" - #include "variables.h" - #include "functions.h" - extern PlayState* gPlayState; - extern SaveContext gSaveContext; +#include "z64save.h" +#include "macros.h" +#include "variables.h" +#include "functions.h" +extern PlayState* gPlayState; +extern SaveContext gSaveContext; } +#define CVAR_BLOCKLIFT_NAME CVAR_ENHANCEMENT("FasterHeavyBlockLift") +#define CVAR_BLOCKLIFT_VALUE CVarGetInteger(CVAR_BLOCKLIFT_NAME, 0) + +#define CVAR_SKIP_CUTSCENE_NAME CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint") +#define CVAR_SKIP_CUTSCENE_VALUE CVarGetInteger(CVAR_SKIP_CUTSCENE_NAME, IS_RANDO) + /** * This primarily handles speeding up the heavy block lifts (OGC and in the Fire Trial) but also handles skipping * the one point cutscene since the two options are so similar in what they do. */ -void FasterHeavyBlockLift_Register() { - REGISTER_VB_SHOULD(VB_PLAY_ONEPOINT_ACTOR_CS, { +void RegisterFasterHeavyBlockLift() { + COND_VB_SHOULD(VB_PLAY_ONEPOINT_ACTOR_CS, CVAR_BLOCKLIFT_VALUE || CVAR_SKIP_CUTSCENE_VALUE, { Actor* actor = va_arg(args, Actor*); - if ( - actor->id == ACTOR_BG_HEAVY_BLOCK && - (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO)) - ) { + if (actor->id == ACTOR_BG_HEAVY_BLOCK) { *should = false; } }); - REGISTER_VB_SHOULD(VB_FREEZE_LINK_FOR_BLOCK_THROW, { - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO)) { - *should = false; - } - }); + COND_VB_SHOULD(VB_FREEZE_LINK_FOR_BLOCK_THROW, CVAR_BLOCKLIFT_VALUE || CVAR_SKIP_CUTSCENE_VALUE, + { *should = false; }); - REGISTER_VB_SHOULD(VB_PLAY_THROW_ANIMATION, { - Player *player = GET_PLAYER(gPlayState); + COND_VB_SHOULD(VB_PLAY_THROW_ANIMATION, CVAR_BLOCKLIFT_VALUE, { + Player* player = GET_PLAYER(gPlayState); Actor* interactRangeActor = player->interactRangeActor; s32 interactActorId = interactRangeActor->id; LinkAnimationHeader* anim = va_arg(args, LinkAnimationHeader*); // Same actor is used for small and large silver rocks, use actor params to identify large ones - bool isLargeSilverRock = interactActorId == ACTOR_EN_ISHI && interactRangeActor->params & 1 == 1; - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) && (isLargeSilverRock || interactActorId == ACTOR_BG_HEAVY_BLOCK)) { + bool isLargeSilverRock = (interactActorId == ACTOR_EN_ISHI) && ((interactRangeActor->params & 1) == 1); + if (isLargeSilverRock || interactActorId == ACTOR_BG_HEAVY_BLOCK) { *should = false; LinkAnimation_PlayOnceSetSpeed(gPlayState, &player->skelAnime, anim, 5.0f); } }); - REGISTER_VB_SHOULD(VB_MOVE_THROWN_ACTOR, { - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0)) { - Actor* heldActor = va_arg(args, Actor*); + COND_VB_SHOULD(VB_MOVE_THROWN_ACTOR, CVAR_BLOCKLIFT_VALUE, { + Actor* heldActor = va_arg(args, Actor*); - heldActor->shape.rot.x -= 3510; - } + heldActor->shape.rot.x -= 3510; }); } + +static RegisterShipInitFunc initFunc(RegisterFasterHeavyBlockLift, { CVAR_BLOCKLIFT_NAME, CVAR_SKIP_CUTSCENE_NAME }); diff --git a/soh/soh/Enhancements/TimeSavers/FasterPauseMenu.cpp b/soh/soh/Enhancements/TimeSavers/FasterPauseMenu.cpp new file mode 100644 index 0000000000..d9f23216de --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/FasterPauseMenu.cpp @@ -0,0 +1,35 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "variables.h" +extern PlayState* gPlayState; +extern void func_808237B4(PlayState* play, Input* input); +} + +#define CVAR_FASTER_PAUSE_MENU_NAME CVAR_ENHANCEMENT("FasterPauseMenu") +#define CVAR_FASTER_PAUSE_MENU_VALUE CVarGetInteger(CVAR_FASTER_PAUSE_MENU_NAME, 0) + +void OnKaleidoUpdateFaster() { + ZREG(46) = 2; // pauseCtx->eye and pauseCtx->unk_1EA multiply by this for animation. Double the default value. + WREG(6) = 4; // Numerous kaleido animations divide by this for movement and alpha. Half the default value. + + // Page turn animation is governed by func_808237B4. Those values don't use registers to modify the speed, so we + // just directly call it twice to effectively double the speed. + if (gPlayState->pauseCtx.state == 6 && gPlayState->pauseCtx.unk_1E4 == 1) { // In page turning mode + func_808237B4(gPlayState, gPlayState->state.input); + } +} + +void InitFasterPauseMenu() { + COND_HOOK(GameInteractor::OnKaleidoUpdate, CVAR_FASTER_PAUSE_MENU_VALUE, OnKaleidoUpdateFaster); + + // Reset register values on close. These values are only used by z_kaleido_scope_PAL.c + COND_VB_SHOULD(VB_KALEIDO_UNPAUSE_CLOSE, CVAR_FASTER_PAUSE_MENU_VALUE, { + // Default values, as defined in Regs_InitDataImpl + ZREG(46) = 1; + WREG(6) = 8; + }); +} + +static RegisterShipInitFunc initFunc(InitFasterPauseMenu, { CVAR_FASTER_PAUSE_MENU_NAME }); diff --git a/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp b/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp index b7b6587ba2..5fcfb0d268 100644 --- a/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp +++ b/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp @@ -1,21 +1,17 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" -#include "spdlog/spdlog.h" +#include "soh/ShipInit.hpp" extern "C" { - #include "z64save.h" - #include "macros.h" - #include "variables.h" - #include "functions.h" - extern PlayState* gPlayState; - extern SaveContext gSaveContext; +#include "z64save.h" +#include "macros.h" +#include "variables.h" +#include "functions.h" +extern PlayState* gPlayState; +extern SaveContext gSaveContext; } -void FasterRupeeAccumulator_Register() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.FasterRupeeAccumulator"), 0)) return; - +void RegisterFasterRupeeAccumulator() { + COND_HOOK(OnInterfaceUpdate, CVarGetInteger(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 0), []() { if (gSaveContext.rupeeAccumulator == 0) { return; } @@ -28,10 +24,10 @@ void FasterRupeeAccumulator_Register() { } if (gSaveContext.rupeeAccumulator >= 10 && gSaveContext.rupees + 10 < CUR_CAPACITY(UPG_WALLET)) { - gSaveContext.rupeeAccumulator-= 10; + gSaveContext.rupeeAccumulator -= 10; gSaveContext.rupees += 10; } - // Losing rupees + // Losing rupees } else if (gSaveContext.rupeeAccumulator < 0) { // No rupees to lose if (gSaveContext.rupees == 0) { @@ -45,3 +41,5 @@ void FasterRupeeAccumulator_Register() { } }); } + +static RegisterShipInitFunc initFunc(RegisterFasterRupeeAccumulator, { CVAR_ENHANCEMENT("FasterRupeeAccumulator") }); diff --git a/soh/soh/Enhancements/TimeSavers/FasterShadowShip.cpp b/soh/soh/Enhancements/TimeSavers/FasterShadowShip.cpp new file mode 100644 index 0000000000..c59ccc6037 --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/FasterShadowShip.cpp @@ -0,0 +1,26 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "functions.h" +#include "src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.h" +} + +void RegisterFasterShadowShip() { + COND_VB_SHOULD(VB_SHADOW_SHIP_SET_SPEED, CVarGetInteger(CVAR_ENHANCEMENT("FasterShadowShip"), 0), { + BgHakaShip* ship = va_arg(args, BgHakaShip*); + PlayState* play = va_arg(args, PlayState*); + if (!Play_InCsMode(play)) { + if (Actor_FindNearby(play, &ship->dyna.actor, ACTOR_EN_TEST, ACTORCAT_ENEMY, 800.0) == NULL && + Actor_FindNearby(play, &ship->dyna.actor, ACTOR_PLAYER, ACTORCAT_PLAYER, 450.0) != NULL) { + *should = false; + ship->dyna.actor.speedXZ = 25.0f; + } else if (ship->dyna.actor.speedXZ > 4.0f) { + *should = false; + ship->dyna.actor.speedXZ = 4.0f; + } + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterFasterShadowShip, { CVAR_ENHANCEMENT("FasterShadowShip") }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/SkipIntro.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/SkipIntro.cpp index f7db9de32a..26eae80978 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/SkipIntro.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/SkipIntro.cpp @@ -1,6 +1,6 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/Enhancements/randomizer/context.h" +#include "soh/ShipInit.hpp" extern "C" { #include "z64save.h" @@ -10,12 +10,13 @@ extern PlayState* gPlayState; extern SaveContext gSaveContext; } -void SkipIntro_Register() { - REGISTER_VB_SHOULD(VB_PLAY_TRANSITION_CS, { +void RegisterSkipIntro() { + bool shouldRegister = CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), 0) || IS_RANDO; + COND_VB_SHOULD(VB_PLAY_TRANSITION_CS, shouldRegister, { // If we're playing rando and if starting age is adult and/or overworld spawns are shuffled we need to skip // the cutscene regardless of the enhancement being on. bool adultStart = gSaveContext.linkAge == LINK_AGE_ADULT; - bool shuffleEntrances = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_ENTRANCES).Is(true); + bool shuffleEntrances = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_ENTRANCES).Is(true); if ((CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), IS_RANDO) || (IS_RANDO && (adultStart || shuffleEntrances))) && gSaveContext.cutsceneIndex == 0xFFF1) { @@ -45,3 +46,6 @@ void SkipIntro_Register() { } }); } + +static RegisterShipInitFunc initFunc(RegisterSkipIntro, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp index c9a999cb1a..cc136b14f8 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp @@ -1,6 +1,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/Enhancements/randomizer/context.h" +#include "soh/ShipInit.hpp" extern "C" { #include "macros.h" @@ -10,111 +11,8 @@ extern "C" { #include "variables.h" } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() - static bool sEnteredBlueWarp = false; -/** - * This will override the transitions into the blue warp cutscenes, set any appropriate flags, and - * set the entrance index to where you would normally end up after the blue warp cutscene. This - * should also account for the difference between your first and following visits to the blue warp. - */ -void SkipBlueWarp_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, va_list originalArgs) { - bool overrideBlueWarpDestinations = - IS_RANDO && (RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || - RAND_GET_OPTION(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF); - - // Force blue warp skip on when ER needs to place Link somewhere else. - // This is preferred over having story cutscenes play in the overworld and then reloading Link somewhere else after. - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) || overrideBlueWarpDestinations) { - bool isBlueWarpCutscene = false; - // Deku Tree Blue warp - if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0 && gSaveContext.cutsceneIndex == 0xFFF1) { - gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP; - isBlueWarpCutscene = true; - // Dodongo's Cavern Blue warp - } else if (gSaveContext.entranceIndex == ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT && gSaveContext.cutsceneIndex == 0xFFF1) { - gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP; - isBlueWarpCutscene = true; - // Jabu Jabu's Blue warp - } else if (gSaveContext.entranceIndex == ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP && gSaveContext.cutsceneIndex == 0xFFF0) { - gSaveContext.entranceIndex = ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP; - isBlueWarpCutscene = true; - // Forest Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_FOREST) { - // Normally set in the blue warp cutscene - Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_DEKU_TREE_SPROUT); - - if (IS_RANDO) { - gSaveContext.entranceIndex = ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP; - } else { - gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_12; - } - - isBlueWarpCutscene = true; - // Fire Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE && gSaveContext.cutsceneIndex == 0xFFF3) { - // Normally set in the blue warp cutscene - Flags_SetEventChkInf(EVENTCHKINF_DEATH_MOUNTAIN_ERUPTED); - - gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP; - isBlueWarpCutscene = true; - // Water Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_WATER) { - // Normally set in the blue warp cutscene - gSaveContext.dayTime = gSaveContext.skyboxTime = 0x4800; - Flags_SetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER); - - gSaveContext.entranceIndex = ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP; - isBlueWarpCutscene = true; - // Spirit Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_SPIRIT) { - gSaveContext.entranceIndex = ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP; - isBlueWarpCutscene = true; - // Shadow Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_SHADOW) { - gSaveContext.entranceIndex = ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP; - isBlueWarpCutscene = true; - } - - if (isBlueWarpCutscene) { - if (gSaveContext.entranceIndex != ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP) { - // Normally set in the blue warp cutscene - gSaveContext.dayTime = gSaveContext.skyboxTime = 0x8000; - } - - *should = false; - gSaveContext.cutsceneIndex = 0; - } - - // This is outside the above condition because we want to handle both first and following visits to the blue warp - if (sEnteredBlueWarp && overrideBlueWarpDestinations) { - Entrance_OverrideBlueWarp(); - } - } - - sEnteredBlueWarp = false; -} - -/** - * Using this hook to simply observe that Link has entered a bluewarp - * This way we know to allow entrance rando overrides to be processed on the next tranisition hook - */ -void SkipBlueWarp_ShouldPlayBlueWarpCS(GIVanillaBehavior _, bool* should, va_list originalArgs) { - sEnteredBlueWarp = true; -} - -/** - * While we could rely on the Item_Give that's normally called, it's not very clear to the player that they - * received the item when skipping the blue warp cutscene, so we'll prevent that and queue it up to be given - * to the player instead. - */ -void SkipBlueWarp_ShouldGiveItem(GIVanillaBehavior _, bool* should, va_list originalArgs) { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - *should = false; - } -} - // Todo: Move item queueing here /** @@ -137,31 +35,143 @@ void EnKo_MoveWhenReady(EnKo* enKo, PlayState* play) { void SkipBlueWarp_OnActorUpdate(void* actorPtr) { EnKo* enKo = static_cast(actorPtr); - if ( - (enKo->actor.params & 0xFF) == ENKO_TYPE_CHILD_3 && - enKo->actionFunc == func_80A995CC && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) - ) { + if ((enKo->actor.params & 0xFF) == ENKO_TYPE_CHILD_3 && enKo->actionFunc == func_80A995CC) { enKo->actionFunc = EnKo_MoveWhenReady; } } -/** - * This will ensure that the Deku Tree Sprout considers the Forest Temple finished when you skip the blue warp cutscene. - * Typically this checks for if you have the medallion, and when skipping the cutscene at this point you don't have it yet. - */ -void SkipBlueWarp_ShouldDekuJrConsiderForestTempleFinished(GIVanillaBehavior _, bool* should, va_list originalArgs) { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP && gSaveContext.cutsceneIndex == 0xFFF1) { - *should = Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP); - } - } +void RegisterSkipBlueWarp() { + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_KO, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), + SkipBlueWarp_OnActorUpdate); + + /** + * This will ensure that the Deku Tree Sprout considers the Forest Temple finished when you skip the blue warp + * cutscene. Typically this checks for if you have the medallion, and when skipping the cutscene at this point you + * don't have it yet. + */ + COND_VB_SHOULD(VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { + if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP && + gSaveContext.cutsceneIndex == 0xFFF1) { + *should = Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP); + } + }); + + /** + * While we could rely on the Item_Give that's normally called, it's not very clear to the player that they + * received the item when skipping the blue warp cutscene, so we'll prevent that and queue it up to be given + * to the player instead. + */ + COND_VB_SHOULD(VB_GIVE_ITEM_FROM_BLUE_WARP, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { *should = false; }); } -void SkipBlueWarp_Register() { - GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_KO, SkipBlueWarp_OnActorUpdate); - GameInteractor::Instance->RegisterGameHookForID(VB_PLAY_TRANSITION_CS, SkipBlueWarp_ShouldPlayTransitionCS); - GameInteractor::Instance->RegisterGameHookForID(VB_PLAY_BLUE_WARP_CS, SkipBlueWarp_ShouldPlayBlueWarpCS); - GameInteractor::Instance->RegisterGameHookForID(VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED, SkipBlueWarp_ShouldDekuJrConsiderForestTempleFinished); - GameInteractor::Instance->RegisterGameHookForID(VB_GIVE_ITEM_FROM_BLUE_WARP, SkipBlueWarp_ShouldGiveItem); +void RegisterShouldPlayBlueWarp() { + /** + * This will override the transitions into the blue warp cutscenes, set any appropriate flags, and + * set the entrance index to where you would normally end up after the blue warp cutscene. This + * should also account for the difference between your first and following visits to the blue warp. + */ + REGISTER_VB_SHOULD(VB_PLAY_TRANSITION_CS, { + // Do nothing when in a boss rush + if (IS_BOSS_RUSH) { + return; + } + + bool overrideBlueWarpDestinations = + IS_RANDO && (RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || + RAND_GET_OPTION(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF); + + // Force blue warp skip on when ER needs to place Link somewhere else. + // This is preferred over having story cutscenes play in the overworld and then reloading Link somewhere else + // after. + if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) || + overrideBlueWarpDestinations) { + bool isBlueWarpCutscene = false; + // Deku Tree Blue warp + if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0 && gSaveContext.cutsceneIndex == 0xFFF1) { + gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP; + isBlueWarpCutscene = true; + // Dodongo's Cavern Blue warp + } else if (gSaveContext.entranceIndex == ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT && + gSaveContext.cutsceneIndex == 0xFFF1) { + gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP; + isBlueWarpCutscene = true; + // Jabu Jabu's Blue warp + } else if (gSaveContext.entranceIndex == ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP && + gSaveContext.cutsceneIndex == 0xFFF0) { + gSaveContext.entranceIndex = ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP; + isBlueWarpCutscene = true; + // Forest Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_FOREST) { + // Normally set in the blue warp cutscene + Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_DEKU_TREE_SPROUT); + + if (IS_RANDO) { + gSaveContext.entranceIndex = ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP; + } else { + gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_12; + } + + isBlueWarpCutscene = true; + // Fire Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE && + gSaveContext.cutsceneIndex == 0xFFF3) { + // Normally set in the blue warp cutscene + Flags_SetEventChkInf(EVENTCHKINF_DEATH_MOUNTAIN_ERUPTED); + + gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP; + isBlueWarpCutscene = true; + // Water Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_WATER) { + // Normally set in the blue warp cutscene + gSaveContext.dayTime = gSaveContext.skyboxTime = 0x4800; + Flags_SetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER); + + gSaveContext.entranceIndex = ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP; + isBlueWarpCutscene = true; + // Spirit Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_SPIRIT) { + gSaveContext.entranceIndex = ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP; + isBlueWarpCutscene = true; + // Shadow Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_SHADOW) { + gSaveContext.entranceIndex = ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP; + isBlueWarpCutscene = true; + } + + if (isBlueWarpCutscene) { + if (gSaveContext.entranceIndex != ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP) { + // Normally set in the blue warp cutscene + gSaveContext.dayTime = gSaveContext.skyboxTime = 0x8000; + } + + *should = false; + gSaveContext.cutsceneIndex = 0; + } + + // This is outside the above condition because we want to handle both first and following visits to the blue + // warp + if (sEnteredBlueWarp && overrideBlueWarpDestinations) { + Entrance_OverrideBlueWarp(); + } + } + + sEnteredBlueWarp = false; + }); + + /** + * Using this hook to simply observe that Link has entered a bluewarp + * This way we know to allow entrance rando overrides to be processed on the next tranisition hook + */ + REGISTER_VB_SHOULD(VB_PLAY_BLUE_WARP_CS, { sEnteredBlueWarp = true; }); } + +static RegisterShipInitFunc initHooks(RegisterSkipBlueWarp, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), "IS_RANDO" }); +static RegisterShipInitFunc initUnconditionalHooks(RegisterShouldPlayBlueWarp); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp index e1cc1db216..9faa312a16 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp @@ -1,22 +1,24 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { - #include "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h" +#include "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h" } /** * This will skip the Deku Tree intro, and simply open the mouth as you approach it. -*/ -void SkipDekuTreeIntro_Register() { - REGISTER_VB_SHOULD(VB_PLAY_DEKU_TREE_INTRO_CS, { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - BgTreemouth* treeMouth = va_arg(args, BgTreemouth*); - Flags_SetEventChkInf(EVENTCHKINF_DEKU_TREE_OPENED_MOUTH); - Audio_PlaySoundGeneral(NA_SE_EV_WOODDOOR_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - BgTreemouth_SetupAction(treeMouth, func_808BC6F8); - *should = false; - } - }); + */ +void RegisterSkipDekuTreeIntro() { + COND_VB_SHOULD(VB_PLAY_DEKU_TREE_INTRO_CS, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { + BgTreemouth* treeMouth = va_arg(args, BgTreemouth*); + Flags_SetEventChkInf(EVENTCHKINF_DEKU_TREE_OPENED_MOUTH); + Audio_PlaySoundGeneral(NA_SE_EV_WOODDOOR_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + BgTreemouth_SetupAction(treeMouth, func_808BC6F8); + *should = false; + }); } + +static RegisterShipInitFunc initFunc(RegisterSkipDekuTreeIntro, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp index d487c1f471..d743bead94 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp @@ -1,39 +1,40 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { - #include "z64save.h" - #include "functions.h" - extern PlayState* gPlayState; - extern SaveContext gSaveContext; +#include "z64save.h" +#include "functions.h" +extern PlayState* gPlayState; +extern SaveContext gSaveContext; } -void SkipLostWoodsBridge_Register() { +void RegisterSkipLostWoodsBridge() { /** - * This skips the cutscene where you speak to Saria on the bridge in Lost Woods, where she gives you the Fairy Ocarina. + * This skips the cutscene where you speak to Saria on the bridge in Lost Woods, where she gives you the Fairy + * Ocarina. */ - REGISTER_VB_SHOULD(VB_PLAY_TRANSITION_CS, { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - if ((gSaveContext.entranceIndex == ENTR_LOST_WOODS_BRIDGE_EAST_EXIT) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE)) { - Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE); - if (GameInteractor_Should(VB_GIVE_ITEM_FAIRY_OCARINA, true)) { - Item_Give(gPlayState, ITEM_OCARINA_FAIRY); - } - *should = false; + COND_VB_SHOULD(VB_PLAY_TRANSITION_CS, CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { + if ((gSaveContext.entranceIndex == ENTR_LOST_WOODS_BRIDGE_EAST_EXIT) && + !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE)) { + Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE); + if (GameInteractor_Should(VB_GIVE_ITEM_FAIRY_OCARINA, true)) { + Item_Give(gPlayState, ITEM_OCARINA_FAIRY); } - } - }); - - /** - * While we could rely on the Item_Give that's normally called (and that we have above), it's not very clear to the player - * that they received the item when skipping the cutscene, so we'll prevent it, and queue it up to be given instead. - */ - REGISTER_VB_SHOULD(VB_GIVE_ITEM_FAIRY_OCARINA, { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { *should = false; } }); + /** + * While we could rely on the Item_Give that's normally called (and that we have above), it's not very clear to the + * player that they received the item when skipping the cutscene, so we'll prevent it, and queue it up to be given + * instead. + */ + COND_VB_SHOULD(VB_GIVE_ITEM_FAIRY_OCARINA, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { *should = false; }); + // Todo: Move item queueing here } + +static RegisterShipInitFunc initFunc(RegisterSkipLostWoodsBridge, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp index 357125db84..1acd6dabed 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp @@ -1,9 +1,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { - #include "src/overlays/actors/ovl_En_Zl4/z_en_zl4.h" +#include "src/overlays/actors/ovl_En_Zl4/z_en_zl4.h" } /** @@ -21,7 +20,8 @@ void EnZl4_SkipToGivingZeldasLetter(EnZl4* enZl4, PlayState* play) { Audio_PlayFanfare(NA_BGM_APPEAR); enZl4->csState = 8; // ZL4_CS_PLAN } else { - Npc_UpdateTalking(play, &enZl4->actor, &enZl4->interactInfo.talkState, enZl4->collider.dim.radius + 60.0f, EnZl4_GiveItemTextId, func_80B5B9B0); + Npc_UpdateTalking(play, &enZl4->actor, &enZl4->interactInfo.talkState, enZl4->collider.dim.radius + 60.0f, + EnZl4_GiveItemTextId, func_80B5B9B0); func_80B5BB78(enZl4, play); if (enZl4->interactInfo.talkState != NPC_TALK_STATE_IDLE) { @@ -32,14 +32,17 @@ void EnZl4_SkipToGivingZeldasLetter(EnZl4* enZl4, PlayState* play) { } void SkipToGivingZeldasLetter_OnActorInit(void* actorPtr) { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - EnZl4* enZl4 = static_cast(actorPtr); - if (enZl4->actionFunc != EnZl4_Cutscene || enZl4->csState != 0) return; + EnZl4* enZl4 = static_cast(actorPtr); + if (enZl4->actionFunc != EnZl4_Cutscene || enZl4->csState != 0) + return; - enZl4->actionFunc = EnZl4_SkipToGivingZeldasLetter; - } + enZl4->actionFunc = EnZl4_SkipToGivingZeldasLetter; } -void SkipToGivingZeldasLetter_Register() { - GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_ZL4, SkipToGivingZeldasLetter_OnActorInit); +void RegisterSkipToGivingZeldasLetter() { + COND_ID_HOOK(OnActorInit, ACTOR_EN_ZL4, CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), + SkipToGivingZeldasLetter_OnActorInit); } + +static RegisterShipInitFunc initFunc(RegisterSkipToGivingZeldasLetter, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp index 1cb331539f..ae82ff9f0f 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp @@ -1,23 +1,10 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { - #include "z64save.h" - #include "functions.h" - extern SaveContext gSaveContext; -} - -void SkipZeldaFleeingCastle_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, va_list originalArgs) { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN && gSaveContext.cutsceneIndex == 0xFFF1) { - // Normally set in the cutscene - gSaveContext.dayTime = gSaveContext.skyboxTime = 0x4AAA; - - gSaveContext.cutsceneIndex = 0; - *should = false; - } - } +#include "z64save.h" +#include "functions.h" +extern SaveContext gSaveContext; } /** @@ -46,13 +33,11 @@ void SkipZeldaFleeingCastle_OnActorUpdate(void* actorPtr) { void SkipZeldaFleeingCastle_OnActorInit(void* actorPtr) { Actor* actor = static_cast(actorPtr); - if ( - actor->params == 3 && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) - ) { + if (actor->params == 3) { framesSinceSpawn = 0; - itemOcarinaUpdateHook = GameInteractor::Instance->RegisterGameHookForPtr((uintptr_t)actorPtr, SkipZeldaFleeingCastle_OnActorUpdate); - sceneInitHook = GameInteractor::Instance->RegisterGameHook([] (int16_t sceneNum) { + itemOcarinaUpdateHook = GameInteractor::Instance->RegisterGameHookForPtr( + (uintptr_t)actorPtr, SkipZeldaFleeingCastle_OnActorUpdate); + sceneInitHook = GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { GameInteractor::Instance->UnregisterGameHookForPtr(itemOcarinaUpdateHook); GameInteractor::Instance->UnregisterGameHook(sceneInitHook); itemOcarinaUpdateHook = 0; @@ -61,7 +46,20 @@ void SkipZeldaFleeingCastle_OnActorInit(void* actorPtr) { } } -void SkipZeldaFleeingCastle_Register() { - GameInteractor::Instance->RegisterGameHookForID(ACTOR_ITEM_OCARINA, SkipZeldaFleeingCastle_OnActorInit); - GameInteractor::Instance->RegisterGameHookForID(VB_PLAY_TRANSITION_CS, SkipZeldaFleeingCastle_ShouldPlayTransitionCS); +void RegisterSkipZeldaFleeingCastle() { + COND_ID_HOOK(OnActorInit, ACTOR_ITEM_OCARINA, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), + SkipZeldaFleeingCastle_OnActorInit); + COND_VB_SHOULD(VB_PLAY_TRANSITION_CS, CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { + if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN && gSaveContext.cutsceneIndex == 0xFFF1) { + // Normally set in the cutscene + gSaveContext.dayTime = gSaveContext.skyboxTime = 0x4AAA; + + gSaveContext.cutsceneIndex = 0; + *should = false; + } + }); } + +static RegisterShipInitFunc initFunc(RegisterSkipZeldaFleeingCastle, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp index 1e1c6ceb5b..34e2fdf614 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp @@ -1,27 +1,28 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include "src/overlays/actors/ovl_Bg_Bdan_Objects/z_bg_bdan_objects.h" } +void BdanInit(void* actorRef) { + Player* player = GET_PLAYER(gPlayState); + BgBdanObjects* bgBdanObjects = static_cast(actorRef); + + if (bgBdanObjects->dyna.actor.params == 1) { + if (player->actor.world.pos.y < -500.0f) { + bgBdanObjects->timer = 220; + } + } +} + /** * Adjusts the behavior of the elevator to start near the bottom if you are entering the room from the bottom */ -void MoveJabuJabuElevator_Register() { - GameInteractor::Instance->RegisterGameHookForID(ACTOR_BG_BDAN_OBJECTS, [](void* actorRef) { - Player* player = GET_PLAYER(gPlayState); - BgBdanObjects* bgBdanObjects = static_cast(actorRef); - - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { - return; - } - - if (bgBdanObjects->dyna.actor.params == 1) { - if (player->actor.world.pos.y < -500.0f) { - bgBdanObjects->timer = 220; - } - } - }); +void RegisterMoveJabuJabuElevator() { + COND_ID_HOOK(OnActorInit, ACTOR_BG_BDAN_OBJECTS, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), BdanInit); } + +static RegisterShipInitFunc initFunc(RegisterMoveJabuJabuElevator, + { CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp index 59381968aa..1e4e77d444 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp @@ -1,31 +1,30 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { - #include "z64save.h" - #include "macros.h" - #include "variables.h" - #include "functions.h" - extern PlayState* gPlayState; - extern SaveContext gSaveContext; +#include "z64save.h" +#include "macros.h" +#include "variables.h" +#include "functions.h" +extern PlayState* gPlayState; +extern SaveContext gSaveContext; } /** * This simply skips the Mido interaction in Kokiri Forest, once you equip the Kokiri * Sword and Deku Shield he will move out of the way without you needing to talk to him. */ -void MoveMidoInKokiriForest_Register() { - REGISTER_VB_SHOULD(VB_MOVE_MIDO_IN_KOKIRI_FOREST, { - if ( - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO) && - !Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD) && - (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_DEKU) && - (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_KOKIRI) && - gSaveContext.cutsceneIndex == 0 - ) { - Flags_SetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD); - *should = true; - } - }); +void RegisterMoveMidoInKokiriForest() { + COND_VB_SHOULD( + VB_MOVE_MIDO_IN_KOKIRI_FOREST, CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), { + if (!Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD) && + (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_DEKU) && + (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_KOKIRI) && gSaveContext.cutsceneIndex == 0) { + Flags_SetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD); + *should = true; + } + }); } + +static RegisterShipInitFunc initFunc(RegisterMoveMidoInKokiriForest, + { CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp index 7d676e6f82..39417d5dee 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp @@ -1,6 +1,5 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include "overlays/actors/ovl_En_Ru1/z_en_ru1.h" @@ -9,85 +8,87 @@ extern "C" { Actor* func_80AEB124(PlayState* play); } -void SkipChildRutoInteractions_Register() { - // Skips the Child Ruto introduction cutscene, where she drops down into the hole in Jabu-Jabu's Belly - REGISTER_VB_SHOULD(VB_PLAY_CHILD_RUTO_INTRO, { - EnRu1* enRu1 = va_arg(args, EnRu1*); +void Ru1Init(void* actorRef) { + EnRu1* enRu1 = static_cast(actorRef); - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { - return; - } - - Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_MEET_RUTO); - Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_TALK_FIRST_TIME); - Flags_SetInfTable(INFTABLE_143); + if (enRu1->action == 22) { + enRu1->action = 27; enRu1->drawConfig = 1; - enRu1->actor.world.pos.x = 127.0f; - enRu1->actor.world.pos.y = -340.0f; - enRu1->actor.world.pos.z = -3041.0f; - enRu1->actor.shape.rot.y = enRu1->actor.world.rot.y = -5098; + enRu1->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; + Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildSittingAnim, 1.0f, 0.0f, + Animation_GetLastFrame((void*)&gRutoChildSittingAnim), ANIMMODE_LOOP, 0.0f); + } +} - if (*should) { - Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildTurnAroundAnim, 1.0f, 0, - Animation_GetLastFrame((void*)&gRutoChildTurnAroundAnim), ANIMMODE_ONCE, -8.0f); - enRu1->action = 10; - } +void RegisterSkipChildRutoInteractions() { + // Skips the Child Ruto introduction cutscene, where she drops down into the hole in Jabu-Jabu's Belly + COND_VB_SHOULD( + VB_PLAY_CHILD_RUTO_INTRO, CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), { + EnRu1* enRu1 = va_arg(args, EnRu1*); - *should = false; - }); + Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_MEET_RUTO); + Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_TALK_FIRST_TIME); + Flags_SetInfTable(INFTABLE_143); + enRu1->drawConfig = 1; + enRu1->actor.world.pos.x = 127.0f; + enRu1->actor.world.pos.y = -340.0f; + enRu1->actor.world.pos.z = -3041.0f; + enRu1->actor.shape.rot.y = enRu1->actor.world.rot.y = -5098; + + if (*should) { + Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildTurnAroundAnim, 1.0f, 0, + Animation_GetLastFrame((void*)&gRutoChildTurnAroundAnim), ANIMMODE_ONCE, -8.0f); + enRu1->action = 10; + } + + *should = false; + }); // Skips a short dialogue sequence where Ruto tells you to throw her to the Sapphire - REGISTER_VB_SHOULD(VB_RUTO_WANT_TO_BE_TOSSED_TO_SAPPHIRE, { - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { - return; - } + COND_VB_SHOULD(VB_RUTO_WANT_TO_BE_TOSSED_TO_SAPPHIRE, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), { + if (*should) { + Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_WANTS_TO_BE_TOSSED_TO_SAPPHIRE); + *should = false; + } + }); - if (*should) { - Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_WANTS_TO_BE_TOSSED_TO_SAPPHIRE); - *should = false; - } - }); + // Prevents Ruto from running to the Sapphire when she wants to be tossed to it, instead she just stands up and + // waits for link to get closer + COND_VB_SHOULD(VB_RUTO_RUN_TO_SAPPHIRE, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), { + EnRu1* enRu1 = va_arg(args, EnRu1*); + DynaPolyActor* dynaPolyActor = va_arg(args, DynaPolyActor*); - // Prevents Ruto from running to the Sapphire when she wants to be tossed to it, instead she just stands up and waits for link to get closer - REGISTER_VB_SHOULD(VB_RUTO_RUN_TO_SAPPHIRE, { - EnRu1* enRu1 = va_arg(args, EnRu1*); - DynaPolyActor* dynaPolyActor = va_arg(args, DynaPolyActor*); + if (*should) { + enRu1->unk_28C = (BgBdanObjects*)dynaPolyActor; + Flags_SetInfTable(INFTABLE_145); + Flags_SetSwitch(gPlayState, 0x02); + Flags_SetSwitch(gPlayState, 0x1F); + enRu1->action = 42; + Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildWait2Anim, 1.0f, 0, + Animation_GetLastFrame((void*)&gRutoChildWait2Anim), ANIMMODE_LOOP, -8.0f); + // If we aren't skipping one point cutscenes and BgBdan objects has set the camera setting + // to CAM_SET_NORMAL1 (2), don't reset the camera setting to 1. This prevents the One Point + // Cutscene of Ruto getting lifted up from getting queued up twice. + if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) || + enRu1->unk_28C->cameraSetting != 2) { + enRu1->unk_28C->cameraSetting = 1; + } + Actor* sapphire = func_80AEB124(gPlayState); + if (sapphire != NULL) { + Actor_Kill(sapphire); + } + enRu1->actor.room = gPlayState->roomCtx.curRoom.num; + *should = false; + } + }); - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { - return; - } - - if (*should) { - enRu1->unk_28C = (BgBdanObjects*)dynaPolyActor; - Flags_SetInfTable(INFTABLE_145); - Flags_SetSwitch(gPlayState, 0x02); - Flags_SetSwitch(gPlayState, 0x1F); - enRu1->action = 42; - Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildWait2Anim, 1.0f, 0, - Animation_GetLastFrame((void*)&gRutoChildWait2Anim), ANIMMODE_LOOP, -8.0f); - enRu1->unk_28C->cameraSetting = 1; - Actor* sapphire = func_80AEB124(gPlayState); - if (sapphire != NULL) { - Actor_Kill(sapphire); - } - enRu1->actor.room = gPlayState->roomCtx.curRoom.num; - *should = false; - } - }); - - // This overrides the behavior that causes Ruto to get upset at you before sitting back down again when INFTABLE_RUTO_IN_JJ_TALK_FIRST_TIME is set - GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_RU1, [](void* actorRef) { - EnRu1* enRu1 = static_cast(actorRef); - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { - return; - } - - if (enRu1->action == 22) { - enRu1->action = 27; - enRu1->drawConfig = 1; - enRu1->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; - Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildSittingAnim, 1.0f, 0.0f, - Animation_GetLastFrame((void*)&gRutoChildSittingAnim), ANIMMODE_LOOP, 0.0f); - } - }); + // This overrides the behavior that causes Ruto to get upset at you before sitting back down again when + // INFTABLE_RUTO_IN_JJ_TALK_FIRST_TIME is set + COND_ID_HOOK(OnActorInit, ACTOR_EN_RU1, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), Ru1Init); } + +static RegisterShipInitFunc initFunc(RegisterSkipChildRutoInteractions, + { CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp b/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp deleted file mode 100644 index a198f82890..0000000000 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "TimeSavers.h" - -void TimeSavers_Register() { - // SkipCutscene - // Story - SkipBlueWarp_Register(); - SkipDekuTreeIntro_Register(); - SkipLostWoodsBridge_Register(); - SkipToGivingZeldasLetter_Register(); - SkipZeldaFleeingCastle_Register(); - SkipIntro_Register(); - // SkipMiscInteractions - MoveJabuJabuElevator_Register(); - MoveMidoInKokiriForest_Register(); - SkipChildRutoInteractions_Register(); - FasterHeavyBlockLift_Register(); - FasterRupeeAccumulator_Register(); -} diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.h b/soh/soh/Enhancements/TimeSavers/TimeSavers.h deleted file mode 100644 index ad521c6c2b..0000000000 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef TIME_SAVERS_H -#define TIME_SAVERS_H - -void TimeSavers_Register(); - -// SkipCutscene - // Story - void SkipBlueWarp_Register(); - void SkipDekuTreeIntro_Register(); - void SkipLostWoodsBridge_Register(); - void SkipToGivingZeldasLetter_Register(); - void SkipZeldaFleeingCastle_Register(); - void SkipIntro_Register(); -// SkipMiscInteractions - void MoveJabuJabuElevator_Register(); - void MoveMidoInKokiriForest_Register(); - void SkipChildRutoInteractions_Register(); -void FasterHeavyBlockLift_Register(); -void FasterRupeeAccumulator_Register(); - -#endif // TIME_SAVERS_H diff --git a/soh/soh/Enhancements/TreesDropSticks.cpp b/soh/soh/Enhancements/TreesDropSticks.cpp new file mode 100644 index 0000000000..7fdc4eb0a1 --- /dev/null +++ b/soh/soh/Enhancements/TreesDropSticks.cpp @@ -0,0 +1,31 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "src/overlays/actors/ovl_En_Wood02/z_en_wood02.h" +} + +extern PlayState* gPlayState; + +void RegisterTreesDropSticks() { + COND_VB_SHOULD(VB_TREE_DROP_COLLECTIBLE, CVarGetInteger(CVAR_ENHANCEMENT("TreesDropSticks"), 0), { + if (INV_CONTENT(ITEM_STICK) != ITEM_NONE) { + EnWood02* tree = va_arg(args, EnWood02*); + Vec3f dropsSpawnPt = tree->actor.world.pos; + dropsSpawnPt.y += 200.0f; + + *should = false; + for (s32 numDrops = Rand_Next() % 4; numDrops > 0; numDrops--) { + Item_DropCollectible(gPlayState, &dropsSpawnPt, ITEM00_STICK); + } + } + }); + + COND_VB_SHOULD(VB_PREVENT_ADULT_STICK, CVarGetInteger(CVAR_ENHANCEMENT("TreesDropSticks"), 0), { + if (INV_CONTENT(ITEM_STICK) != ITEM_NONE) { + *should = false; + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterTreesDropSticks, { CVAR_ENHANCEMENT("TreesDropSticks") }); diff --git a/soh/soh/Enhancements/audio/AudioCollection.cpp b/soh/soh/Enhancements/audio/AudioCollection.cpp index 28e8d3d990..d3f69dad85 100644 --- a/soh/soh/Enhancements/audio/AudioCollection.cpp +++ b/soh/soh/Enhancements/audio/AudioCollection.cpp @@ -11,9 +11,14 @@ #include #define SEQUENCE_MAP_ENTRY(sequenceId, label, sfxKey, category, canBeReplaced, canBeUsedAsReplacement) \ - { sequenceId, { sequenceId, label, sfxKey, category, canBeReplaced, canBeUsedAsReplacement } } + { \ + sequenceId, { \ + sequenceId, label, sfxKey, category, canBeReplaced, canBeUsedAsReplacement \ + } \ + } AudioCollection::AudioCollection() { + // clang-format off // (originalSequenceId, label, sfxKey, category, canBeReplaced, canBeUsedAsReplacement), sequenceMap = { @@ -114,7 +119,7 @@ AudioCollection::AudioCollection() { SEQUENCE_MAP_ENTRY(NA_BGM_STAFF_2, "End Credits II", "NA_BGM_STAFF_2", SEQ_BGM_EVENT, false, false), // Previously SEQ_UNUSED, so not shown anywhere? SEQUENCE_MAP_ENTRY(NA_BGM_STAFF_3, "End Credits III", "NA_BGM_STAFF_3", SEQ_BGM_EVENT, false, false), // Previously SEQ_UNUSED, so not shown anywhere? SEQUENCE_MAP_ENTRY(NA_BGM_STAFF_4, "End Credits IV", "NA_BGM_STAFF_4", SEQ_BGM_EVENT, false, false), // Previously SEQ_UNUSED, so not shown anywhere? - + // SEQ_INSTRUMENT SEQUENCE_MAP_ENTRY(INSTRUMENT_OFFSET + 1, "Ocarina", "OCARINA_INSTRUMENT_DEFAULT", SEQ_INSTRUMENT, true, true), SEQUENCE_MAP_ENTRY(INSTRUMENT_OFFSET + 2, "Malon", "OCARINA_INSTRUMENT_MALON", SEQ_INSTRUMENT, true, true), @@ -299,7 +304,7 @@ AudioCollection::AudioCollection() { //SEQUENCE_MAP_ENTRY("Adult Link - Unused Sound 1?","NA_SE_VO_LI_ELECTRIC_SHOCK_LV", "NA_SE_VO_LI_ELECTRIC_SHOCK_LV", SEQ_VOICE, true, false), //SEQUENCE_MAP_ENTRY(NA_SE_VO_LI_GROAN_KID, "Child Link - Groan (Unused)", "NA_SE_VO_LI_GROAN_KID", SEQ_VOICE, true, false), //SEQUENCE_MAP_ENTRY(NA_SE_VO_LI_ELECTRIC_SHOCK_LV_KID, "Child Link - Unused Sound 1?", "NA_SE_VO_LI_ELECTRIC_SHOCK_LV_KID", SEQ_VOICE, true, false), - + // Following group of Dummies are all duplicate entries for Navi saying Look/Hey/Watchout //SEQUENCE_MAP_ENTRY(NA_SE_VO_DUMMY_0x45, "NA_SE_VO_DUMMY_0x45", "NA_SE_VO_DUMMY_0x45", SEQ_VOICE, true, false), //SEQUENCE_MAP_ENTRY(NA_SE_VO_DUMMY_0x46, "NA_SE_VO_DUMMY_0x46", "NA_SE_VO_DUMMY_0x46", SEQ_VOICE, true, false), @@ -328,7 +333,7 @@ AudioCollection::AudioCollection() { //SEQUENCE_MAP_ENTRY(NA_SE_VO_DUMMY_0x88_YOBI, "NA_SE_VO_DUMMY_0x88_YOBI", "NA_SE_VO_DUMMY_0x88_YOBI", SEQ_VOICE, true, false), // .. //SEQUENCE_MAP_ENTRY(NA_SE_VO_DUMMY_0x89_YOBI, "NA_SE_VO_DUMMY_0x89_YOBI", "NA_SE_VO_DUMMY_0x89_YOBI", SEQ_VOICE, true, false), // .. }; - + // clang-format on } std::string AudioCollection::GetCvarKey(std::string sfxKey) { @@ -354,10 +359,13 @@ void AudioCollection::AddToCollection(char* otrPath, uint16_t seqNum) { if (typeString == "fanfare") { type = SEQ_FANFARE; } - SequenceInfo info = {seqNum, - sequenceName, - StringHelper::Replace(StringHelper::Replace(StringHelper::Replace(sequenceName, " ", "_"), "~", "-"),".", ""), - type, false, true}; + SequenceInfo info = { seqNum, + sequenceName, + StringHelper::Replace( + StringHelper::Replace(StringHelper::Replace(sequenceName, " ", "_"), "~", "-"), ".", ""), + type, + false, + true }; sequenceMap.emplace(seqNum, info); } @@ -366,7 +374,8 @@ uint16_t AudioCollection::GetReplacementSequence(uint16_t seqId) { // for Hyrule Field instead. Otherwise, leave it alone, so that without any sfx editor modifications we will // play the normal track as usual. if (seqId == NA_BGM_FIELD_MORNING) { - if (CVarGetInteger(CVAR_AUDIO("ReplacedSequences.NA_BGM_FIELD_LOGIC.value"), NA_BGM_FIELD_LOGIC) != NA_BGM_FIELD_LOGIC) { + if (CVarGetInteger(CVAR_AUDIO("ReplacedSequences.NA_BGM_FIELD_LOGIC.value"), NA_BGM_FIELD_LOGIC) != + NA_BGM_FIELD_LOGIC) { seqId = NA_BGM_FIELD_LOGIC; } } @@ -401,10 +410,12 @@ void AudioCollection::AddToShufflePool(SequenceInfo* seqInfo) { } void AudioCollection::InitializeShufflePool() { - if (shufflePoolInitialized) return; - + if (shufflePoolInitialized) + return; + for (auto& [seqId, seqInfo] : sequenceMap) { - if (!seqInfo.canBeUsedAsReplacement) continue; + if (!seqInfo.canBeUsedAsReplacement) + continue; const std::string cvarKey = std::string(CVAR_AUDIO("Excluded.")) + seqInfo.sfxKey; if (CVarGetInteger(cvarKey.c_str(), 0)) { excludedSequences.insert(&seqInfo); @@ -416,7 +427,7 @@ void AudioCollection::InitializeShufflePool() { shufflePoolInitialized = true; }; -extern "C" void AudioCollection_AddToCollection(char *otrPath, uint16_t seqNum) { +extern "C" void AudioCollection_AddToCollection(char* otrPath, uint16_t seqNum) { AudioCollection::Instance->AddToCollection(otrPath, seqNum); } diff --git a/soh/soh/Enhancements/audio/AudioCollection.h b/soh/soh/Enhancements/audio/AudioCollection.h index f3fd964bc0..2cdb02e217 100644 --- a/soh/soh/Enhancements/audio/AudioCollection.h +++ b/soh/soh/Enhancements/audio/AudioCollection.h @@ -6,16 +6,16 @@ #include enum SeqType { - SEQ_NOSHUFFLE = 0, - SEQ_BGM_WORLD = 1 << 0, - SEQ_BGM_EVENT = 1 << 1, + SEQ_NOSHUFFLE = 0, + SEQ_BGM_WORLD = 1 << 0, + SEQ_BGM_EVENT = 1 << 1, SEQ_BGM_BATTLE = 1 << 2, - SEQ_OCARINA = 1 << 3, - SEQ_FANFARE = 1 << 4, - SEQ_BGM_ERROR = 1 << 5, - SEQ_SFX = 1 << 6, + SEQ_OCARINA = 1 << 3, + SEQ_FANFARE = 1 << 4, + SEQ_BGM_ERROR = 1 << 5, + SEQ_SFX = 1 << 6, SEQ_INSTRUMENT = 1 << 7, - SEQ_VOICE = 1 << 8, + SEQ_VOICE = 1 << 8, SEQ_BGM_CUSTOM = SEQ_BGM_WORLD | SEQ_BGM_EVENT | SEQ_BGM_BATTLE, }; @@ -31,45 +31,45 @@ struct SequenceInfo { }; class AudioCollection { - private: - // All Loaded Audio - std::map sequenceMap; - - // Sequences/SFX to include in/exclude from shuffle pool - struct compareSequenceLabel { - bool operator() (SequenceInfo* a, SequenceInfo* b) const { - return a->label < b->label; - }; - }; - std::set includedSequences; - std::set excludedSequences; - bool shufflePoolInitialized = false; + private: + // All Loaded Audio + std::map sequenceMap; - public: - static AudioCollection* Instance; - AudioCollection(); - std::map GetAllSequences() const { - return sequenceMap; - } - std::set GetIncludedSequences() const { - return includedSequences; + // Sequences/SFX to include in/exclude from shuffle pool + struct compareSequenceLabel { + bool operator()(SequenceInfo* a, SequenceInfo* b) const { + return a->label < b->label; }; - std::set GetExcludedSequences() const { - return excludedSequences; - }; - void AddToShufflePool(SequenceInfo*); - void RemoveFromShufflePool(SequenceInfo*); - void AddToCollection(char* otrPath, uint16_t seqNum); - uint16_t GetReplacementSequence(uint16_t seqId); - void InitializeShufflePool(); - const char* GetSequenceName(uint16_t seqId); - bool HasSequenceNum(uint16_t seqId); - size_t SequenceMapSize(); - std::string GetCvarKey(std::string sfxKey); - std::string GetCvarLockKey(std::string sfxKey); + }; + std::set includedSequences; + std::set excludedSequences; + bool shufflePoolInitialized = false; + + public: + static AudioCollection* Instance; + AudioCollection(); + std::map GetAllSequences() const { + return sequenceMap; + } + std::set GetIncludedSequences() const { + return includedSequences; + }; + std::set GetExcludedSequences() const { + return excludedSequences; + }; + void AddToShufflePool(SequenceInfo*); + void RemoveFromShufflePool(SequenceInfo*); + void AddToCollection(char* otrPath, uint16_t seqNum); + uint16_t GetReplacementSequence(uint16_t seqId); + void InitializeShufflePool(); + const char* GetSequenceName(uint16_t seqId); + bool HasSequenceNum(uint16_t seqId); + size_t SequenceMapSize(); + std::string GetCvarKey(std::string sfxKey); + std::string GetCvarLockKey(std::string sfxKey); }; #else -void AudioCollection_AddToCollection(char *otrPath, uint16_t seqNum); +void AudioCollection_AddToCollection(char* otrPath, uint16_t seqNum); const char* AudioCollection_GetSequenceName(uint16_t seqId); bool AudioCollection_HasSequenceNum(uint16_t seqId); size_t AudioCollection_SequenceMapSize(); diff --git a/soh/soh/Enhancements/audio/AudioEditor.cpp b/soh/soh/Enhancements/audio/AudioEditor.cpp index d15bc5f254..4cf1f389d0 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.cpp +++ b/soh/soh/Enhancements/audio/AudioEditor.cpp @@ -12,9 +12,15 @@ #include "soh/cvar_prefixes.h" #include #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "AudioCollection.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" +extern "C" { +#include "z64save.h" +extern SaveContext gSaveContext; +} + Vec3f pos = { 0.0f, 0.0f, 0.0f }; f32 freqScale = 1.0f; s8 reverbAdd = 0; @@ -52,7 +58,7 @@ size_t AuthenticCountBySequenceType(SeqType type) { case SEQ_VOICE: return SEQ_COUNT_VOICE; default: - return 0; + return 0; } } @@ -95,7 +101,8 @@ void RandomizeGroup(SeqType type) { } // if we didn't find any, return early without shuffling to prevent an infinite loop - if (!values.size()) return; + if (!values.size()) + return; } Shuffle(values); for (const auto& [seqId, seqData] : AudioCollection::Instance->GetAllSequences()) { @@ -104,7 +111,9 @@ void RandomizeGroup(SeqType type) { // don't randomize locked entries if ((seqData.category & type) && CVarGetInteger(cvarLockKey.c_str(), 0) == 0) { // Only save authentic sequence CVars - if ((((seqData.category & SEQ_BGM_CUSTOM) || seqData.category == SEQ_FANFARE) && seqData.sequenceId >= MAX_AUTHENTIC_SEQID) || seqData.canBeReplaced == false) { + if ((((seqData.category & SEQ_BGM_CUSTOM) || seqData.category == SEQ_FANFARE) && + seqData.sequenceId >= MAX_AUTHENTIC_SEQID) || + seqData.canBeReplaced == false) { continue; } const int randomValue = values.back(); @@ -165,14 +174,21 @@ void DrawPreviewButton(uint16_t sequenceId, std::string sfxKey, SeqType sequence const std::string previewButton = ICON_FA_PLAY + hiddenKey; if (CVarGetInteger(CVAR_AUDIO("Playing"), 0) == sequenceId) { - if (ImGui::Button(stopButton.c_str())) { + if (UIWidgets::Button(stopButton.c_str(), UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Stop Preview") + .Color(THEME_COLOR))) { func_800F5C2C(); CVarSetInteger(CVAR_AUDIO("Playing"), 0); } - UIWidgets::Tooltip("Stop Preview"); } else { - if (ImGui::Button(previewButton.c_str())) { - if (CVarGetInteger(CVAR_AUDIO("Playing"), 0) != 0) { + if (UIWidgets::Button(previewButton.c_str(), UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Play Preview") + .Color(THEME_COLOR))) { + if (CVarGetInteger(CVAR_AUDIO("Playing"), 0) != 0) { func_800F5C2C(); CVarSetInteger(CVAR_AUDIO("Playing"), 0); } else { @@ -188,11 +204,10 @@ void DrawPreviewButton(uint16_t sequenceId, std::string sfxKey, SeqType sequence } } } - UIWidgets::Tooltip("Play Preview"); } } -void Draw_SfxTab(const std::string& tabId, SeqType type) { +void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabName) { const std::map& map = AudioCollection::Instance->GetAllSequences(); const std::string hiddenTabId = "##" + tabId; @@ -200,7 +215,10 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { const std::string randomizeAllButton = "Randomize All" + hiddenTabId; const std::string lockAllButton = "Lock All" + hiddenTabId; const std::string unlockAllButton = "Unlock All" + hiddenTabId; - if (ImGui::Button(resetAllButton.c_str())) { + + ImGui::SeparatorText(tabName.c_str()); + if (UIWidgets::Button(resetAllButton.c_str(), + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); ResetGroup(map, type); @@ -211,7 +229,8 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { } } ImGui::SameLine(); - if (ImGui::Button(randomizeAllButton.c_str())) { + if (UIWidgets::Button(randomizeAllButton.c_str(), + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); RandomizeGroup(type); @@ -222,7 +241,8 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { } } ImGui::SameLine(); - if (ImGui::Button(lockAllButton.c_str())) { + if (UIWidgets::Button(lockAllButton.c_str(), + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); LockGroup(map, type); @@ -233,7 +253,8 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { } } ImGui::SameLine(); - if (ImGui::Button(unlockAllButton.c_str())) { + if (UIWidgets::Button(unlockAllButton.c_str(), + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); UnlockGroup(map, type); @@ -244,16 +265,23 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { } } + auto playingFromMenu = CVarGetInteger(CVAR_AUDIO("Playing"), 0); + auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); + + // Longest text in Audio Editor + ImVec2 columnSize = ImGui::CalcTextSize("Navi - Look/Hey/Watchout (Target Enemy)"); ImGui::BeginTable(tabId.c_str(), 3, ImGuiTableFlags_SizingFixedFit); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 100.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, columnSize.x + 30); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, columnSize.x + 30); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 160.0f); for (const auto& [defaultValue, seqData] : map) { if (~(seqData.category) & type) { continue; } // Do not display custom sequences in the list - if ((((seqData.category & SEQ_BGM_CUSTOM) || seqData.category == SEQ_FANFARE) && defaultValue >= MAX_AUTHENTIC_SEQID) || seqData.canBeReplaced == false) { + if ((((seqData.category & SEQ_BGM_CUSTOM) || seqData.category == SEQ_FANFARE) && + defaultValue >= MAX_AUTHENTIC_SEQID) || + seqData.canBeReplaced == false) { continue; } @@ -266,17 +294,23 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { const std::string lockedButton = ICON_FA_LOCK + hiddenKey; const std::string unlockedButton = ICON_FA_UNLOCK + hiddenKey; const int currentValue = CVarGetInteger(cvarKey.c_str(), defaultValue); + const bool isCurrentlyPlaying = currentValue == playingFromMenu || seqData.sequenceId == currentBGM; ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::Text("%s", seqData.label.c_str()); + ImGui::TextColored( + UIWidgets::ColorValues.at(isCurrentlyPlaying ? UIWidgets::Colors::Yellow : UIWidgets::Colors::White), "%s", + seqData.label.c_str()); ImGui::TableNextColumn(); ImGui::PushItemWidth(-FLT_MIN); const int initialValue = map.contains(currentValue) ? currentValue : defaultValue; + UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo(hiddenKey.c_str(), map.at(initialValue).label.c_str())) { for (const auto& [value, seqData] : map) { - // If excluded as a replacement sequence, don't show in other dropdowns except the effect's own dropdown. - if (~(seqData.category) & type || (!seqData.canBeUsedAsReplacement && initialSfxKey != seqData.sfxKey)) { + // If excluded as a replacement sequence, don't show in other dropdowns except the effect's own + // dropdown. + if (~(seqData.category) & type || + (!seqData.canBeUsedAsReplacement && initialSfxKey != seqData.sfxKey)) { continue; } @@ -293,22 +327,32 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { ImGui::EndCombo(); } + UIWidgets::PopStyleCombobox(); ImGui::TableNextColumn(); ImGui::PushItemWidth(-FLT_MIN); - DrawPreviewButton((type == SEQ_SFX || type == SEQ_VOICE || type == SEQ_INSTRUMENT) ? defaultValue : currentValue, seqData.sfxKey, type); - auto locked = CVarGetInteger(cvarLockKey.c_str(), 0) == 1; + DrawPreviewButton((type == SEQ_SFX || type == SEQ_VOICE || type == SEQ_INSTRUMENT) ? defaultValue + : currentValue, + seqData.sfxKey, type); + auto locked = CVarGetInteger(cvarLockKey.c_str(), 0) == 1; ImGui::SameLine(); ImGui::PushItemWidth(-FLT_MIN); - if (ImGui::Button(resetButton.c_str())) { + if (UIWidgets::Button(resetButton.c_str(), UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Reset to default") + .Color(THEME_COLOR))) { CVarClear(cvarKey.c_str()); CVarClear(cvarLockKey.c_str()); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); UpdateCurrentBGM(defaultValue, seqData.category); } - UIWidgets::Tooltip("Reset to default"); ImGui::SameLine(); ImGui::PushItemWidth(-FLT_MIN); - if (ImGui::Button(randomizeButton.c_str())) { + if (UIWidgets::Button(randomizeButton.c_str(), UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Randomize this sound") + .Color(THEME_COLOR))) { std::vector validSequences = {}; for (const auto seqInfo : AudioCollection::Instance->GetIncludedSequences()) { if (seqInfo->category & type) { @@ -325,12 +369,16 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { } Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); UpdateCurrentBGM(defaultValue, type); - } + } } - UIWidgets::Tooltip("Randomize this sound"); ImGui::SameLine(); ImGui::PushItemWidth(-FLT_MIN); - if (ImGui::Button(locked ? lockedButton.c_str() : unlockedButton.c_str())) { + if (UIWidgets::Button(locked ? lockedButton.c_str() : unlockedButton.c_str(), + UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip(locked ? "Sound locked" : "Sound unlocked") + .Color(THEME_COLOR))) { if (locked) { CVarClear(cvarLockKey.c_str()); } else { @@ -338,7 +386,6 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { } Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - UIWidgets::Tooltip(locked ? "Sound locked" : "Sound unlocked"); } ImGui::EndTable(); } @@ -401,18 +448,18 @@ ImVec4 GetSequenceTypeColor(SeqType type) { } } -void DrawTypeChip(SeqType type) { +void DrawTypeChip(SeqType type, std::string sequenceName) { ImGui::BeginDisabled(); ImGui::PushStyleColor(ImGuiCol_Button, GetSequenceTypeColor(type)); - ImGui::SmallButton(GetSequenceTypeName(type).c_str()); + std::string buttonLabel = GetSequenceTypeName(type) + "##" + sequenceName; + ImGui::Button(buttonLabel.c_str()); ImGui::PopStyleColor(); ImGui::EndDisabled(); } - void AudioEditorRegisterOnSceneInitHook() { GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { - if (CVarGetInteger(CVAR_AUDIO("RandomizeAllOnNewScene"), 0)) { + if (gSaveContext.gameMode != GAMEMODE_END_CREDITS && CVarGetInteger(CVAR_AUDIO("RandomizeAllOnNewScene"), 0)) { AudioEditor_RandomizeAll(); } }); @@ -425,114 +472,112 @@ void AudioEditor::InitElement() { void AudioEditor::DrawElement() { AudioCollection::Instance->InitializeShufflePool(); - float buttonSegments = ImGui::GetContentRegionAvail().x / 4; - if (ImGui::Button("Randomize All Groups", ImVec2(buttonSegments, 30.0f))) { + UIWidgets::Separator(); + if (UIWidgets::Button("Randomize All Groups", + UIWidgets::ButtonOptions() + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Randomizes all unlocked music and sound effects across tab groups"))) { AudioEditor_RandomizeAll(); } - UIWidgets::Tooltip("Randomizes all unlocked music and sound effects across tab groups"); ImGui::SameLine(); - if (ImGui::Button("Reset All Groups", ImVec2(buttonSegments, 30.0f))) { + if (UIWidgets::Button("Reset All Groups", + UIWidgets::ButtonOptions() + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Resets all unlocked music and sound effects across tab groups"))) { AudioEditor_ResetAll(); } - UIWidgets::Tooltip("Resets all unlocked music and sound effects across tab groups"); ImGui::SameLine(); - if (ImGui::Button("Lock All Groups", ImVec2(buttonSegments, 30.0f))) { + if (UIWidgets::Button("Lock All Groups", UIWidgets::ButtonOptions() + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Locks all music and sound effects across tab groups"))) { AudioEditor_LockAll(); } - UIWidgets::Tooltip("Locks all music and sound effects across tab groups"); ImGui::SameLine(); - if (ImGui::Button("Unlock All Groups", ImVec2(buttonSegments, 30.0f))) { + if (UIWidgets::Button("Unlock All Groups", UIWidgets::ButtonOptions() + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Unlocks all music and sound effects across tab groups"))) { AudioEditor_UnlockAll(); } - UIWidgets::Tooltip("Unlocks all music and sound effects across tab groups"); - + UIWidgets::Separator(); + UIWidgets::PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("SfxContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { - if (ImGui::BeginTabItem("Background Music")) { - Draw_SfxTab("backgroundMusic", SEQ_BGM_WORLD); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Fanfares")) { - Draw_SfxTab("fanfares", SEQ_FANFARE); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Events")) { - Draw_SfxTab("event", SEQ_BGM_EVENT); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Battle Music")) { - Draw_SfxTab("battleMusic", SEQ_BGM_BATTLE); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Ocarina")) { - Draw_SfxTab("instrument", SEQ_INSTRUMENT); - Draw_SfxTab("ocarina", SEQ_OCARINA); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Sound Effects")) { - Draw_SfxTab("sfx", SEQ_SFX); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Voices")) { - Draw_SfxTab("voice", SEQ_VOICE); - ImGui::EndTabItem(); - } static ImVec2 cellPadding(8.0f, 8.0f); - if (ImGui::BeginTabItem("Options")) { + if (ImGui::BeginTabItem("Audio Options")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); - ImGui::BeginTable("Options", 1, ImGuiTableFlags_SizingStretchSame); + ImGui::BeginTable("Audio Options", 1, ImGuiTableFlags_SizingStretchSame); ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); ImGui::TableNextRow(); ImGui::TableNextColumn(); if (ImGui::BeginChild("SfxOptions", ImVec2(0, -8))) { - ImGui::PushItemWidth(-FLT_MIN); - UIWidgets::EnhancementCheckbox("Disable Enemy Proximity Music", CVAR_AUDIO("EnemyBGMDisable")); - UIWidgets::InsertHelpHoverText( - "Disables the music change when getting close to enemies. Useful for hearing " - "your custom music for each scene more often."); - UIWidgets::EnhancementCheckbox("Disable Leading Music in Lost Woods", CVAR_AUDIO("LostWoodsConsistentVolume")); - UIWidgets::InsertHelpHoverText( - "Disables the volume shifting in the Lost Woods. Useful for hearing " - "your custom music in the Lost Woods if you don't need the navigation assitance " - "the volume changing provides. If toggling this while in the Lost Woods, reload " - "the area for the effect to kick in." - ); - UIWidgets::EnhancementCheckbox("Display Sequence Name on Overlay", CVAR_AUDIO("SeqNameOverlay")); - UIWidgets::InsertHelpHoverText( - "Displays the name of the current sequence in the corner of the screen whenever a new sequence " - "is loaded to the main sequence player (does not apply to fanfares or enemy BGM)." - ); + UIWidgets::CVarCheckbox( + "Mute Low HP Alarm", CVAR_AUDIO("LowHpAlarm"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR).Tooltip("Disable the low HP beeping sound.")); + UIWidgets::CVarCheckbox("Disable Navi Call Audio", CVAR_AUDIO("DisableNaviCallAudio"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Disables the voice audio when Navi calls you.")); + UIWidgets::CVarCheckbox( + "Disable Enemy Proximity Music", CVAR_AUDIO("EnemyBGMDisable"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Disables the music change when getting close to enemies. Useful for hearing " + "your custom music for each scene more often.")); + UIWidgets::CVarCheckbox( + "Disable Leading Music in Lost Woods", CVAR_AUDIO("LostWoodsConsistentVolume"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Disables the volume shifting in the Lost Woods. Useful for hearing " + "your custom music in the Lost Woods if you don't need the navigation assitance " + "the volume changing provides. If toggling this while in the Lost Woods, reload " + "the area for the effect to kick in.")); + UIWidgets::CVarCheckbox( + "Display Sequence Name on Overlay", CVAR_AUDIO("SeqNameOverlay"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Displays the name of the current sequence in the corner of the screen whenever a new " + "sequence " + "is loaded to the main sequence player (does not apply to fanfares or enemy BGM).")); + UIWidgets::CVarSliderInt("Overlay Duration: %d seconds", CVAR_AUDIO("SeqNameOverlayDuration"), + UIWidgets::IntSliderOptions() + .Min(1) + .Max(10) + .DefaultValue(5) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + UIWidgets::CVarSliderFloat("Link's voice pitch multiplier", CVAR_AUDIO("LinkVoiceFreqMultiplier"), + UIWidgets::FloatSliderOptions() + .IsPercentage() + .Min(0.4f) + .Max(2.5f) + .DefaultValue(1.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); ImGui::SameLine(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - UIWidgets::EnhancementSliderInt("Overlay Duration: %d seconds", "##SeqNameOverlayDuration", - CVAR_AUDIO("SeqNameOverlayDuration"), 1, 10, "", 5); - ImGui::PopItemWidth(); - ImGui::NewLine(); - ImGui::PopItemWidth(); - UIWidgets::EnhancementSliderFloat("Link's voice pitch multiplier: %.1f %%", "##linkVoiceFreqMultiplier", - CVAR_AUDIO("LinkVoiceFreqMultiplier"), 0.4, 2.5, "", 1.0, true, true); - ImGui::SameLine(); - const std::string resetButton = "Reset##linkVoiceFreqMultiplier"; - if (ImGui::Button(resetButton.c_str())) { + ImGui::SetCursorPosY(ImGui::GetCursorPos().y + 40.f); + if (UIWidgets::Button("Reset##linkVoiceFreqMultiplier", + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarSetFloat(CVAR_AUDIO("LinkVoiceFreqMultiplier"), 1.0f); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - - ImGui::NewLine(); - UIWidgets::EnhancementCheckbox("Randomize All Music and Sound Effects on New Scene", CVAR_AUDIO("RandomizeAllOnNewScene")); - UIWidgets::Tooltip("Enables randomizing all unlocked music and sound effects when you enter a new scene."); - - ImGui::NewLine(); - ImGui::PushItemWidth(-FLT_MIN); - UIWidgets::PaddedSeparator(); - UIWidgets::PaddedText("The following options are experimental and may cause music\nto sound odd or have other undesireable effects."); - UIWidgets::EnhancementCheckbox("Lower Octaves of Unplayable High Notes", CVAR_AUDIO("ExperimentalOctaveDrop")); - UIWidgets::InsertHelpHoverText("Some custom sequences may have notes that are too high for the game's audio " - "engine to play. Enabling this checkbox will cause these notes to drop a " - "couple of octaves so they can still harmonize with the other notes of the " - "sequence."); - ImGui::PopItemWidth(); + UIWidgets::CVarCheckbox( + "Randomize All Music and Sound Effects on New Scene", CVAR_AUDIO("RandomizeAllOnNewScene"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip( + "Enables randomizing all unlocked music and sound effects when you enter a new scene.")); + UIWidgets::CVarCheckbox( + "Lower Octaves of Unplayable High Notes", CVAR_AUDIO("ExperimentalOctaveDrop"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Some custom sequences may have notes that are too high for the game's audio " + "engine to play. Enabling this checkbox will cause these notes to drop a " + "couple of octaves so they can still harmonize with the other notes of the " + "sequence.")); } ImGui::EndChild(); ImGui::EndTable(); @@ -540,6 +585,36 @@ void AudioEditor::DrawElement() { ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("Background Music")) { + Draw_SfxTab("backgroundMusic", SEQ_BGM_WORLD, "Background Music"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Fanfares")) { + Draw_SfxTab("fanfares", SEQ_FANFARE, "Fanfares"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Events")) { + Draw_SfxTab("event", SEQ_BGM_EVENT, "Events"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Battle Music")) { + Draw_SfxTab("battleMusic", SEQ_BGM_BATTLE, "Battle Music"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Ocarina")) { + Draw_SfxTab("instrument", SEQ_INSTRUMENT, "Instruments"); + Draw_SfxTab("ocarina", SEQ_OCARINA, "Ocarina"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Sound Effects")) { + Draw_SfxTab("sfx", SEQ_SFX, "Sound Effects"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Voices")) { + Draw_SfxTab("voice", SEQ_VOICE, "Voices"); + ImGui::EndTabItem(); + } + static bool excludeTabOpen = false; if (ImGui::BeginTabItem("Audio Shuffle Pool Management")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); @@ -547,16 +622,10 @@ void AudioEditor::DrawElement() { excludeTabOpen = true; } - static std::map showType { - {SEQ_BGM_WORLD, true}, - {SEQ_BGM_EVENT, true}, - {SEQ_BGM_BATTLE, true}, - {SEQ_OCARINA, true}, - {SEQ_FANFARE, true}, - {SEQ_SFX, true }, - {SEQ_VOICE, true }, - {SEQ_INSTRUMENT, true}, - {SEQ_BGM_CUSTOM, true} + static std::map showType{ + { SEQ_BGM_WORLD, true }, { SEQ_BGM_EVENT, true }, { SEQ_BGM_BATTLE, true }, + { SEQ_OCARINA, true }, { SEQ_FANFARE, true }, { SEQ_SFX, true }, + { SEQ_VOICE, true }, { SEQ_INSTRUMENT, true }, { SEQ_BGM_CUSTOM, true }, }; // make temporary sets because removing from the set we're iterating through crashes ImGui @@ -564,9 +633,12 @@ void AudioEditor::DrawElement() { std::set seqsToExclude = {}; static ImGuiTextFilter sequenceSearch; + UIWidgets::PushStyleInput(THEME_COLOR); sequenceSearch.Draw("Filter (inc,-exc)", 490.0f); + UIWidgets::PopStyleInput(); ImGui::SameLine(); - if (ImGui::Button("Exclude All")) { + if (UIWidgets::Button("Exclude All", + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { for (auto seqInfo : AudioCollection::Instance->GetIncludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { seqsToExclude.insert(seqInfo); @@ -574,7 +646,8 @@ void AudioEditor::DrawElement() { } } ImGui::SameLine(); - if (ImGui::Button("Include All")) { + if (UIWidgets::Button("Include All", + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { for (auto seqInfo : AudioCollection::Instance->GetExcludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { seqsToInclude.insert(seqInfo); @@ -582,7 +655,8 @@ void AudioEditor::DrawElement() { } } - ImGui::BeginTable("sequenceTypes", 9, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders); + ImGui::BeginTable("sequenceTypes", 9, + ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders); ImGui::TableNextColumn(); ImGui::PushStyleColor(ImGuiCol_Header, GetSequenceTypeColor(SEQ_BGM_WORLD)); @@ -643,13 +717,17 @@ void AudioEditor::DrawElement() { ImGui::BeginChild("ChildIncludedSequences", ImVec2(0, -8)); for (auto seqInfo : AudioCollection::Instance->GetIncludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { - if (ImGui::Button(std::string(ICON_FA_TIMES "##" + seqInfo->sfxKey).c_str())) { + if (UIWidgets::Button(std::string(ICON_FA_TIMES "##" + seqInfo->sfxKey).c_str(), + UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(9.0f, 6.0f)) + .Color(THEME_COLOR))) { seqsToExclude.insert(seqInfo); } ImGui::SameLine(); DrawPreviewButton(seqInfo->sequenceId, seqInfo->sfxKey, seqInfo->category); ImGui::SameLine(); - DrawTypeChip(seqInfo->category); + DrawTypeChip(seqInfo->category, seqInfo->label); ImGui::SameLine(); ImGui::Text("%s", seqInfo->label.c_str()); } @@ -667,13 +745,17 @@ void AudioEditor::DrawElement() { ImGui::BeginChild("ChildExcludedSequences", ImVec2(0, -8)); for (auto seqInfo : AudioCollection::Instance->GetExcludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { - if (ImGui::Button(std::string(ICON_FA_PLUS "##" + seqInfo->sfxKey).c_str())) { + if (UIWidgets::Button(std::string(ICON_FA_PLUS "##" + seqInfo->sfxKey).c_str(), + UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(9.0f, 6.0f)) + .Color(THEME_COLOR))) { seqsToInclude.insert(seqInfo); } ImGui::SameLine(); DrawPreviewButton(seqInfo->sequenceId, seqInfo->sfxKey, seqInfo->category); ImGui::SameLine(); - DrawTypeChip(seqInfo->category); + DrawTypeChip(seqInfo->category, seqInfo->sfxKey); ImGui::SameLine(); ImGui::Text("%s", seqInfo->label.c_str()); } @@ -695,9 +777,12 @@ void AudioEditor::DrawElement() { ImGui::EndTabBar(); } + UIWidgets::PopStyleTabs(); } -std::vector allTypes = { SEQ_BGM_WORLD, SEQ_BGM_EVENT, SEQ_BGM_BATTLE, SEQ_OCARINA, SEQ_FANFARE, SEQ_INSTRUMENT, SEQ_SFX, SEQ_VOICE }; +std::vector allTypes = { + SEQ_BGM_WORLD, SEQ_BGM_EVENT, SEQ_BGM_BATTLE, SEQ_OCARINA, SEQ_FANFARE, SEQ_INSTRUMENT, SEQ_SFX, SEQ_VOICE, +}; void AudioEditor_RandomizeAll() { for (auto type : allTypes) { diff --git a/soh/soh/Enhancements/audio/AudioEditor.h b/soh/soh/Enhancements/audio/AudioEditor.h index b1b034f246..ca3636d9a8 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.h +++ b/soh/soh/Enhancements/audio/AudioEditor.h @@ -7,14 +7,14 @@ #include #include "AudioCollection.h" -class AudioEditor : public Ship::GuiWindow { - public: - using GuiWindow::GuiWindow; +class AudioEditor final : public Ship::GuiWindow { + public: + using GuiWindow::GuiWindow; - void DrawElement() override; - void InitElement() override; - void UpdateElement() override {}; - ~AudioEditor() {}; + void DrawElement() override; + void InitElement() override; + void UpdateElement() override{}; + ~AudioEditor(){}; }; void AudioEditor_RandomizeAll(); @@ -29,7 +29,6 @@ extern "C" { u16 AudioEditor_GetReplacementSeq(u16 seqId); - #ifdef __cplusplus } #endif diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c index ac2ae2bc53..dde827ec57 100644 --- a/soh/soh/Enhancements/bootcommands.c +++ b/soh/soh/Enhancements/bootcommands.c @@ -12,8 +12,7 @@ #include "soh/OTRGlobals.h" #include "soh/cvar_prefixes.h" -void BootCommands_Init() -{ +void BootCommands_Init() { // Clears vars to prevent randomizer menu from being disabled CVarClear(CVAR_GENERAL("RandoGenerating")); // Clear when a crash happened during rando seed generation CVarClear(CVAR_GENERAL("NewSeedGenerated")); diff --git a/soh/soh/Enhancements/boss-rush/BossRush.cpp b/soh/soh/Enhancements/boss-rush/BossRush.cpp index aabe5d67ab..979f0ad6a2 100644 --- a/soh/soh/Enhancements/boss-rush/BossRush.cpp +++ b/soh/soh/Enhancements/boss-rush/BossRush.cpp @@ -1,4 +1,4 @@ -#include "BossRush.h" +#include "BossRush.h" #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" @@ -8,18 +8,18 @@ #include extern "C" { - #include "functions.h" - #include "macros.h" - #include "variables.h" - #include "src/overlays/actors/ovl_Boss_Goma/z_boss_goma.h" - #include "src/overlays/actors/ovl_Boss_Mo/z_boss_mo.h" - #include "src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h" - extern PlayState* gPlayState; +#include "functions.h" +#include "macros.h" +#include "variables.h" +#include "src/overlays/actors/ovl_Boss_Goma/z_boss_goma.h" +#include "src/overlays/actors/ovl_Boss_Mo/z_boss_mo.h" +#include "src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h" +extern PlayState* gPlayState; - Gfx* KaleidoScope_QuadTextureIA8(Gfx* gfx, void* texture, s16 width, s16 height, u16 point); - #include "textures/icon_item_nes_static/icon_item_nes_static.h" - #include "textures/icon_item_ger_static/icon_item_ger_static.h" - #include "textures/icon_item_fra_static/icon_item_fra_static.h" +Gfx* KaleidoScope_QuadTextureIA8(Gfx* gfx, void* texture, s16 width, s16 height, u16 point); +#include "textures/icon_item_nes_static/icon_item_nes_static.h" +#include "textures/icon_item_ger_static/icon_item_ger_static.h" +#include "textures/icon_item_fra_static/icon_item_fra_static.h" } typedef struct BossRushSetting { @@ -27,103 +27,79 @@ typedef struct BossRushSetting { std::vector> choices; } BossRushSetting; -BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = { - { - { "BOSSES:", "BOSSE:", "BOSS:" }, - { - { "All", "Alle", "Tous" }, - { "Child", "Kind", "Enfant" }, - { "Adult", "Erwachsener", "Adulte" }, - { "Ganondorf & Ganon", "Ganondorf & Ganon", "Ganondorf & Ganon" } - } - }, - { - { "HEARTS:", "HERZEN:", "COEURS:" }, - { - { "10", "10", "10" }, - { "15", "15", "15" }, - { "20", "20", "20" }, - { "3", "3", "3" }, - { "5", "5", "5" }, - { "7", "7", "7" } - } - }, - { - { "AMMO:", "MUNITION:", "MUNITIONS:" }, - { - { "Limited", "Limitiert", "Limitées" }, - { "Full", "Voll", "Pleines" }, - { "Maxed", "Maximum", "Maximum" } - } - }, - { - { "HEAL:", "REGENERATION:", "SOIN:" }, - { - { "Before Ganondorf", "Vor Ganondorf", "Avant Ganondorf" }, - { "Every Boss", "Bei jedem Boss", "Tous les Boss" }, - { "Never", "Niemals", "Jamais" } - } - }, - { - { "HYPER BOSSES:", "HYPER-BOSSE:", "HYPER BOSS:" }, - { - { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" } - } - }, - { - { "MAGIC:", "MAGIE:", "MAGIE:" }, - { - { "Single", "Einzel", "Simple" }, - { "Double", "Doppel", "Double" } - } - }, - { - { "BIG. SWORD:", "BIG.-SCHWERT:", "EPÉE DE BIG.:" }, - { - { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" } - } - }, - { - { "BOTTLE:", "FLASCHEN:", "BOUTEILLE:" }, - { - { "No", "Nein", "Non" }, - { "Empty", "Leer", "Vide" }, - { "Fairy", "Fee", "Fée" }, - { "Red Potion", "Rotes Elixier", "Potion Rouge" }, - { "Green Potion", "Grünes Elixier", "Potion Verte" }, - { "Blue Potion", "Blaues Elixier", "Potion Bleue" } - } - }, - { - { "LONGSHOT:", "ENTERHAKEN:", "SUPER GRAPPIN:" }, - { - { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" } - } - }, - { - { "HOVER BOOTS:", "GLEITSTIEFEL:", "BOTTES DES AIRS:" }, - { - { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" } - } - }, - { - { "BUNNY HOOD:", "HASENOHREN:", "MASQUE DU LAPIN:" }, - { - { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" } - } - }, - { - { "TIMER:", "TIMER:", "TIMER:" }, - { - { "Yes", "Ja", "Oui" }, - { "No", "Nein", "Non" } - } - } +BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = { + { { "BOSSES:", "BOSSE:", "BOSS:" }, + { + { "All", "Alle", "Tous" }, + { "Child", "Kind", "Enfant" }, + { "Adult", "Erwachsener", "Adulte" }, + { "Ganondorf & Ganon", "Ganondorf & Ganon", "Ganondorf & Ganon" }, + } }, + { { "HEARTS:", "HERZEN:", "COEURS:" }, + { + { "10", "10", "10" }, + { "15", "15", "15" }, + { "20", "20", "20" }, + { "3", "3", "3" }, + { "5", "5", "5" }, + { "7", "7", "7" }, + } }, + { { "AMMO:", "MUNITION:", "MUNITIONS:" }, + { + { "Limited", "Limitiert", "Limitées" }, + { "Full", "Voll", "Pleines" }, + { "Maxed", "Maximum", "Maximum" }, + } }, + { { "HEAL:", "REGENERATION:", "SOIN:" }, + { + { "Before Ganondorf", "Vor Ganondorf", "Avant Ganondorf" }, + { "Every Boss", "Bei jedem Boss", "Tous les Boss" }, + { "Never", "Niemals", "Jamais" }, + } }, + { { "HYPER BOSSES:", "HYPER-BOSSE:", "HYPER BOSS:" }, + { + { "No", "Nein", "Non" }, + { "Yes", "Ja", "Oui" }, + } }, + { { "MAGIC:", "MAGIE:", "MAGIE:" }, + { + { "Single", "Einzel", "Simple" }, + { "Double", "Doppel", "Double" }, + } }, + { { "BIG. SWORD:", "BIG.-SCHWERT:", "EPÉE DE BIG.:" }, + { + { "No", "Nein", "Non" }, + { "Yes", "Ja", "Oui" }, + } }, + { { "BOTTLE:", "FLASCHEN:", "BOUTEILLE:" }, + { + { "No", "Nein", "Non" }, + { "Empty", "Leer", "Vide" }, + { "Fairy", "Fee", "Fée" }, + { "Red Potion", "Rotes Elixier", "Potion Rouge" }, + { "Green Potion", "Grünes Elixier", "Potion Verte" }, + { "Blue Potion", "Blaues Elixier", "Potion Bleue" }, + } }, + { { "LONGSHOT:", "ENTERHAKEN:", "SUPER GRAPPIN:" }, + { + { "No", "Nein", "Non" }, + { "Yes", "Ja", "Oui" }, + } }, + { { "HOVER BOOTS:", "GLEITSTIEFEL:", "BOTTES DES AIRS:" }, + { + { "No", "Nein", "Non" }, + { "Yes", "Ja", "Oui" }, + } }, + { { "BUNNY HOOD:", "HASENOHREN:", "MASQUE DU LAPIN:" }, + { + { "No", "Nein", "Non" }, + { "Yes", "Ja", "Oui" }, + } }, + { { "TIMER:", "TIMER:", "TIMER:" }, + { + { "Yes", "Ja", "Oui" }, + { "No", "Nein", "Non" }, + } } }; const char* BossRush_GetSettingName(u8 optionIndex, u8 language) { @@ -135,7 +111,7 @@ const char* BossRush_GetSettingChoiceName(u8 optionIndex, u8 choiceIndex, u8 lan } u8 BossRush_GetSettingOptionsAmount(u8 optionIndex) { - return BossRushOptions[optionIndex].choices.size(); + return static_cast(BossRushOptions[optionIndex].choices.size()); } void BossRush_SpawnBlueWarps(PlayState* play) { @@ -196,7 +172,7 @@ void BossRush_SetEquipment(u8 linkAge) { Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU); - // Set Adult equipment. + // Set Adult equipment. } else { brButtonItems = { ITEM_SWORD_MASTER, ITEM_BOW, ITEM_HAMMER, ITEM_BOMB, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE }; @@ -229,34 +205,36 @@ void BossRush_HandleBlueWarp(PlayState* play, f32 warpPosX, f32 warpPosZ) { } else { play->nextEntranceIndex = ENTR_FOREST_TEMPLE_BOSS_ENTRANCE; } - // King Dodongo & Volvagia + // King Dodongo & Volvagia } else if (warpPosX == 100 && warpPosZ == -170) { if (gSaveContext.linkAge == LINK_AGE_CHILD) { play->nextEntranceIndex = ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE; } else { play->nextEntranceIndex = ENTR_FIRE_TEMPLE_BOSS_ENTRANCE; } - // Barinade & Morb + // Barinade & Morb } else if (warpPosX == 199 && warpPosZ == 0) { if (gSaveContext.linkAge == LINK_AGE_CHILD) { play->nextEntranceIndex = ENTR_JABU_JABU_BOSS_ENTRANCE; } else { play->nextEntranceIndex = ENTR_WATER_TEMPLE_BOSS_ENTRANCE; } - // Twinrova + // Twinrova } else if (warpPosX == 100 && warpPosZ == 170) { play->nextEntranceIndex = ENTR_SPIRIT_TEMPLE_BOSS_2; - // Bongo Bongo + // Bongo Bongo } else if (warpPosX == -100 && warpPosZ == 170) { play->nextEntranceIndex = ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE; - // Ganondork + // Ganondork } else if (warpPosX == -199 && warpPosZ == 0) { play->nextEntranceIndex = ENTR_GANONDORF_BOSS_0; } else { - SPDLOG_ERROR("[BossRush]: Unknown blue warp in chamber of sages at position ({}, {}). Warping back to chamber of sages.", warpPosX, warpPosZ); + SPDLOG_ERROR("[BossRush]: Unknown blue warp in chamber of sages at position ({}, {}). Warping back to " + "chamber of sages.", + warpPosX, warpPosZ); play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; } - // If coming from a boss room, teleport back to Chamber of Sages and set flag. + // If coming from a boss room, teleport back to Chamber of Sages and set flag. } else { play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; @@ -267,7 +245,7 @@ void BossRush_HandleBlueWarp(PlayState* play, f32 warpPosX, f32 warpPosZ) { // Change to Adult Link. if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_ALL) { BossRush_SetEquipment(LINK_AGE_ADULT); - // Warp to credits. + // Warp to credits. } else if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_CHILD) { play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.nextCutsceneIndex = 0xFFF2; @@ -328,11 +306,13 @@ void BossRush_HandleCompleteBoss(PlayState* play) { Health_ChangeBy(play, 320); } - if ((CheckDungeonCount() == 3 && gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_CHILD) || + if ((CheckDungeonCount() == 3 && + gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_CHILD) || play->sceneNum == SCENE_GANON_BOSS) { gSaveContext.ship.stats.playTimer += 2; gSaveContext.ship.stats.gameComplete = 1; - gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_BOSSRUSH_FINISH] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_BOSSRUSH_FINISH] = + static_cast(GAMEPLAYSTAT_TOTAL_TIME); } } @@ -399,17 +379,17 @@ void BossRush_InitSave() { gSaveContext.eventChkInf[7] |= 0x80; // bongo bongo // Sets all rando flags to false - // Boss Rush currently uses 2 randomizer flags (RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE & RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE) + // Boss Rush currently uses 2 randomizer flags (RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE & + // RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE) for (s32 i = 0; i < ARRAY_COUNT(gSaveContext.ship.randomizerInf); i++) { gSaveContext.ship.randomizerInf[i] = 0; } // Set items std::array brItems = { - ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_NONE, ITEM_NONE, - ITEM_SLINGSHOT, ITEM_NONE, ITEM_NONE, ITEM_HOOKSHOT, ITEM_NONE, ITEM_NONE, - ITEM_BOOMERANG, ITEM_LENS, ITEM_NONE, ITEM_HAMMER, ITEM_ARROW_LIGHT, ITEM_NONE, - ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, + ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_NONE, ITEM_NONE, ITEM_SLINGSHOT, ITEM_NONE, + ITEM_NONE, ITEM_HOOKSHOT, ITEM_NONE, ITEM_NONE, ITEM_BOOMERANG, ITEM_LENS, ITEM_NONE, ITEM_HAMMER, + ITEM_ARROW_LIGHT, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, }; if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_LONGSHOT] == BR_CHOICE_LONGSHOT_YES) { @@ -507,7 +487,7 @@ void BossRush_InitSave() { static void* sSavePromptNoChoiceTexs[] = { (void*)gPauseNoENGTex, (void*)gPauseNoGERTex, - (void*)gPauseNoFRATex + (void*)gPauseNoFRATex, }; void BossRush_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { @@ -541,11 +521,13 @@ void BossRush_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li break; } } - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, childPos.x, bossGoma->actor.world.pos.y, childPos.z, 0, 0, 0, WARP_DUNGEON_ADULT, false); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, childPos.x, + bossGoma->actor.world.pos.y, childPos.z, 0, 0, 0, WARP_DUNGEON_ADULT, false); break; } case SCENE_DODONGOS_CAVERN_BOSS: { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, -890.0f, -1523.76f, -3304.0f, 0, 0, 0, WARP_DUNGEON_ADULT, false); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, -890.0f, -1523.76f, -3304.0f, 0, 0, + 0, WARP_DUNGEON_ADULT, false); break; } case SCENE_JABU_JABU_BOSS: { @@ -563,28 +545,34 @@ void BossRush_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li } } - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, sWarpPos[sp7C].x, sWarpPos[sp7C].y, sWarpPos[sp7C].z, 0, 0, 0, WARP_DUNGEON_ADULT, false); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, sWarpPos[sp7C].x, sWarpPos[sp7C].y, + sWarpPos[sp7C].z, 0, 0, 0, WARP_DUNGEON_ADULT, false); break; } case SCENE_FOREST_TEMPLE_BOSS: { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 14.0f, -33.0f, -3315.0f, 0, 0, 0, WARP_DUNGEON_ADULT, true); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 14.0f, -33.0f, -3315.0f, 0, 0, 0, + WARP_DUNGEON_ADULT, true); break; } case SCENE_FIRE_TEMPLE_BOSS: { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 0.0f, 100.0f, 0.0f, 0, 0, 0, WARP_DUNGEON_ADULT, true); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 0.0f, 100.0f, 0.0f, 0, 0, 0, + WARP_DUNGEON_ADULT, true); break; } case SCENE_WATER_TEMPLE_BOSS: { BossMo* bossMo = va_arg(args, BossMo*); - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, bossMo->actor.world.pos.x, -280.0f, bossMo->actor.world.pos.z, 0, 0, 0, WARP_DUNGEON_ADULT, true); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, bossMo->actor.world.pos.x, -280.0f, + bossMo->actor.world.pos.z, 0, 0, 0, WARP_DUNGEON_ADULT, true); break; } case SCENE_SPIRIT_TEMPLE_BOSS: { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 600.0f, 230.0f, 0.0f, 0, 0, 0, WARP_DUNGEON_ADULT, true); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 600.0f, 230.0f, 0.0f, 0, 0, 0, + WARP_DUNGEON_ADULT, true); break; } case SCENE_SHADOW_TEMPLE_BOSS: { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, -50.0f, 0.0f, 400.0f, 0, 0, 0, WARP_DUNGEON_ADULT, true); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, -50.0f, 0.0f, 400.0f, 0, 0, 0, + WARP_DUNGEON_ADULT, true); break; } default: { @@ -699,12 +687,18 @@ void BossRush_RegisterHooks() { onBossDefeatHook = 0; onActorUpdate = 0; - if (!IS_BOSS_RUSH) return; + if (!IS_BOSS_RUSH) + return; - onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(BossRush_OnVanillaBehaviorHandler); - onSceneInitHook = GameInteractor::Instance->RegisterGameHook(BossRush_OnSceneInitHandler); - onActorInitHook = GameInteractor::Instance->RegisterGameHook(BossRush_OnActorInitHandler); - onBossDefeatHook = GameInteractor::Instance->RegisterGameHook(BossRush_OnBossDefeatHandler); - onActorUpdate = GameInteractor::Instance->RegisterGameHookForID(ACTOR_DOOR_WARP1, BossRush_OnBlueWarpUpdate); + onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook( + BossRush_OnVanillaBehaviorHandler); + onSceneInitHook = + GameInteractor::Instance->RegisterGameHook(BossRush_OnSceneInitHandler); + onActorInitHook = + GameInteractor::Instance->RegisterGameHook(BossRush_OnActorInitHandler); + onBossDefeatHook = + GameInteractor::Instance->RegisterGameHook(BossRush_OnBossDefeatHandler); + onActorUpdate = GameInteractor::Instance->RegisterGameHookForID( + ACTOR_DOOR_WARP1, BossRush_OnBlueWarpUpdate); }); } diff --git a/soh/soh/Enhancements/boss-rush/BossRush.h b/soh/soh/Enhancements/boss-rush/BossRush.h index 292cbaf26a..881d8d53f6 100644 --- a/soh/soh/Enhancements/boss-rush/BossRush.h +++ b/soh/soh/Enhancements/boss-rush/BossRush.h @@ -5,12 +5,12 @@ #ifdef __cplusplus extern "C" { #endif - void BossRush_HandleBlueWarpHeal(PlayState* play); - void BossRush_InitSave(); - const char* BossRush_GetSettingName(u8 optionIndex, u8 language); - const char* BossRush_GetSettingChoiceName(u8 optionIndex, u8 choiceIndex, u8 language); - u8 BossRush_GetSettingOptionsAmount(u8 optionIndex); - void BossRush_RegisterHooks(); +void BossRush_HandleBlueWarpHeal(PlayState* play); +void BossRush_InitSave(); +const char* BossRush_GetSettingName(u8 optionIndex, u8 language); +const char* BossRush_GetSettingChoiceName(u8 optionIndex, u8 choiceIndex, u8 language); +u8 BossRush_GetSettingOptionsAmount(u8 optionIndex); +void BossRush_RegisterHooks(); #ifdef __cplusplus }; #endif diff --git a/soh/soh/Enhancements/boss-rush/BossRushTypes.h b/soh/soh/Enhancements/boss-rush/BossRushTypes.h index cf4d3aaba1..973f1599f4 100644 --- a/soh/soh/Enhancements/boss-rush/BossRushTypes.h +++ b/soh/soh/Enhancements/boss-rush/BossRushTypes.h @@ -37,28 +37,28 @@ typedef enum { typedef enum { BR_CHOICE_AMMO_LIMITED, BR_CHOICE_AMMO_FULL, - BR_CHOICE_AMMO_MAXED + BR_CHOICE_AMMO_MAXED, } BossRushAmmoChoices; typedef enum { BR_CHOICE_HEAL_GANONDORF, BR_CHOICE_HEAL_EVERYBOSS, - BR_CHOICE_HEAL_NEVER + BR_CHOICE_HEAL_NEVER, } BossRushHealChoices; typedef enum { BR_CHOICE_HYPERBOSSES_NO, - BR_CHOICE_HYPERBOSSES_YES + BR_CHOICE_HYPERBOSSES_YES, } BossRushHyperBossesChoices; typedef enum { BR_CHOICE_MAGIC_SINGLE, - BR_CHOICE_MAGIC_DOUBLE + BR_CHOICE_MAGIC_DOUBLE, } BossRushMagicChoices; typedef enum { BR_CHOICE_BGS_NO, - BR_CHOICE_BGS_YES + BR_CHOICE_BGS_YES, } BossRushBgsChoices; typedef enum { @@ -72,20 +72,20 @@ typedef enum { typedef enum { BR_CHOICE_LONGSHOT_NO, - BR_CHOICE_LONGSHOT_YES + BR_CHOICE_LONGSHOT_YES, } BossRushLongshotChoices; typedef enum { BR_CHOICE_HOVERBOOTS_NO, - BR_CHOICE_HOVERBOOTS_YES + BR_CHOICE_HOVERBOOTS_YES, } BossRushHoverBootsChoices; typedef enum { BR_CHOICE_BUNNYHOOD_NO, - BR_CHOICE_BUNNYHOOD_YES + BR_CHOICE_BUNNYHOOD_YES, } BossRushBunnyHoodChoices; typedef enum { BR_CHOICE_TIMER_YES, - BR_CHOICE_TIMER_NO + BR_CHOICE_TIMER_NO, } BossRushTimerChoices; diff --git a/soh/soh/Enhancements/controls/InputViewer.cpp b/soh/soh/Enhancements/controls/InputViewer.cpp index 5f650a25fe..1fbab40c21 100644 --- a/soh/soh/Enhancements/controls/InputViewer.cpp +++ b/soh/soh/Enhancements/controls/InputViewer.cpp @@ -10,31 +10,32 @@ #include #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" + +using namespace UIWidgets; // Text colors -static ImVec4 textColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); -static ImVec4 range1Color = ImVec4(1.0f, 0.7f, 0, 1.0f); -static ImVec4 range2Color = ImVec4(0, 1.0f, 0, 1.0f); +static Color_RGBA8 textColorDefault = { 255, 255, 255, 255 }; +static Color_RGBA8 range1ColorDefault = { 255, 178, 0, 255 }; +static Color_RGBA8 range2ColorDefault = { 0, 255, 0, 255 }; -static const char* buttonOutlineOptions[4] = { "Always Shown", "Shown Only While Not Pressed", - "Shown Only While Pressed", "Always Hidden" }; -static const char* buttonOutlineOptionsVerbose[4] = { "Outline Always Shown", "Outline Shown Only While Not Pressed", - "Outline Shown Only While Pressed", "Outline Always Hidden" }; +static std::unordered_map buttonOutlineOptions = { + { BUTTON_OUTLINE_ALWAYS_SHOWN, "Always Shown" }, + { BUTTON_OUTLINE_NOT_PRESSED, "Shown Only While Not Pressed" }, + { BUTTON_OUTLINE_PRESSED, "Shown Only While Pressed" }, + { BUTTON_OUTLINE_ALWAYS_HIDDEN, "Always Hidden" } +}; +static std::unordered_map buttonOutlineOptionsVerbose = { + { BUTTON_OUTLINE_ALWAYS_SHOWN, "Outline Always Shown" }, + { BUTTON_OUTLINE_NOT_PRESSED, "Outline Shown Only While Not Pressed" }, + { BUTTON_OUTLINE_PRESSED, "Outline Shown Only While Pressed" }, + { BUTTON_OUTLINE_ALWAYS_HIDDEN, "Outline Always Hidden" } +}; -static const char* stickModeOptions[3] = { "Always", "While In Use", "Never" }; - -static Color_RGBA8 vec2Color(ImVec4 vec) { - Color_RGBA8 color; - color.r = vec.x * 255.0; - color.g = vec.y * 255.0; - color.b = vec.z * 255.0; - color.a = vec.w * 255.0; - return color; -} - -static ImVec4 color2Vec(Color_RGBA8 color) { - return ImVec4(color.r / 255.0, color.g / 255.0, color.b / 255.0, color.a / 255.0); -} +static std::unordered_map stickModeOptions = { { STICK_MODE_ALWAYS_SHOWN, "Always" }, + { STICK_MODE_HIDDEN_IN_DEADZONE, "While In Use" }, + { STICK_MODE_ALWAYS_HIDDEN, "Never" } }; InputViewer::~InputViewer() { SPDLOG_TRACE("destruct input viewer"); @@ -48,14 +49,14 @@ void InputViewer::RenderButton(std::string btnTexture, std::string btnOutlineTex if (outlineMode == BUTTON_OUTLINE_ALWAYS_SHOWN || (outlineMode == BUTTON_OUTLINE_NOT_PRESSED && !state) || (outlineMode == BUTTON_OUTLINE_PRESSED && state)) { ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(btnOutlineTexture), size, - ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); + ImVec2(0, 0), ImVec2(1.0f, 1.0f)); } // Render button if pressed if (state) { ImGui::SetCursorPos(pos); ImGui::SetNextItemAllowOverlap(); ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(btnTexture), size, - ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); + ImVec2(0, 0), ImVec2(1.0f, 1.0f)); } } @@ -74,71 +75,83 @@ void InputViewer::DrawElement() { if (!sButtonTexturesLoaded) { Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( "Input-Viewer-Background", "textures/buttons/InputViewerBackground.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("A-Btn", "textures/buttons/ABtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("B-Btn", "textures/buttons/BBtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("L-Btn", "textures/buttons/LBtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("R-Btn", "textures/buttons/RBtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Z-Btn", "textures/buttons/ZBtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Start-Btn", - "textures/buttons/StartBtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Left", "textures/buttons/CLeft.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Right", "textures/buttons/CRight.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Up", "textures/buttons/CUp.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Down", "textures/buttons/CDown.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Analog-Stick", - "textures/buttons/AnalogStick.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Left", - "textures/buttons/DPadLeft.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Right", - "textures/buttons/DPadRight.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Up", "textures/buttons/DPadUp.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Down", - "textures/buttons/DPadDown.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-1", "textures/buttons/Mod1.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-2", "textures/buttons/Mod2.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Right-Stick", - "textures/buttons/RightStick.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("A-Btn Outline", - "textures/buttons/ABtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("B-Btn Outline", - "textures/buttons/BBtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("L-Btn Outline", - "textures/buttons/LBtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("R-Btn Outline", - "textures/buttons/RBtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Z-Btn Outline", - "textures/buttons/ZBtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Start-Btn Outline", - "textures/buttons/StartBtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Left Outline", - "textures/buttons/CLeftOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Right Outline", - "textures/buttons/CRightOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Up Outline", - "textures/buttons/CUpOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Down Outline", - "textures/buttons/CDownOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Analog-Stick Outline", - "textures/buttons/AnalogStickOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Left Outline", - "textures/buttons/DPadLeftOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Right Outline", - "textures/buttons/DPadRightOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Up Outline", - "textures/buttons/DPadUpOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Down Outline", - "textures/buttons/DPadDownOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-1 Outline", - "textures/buttons/Mod1Outline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-2 Outline", - "textures/buttons/Mod2Outline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Right-Stick Outline", - "textures/buttons/RightStickOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("A-Btn", + "textures/buttons/ABtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("B-Btn", + "textures/buttons/BBtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("L-Btn", + "textures/buttons/LBtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("R-Btn", + "textures/buttons/RBtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Z-Btn", + "textures/buttons/ZBtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Start-Btn", "textures/buttons/StartBtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Left", + "textures/buttons/CLeft.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Right", + "textures/buttons/CRight.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Up", + "textures/buttons/CUp.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Down", + "textures/buttons/CDown.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Analog-Stick", "textures/buttons/AnalogStick.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Left", "textures/buttons/DPadLeft.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Right", "textures/buttons/DPadRight.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Up", + "textures/buttons/DPadUp.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Down", "textures/buttons/DPadDown.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-1", + "textures/buttons/Mod1.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-2", + "textures/buttons/Mod2.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Right-Stick", "textures/buttons/RightStick.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "A-Btn Outline", "textures/buttons/ABtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "B-Btn Outline", "textures/buttons/BBtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "L-Btn Outline", "textures/buttons/LBtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "R-Btn Outline", "textures/buttons/RBtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Z-Btn Outline", "textures/buttons/ZBtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Start-Btn Outline", "textures/buttons/StartBtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "C-Left Outline", "textures/buttons/CLeftOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "C-Right Outline", "textures/buttons/CRightOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "C-Up Outline", "textures/buttons/CUpOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "C-Down Outline", "textures/buttons/CDownOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Analog-Stick Outline", "textures/buttons/AnalogStickOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Left Outline", "textures/buttons/DPadLeftOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Right Outline", "textures/buttons/DPadRightOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Up Outline", "textures/buttons/DPadUpOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Down Outline", "textures/buttons/DPadDownOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Modifier-1 Outline", "textures/buttons/Mod1Outline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Modifier-2 Outline", "textures/buttons/Mod2Outline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Right-Stick Outline", "textures/buttons/RightStickOutline.png"); sButtonTexturesLoaded = true; } ImVec2 mainPos = ImGui::GetWindowPos(); - ImVec2 size = ImGui::GetContentRegionAvail(); + ImVec2 size = ImGui::GetMainViewport()->WorkSize; #ifdef __WIIU__ const float scale = CVarGetFloat(CVAR_INPUT_VIEWER("Scale"), 1.0f) * 2.0f; @@ -146,7 +159,8 @@ void InputViewer::DrawElement() { const float scale = CVarGetFloat(CVAR_INPUT_VIEWER("Scale"), 1.0f); #endif const int showAnalogAngles = CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Enabled"), 0); - const int buttonOutlineMode = CVarGetInteger(CVAR_INPUT_VIEWER("ButtonOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED); + const int buttonOutlineMode = + CVarGetInteger(CVAR_INPUT_VIEWER("ButtonOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED); const bool useGlobalOutlineMode = CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1); ImVec2 bgSize = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureSize("Input-Viewer-Background"); @@ -154,12 +168,12 @@ void InputViewer::DrawElement() { ImGui::SetNextWindowSize( ImVec2(scaledBGSize.x + 20, scaledBGSize.y + - (showAnalogAngles ? ImGui::CalcTextSize("X").y : 0) * scale * - CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f) + - 20)); + (showAnalogAngles ? ImGui::CalcTextSize("X").y : 0) * scale * + CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f) + + 20)); ImGui::SetNextWindowContentSize( ImVec2(scaledBGSize.x, scaledBGSize.y + (showAnalogAngles ? 15 : 0) * scale * - CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f))); + CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f))); ImGui::SetNextWindowPos( ImVec2(mainPos.x + size.x - scaledBGSize.x - 30, mainPos.y + size.y - scaledBGSize.y - 30), ImGuiCond_FirstUseEver); @@ -167,11 +181,12 @@ void InputViewer::DrawElement() { ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 0.0f)); - OSContPad* pads = std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); + OSContPad* pads = + std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | - ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground | - ImGuiWindowFlags_NoFocusOnAppearing; + ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground | + ImGuiWindowFlags_NoFocusOnAppearing; if (!CVarGetInteger(CVAR_INPUT_VIEWER("EnableDragging"), 1)) { windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; @@ -186,7 +201,7 @@ void InputViewer::DrawElement() { // Background ImGui::Image( Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Input-Viewer-Background"), - scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); + scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f)); } // A/B @@ -194,17 +209,17 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("B-Btn", "B-Btn Outline", pads[0].button & BTN_B, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("BBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("BBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("ABtn"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("A-Btn", "A-Btn Outline", pads[0].button & BTN_A, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("ABtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("ABtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // C buttons @@ -212,33 +227,33 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Up", "C-Up Outline", pads[0].button & BTN_CUP, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CUpOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CUpOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("CLeft"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Left", "C-Left Outline", pads[0].button & BTN_CLEFT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CLeftOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CLeftOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("CRight"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Right", "C-Right Outline", pads[0].button & BTN_CRIGHT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CRightOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CRightOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("CDown"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Down", "C-Down Outline", pads[0].button & BTN_CDOWN, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CDownOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CDownOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // L/R/Z @@ -246,25 +261,25 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("L-Btn", "L-Btn Outline", pads[0].button & BTN_L, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("LBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("LBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("RBtn"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("R-Btn", "R-Btn Outline", pads[0].button & BTN_R, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("RBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("RBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("ZBtn"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Z-Btn", "Z-Btn Outline", pads[0].button & BTN_Z, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("ZBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("ZBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // Start @@ -272,9 +287,9 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Start-Btn", "Start-Btn Outline", pads[0].button & BTN_START, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("StartBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("StartBtnOutlineMode"), + BUTTON_OUTLINE_NOT_PRESSED)); } // Dpad @@ -282,27 +297,27 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Left", "Dpad-Left Outline", pads[0].button & BTN_DLEFT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Right", "Dpad-Right Outline", pads[0].button & BTN_DRIGHT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Up", "Dpad-Up Outline", pads[0].button & BTN_DUP, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Down", "Dpad-Down Outline", pads[0].button & BTN_DDOWN, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // Modifier 1 @@ -310,18 +325,18 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Modifier-1", "Modifier-1 Outline", pads[0].button & BTN_CUSTOM_MODIFIER1, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("Mod1OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("Mod1OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // Modifier 2 if (CVarGetInteger(CVAR_INPUT_VIEWER("Mod2"), 0)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Modifier-2", "Modifier-2 Outline", pads[0].button & BTN_CUSTOM_MODIFIER2, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("Mod2OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("Mod2OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } const bool analogStickIsInDeadzone = !pads[0].stick_x && !pads[0].stick_y; @@ -330,14 +345,14 @@ void InputViewer::DrawElement() { // Analog Stick const int analogOutlineMode = CVarGetInteger(CVAR_INPUT_VIEWER("AnalogStick.OutlineMode"), STICK_MODE_ALWAYS_SHOWN); - const float maxStickDistance = CVarGetInteger(CVAR_INPUT_VIEWER("AnalogStick.Movement"), 12); + const int32_t maxStickDistance = CVarGetInteger(CVAR_INPUT_VIEWER("AnalogStick.Movement"), 12); if (analogOutlineMode == STICK_MODE_ALWAYS_SHOWN || (analogOutlineMode == STICK_MODE_HIDDEN_IN_DEADZONE && !analogStickIsInDeadzone)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); ImGui::Image( Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Analog-Stick Outline"), - scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); + scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f)); } const int analogStickMode = CVarGetInteger(CVAR_INPUT_VIEWER("AnalogStick.VisibilityMode"), STICK_MODE_ALWAYS_SHOWN); @@ -346,13 +361,13 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos( ImVec2(aPos.x + maxStickDistance * ((float)(pads[0].stick_x) / MAX_AXIS_RANGE) * scale, - aPos.y - maxStickDistance * ((float)(pads[0].stick_y) / MAX_AXIS_RANGE) * scale)); + aPos.y - maxStickDistance * ((float)(pads[0].stick_y) / MAX_AXIS_RANGE) * scale)); ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Analog-Stick"), - scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); + scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f)); } // Right Stick - const float maxRightStickDistance = CVarGetInteger(CVAR_INPUT_VIEWER("RightStick.Movement"), 7); + const int32_t maxRightStickDistance = CVarGetInteger(CVAR_INPUT_VIEWER("RightStick.Movement"), 7); const int rightOutlineMode = CVarGetInteger(CVAR_INPUT_VIEWER("RightStick.OutlineMode"), STICK_MODE_ALWAYS_HIDDEN); if (rightOutlineMode == STICK_MODE_ALWAYS_SHOWN || @@ -361,7 +376,7 @@ void InputViewer::DrawElement() { ImGui::SetCursorPos(aPos); ImGui::Image( Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Right-Stick Outline"), - scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); + scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f)); } const int rightStickMode = CVarGetInteger(CVAR_INPUT_VIEWER("RightStick.VisibilityMode"), STICK_MODE_ALWAYS_HIDDEN); @@ -370,22 +385,23 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos( ImVec2(aPos.x + maxRightStickDistance * ((float)(pads[0].right_stick_x) / MAX_AXIS_RANGE) * scale, - aPos.y - maxRightStickDistance * ((float)(pads[0].right_stick_y) / MAX_AXIS_RANGE) * scale)); + aPos.y - maxRightStickDistance * ((float)(pads[0].right_stick_y) / MAX_AXIS_RANGE) * scale)); ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Right-Stick"), - scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); + scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f)); } // Analog stick angle text if (showAnalogAngles) { - ImGui::SetCursorPos(ImVec2(aPos.x + 10 + CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Offset"), 0) * scale, - scaledBGSize.y + aPos.y + 10)); + ImGui::SetCursorPos( + ImVec2(aPos.x + 10 + CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Offset"), 0) * scale, + scaledBGSize.y + aPos.y + 10)); // Scale font with input viewer scale float oldFontScale = ImGui::GetFont()->Scale; ImGui::GetFont()->Scale *= scale * CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f); ImGui::PushFont(ImGui::GetFont()); // Calculate polar R coordinate from X and Y angles, squared to avoid sqrt - const float rSquared = pads[0].stick_x * pads[0].stick_x + pads[0].stick_y * pads[0].stick_y; + const int32_t rSquared = pads[0].stick_x * pads[0].stick_x + pads[0].stick_y * pads[0].stick_y; // ESS range const int range1Min = CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Min"), 8); @@ -398,18 +414,17 @@ void InputViewer::DrawElement() { if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled"), 0) && (rSquared >= (range1Min * range1Min)) && (rSquared < (range1Max * range1Max))) { ImGui::PushStyleColor( - ImGuiCol_Text, - color2Vec(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color"), vec2Color(range1Color)))); - } - else if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0) && - (rSquared >= (range2Min * range2Min)) && (rSquared < (range2Max * range2Max))) { + ImGuiCol_Text, VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color.Value"), + range1ColorDefault))); + } else if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0) && + (rSquared >= (range2Min * range2Min)) && (rSquared < (range2Max * range2Max))) { ImGui::PushStyleColor( - ImGuiCol_Text, - color2Vec(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color"), vec2Color(range2Color)))); - } - else { - ImGui::PushStyleColor(ImGuiCol_Text, color2Vec(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.TextColor"), - vec2Color(textColor)))); + ImGuiCol_Text, VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color.Value"), + range2ColorDefault))); + } else { + ImGui::PushStyleColor(ImGuiCol_Text, + VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.TextColor.Value"), + textColorDefault))); } // Render text @@ -434,158 +449,164 @@ InputViewerSettingsWindow::~InputViewerSettingsWindow() { } void InputViewerSettingsWindow::DrawElement() { - // gInputViewer.Scale - UIWidgets::EnhancementSliderFloat("Input Viewer Scale: %.2f", "##Input", CVAR_INPUT_VIEWER("Scale"), 0.1f, 5.0f, "", - 1.0f, false, true); - UIWidgets::Tooltip("Sets the on screen size of the input viewer"); + // gInputViewer.Scale + CVarSliderFloat("Input Viewer Scale: %.2f", CVAR_INPUT_VIEWER("Scale"), + FloatSliderOptions() + .Color(THEME_COLOR) + .DefaultValue(1.0f) + .Min(0.1f) + .Max(5.0f) + .ShowButtons(true) + .Tooltip("Sets the on screen size of the input viewer")); // gInputViewer.EnableDragging - UIWidgets::EnhancementCheckbox("Enable Dragging", CVAR_INPUT_VIEWER("EnableDragging"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Enable Dragging", CVAR_INPUT_VIEWER("EnableDragging"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); UIWidgets::PaddedSeparator(true, true); // gInputViewer.ShowBackground - UIWidgets::EnhancementCheckbox("Show Background Layer", CVAR_INPUT_VIEWER("ShowBackground"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show Background Layer", CVAR_INPUT_VIEWER("ShowBackground"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); UIWidgets::PaddedSeparator(true, true); + PushStyleHeader(THEME_COLOR); if (ImGui::CollapsingHeader("Buttons")) { // gInputViewer.ButtonOutlineMode - UIWidgets::PaddedText("Button Outlines/Backgrounds", true, false); - UIWidgets::EnhancementCombobox( - CVAR_INPUT_VIEWER("ButtonOutlineMode"), buttonOutlineOptions, BUTTON_OUTLINE_NOT_PRESSED, - !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1), "", - CVarGetInteger(CVAR_INPUT_VIEWER("ButtonOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); - UIWidgets::Tooltip( - "Sets the desired visibility behavior for the button outline/background layers. Useful for " - "custom input viewers."); + CVarCombobox( + "Button Outlines/Backgrounds", CVAR_INPUT_VIEWER("ButtonOutlineMode"), buttonOutlineOptions, + ComboboxOptions({ { .disabled = !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1), + .disabledTooltip = "Disabled because Global Button Outline is off" } }) + .Color(THEME_COLOR) + .DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED) + .Tooltip("Sets the desired visibility behavior for the button outline/background layers. Useful for " + "custom input viewers.")); // gInputViewer.UseGlobalButtonOutlineMode - UIWidgets::EnhancementCheckbox("Use for all buttons", CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Use for all buttons", CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); UIWidgets::PaddedSeparator(); bool useIndividualOutlines = !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1); // gInputViewer.ABtn - UIWidgets::EnhancementCheckbox("Show A-Button Layers", CVAR_INPUT_VIEWER("ABtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show A-Button Layers", CVAR_INPUT_VIEWER("ABtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("ABtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("ABtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##ABtnOutline", CVAR_INPUT_VIEWER("ABtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.BBtn - UIWidgets::EnhancementCheckbox("Show B-Button Layers", CVAR_INPUT_VIEWER("BBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show B-Button Layers", CVAR_INPUT_VIEWER("BBtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("BBtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("BBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##BBtnOutline", CVAR_INPUT_VIEWER("BBtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CUp - UIWidgets::EnhancementCheckbox("Show C-Up Layers", CVAR_INPUT_VIEWER("CUp"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show C-Up Layers", CVAR_INPUT_VIEWER("CUp"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CUp"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CUpOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##CUpOutline", CVAR_INPUT_VIEWER("CUpOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CRight - UIWidgets::EnhancementCheckbox("Show C-Right Layers", CVAR_INPUT_VIEWER("CRight"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show C-Right Layers", CVAR_INPUT_VIEWER("CRight"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CRight"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CRightOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##CRightOutline", CVAR_INPUT_VIEWER("CRightOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CDown - UIWidgets::EnhancementCheckbox("Show C-Down Layers", CVAR_INPUT_VIEWER("CDown"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show C-Down Layers", CVAR_INPUT_VIEWER("CDown"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CDown"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CDownOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##CDownOutline", CVAR_INPUT_VIEWER("CDownOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CLeft - UIWidgets::EnhancementCheckbox("Show C-Left Layers", CVAR_INPUT_VIEWER("CLeft"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show C-Left Layers", CVAR_INPUT_VIEWER("CLeft"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CLeft"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CLeftOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##CLeftOutline", CVAR_INPUT_VIEWER("CLeftOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.LBtn - UIWidgets::EnhancementCheckbox("Show L-Button Layers", CVAR_INPUT_VIEWER("LBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show L-Button Layers", CVAR_INPUT_VIEWER("LBtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("LBtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("LBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##LBtnOutline", CVAR_INPUT_VIEWER("LBtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.RBtn - UIWidgets::EnhancementCheckbox("Show R-Button Layers", CVAR_INPUT_VIEWER("RBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show R-Button Layers", CVAR_INPUT_VIEWER("RBtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("RBtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##RBtnOutline", CVAR_INPUT_VIEWER("RBtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.ZBtn - UIWidgets::EnhancementCheckbox("Show Z-Button Layers", CVAR_INPUT_VIEWER("ZBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show Z-Button Layers", CVAR_INPUT_VIEWER("ZBtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("ZBtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("ZBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##ZBtnOutline", CVAR_INPUT_VIEWER("ZBtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.StartBtn - UIWidgets::EnhancementCheckbox("Show Start Button Layers", CVAR_INPUT_VIEWER("StartBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show Start Button Layers", CVAR_INPUT_VIEWER("StartBtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("StartBtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("StartBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##StartBtnOutline", CVAR_INPUT_VIEWER("StartBtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.Dpad - UIWidgets::EnhancementCheckbox("Show D-Pad Layers", CVAR_INPUT_VIEWER("Dpad"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, false); + CVarCheckbox("Show D-Pad Layers", CVAR_INPUT_VIEWER("Dpad"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(false)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Dpad"), 0)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("DpadOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##DpadOutline", CVAR_INPUT_VIEWER("DpadOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.Mod1 - UIWidgets::EnhancementCheckbox("Show Modifier Button 1 Layers", CVAR_INPUT_VIEWER("Mod1"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, false); + CVarCheckbox("Show Modifier Button 1 Layers", CVAR_INPUT_VIEWER("Mod1"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(false)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod1"), 0)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("Mod1OutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##Mmod1Outline", CVAR_INPUT_VIEWER("Mod1OutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.Mod2 - UIWidgets::EnhancementCheckbox("Show Modifier Button 2 Layers", CVAR_INPUT_VIEWER("Mod2"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, false); + CVarCheckbox("Show Modifier Button 2 Layers", CVAR_INPUT_VIEWER("Mod2"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(false)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod2"), 0)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("Mod2OutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##Mod2Outline", CVAR_INPUT_VIEWER("Mod2OutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } @@ -594,90 +615,126 @@ void InputViewerSettingsWindow::DrawElement() { if (ImGui::CollapsingHeader("Analog Stick")) { // gInputViewer.AnalogStick.VisibilityMode - UIWidgets::PaddedText("Analog Stick Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("AnalogStick.VisibilityMode"), stickModeOptions, - STICK_MODE_ALWAYS_SHOWN); - UIWidgets::Tooltip( - "Determines the conditions under which the moving layer of the analog stick texture is visible."); + CVarCombobox( + "Analog Stick Visibility", CVAR_INPUT_VIEWER("AnalogStick.VisibilityMode"), stickModeOptions, + ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .Tooltip( + "Determines the conditions under which the moving layer of the analog stick texture is visible.")); // gInputViewer.AnalogStick.OutlineMode - UIWidgets::PaddedText("Analog Stick Outline/Background Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("AnalogStick.OutlineMode"), stickModeOptions, - STICK_MODE_ALWAYS_SHOWN); - UIWidgets::Tooltip( - "Determines the conditions under which the analog stick outline/background texture is visible."); + CVarCombobox( + "Analog Stick Outline/Background Visibility", CVAR_INPUT_VIEWER("AnalogStick.OutlineMode"), + stickModeOptions, + ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .Tooltip( + "Determines the conditions under which the analog stick outline/background texture is visible.")); // gInputViewer.AnalogStick.Movement - UIWidgets::EnhancementSliderInt("Analog Stick Movement: %dpx", "##AnalogMovement", - CVAR_INPUT_VIEWER("AnalogStick.Movement"), 0, 200, "", 12, true); - UIWidgets::Tooltip( - "Sets the distance to move the analog stick in the input viewer. Useful for custom input viewers."); + CVarSliderInt("Analog Stick Movement: %dpx", CVAR_INPUT_VIEWER("AnalogStick.Movement"), + IntSliderOptions() + .Color(THEME_COLOR) + .Min(0) + .Max(200) + .DefaultValue(12) + .ShowButtons(true) + .Tooltip("Sets the distance to move the analog stick in the input viewer. Useful for custom " + "input viewers.")); UIWidgets::PaddedSeparator(true, true); } if (ImGui::CollapsingHeader("Additional (\"Right\") Stick")) { // gInputViewer.RightStick.VisibilityMode - UIWidgets::PaddedText("Right Stick Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RightStick.VisibilityMode"), stickModeOptions, - STICK_MODE_HIDDEN_IN_DEADZONE); - UIWidgets::Tooltip( - "Determines the conditions under which the moving layer of the right stick texture is visible."); + CVarCombobox( + "Right Stick Visibility", CVAR_INPUT_VIEWER("RightStick.VisibilityMode"), stickModeOptions, + ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(STICK_MODE_ALWAYS_HIDDEN) + .Tooltip( + "Determines the conditions under which the moving layer of the right stick texture is visible.")); // gInputViewer.RightStick.OutlineMode - UIWidgets::PaddedText("Right Stick Outline/Background Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RightStick.OutlineMode"), stickModeOptions, - STICK_MODE_HIDDEN_IN_DEADZONE); - UIWidgets::Tooltip( - "Determines the conditions under which the right stick outline/background texture is visible."); + CVarCombobox( + "Right Stick Outline/Background Visibility", CVAR_INPUT_VIEWER("RightStick.OutlineMode"), stickModeOptions, + ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(STICK_MODE_ALWAYS_HIDDEN) + .Tooltip( + "Determines the conditions under which the right stick outline/background texture is visible.")); // gInputViewer.RightStick.Movement - UIWidgets::EnhancementSliderInt("Right Stick Movement: %dpx", "##RightMovement", - CVAR_INPUT_VIEWER("RightStick.Movement"), 0, 200, "", 7, true); - UIWidgets::Tooltip( - "Sets the distance to move the right stick in the input viewer. Useful for custom input viewers."); + CVarSliderInt( + "Right Stick Movement: %dpx", CVAR_INPUT_VIEWER("RightStick.Movement"), + IntSliderOptions() + .Color(THEME_COLOR) + .Min(0) + .Max(200) + .DefaultValue(7) + .ShowButtons(true) + .Tooltip( + "Sets the distance to move the right stick in the input viewer. Useful for custom input viewers.")); UIWidgets::PaddedSeparator(true, true); } if (ImGui::CollapsingHeader("Analog Angle Values")) { // gAnalogAngles - UIWidgets::EnhancementCheckbox("Show Analog Stick Angle Values", CVAR_INPUT_VIEWER("AnalogAngles.Enabled")); - UIWidgets::Tooltip("Displays analog stick angle values in the input viewer"); + CVarCheckbox( + "Show Analog Stick Angle Values", CVAR_INPUT_VIEWER("AnalogAngles.Enabled"), + CheckboxOptions().Color(THEME_COLOR).Tooltip("Displays analog stick angle values in the input viewer")); if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Enabled"), 0)) { // gInputViewer.AnalogAngles.TextColor - if (ImGui::ColorEdit4("Text Color", (float*)&textColor)) { - CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.TextColor"), vec2Color(textColor)); - } + CVarColorPicker("Text Color", CVAR_INPUT_VIEWER("AnalogAngles.TextColor"), textColorDefault, true, + ColorPickerRandomButton | ColorPickerResetButton); // gAnalogAngleScale - UIWidgets::EnhancementSliderFloat("Angle Text Scale: %.2f%%", "##AnalogAngleScale", - CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 0.1f, 5.0f, "", 1.0f, true, true); + CVarSliderFloat("Angle Text Scale: %.2f%%", CVAR_INPUT_VIEWER("AnalogAngles.Scale"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); // gInputViewer.AnalogAngles.Offset - UIWidgets::EnhancementSliderInt("Angle Text Offset: %dpx", "##AnalogAngleOffset", - CVAR_INPUT_VIEWER("AnalogAngles.Offset"), 0, 400, "", 0, true); + CVarSliderInt("Angle Text Offset: %dpx", CVAR_INPUT_VIEWER("AnalogAngles.Offset"), + IntSliderOptions() + .Color(THEME_COLOR) + .Min(0) + .Max(400) + .DefaultValue(0) + .ShowButtons(true) + .Tooltip("Sets the distance to move the right stick in the input viewer. Useful for " + "custom input viewers.")); UIWidgets::PaddedSeparator(true, true); // gInputViewer.AnalogAngles.Range1.Enabled - UIWidgets::EnhancementCheckbox("Highlight ESS Position", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled")); - UIWidgets::Tooltip( - "Highlights the angle value text when the analog stick is in ESS position (on flat ground)"); + CVarCheckbox( + "Highlight ESS Position", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip( + "Highlights the angle value text when the analog stick is in ESS position (on flat ground)")); if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled"), 0)) { // gInputViewer.AnalogAngles.Range1.Color - if (ImGui::ColorEdit4("ESS Color", (float*)&range1Color)) { - CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color"), vec2Color(range1Color)); - } + CVarColorPicker("ESS Color", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color"), range1ColorDefault, true, + ColorPickerRandomButton | ColorPickerResetButton); } UIWidgets::PaddedSeparator(true, true); // gInputViewer.AnalogAngles.Range2.Enabled - UIWidgets::EnhancementCheckbox("Highlight Walking Speed Angles", - CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled")); - UIWidgets::Tooltip("Highlights the angle value text when the analog stick is at an angle that would " - "produce a walking speed (on flat ground)\n\n" - "Useful for 1.0 Empty Jumpslash Quick Put Away"); + CVarCheckbox("Highlight Walking Speed Angles", CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Highlights the angle value text when the analog stick is at an angle that would " + "produce a walking speed (on flat ground)\n\n" + "Useful for 1.0 Empty Jumpslash Quick Put Away")); if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0)) { // gInputViewer.AnalogAngles.Range2.Color - if (ImGui::ColorEdit4("Walking Speed Color", (float*)&range2Color)) { - CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color"), vec2Color(range2Color)); - } + CVarColorPicker("Walking Speed Color", CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color"), + range2ColorDefault, true, ColorPickerRandomButton | ColorPickerResetButton); } } } + PopStyleHeader(); } diff --git a/soh/soh/Enhancements/controls/InputViewer.h b/soh/soh/Enhancements/controls/InputViewer.h index a4b1cc44fc..67303b7eb5 100644 --- a/soh/soh/Enhancements/controls/InputViewer.h +++ b/soh/soh/Enhancements/controls/InputViewer.h @@ -17,29 +17,29 @@ typedef enum { STICK_MODE_ALWAYS_HIDDEN, } StickMode; -class InputViewer : public Ship::GuiWindow { -public: +class InputViewer final : public Ship::GuiWindow { + public: using GuiWindow::GuiWindow; void Draw() override; - void InitElement() override {}; + void InitElement() override{}; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; InputViewer(); ~InputViewer(); - - private: - void RenderButton(std::string btn, std::string btnOutline, int state, ImVec2 size, int outlineMode); + + private: + void RenderButton(std::string btn, std::string btnOutline, int state, ImVec2 size, int outlineMode); }; -class InputViewerSettingsWindow : public Ship::GuiWindow { -public: +class InputViewerSettingsWindow final : public Ship::GuiWindow { + public: using GuiWindow::GuiWindow; - void InitElement() override {}; + void InitElement() override{}; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; InputViewerSettingsWindow(); ~InputViewerSettingsWindow(); diff --git a/soh/soh/Enhancements/controls/Mouse.cpp b/soh/soh/Enhancements/controls/Mouse.cpp new file mode 100644 index 0000000000..4ad9d11d0d --- /dev/null +++ b/soh/soh/Enhancements/controls/Mouse.cpp @@ -0,0 +1,156 @@ +#include "Mouse.h" +#include "soh/OTRGlobals.h" +#include "z64player.h" +#include "global.h" +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +static Ship::Coords mouseCoord = {}; +static Ship::Coords mouseCoordRel = {}; + +#define CVAR_ENABLE_MOUSE_NAME CVAR_SETTING("EnableMouse") +#define CVAR_ENABLE_MOUSE_DEFAULT 0 +#define CVAR_ENABLE_MOUSE_VALUE CVarGetInteger(CVAR_ENABLE_MOUSE_NAME, CVAR_ENABLE_MOUSE_DEFAULT) +#define MOUSE_ENABLED (CVAR_ENABLE_MOUSE_VALUE && GetWindow()->IsMouseCaptured()) + +std::shared_ptr GetWindow() { + return OTRGlobals::Instance->context->GetWindow(); +} + +extern "C" { +void Mouse_UpdatePos() { + mouseCoord = GetWindow()->GetMousePos(); +} + +void Mouse_UpdatePosRel() { + mouseCoordRel = GetWindow()->GetMouseDelta(); +} + +void Mouse_UpdateAll() { + Mouse_UpdatePos(); + Mouse_UpdatePosRel(); +} + +void Mouse_HandleThirdPerson(f32* newCamX, f32* newCamY) { + if (MOUSE_ENABLED) { + *newCamX -= mouseCoordRel.x * 40.0f; + *newCamY += mouseCoordRel.y * 40.0f; + } +} + +void Mouse_HandleFirstPerson(Player* player) { + f32 xAxisMulti = CVarGetFloat(CVAR_SETTING("FirstPersonCameraSensitivity.X"), 1.0f); + f32 yAxisMulti = CVarGetFloat(CVAR_SETTING("FirstPersonCameraSensitivity.Y"), 1.0f); + s8 invertXAxisMulti = ((CVarGetInteger(CVAR_SETTING("Controls.InvertAimingXAxis"), 0) && + !CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0)) || + (!CVarGetInteger(CVAR_SETTING("Controls.InvertAimingXAxis"), 0) && + CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0))) + ? -1 + : 1; + s8 invertYAxisMulti = CVarGetInteger(CVAR_SETTING("Controls.InvertAimingYAxis"), 1) ? 1 : -1; + if (MOUSE_ENABLED) { + player->actor.focus.rot.y -= static_cast(mouseCoordRel.x * 6.0f * xAxisMulti * invertXAxisMulti); + player->actor.focus.rot.x += static_cast(mouseCoordRel.y * 6.0f * yAxisMulti * invertYAxisMulti); + } +} + +void Mouse_RecenterCursor() { + u32 width = GetWindow()->GetWidth(); + u32 height = GetWindow()->GetHeight(); + if (MOUSE_ENABLED) { + GetWindow()->SetMousePos({ static_cast(width / 2), static_cast(height / 2) }); + } +} + +void Mouse_HandleShield(f32* sp50, f32* sp54) { + if (MOUSE_ENABLED) { + s32 width = GetWindow()->GetWidth(); + s32 height = GetWindow()->GetHeight(); + f32 xBound = 7200 / (width / 2.0f); + f32 yBound = 6000 / (height / 2.0f); + *sp50 += + (mouseCoord.x - (width / 2)) * xBound * (CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0) ? 1 : -1); + *sp54 += (mouseCoord.y - (height / 2)) * yBound; + *sp50 = CLAMP(*sp50, -7200, 7200); + *sp54 = CLAMP(*sp54, -6000, 6000); + } +} + +static s8 iterMouse = 0; +static s32 mouseQuickspinX[5] = {}; +static s32 mouseQuickspinY[5] = {}; +static u8 quickspinCount = 0; + +void Mouse_UpdateQuickspinCount() { + if (MOUSE_ENABLED) { + quickspinCount = (quickspinCount + 1) % 5; + mouseQuickspinX[quickspinCount] = mouseCoord.x; + mouseQuickspinY[quickspinCount] = mouseCoord.y; + } else { + quickspinCount = 0; + } +} + +bool Mouse_HandleQuickspin(bool* should, s8* iter2, s8* sp3C) { + s8 temp1; + s8 temp2; + s32 i; + if (!MOUSE_ENABLED) { + return *should = false; + } + + for (i = 0; i < 4; i++, iter2++) { + // Calculating angles as per z_lib.c:func_80077D10() + s32 relY = mouseQuickspinY[i + 1] - mouseQuickspinY[i]; + s32 relX = mouseQuickspinX[i + 1] - mouseQuickspinX[i]; + s16 aTan = Math_Atan2S((f32)relY, (f32)-relX); + iterMouse = (u16)(aTan + 0x2000) >> 9; // See z_player.c:Player_ProcessControlStick() + if ((*iter2 = iterMouse) < 0) { + return *should = false; + } + *iter2 *= 2; + } + temp1 = sp3C[0] - sp3C[1]; + if (ABS(temp1) < 10) { + return *should = false; + } + iter2 = &sp3C[1]; + for (i = 1; i < 3; i++, iter2++) { + temp2 = *iter2 - *(iter2 + 1); + if ((ABS(temp2) < 10) || (temp2 * temp1 < 0)) { + return *should = false; + } + } + + return *should = true; +} + +// Hook handlers + +void Mouse_RegisterRecenterCursorOnShield() { + COND_HOOK(OnPlayerHoldUpShield, true, Mouse_RecenterCursor); +} + +void Mouse_RegisterHandleFirstPerson() { + COND_HOOK(OnPlayerFirstPersonControl, true, Mouse_HandleFirstPerson); +} + +void Mouse_RegisterHandleShield() { + COND_HOOK(OnPlayerShieldControl, true, Mouse_HandleShield); +} + +void Mouse_RegisterUpdateQuickspinCount() { + COND_HOOK(OnPlayerProcessStick, true, Mouse_UpdateQuickspinCount); +} + +void Mouse_RegisterHandleQuickspin() { + REGISTER_VB_SHOULD(VB_SHOULD_QUICKSPIN, { Mouse_HandleQuickspin(should, va_arg(args, s8*), va_arg(args, s8*)); }); +} + +static RegisterShipInitFunc initFunc_shieldRecenter(Mouse_RegisterRecenterCursorOnShield, { CVAR_ENABLE_MOUSE_NAME }); +static RegisterShipInitFunc initFunc_firstPerson(Mouse_RegisterHandleFirstPerson, { CVAR_ENABLE_MOUSE_NAME }); +static RegisterShipInitFunc initFunc_quickspinCount(Mouse_RegisterUpdateQuickspinCount, { CVAR_ENABLE_MOUSE_NAME }); +static RegisterShipInitFunc initFunc_quickspin(Mouse_RegisterHandleQuickspin, { CVAR_ENABLE_MOUSE_NAME }); +static RegisterShipInitFunc initFunc_shieldMove(Mouse_RegisterHandleShield, { CVAR_ENABLE_MOUSE_NAME }); +} // extern "C" diff --git a/soh/soh/Enhancements/controls/Mouse.h b/soh/soh/Enhancements/controls/Mouse.h new file mode 100644 index 0000000000..2ab954e47d --- /dev/null +++ b/soh/soh/Enhancements/controls/Mouse.h @@ -0,0 +1,25 @@ +#ifndef MOUSE_H +#define MOUSE_H + +#pragma once + +#include + +struct Player; + +#ifdef __cplusplus +extern "C" { +#endif +void Mouse_UpdateAll(); +void Mouse_RecenterCursor(); +void Mouse_HandleThirdPerson(f32* newCamX, f32* newCamY); +void Mouse_HandleFirstPerson(struct Player* player); +void Mouse_HandleShield(f32* sp50, f32* sp54); +bool Mouse_HandleQuickspin(bool* should, s8* iter2, s8* sp3C); +void Mouse_UpdateQuickspinCount(); +#ifdef __cplusplus +}; // extern "C" +#endif + +// MOUSE_H +#endif diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp index 7e49187992..8a8227073e 100644 --- a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp @@ -2,6 +2,7 @@ #include #include "soh/OTRGlobals.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "z64.h" #include "soh/cvar_prefixes.h" #ifndef __WIIU__ @@ -10,6 +11,8 @@ #define SCALE_IMGUI_SIZE(value) ((value / 13.0f) * ImGui::GetFontSize()) +using namespace UIWidgets; + SohInputEditorWindow::~SohInputEditorWindow() { } @@ -23,29 +26,25 @@ void SohInputEditorWindow::InitElement() { mButtonsBitmasks = { BTN_A, BTN_B, BTN_START, BTN_L, BTN_R, BTN_Z, BTN_CUP, BTN_CDOWN, BTN_CLEFT, BTN_CRIGHT }; mDpadBitmasks = { BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT }; mModifierButtonsBitmasks = { BTN_CUSTOM_MODIFIER1, BTN_CUSTOM_MODIFIER2 }; - mCustomOcarinaButtonsBitmasks = { - BTN_CUSTOM_OCARINA_NOTE_D4, - BTN_CUSTOM_OCARINA_NOTE_F4, - BTN_CUSTOM_OCARINA_NOTE_A4, - BTN_CUSTOM_OCARINA_NOTE_B4, - BTN_CUSTOM_OCARINA_NOTE_D5 - }; + mCustomOcarinaButtonsBitmasks = { BTN_CUSTOM_OCARINA_NOTE_D4, BTN_CUSTOM_OCARINA_NOTE_F4, + BTN_CUSTOM_OCARINA_NOTE_A4, BTN_CUSTOM_OCARINA_NOTE_B4, + BTN_CUSTOM_OCARINA_NOTE_D5 }; - addButtonName(BTN_A, "A"); - addButtonName(BTN_B, "B"); - addButtonName(BTN_CUP, "C Up"); - addButtonName(BTN_CDOWN, "C Down"); - addButtonName(BTN_CLEFT, "C Left"); - addButtonName(BTN_CRIGHT, "C Right"); - addButtonName(BTN_L, "L"); - addButtonName(BTN_Z, "Z"); - addButtonName(BTN_R, "R"); - addButtonName(BTN_START, "Start"); - addButtonName(BTN_DUP, "D-pad up"); - addButtonName(BTN_DDOWN, "D-pad down"); - addButtonName(BTN_DLEFT, "D-pad left"); - addButtonName(BTN_DRIGHT, "D-pad right"); - addButtonName(0, "None"); + addButtonName(BTN_A, "A"); + addButtonName(BTN_B, "B"); + addButtonName(BTN_CUP, "C Up"); + addButtonName(BTN_CDOWN, "C Down"); + addButtonName(BTN_CLEFT, "C Left"); + addButtonName(BTN_CRIGHT, "C Right"); + addButtonName(BTN_L, "L"); + addButtonName(BTN_Z, "Z"); + addButtonName(BTN_R, "R"); + addButtonName(BTN_START, "Start"); + addButtonName(BTN_DUP, "D-pad up"); + addButtonName(BTN_DDOWN, "D-pad down"); + addButtonName(BTN_DLEFT, "D-pad left"); + addButtonName(BTN_DRIGHT, "D-pad right"); + addButtonName(0, "None"); } #define INPUT_EDITOR_WINDOW_GAME_INPUT_BLOCK_ID 95237929 @@ -169,8 +168,8 @@ void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, fl #define BUTTON_COLOR_KEYBOARD_BEIGE ImVec4(0.651f, 0.482f, 0.357f, 0.5f) #define BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED ImVec4(0.651f, 0.482f, 0.357f, 1.0f) -#define BUTTON_COLOR_MOUSE_BEIGE ImVec4(0.5f, 0.5f, 0.5f, 0.5f) -#define BUTTON_COLOR_MOUSE_BEIGE_HOVERED ImVec4(0.5f, 0.5f, 0.5f, 1.0f) +#define BUTTON_COLOR_MOUSE_GRAY ImVec4(0.5f, 0.5f, 0.5f, 0.5f) +#define BUTTON_COLOR_MOUSE_GRAY_HOVERED ImVec4(0.5f, 0.5f, 0.5f, 1.0f) #define BUTTON_COLOR_GAMEPAD_BLUE ImVec4(0.0f, 0.255f, 0.976f, 0.5f) #define BUTTON_COLOR_GAMEPAD_BLUE_HOVERED ImVec4(0.0f, 0.255f, 0.976f, 1.0f) @@ -188,15 +187,15 @@ void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, fl #define BUTTON_COLOR_GAMEPAD_PURPLE_HOVERED ImVec4(0.431f, 0.369f, 0.706f, 1.0f) void SohInputEditorWindow::GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor, - ImVec4& buttonHoveredColor) { + ImVec4& buttonHoveredColor) { switch (lusIndex) { case Ship::PhysicalDeviceType::Keyboard: buttonColor = BUTTON_COLOR_KEYBOARD_BEIGE; buttonHoveredColor = BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED; break; case Ship::PhysicalDeviceType::Mouse: - buttonColor = BUTTON_COLOR_MOUSE_BEIGE; - buttonHoveredColor = BUTTON_COLOR_MOUSE_BEIGE_HOVERED; + buttonColor = BUTTON_COLOR_MOUSE_GRAY; + buttonHoveredColor = BUTTON_COLOR_MOUSE_GRAY_HOVERED; break; case Ship::PhysicalDeviceType::SDLGamepad: buttonColor = BUTTON_COLOR_GAMEPAD_BLUE; @@ -262,6 +261,7 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt icon = ICON_FA_GAMEPAD; break; case MAPPING_TYPE_KEYBOARD: + case MAPPING_TYPE_MOUSE: icon = ICON_FA_KEYBOARD_O; break; case MAPPING_TYPE_UNKNOWN: @@ -642,10 +642,14 @@ void SohInputEditorWindow::DrawStickSection(uint8_t port, uint8_t stick, int32_t ImGui::SameLine(); ImGui::BeginGroup(); - DrawStickDirectionLine(ICON_FA_ARROW_UP, port, stick, Ship::UP, color); - DrawStickDirectionLine(ICON_FA_ARROW_DOWN, port, stick, Ship::DOWN, color); - DrawStickDirectionLine(ICON_FA_ARROW_LEFT, port, stick, Ship::LEFT, color); - DrawStickDirectionLine(ICON_FA_ARROW_RIGHT, port, stick, Ship::RIGHT, color); + DrawStickDirectionLine(StringHelper::Sprintf("%s##%d", ICON_FA_ARROW_UP, stick).c_str(), port, stick, Ship::UP, + color); + DrawStickDirectionLine(StringHelper::Sprintf("%s##%d", ICON_FA_ARROW_DOWN, stick).c_str(), port, stick, Ship::DOWN, + color); + DrawStickDirectionLine(StringHelper::Sprintf("%s##%d", ICON_FA_ARROW_LEFT, stick).c_str(), port, stick, Ship::LEFT, + color); + DrawStickDirectionLine(StringHelper::Sprintf("%s##%d", ICON_FA_ARROW_RIGHT, stick).c_str(), port, stick, + Ship::RIGHT, color); ImGui::EndGroup(); ImGui::SetNextItemOpen(true, ImGuiCond_Once); if (ImGui::TreeNode(StringHelper::Sprintf("Analog Stick Options##%d", id).c_str())) { @@ -665,8 +669,8 @@ void SohInputEditorWindow::DrawStickSection(uint8_t port, uint8_t stick, int32_t } ImGui::SameLine(0.0f, 0.0f); ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); - if (ImGui::SliderInt(StringHelper::Sprintf("##Sensitivity%d", id).c_str(), &sensitivityPercentage, 0, 200, "%d%%", - ImGuiSliderFlags_AlwaysClamp)) { + if (ImGui::SliderInt(StringHelper::Sprintf("##Sensitivity%d", id).c_str(), &sensitivityPercentage, 0, 200, + "%d%%", ImGuiSliderFlags_AlwaysClamp)) { controllerStick->SetSensitivity(sensitivityPercentage); } ImGui::SameLine(0.0f, 0.0f); @@ -1062,17 +1066,20 @@ void SohInputEditorWindow::DrawLEDSection(uint8_t port) { } // todo: clean this up, probably just hardcode to LED_COLOR_SOURCE_GAME and use SoH options only here if (mapping->GetColorSource() == LED_COLOR_SOURCE_GAME) { - static const char* ledSources[] = { + static std::vector ledSources = { "Original Tunic Colors", "Cosmetics Tunic Colors", "Health Colors", "Original Navi Targeting Colors", "Cosmetics Navi Targeting Colors", "Custom" }; - UIWidgets::PaddedText("Source"); - UIWidgets::EnhancementCombobox(CVAR_SETTING("LEDColorSource"), ledSources, LED_SOURCE_TUNIC_ORIGINAL); - UIWidgets::Tooltip("Health\n- Red when health critical (13-20% depending on max health)\n- Yellow when " - "health < 40%. Green otherwise.\n\n" - "Tunics: colors will mirror currently equipped tunic, whether original or the current " - "values in Cosmetics Editor.\n\n" - "Custom: single, solid color"); + CVarCombobox( + "Source", CVAR_SETTING("LEDColorSource"), ledSources, + UIWidgets::ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(LED_SOURCE_TUNIC_ORIGINAL) + .Tooltip("Health\n- Red when health critical (13-20% depending on max health)\n- Yellow when " + "health < 40%. Green otherwise.\n\n" + "Tunics: colors will mirror currently equipped tunic, whether original or the current " + "values in Cosmetics Editor.\n\n" + "Custom: single, solid color")); if (CVarGetInteger(CVAR_SETTING("LEDColorSource"), 1) == LED_SOURCE_CUSTOM) { UIWidgets::Spacer(3); auto port1Color = CVarGetColor24(CVAR_SETTING("LEDPort1Color"), { 255, 255, 255 }); @@ -1090,14 +1097,22 @@ void SohInputEditorWindow::DrawLEDSection(uint8_t port) { ImGui::SameLine(); ImGui::Text("Custom Color"); } - UIWidgets::PaddedEnhancementSliderFloat("Brightness: %.1f %%", "##LED_Brightness", CVAR_SETTING("LEDBrightness"), 0.0f, - 1.0f, "", 1.0f, true, true); - UIWidgets::Tooltip("Sets the brightness of controller LEDs. 0% brightness = LEDs off."); - UIWidgets::PaddedEnhancementCheckbox( - "Critical Health Override", CVAR_SETTING("LEDCriticalOverride"), true, true, - CVarGetInteger(CVAR_SETTING("LEDColorSource"), LED_SOURCE_TUNIC_ORIGINAL) == LED_SOURCE_HEALTH, - "Override redundant for health source.", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Shows red color when health is critical, otherwise displays according to color source."); + CVarSliderFloat("Brightness: %.1f %%", CVAR_SETTING("LEDBrightness"), + FloatSliderOptions() + .IsPercentage() + .Min(0.0f) + .Max(1.0f) + .DefaultValue(1.0f) + .ShowButtons(true) + .Tooltip("Sets the brightness of controller LEDs. 0% brightness = LEDs off.")); + CVarCheckbox( + "Critical Health Override", CVAR_SETTING("LEDCriticalOverride"), + CheckboxOptions({ { .disabled = CVarGetInteger(CVAR_SETTING("LEDColorSource"), + LED_SOURCE_TUNIC_ORIGINAL) == LED_SOURCE_HEALTH, + .disabledTooltip = "Override redundant for health source." } }) + .DefaultValue(true) + .Tooltip( + "Shows red color when health is critical, otherwise displays according to color source.")); } ImGui::TreePop(); } @@ -1232,38 +1247,35 @@ void SohInputEditorWindow::DrawGyroSection(uint8_t port) { } } -const ImGuiTableFlags PANEL_TABLE_FLAGS = - ImGuiTableFlags_BordersH | - ImGuiTableFlags_BordersV; +const ImGuiTableFlags PANEL_TABLE_FLAGS = ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV; const ImGuiTableColumnFlags PANEL_TABLE_COLUMN_FLAGS = - ImGuiTableColumnFlags_IndentEnable | - ImGuiTableColumnFlags_NoSort; + ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort; namespace TableHelper { - void InitHeader(bool has_header = true) { - if (has_header) { - ImGui::TableHeadersRow(); - } - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::AlignTextToFramePadding(); //This is to adjust Vertical pos of item in a cell to be normlized. - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - } - - void NextCol() { - ImGui::TableNextColumn(); - ImGui::AlignTextToFramePadding(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - } - - void NextLine() { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::AlignTextToFramePadding(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); +void InitHeader(bool has_header = true) { + if (has_header) { + ImGui::TableHeadersRow(); } + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); // This is to adjust Vertical pos of item in a cell to be normlized. + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); } +void NextCol() { + ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); +} + +void NextLine() { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); +} +} // namespace TableHelper + void SohInputEditorWindow::addButtonName(N64ButtonMask mask, const char* name) { buttons.push_back(std::make_pair(mask, name)); buttonNames[mask] = std::prev(buttons.end()); @@ -1281,7 +1293,6 @@ void SohInputEditorWindow::DrawMapping(CustomButtonMap& mapping, float labelWidt preview = "Unknown"; } - UIWidgets::Spacer(0); ImVec2 cursorPos = ImGui::GetCursorPos(); ImVec2 textSize = ImGui::CalcTextSize(mapping.label); ImGui::SetCursorPosY(cursorPos.y + textSize.y / 4); @@ -1291,7 +1302,7 @@ void SohInputEditorWindow::DrawMapping(CustomButtonMap& mapping, float labelWidt ImGui::SetCursorPosY(cursorPos.y); ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); - if (ImGui::BeginCombo(StringHelper::Sprintf("##%s", mapping.cVarName).c_str(), preview)) { + if (ImGui::BeginCombo(StringHelper::Sprintf("##%s", mapping.cVarName).c_str(), preview)) { for (auto i = buttons.begin(); i != buttons.end(); i++) { if ((i->first & excludedButtons) != 0) { continue; @@ -1303,16 +1314,16 @@ void SohInputEditorWindow::DrawMapping(CustomButtonMap& mapping, float labelWidt } ImGui::EndCombo(); } - UIWidgets::Spacer(0); } void SohInputEditorWindow::DrawOcarinaControlPanel() { ImVec2 cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x, cursor.y + 5)); - - UIWidgets::EnhancementCheckbox("Dpad Ocarina Playback", CVAR_SETTING("CustomOcarina.Dpad")); - UIWidgets::EnhancementCheckbox("Right Stick Ocarina Playback", CVAR_SETTING("CustomOcarina.RightStick")); - UIWidgets::EnhancementCheckbox("Customize Ocarina Controls", CVAR_SETTING("CustomOcarina.Enabled")); + + CheckboxOptions checkOpt = CheckboxOptions().Color(THEME_COLOR); + CVarCheckbox("Dpad Ocarina Playback", CVAR_SETTING("CustomOcarina.Dpad"), checkOpt); + CVarCheckbox("Right Stick Ocarina Playback", CVAR_SETTING("CustomOcarina.RightStick"), checkOpt); + CVarCheckbox("Customize Ocarina Controls", CVAR_SETTING("CustomOcarina.Enabled"), checkOpt); if (!CVarGetInteger(CVAR_SETTING("CustomOcarina.Enabled"), 0)) { ImGui::BeginDisabled(); @@ -1328,12 +1339,12 @@ void SohInputEditorWindow::DrawOcarinaControlPanel() { ImGui::AlignTextToFramePadding(); ImGui::BulletText("Disable song detection"); - DrawButtonLine(ICON_FA_BAN, 0, BTN_CUSTOM_OCARINA_DISABLE_SONGS); + DrawButtonLine(ICON_FA_BAN "##DisableSongDetection", 0, BTN_CUSTOM_OCARINA_DISABLE_SONGS); ImGui::AlignTextToFramePadding(); ImGui::BulletText("Pitch"); - DrawButtonLine(ICON_FA_ARROW_UP, 0, BTN_CUSTOM_OCARINA_PITCH_UP); - DrawButtonLine(ICON_FA_ARROW_DOWN, 0, BTN_CUSTOM_OCARINA_PITCH_DOWN); + DrawButtonLine(ICON_FA_ARROW_UP "##Pitch", 0, BTN_CUSTOM_OCARINA_PITCH_UP); + DrawButtonLine(ICON_FA_ARROW_DOWN "##Pitch", 0, BTN_CUSTOM_OCARINA_PITCH_DOWN); if (!CVarGetInteger(CVAR_SETTING("CustomOcarina.Enabled"), 0)) { ImGui::EndDisabled(); @@ -1343,61 +1354,110 @@ void SohInputEditorWindow::DrawOcarinaControlPanel() { void SohInputEditorWindow::DrawCameraControlPanel() { ImVec2 cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5)); + CVarCheckbox( + "Enable Mouse Controls", CVAR_SETTING("EnableMouse"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Allows for using the mouse to control the camera (must enable Free Look), " + "aim with the shield, and perform quickspin attacks (quickly rotate the mouse then press B)")); Ship::GuiWindow::BeginGroupPanel("Aiming/First-Person Camera", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementCheckbox("Right Stick Aiming", CVAR_SETTING("Controls.RightStickAim")); - UIWidgets::Tooltip("Allows for aiming with the right stick in:\n-First-Person/C-Up view\n-Weapon Aiming"); + CVarCheckbox("Right Stick Aiming", CVAR_SETTING("Controls.RightStickAim"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Allows for aiming with the right stick in:\n-First-Person/C-Up view\n-Weapon Aiming")); if (CVarGetInteger(CVAR_SETTING("Controls.RightStickAim"), 0)) { - UIWidgets::PaddedEnhancementCheckbox("Allow moving while in first person mode", CVAR_SETTING("MoveInFirstPerson")); - UIWidgets::Tooltip("Changes the left stick to move the player while in first person mode"); + CVarCheckbox("Allow moving while in first person mode", CVAR_SETTING("MoveInFirstPerson"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Changes the left stick to move the player while in first person mode")); } - UIWidgets::PaddedEnhancementCheckbox("Invert Aiming X Axis", CVAR_SETTING("Controls.InvertAimingXAxis")); - UIWidgets::Tooltip("Inverts the Camera X Axis in:\n-First-Person/C-Up view\n-Weapon Aiming"); - UIWidgets::PaddedEnhancementCheckbox("Invert Aiming Y Axis", CVAR_SETTING("Controls.InvertAimingYAxis"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Inverts the Camera Y Axis in:\n-First-Person/C-Up view\n-Weapon Aiming"); - UIWidgets::PaddedEnhancementCheckbox("Invert Shield Aiming X Axis", CVAR_SETTING("Controls.InvertShieldAimingXAxis"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Inverts the Shield Aiming X Axis"); - UIWidgets::PaddedEnhancementCheckbox("Invert Shield Aiming Y Axis", CVAR_SETTING("Controls.InvertShieldAimingYAxis")); - UIWidgets::Tooltip("Inverts the Shield Aiming Y Axis"); - UIWidgets::PaddedEnhancementCheckbox("Invert Z-Weapon Aiming Y Axis", CVAR_SETTING("Controls.InvertZAimingYAxis"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Inverts the Camera Y Axis in:\n-Z-Weapon Aiming"); - UIWidgets::PaddedEnhancementCheckbox("Disable Auto-Centering in First-Person View", CVAR_SETTING("DisableFirstPersonAutoCenterView")); - UIWidgets::Tooltip("Prevents the C-Up view from auto-centering, allowing for Gyro Aiming"); - if (UIWidgets::PaddedEnhancementCheckbox("Enable Custom Aiming/First-Person sensitivity", CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), true, false)) { + CVarCheckbox("Invert Aiming X Axis", CVAR_SETTING("Controls.InvertAimingXAxis"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Inverts the Camera X Axis in:\n-First-Person/C-Up view\n-Weapon Aiming")); + CVarCheckbox("Invert Aiming Y Axis", CVAR_SETTING("Controls.InvertAimingYAxis"), + CheckboxOptions() + .Color(THEME_COLOR) + .DefaultValue(true) + .Tooltip("Inverts the Camera Y Axis in:\n-First-Person/C-Up view\n-Weapon Aiming")); + CVarCheckbox("Invert Shield Aiming X Axis", CVAR_SETTING("Controls.InvertShieldAimingXAxis"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true).Tooltip("Inverts the Shield Aiming X Axis")); + CVarCheckbox("Invert Shield Aiming Y Axis", CVAR_SETTING("Controls.InvertShieldAimingYAxis"), + CheckboxOptions().Color(THEME_COLOR).Tooltip("Inverts the Shield Aiming Y Axis")); + CVarCheckbox("Invert Z-Weapon Aiming Y Axis", CVAR_SETTING("Controls.InvertZAimingYAxis"), + CheckboxOptions() + .Color(THEME_COLOR) + .DefaultValue(true) + .Tooltip("Inverts the Camera Y Axis in:\n-Z-Weapon Aiming")); + CVarCheckbox("Disable Auto-Centering in First-Person View", CVAR_SETTING("DisableFirstPersonAutoCenterView"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Prevents the C-Up view from auto-centering, allowing for Gyro Aiming")); + if (CVarCheckbox("Enable Custom Aiming/First-Person sensitivity", + CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), CheckboxOptions().Color(THEME_COLOR))) { if (!CVarGetInteger(CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), 0)) { CVarClear(CVAR_SETTING("FirstPersonCameraSensitivity.X")); CVarClear(CVAR_SETTING("FirstPersonCameraSensitivity.Y")); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } if (CVarGetInteger(CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), 0)) { - UIWidgets::EnhancementSliderFloat("Aiming/First-Person Horizontal Sensitivity: %.0f %%", "##FirstPersonSensitivity Horizontal", - CVAR_SETTING("FirstPersonCameraSensitivity.X"), 0.01f, 5.0f, "", 1.0f, true); - UIWidgets::EnhancementSliderFloat("Aiming/First-Person Vertical Sensitivity: %.0f %%", "##FirstPersonSensitivity Vertical", - CVAR_SETTING("FirstPersonCameraSensitivity.Y"), 0.01f, 5.0f, "", 1.0f, true); + CVarSliderFloat("Aiming/First-Person Horizontal Sensitivity: %.0f %%", + CVAR_SETTING("FirstPersonCameraSensitivity.X"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.01f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); + CVarSliderFloat("Aiming/First-Person Vertical Sensitivity: %.0f %%", + CVAR_SETTING("FirstPersonCameraSensitivity.Y"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.01f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); } - UIWidgets::Spacer(0); Ship::GuiWindow::EndGroupPanel(0); - UIWidgets::Spacer(0); cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5)); Ship::GuiWindow::BeginGroupPanel("Third-Person Camera", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementCheckbox("Free Look", CVAR_SETTING("FreeLook.Enabled")); - UIWidgets::Tooltip("Enables free look camera control\nNote: You must remap C buttons off of the right stick in the " - "controller config menu, and map the camera stick to the right stick."); - UIWidgets::PaddedEnhancementCheckbox("Invert Camera X Axis", CVAR_SETTING("FreeLook.InvertXAxis")); - UIWidgets::Tooltip("Inverts the Camera X Axis in:\n-Free look"); - UIWidgets::PaddedEnhancementCheckbox("Invert Camera Y Axis", CVAR_SETTING("FreeLook.InvertYAxis"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Inverts the Camera Y Axis in:\n-Free look"); - UIWidgets::Spacer(0); - UIWidgets::PaddedEnhancementSliderFloat("Third-Person Horizontal Sensitivity: %.0f %%", "##ThirdPersonSensitivity Horizontal", - CVAR_SETTING("FreeLook.CameraSensitivity.X"), 0.01f, 5.0f, "", 1.0f, true, true, false, true); - UIWidgets::PaddedEnhancementSliderFloat("Third-Person Vertical Sensitivity: %.0f %%", "##ThirdPersonSensitivity Vertical", - CVAR_SETTING("FreeLook.CameraSensitivity.Y"), 0.01f, 5.0f, "", 1.0f, true, true, false, true); - UIWidgets::PaddedEnhancementSliderInt("Camera Distance: %d", "##CamDist", - CVAR_SETTING("FreeLook.MaxCameraDistance"), 100, 900, "", 185, true, false, true); - UIWidgets::PaddedEnhancementSliderInt("Camera Transition Speed: %d", "##CamTranSpeed", - CVAR_SETTING("FreeLook.TransitionSpeed"), 0, 900, "", 25, true, false, true); + CVarCheckbox( + "Free Look", CVAR_SETTING("FreeLook.Enabled"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Enables free look camera control\nNote: You must remap C buttons off of the right stick in the " + "controller config menu, and map the camera stick to the right stick.")); + CVarCheckbox("Invert Camera X Axis", CVAR_SETTING("FreeLook.InvertXAxis"), + CheckboxOptions().Color(THEME_COLOR).Tooltip("Inverts the Camera X Axis in:\n-Free look")); + CVarCheckbox( + "Invert Camera Y Axis", CVAR_SETTING("FreeLook.InvertYAxis"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true).Tooltip("Inverts the Camera Y Axis in:\n-Free look")); + CVarSliderFloat("Third-Person Horizontal Sensitivity: %.0f %%", CVAR_SETTING("FreeLook.CameraSensitivity.X"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.01f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); + CVarSliderFloat("Third-Person Vertical Sensitivity: %.0f %%", CVAR_SETTING("FreeLook.CameraSensitivity.Y"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.01f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); + CVarSliderInt("Camera Distance: %d", CVAR_SETTING("FreeLook.MaxCameraDistance"), + IntSliderOptions().Color(THEME_COLOR).Min(100).Max(900).DefaultValue(185).ShowButtons(true)); + CVarSliderInt("Camera Transition Speed: %d", CVAR_SETTING("FreeLook.TransitionSpeed"), + IntSliderOptions().Color(THEME_COLOR).Min(0).Max(900).DefaultValue(25).ShowButtons(true)); Ship::GuiWindow::EndGroupPanel(0); } @@ -1405,17 +1465,26 @@ void SohInputEditorWindow::DrawDpadControlPanel() { ImVec2 cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5)); Ship::GuiWindow::BeginGroupPanel("D-Pad Options", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementCheckbox("D-pad Support on Pause Screen", CVAR_SETTING("DPadOnPause")); - UIWidgets::Tooltip("Navigate Pause with the D-pad\nIf used with \"D-pad as Equip Items\", you must hold C-Up to equip instead of navigate"); - UIWidgets::PaddedEnhancementCheckbox("D-pad Support in Text Boxes", CVAR_SETTING("DpadInText")); - UIWidgets::Tooltip("Navigate choices in text boxes, shop item selection, and the file select / name entry screens with the D-pad"); + CVarCheckbox("D-pad Support on Pause Screen", CVAR_SETTING("DPadOnPause"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Navigate Pause with the D-pad\nIf used with \"D-pad as Equip Items\", you must hold " + "C-Up to equip instead of navigate")); + CVarCheckbox("D-pad Support in Text Boxes", CVAR_SETTING("DpadInText"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Navigate choices in text boxes, shop item selection, and the file select / name entry " + "screens with the D-pad")); if (!CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0) && !CVarGetInteger(CVAR_SETTING("DpadInText"), 0)) { ImGui::BeginDisabled(); } - UIWidgets::PaddedEnhancementCheckbox("D-pad hold change", CVAR_SETTING("DpadHoldChange"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("The cursor will only move a single space no matter how long a D-pad direction is held"); + CVarCheckbox("D-pad hold change", CVAR_SETTING("DpadHoldChange"), + CheckboxOptions() + .Color(THEME_COLOR) + .DefaultValue(true) + .Tooltip("The cursor will only move a single space no matter how long a D-pad direction is held")); if (!CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0) && !CVarGetInteger(CVAR_SETTING("DpadInText"), 0)) { ImGui::EndDisabled(); @@ -1457,7 +1526,7 @@ void SohInputEditorWindow::DrawDeviceToggles(uint8_t portIndex) { ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); auto notIgnored = !connectedDeviceManager->PortIsIgnoringInstanceId(portIndex, instanceId); ImGui::PopItemFlag(); - if(ImGui::Checkbox(StringHelper::Sprintf("###instanceId_%d", instanceId).c_str(), ¬Ignored)) { + if (ImGui::Checkbox(StringHelper::Sprintf("###instanceId_%d", instanceId).c_str(), ¬Ignored)) { if (notIgnored) { connectedDeviceManager->UnignoreInstanceIdForPort(portIndex, instanceId); } else { @@ -1505,10 +1574,10 @@ void SohInputEditorWindow::DrawLinkTab() { } if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { - DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP); - DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN); - DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT); - DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT); + DrawButtonLine(StringHelper::Sprintf("D %s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP); + DrawButtonLine(StringHelper::Sprintf("D %s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN); + DrawButtonLine(StringHelper::Sprintf("D %s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT); + DrawButtonLine(StringHelper::Sprintf("D %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT); } if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { @@ -1536,30 +1605,52 @@ void SohInputEditorWindow::DrawLinkTab() { DrawButtonLine("M2", portIndex, BTN_CUSTOM_MODIFIER2); ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - UIWidgets::PaddedEnhancementCheckbox("Enable speed modifiers", CVAR_SETTING("WalkModifier.Enabled"), true, false); - UIWidgets::Tooltip("Hold the assigned button to change the maximum walking or swimming speed"); + CVarCheckbox("Enable speed modifiers", CVAR_SETTING("WalkModifier.Enabled"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Hold the assigned button to change the maximum walking or swimming speed")); if (CVarGetInteger(CVAR_SETTING("WalkModifier.Enabled"), 0)) { UIWidgets::Spacer(5); Ship::GuiWindow::BeginGroupPanel("Speed Modifier", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementCheckbox("Toggle modifier instead of holding", - CVAR_SETTING("WalkModifier.SpeedToggle"), true, false); + CVarCheckbox("Toggle modifier instead of holding", CVAR_SETTING("WalkModifier.SpeedToggle"), + CheckboxOptions().Color(THEME_COLOR)); Ship::GuiWindow::BeginGroupPanel("Walk Modifier", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementCheckbox("Don't affect jump distance/velocity", - CVAR_SETTING("WalkModifier.DoesntChangeJump"), true, false); - UIWidgets::PaddedEnhancementSliderFloat("Walk Modifier 1: %.0f %%", "##WalkMod1", - CVAR_SETTING("WalkModifier.Mapping1"), 0.0f, 5.0f, "", 1.0f, - true, true, false, true); - UIWidgets::PaddedEnhancementSliderFloat("Walk Modifier 2: %.0f %%", "##WalkMod2", - CVAR_SETTING("WalkModifier.Mapping2"), 0.0f, 5.0f, "", 1.0f, - true, true, false, true); + CVarCheckbox("Don't affect jump distance/velocity", CVAR_SETTING("WalkModifier.DoesntChangeJump"), + CheckboxOptions().Color(THEME_COLOR)); + CVarSliderFloat("Walk Modifier 1: %.0f %%", CVAR_SETTING("WalkModifier.Mapping1"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.0f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); + CVarSliderFloat("Walk Modifier 2: %.0f %%", CVAR_SETTING("WalkModifier.Mapping2"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.0f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); Ship::GuiWindow::EndGroupPanel(0); Ship::GuiWindow::BeginGroupPanel("Swim Modifier", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementSliderFloat("Swim Modifier 1: %.0f %%", "##SwimMod1", - CVAR_SETTING("WalkModifier.SwimMapping1"), 0.0f, 5.0f, "", 1.0f, - true, true, false, true); - UIWidgets::PaddedEnhancementSliderFloat("Swim Modifier 2: %.0f %%", "##SwimMod2", - CVAR_SETTING("WalkModifier.SwimMapping2"), 0.0f, 5.0f, "", 1.0f, - true, true, false, true); + CVarSliderFloat("Swim Modifier 1: %.0f %%", CVAR_SETTING("WalkModifier.SwimMapping1"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.0f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); + CVarSliderFloat("Swim Modifier 2: %.0f %%", CVAR_SETTING("WalkModifier.SwimMapping2"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.0f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); Ship::GuiWindow::EndGroupPanel(0); Ship::GuiWindow::EndGroupPanel(0); } @@ -1659,9 +1750,7 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo UpdateBitmaskToMappingIds(portIndex); UpdateStickDirectionToMappingIds(portIndex); - ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(0.133f, 0.133f, 0.133f, 1.0f)); - ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); - ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); + PushStyleHeader(THEME_COLOR); if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE); @@ -1690,19 +1779,20 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo DrawStickSection(portIndex, Ship::LEFT, 0); } - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); + PopStyleHeader(); ImGui::EndTabItem(); } } void SohInputEditorWindow::DrawClearAllButton(uint8_t portIndex) { + PushStyleButton(THEME_COLOR); if (ImGui::Button("Clear All", ImGui::CalcTextSize("Clear All") * 2)) { ImGui::OpenPopup("Clear All##clearAllPopup"); } + PopStyleButton(); if (ImGui::BeginPopupModal("Clear All##clearAllPopup", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::Text("This will clear all mappings for port %d.\n\nContinue?", portIndex + 1); + PushStyleButton(THEME_COLOR); if (ImGui::Button("Cancel")) { ImGui::CloseCurrentPopup(); } @@ -1710,6 +1800,7 @@ void SohInputEditorWindow::DrawClearAllButton(uint8_t portIndex) { Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->ClearAllMappings(); ImGui::CloseCurrentPopup(); } + PopStyleButton(); ImGui::EndPopup(); } } @@ -1717,22 +1808,23 @@ void SohInputEditorWindow::DrawClearAllButton(uint8_t portIndex) { void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { ImGui::SameLine(); auto popupId = StringHelper::Sprintf("setDefaultsPopup##%d", portIndex); + PushStyleButton(THEME_COLOR); if (ImGui::Button(StringHelper::Sprintf("Set Defaults##%d", portIndex).c_str(), ImVec2(ImGui::CalcTextSize("Set Defaults") * 2))) { ImGui::OpenPopup(popupId.c_str()); } + PopStyleButton(); if (ImGui::BeginPopup(popupId.c_str())) { bool shouldClose = false; - ImGui::PushStyleColor(ImGuiCol_Button, BUTTON_COLOR_KEYBOARD_BEIGE); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED); + PushStyleButton(BUTTON_COLOR_KEYBOARD_BEIGE); if (ImGui::Button(StringHelper::Sprintf("%s Keyboard", ICON_FA_KEYBOARD_O).c_str())) { ImGui::OpenPopup("Set Defaults for Keyboard"); } - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); + PopStyleButton(); if (ImGui::BeginPopupModal("Set Defaults for Keyboard", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::Text("This will clear all existing mappings for\nKeyboard on port %d.\n\nContinue?", portIndex + 1); + PushStyleButton(THEME_COLOR); if (ImGui::Button("Cancel")) { shouldClose = true; ImGui::CloseCurrentPopup(); @@ -1747,21 +1839,22 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { shouldClose = true; ImGui::CloseCurrentPopup(); } + PopStyleButton(); ImGui::EndPopup(); } auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad, buttonColor, buttonHoveredColor); - ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + PushStyleButton(buttonColor); if (ImGui::Button(StringHelper::Sprintf("%s %s", ICON_FA_GAMEPAD, "Gamepad (SDL)").c_str())) { ImGui::OpenPopup("Set Defaults for Gamepad (SDL)"); } - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); + PopStyleButton(); if (ImGui::BeginPopupModal("Set Defaults for Gamepad (SDL)", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::Text("This will clear all existing mappings for\nGamepad (SDL) on port %d.\n\nContinue?", portIndex + 1); + ImGui::Text("This will clear all existing mappings for\nGamepad (SDL) on port %d.\n\nContinue?", + portIndex + 1); + PushStyleButton(THEME_COLOR); if (ImGui::Button("Cancel")) { shouldClose = true; ImGui::CloseCurrentPopup(); @@ -1776,18 +1869,26 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { shouldClose = true; ImGui::CloseCurrentPopup(); } + PopStyleButton(); ImGui::EndPopup(); } + PushStyleButton(THEME_COLOR); if (ImGui::Button("Cancel") || shouldClose) { ImGui::CloseCurrentPopup(); } + PopStyleButton(); ImGui::EndPopup(); } } void SohInputEditorWindow::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + ImVec4 themeColor = ColorValues.at(THEME_COLOR); + ImGui::PushStyleColor(ImGuiCol_Tab, ImVec4(themeColor.x, themeColor.y, themeColor.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_TabHovered, ImVec4(themeColor.x, themeColor.y, themeColor.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_TabActive, ImVec4(themeColor.x, themeColor.y, themeColor.z, 0.6f)); ImGui::BeginTabBar("##ControllerConfigPortTabs"); DrawLinkTab(); DrawIvanTab(); @@ -1796,4 +1897,6 @@ void SohInputEditorWindow::DrawElement() { DrawDebugPortTab(3); } ImGui::EndTabBar(); + ImGui::PopStyleColor(3); + ImGui::PopFont(); } diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.h b/soh/soh/Enhancements/controls/SohInputEditorWindow.h index 4545f771d6..a6815f060a 100644 --- a/soh/soh/Enhancements/controls/SohInputEditorWindow.h +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.h @@ -17,7 +17,7 @@ typedef struct { N64ButtonMask defaultBtn; } CustomButtonMap; -class SohInputEditorWindow : public Ship::GuiWindow { +class SohInputEditorWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; ~SohInputEditorWindow(); @@ -41,7 +41,8 @@ class SohInputEditorWindow : public Ship::GuiWindow { void DrawButtonLineEditMappingButton(uint8_t port, N64ButtonMask bitmask, std::string id); void DrawButtonLineAddMappingButton(uint8_t port, N64ButtonMask bitmask); - void DrawStickDirectionLineEditMappingButton(uint8_t port, uint8_t stick, Ship::Direction direction, std::string id); + void DrawStickDirectionLineEditMappingButton(uint8_t port, uint8_t stick, Ship::Direction direction, + std::string id); void DrawStickDirectionLineAddMappingButton(uint8_t port, uint8_t stick, Ship::Direction direction); void DrawStickSection(uint8_t port, uint8_t stick, int32_t id, ImVec4 color); @@ -84,7 +85,7 @@ class SohInputEditorWindow : public Ship::GuiWindow { void UpdateStickDirectionToMappingIds(uint8_t port); void GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor, - ImVec4& buttonHoveredColor); + ImVec4& buttonHoveredColor); void DrawLinkTab(); void DrawIvanTab(); void DrawDebugPortTab(uint8_t portIndex, std::string customName = ""); diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index 16fb2bed43..8074fa7074 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -11,6 +11,7 @@ #include #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" @@ -50,7 +51,8 @@ extern "C" { extern PlayState* gPlayState; void ResourceMgr_PatchGfxByName(const char* path, const char* patchName, int index, Gfx instruction); -void ResourceMgr_PatchGfxCopyCommandByName(const char* path, const char* patchName, int destinationIndex, int sourceIndex); +void ResourceMgr_PatchGfxCopyCommandByName(const char* path, const char* patchName, int destinationIndex, + int sourceIndex); void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName); u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); } @@ -67,31 +69,32 @@ u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); static const ALIGN_ASSET(2) char gEndGrayscaleAndEndDlistDL[] = dgEndGrayscaleAndEndDlistDL; std::map groupLabels = { - { COSMETICS_GROUP_LINK, "Link" }, + { COSMETICS_GROUP_LINK, "Link" }, { COSMETICS_GROUP_MIRRORSHIELD, "Mirror Shield" }, - { COSMETICS_GROUP_SWORDS, "Swords" }, - { COSMETICS_GROUP_GLOVES, "Gloves" }, - { COSMETICS_GROUP_EQUIPMENT, "Equipment" }, - { COSMETICS_GROUP_KEYRING, "Keyring" }, - { COSMETICS_GROUP_SMALL_KEYS, "Small Keys" }, - { COSMETICS_GROUP_BOSS_KEYS, "Boss Keys" }, - { COSMETICS_GROUP_CONSUMABLE, "Consumables" }, - { COSMETICS_GROUP_HUD, "HUD" }, - { COSMETICS_GROUP_KALEIDO, "Pause Menu" }, - { COSMETICS_GROUP_TITLE, "Title Screen" }, - { COSMETICS_GROUP_NPC, "NPCs" }, - { COSMETICS_GROUP_WORLD, "World" }, - { COSMETICS_GROUP_MAGIC, "Magic Effects" }, - { COSMETICS_GROUP_ARROWS, "Arrow Effects" }, - { COSMETICS_GROUP_SPIN_ATTACK, "Spin Attack" }, - { COSMETICS_GROUP_TRAILS, "Trails" }, - { COSMETICS_GROUP_NAVI, "Navi" }, - { COSMETICS_GROUP_IVAN, "Ivan" }, - { COSMETICS_GROUP_MESSAGE, "Message" }, + { COSMETICS_GROUP_SWORDS, "Swords" }, + { COSMETICS_GROUP_GLOVES, "Gloves" }, + { COSMETICS_GROUP_EQUIPMENT, "Equipment" }, + { COSMETICS_GROUP_KEYRING, "Keyring" }, + { COSMETICS_GROUP_SMALL_KEYS, "Small Keys" }, + { COSMETICS_GROUP_BOSS_KEYS, "Boss Keys" }, + { COSMETICS_GROUP_CONSUMABLE, "Consumables" }, + { COSMETICS_GROUP_HUD, "HUD" }, + { COSMETICS_GROUP_KALEIDO, "Pause Menu" }, + { COSMETICS_GROUP_TITLE, "Title Screen" }, + { COSMETICS_GROUP_NPC, "NPCs" }, + { COSMETICS_GROUP_WORLD, "World" }, + { COSMETICS_GROUP_MAGIC, "Magic Effects" }, + { COSMETICS_GROUP_ARROWS, "Arrow Effects" }, + { COSMETICS_GROUP_SPIN_ATTACK, "Spin Attack" }, + { COSMETICS_GROUP_TRAILS, "Trails" }, + { COSMETICS_GROUP_NAVI, "Navi" }, + { COSMETICS_GROUP_IVAN, "Ivan" }, + { COSMETICS_GROUP_MESSAGE, "Message" }, }; typedef struct { const char* cvar; + const char* valuesCvar; const char* rainbowCvar; const char* lockedCvar; const char* changedCvar; @@ -109,13 +112,18 @@ Color_RGBA8 ColorRGBA8(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { return color; } -#define COSMETIC_OPTION(id, label, group, defaultColor, supportsAlpha, supportsRainbow, advancedOption) \ - { id, { \ - CVAR_COSMETIC(id ".Value"), CVAR_COSMETIC(id ".Rainbow"), CVAR_COSMETIC(id ".Locked"), CVAR_COSMETIC(id ".Changed"), label, group, \ - ImVec4(defaultColor.r / 255.0f, defaultColor.g / 255.0f, defaultColor.b / 255.0f, defaultColor.a / 255.0f), defaultColor, \ - supportsAlpha, supportsRainbow, advancedOption \ - } } +#define COSMETIC_OPTION(id, label, group, defaultColor, supportsAlpha, supportsRainbow, advancedOption) \ + { \ + id, { \ + CVAR_COSMETIC(id), CVAR_COSMETIC(id ".Value"), CVAR_COSMETIC(id ".Rainbow"), CVAR_COSMETIC(id ".Locked"), \ + CVAR_COSMETIC(id ".Changed"), label, group, \ + ImVec4(defaultColor.r / 255.0f, defaultColor.g / 255.0f, defaultColor.b / 255.0f, \ + defaultColor.a / 255.0f), \ + defaultColor, supportsAlpha, supportsRainbow, advancedOption \ + } \ + } +// clang-format off /* So, you would like to add a new cosmetic option? BUCKLE UP @@ -280,13 +288,13 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("Key.GanonsBossGem", "Ganons Boss Key Gem", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 0, 0, 255), false, true, false), COSMETIC_OPTION("Key.WellSmallBody", "Well Small Key", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), - COSMETIC_OPTION("Key.WellSmallEmblem", "Well Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(227, 110, 255, 255), false, true, true), + COSMETIC_OPTION("Key.WellSmallEmblem", "Well Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(227, 110, 255, 255), false, true, false), COSMETIC_OPTION("Key.FortSmallBody", "Fortress Small Key", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), - COSMETIC_OPTION("Key.FortSmallEmblem", "Fortress Small Key Emblem",COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, true), + COSMETIC_OPTION("Key.FortSmallEmblem", "Fortress Small Key Emblem",COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), COSMETIC_OPTION("Key.GTGSmallBody", "GTG Small Key", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), - COSMETIC_OPTION("Key.GTGSmallEmblem", "GTG Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(221, 212, 60, 255), false, true, true), + COSMETIC_OPTION("Key.GTGSmallEmblem", "GTG Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(221, 212, 60, 255), false, true, false), //COSMETIC_OPTION("Key.ChestGameSmallBody", "Chest Game Key", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), - //COSMETIC_OPTION("Key.ChestGameEmblem", "Chest Game Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 0, 0, 255), false, true, true), + //COSMETIC_OPTION("Key.ChestGameEmblem", "Chest Game Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 0, 0, 255), false, true, false), COSMETIC_OPTION("Key.Skeleton", "Skeleton Key", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 170, 255), false, true, false), COSMETIC_OPTION("HUD.AButton", "A Button", COSMETICS_GROUP_HUD, ColorRGBA8( 90, 90, 255, 255), false, true, false), @@ -313,7 +321,7 @@ static std::map cosmeticOptions = { #define MESSAGE_COSMETIC_OPTION(id, label, r, g, b) COSMETIC_OPTION("Message." id, label, COSMETICS_GROUP_MESSAGE, ColorRGBA8(r, g, b, 255), false, true, true) MESSAGE_COSMETIC_OPTION("Default.Normal", "Message Default Color", 255, 255, 255), - MESSAGE_COSMETIC_OPTION("Default.NoneNoShadow", "Message Default (None No Shadow) Color", 0, 0, 0), + MESSAGE_COSMETIC_OPTION("Default.NoneNoShadow", "Message Default (None No Shadow)", 0, 0, 0), MESSAGE_COSMETIC_OPTION("Red.Normal", "Message Red Color", 255, 60, 60), MESSAGE_COSMETIC_OPTION("Red.Wooden", "Message Red (Wooden) Color", 255, 120, 0), MESSAGE_COSMETIC_OPTION("Adjustable.Normal", "Message Adjustable Color", 70, 255, 80), @@ -322,7 +330,7 @@ static std::map cosmeticOptions = { MESSAGE_COSMETIC_OPTION("Blue.Wooden", "Message Blue (Wooden) Color", 80, 110, 255), MESSAGE_COSMETIC_OPTION("LightBlue.Normal", "Message Light Blue Color", 100, 180, 255), MESSAGE_COSMETIC_OPTION("LightBlue.Wooden", "Message Light Blue (Wooden) Color", 90, 180, 255), - MESSAGE_COSMETIC_OPTION("LightBlue.LightBlue.NoneNoShadow", "Message Light Blue (None No Shadow) Color", 80, 150, 180), + MESSAGE_COSMETIC_OPTION("LightBlue.LightBlue.NoneNoShadow", "Message Light Blue (None No Shadow)", 80, 150, 180), MESSAGE_COSMETIC_OPTION("Purple.Normal", "Message Purple Color", 255, 150, 180), MESSAGE_COSMETIC_OPTION("Purple.Wooden", "Message Purple (Wooden) Color", 210, 100, 255), MESSAGE_COSMETIC_OPTION("Yellow.Normal", "Message Yellow Color", 255, 255, 50), @@ -436,74 +444,53 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("NPC.MetalTrap", "Metal Trap", COSMETICS_GROUP_NPC, ColorRGBA8(255, 255, 255, 255), false, true, true), COSMETIC_OPTION("NPC.IronKnuckles", "Iron Knuckles", COSMETICS_GROUP_NPC, ColorRGBA8(245, 255, 205, 255), false, true, false), }; +// clang-format on -static const char* MarginCvarList[] { - CVAR_COSMETIC("HUD.Hearts"), - CVAR_COSMETIC("HUD.HeartsCount"), - CVAR_COSMETIC("HUD.MagicBar"), - CVAR_COSMETIC("HUD.VisualSoA"), - CVAR_COSMETIC("HUD.BButton"), - CVAR_COSMETIC("HUD.AButton"), - CVAR_COSMETIC("HUD.StartButton"), - CVAR_COSMETIC("HUD.CUpButton"), - CVAR_COSMETIC("HUD.CDownButton"), - CVAR_COSMETIC("HUD.CLeftButton"), - CVAR_COSMETIC("HUD.CRightButton"), - CVAR_COSMETIC("HUD.Dpad"), - CVAR_COSMETIC("HUD.Minimap"), - CVAR_COSMETIC("HUD.SmallKey"), - CVAR_COSMETIC("HUD.Rupees"), - CVAR_COSMETIC("HUD.Carrots"), - CVAR_COSMETIC("HUD.Timers"), - CVAR_COSMETIC("HUD.ArcheryScore"), - CVAR_COSMETIC("HUD.TitleCard.Map"), - CVAR_COSMETIC("HUD.TitleCard.Boss"), - CVAR_COSMETIC("HUD.IGT") +static const char* MarginCvarList[]{ + CVAR_COSMETIC("HUD.Hearts"), CVAR_COSMETIC("HUD.HeartsCount"), CVAR_COSMETIC("HUD.MagicBar"), + CVAR_COSMETIC("HUD.VisualSoA"), CVAR_COSMETIC("HUD.BButton"), CVAR_COSMETIC("HUD.AButton"), + CVAR_COSMETIC("HUD.StartButton"), CVAR_COSMETIC("HUD.CUpButton"), CVAR_COSMETIC("HUD.CDownButton"), + CVAR_COSMETIC("HUD.CLeftButton"), CVAR_COSMETIC("HUD.CRightButton"), CVAR_COSMETIC("HUD.Dpad"), + CVAR_COSMETIC("HUD.Minimap"), CVAR_COSMETIC("HUD.SmallKey"), CVAR_COSMETIC("HUD.Rupees"), + CVAR_COSMETIC("HUD.Carrots"), CVAR_COSMETIC("HUD.Timers"), CVAR_COSMETIC("HUD.ArcheryScore"), + CVAR_COSMETIC("HUD.TitleCard.Map"), CVAR_COSMETIC("HUD.TitleCard.Boss"), CVAR_COSMETIC("HUD.IGT"), }; -static const char* MarginCvarNonAnchor[] { - CVAR_COSMETIC("HUD.Carrots"), - CVAR_COSMETIC("HUD.Timers"), - CVAR_COSMETIC("HUD.ArcheryScore"), - CVAR_COSMETIC("HUD.TitleCard.Map"), - CVAR_COSMETIC("HUD.TitleCard.Boss") +static const char* MarginCvarNonAnchor[]{ + CVAR_COSMETIC("HUD.Carrots"), CVAR_COSMETIC("HUD.Timers"), CVAR_COSMETIC("HUD.ArcheryScore"), + CVAR_COSMETIC("HUD.TitleCard.Map"), CVAR_COSMETIC("HUD.TitleCard.Boss"), }; -ImVec4 GetRandomValue() { -#if !defined(__SWITCH__) && !defined(__WIIU__) - std::random_device rd; - std::mt19937 rng(rd()); -#else - size_t seed = std::hash{}(std::to_string(rand())); - std::mt19937_64 rng(seed); -#endif - std::uniform_int_distribution dist(0, 255 - 1); - - ImVec4 NewColor; - NewColor.x = (float)(dist(rng)) / 255.0f; - NewColor.y = (float)(dist(rng)) / 255.0f; - NewColor.z = (float)(dist(rng)) / 255.0f; - return NewColor; -} - -void SetMarginAll(const char* ButtonName, bool SetActivated) { - if (ImGui::Button(ButtonName)) { - //MarginCvarNonAnchor is an array that list every element that has No anchor by default, because if that the case this function will not touch it with pose type 0. +void SetMarginAll(const char* ButtonName, bool SetActivated, const char* tooltip) { + if (UIWidgets::Button(ButtonName, + UIWidgets::ButtonOptions().Size(ImVec2(200.0f, 0.0f)).Color(THEME_COLOR).Tooltip(tooltip))) { + // MarginCvarNonAnchor is an array that list every element that has No anchor by default, because if that the + // case this function will not touch it with pose type 0. u8 arrayLengthNonMargin = sizeof(MarginCvarNonAnchor) / sizeof(*MarginCvarNonAnchor); for (auto cvarName : MarginCvarList) { std::string cvarPosType = std::string(cvarName).append(".PosType"); std::string cvarNameMargins = std::string(cvarName).append(".UseMargins"); - if (CVarGetInteger(cvarPosType.c_str(),0) <= ANCHOR_RIGHT && SetActivated) { //Our element is not Hidden or Non anchor + if (CVarGetInteger(cvarPosType.c_str(), 0) <= ANCHOR_RIGHT && + SetActivated) { // Our element is not Hidden or Non anchor for (int i = 0; i < arrayLengthNonMargin; i++) { - if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && (CVarGetInteger(cvarPosType.c_str(), 0) == ORIGINAL_LOCATION)) { //Our element is both in original position and do not have anchor by default so we skip it. - CVarSetInteger(cvarNameMargins.c_str(), false); //force set off - } else if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && (CVarGetInteger(cvarPosType.c_str(), 0) != ORIGINAL_LOCATION)) { //Our element is not in original position regarless it has no anchor by default since player made it anchored we can toggle margins + if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && + (CVarGetInteger(cvarPosType.c_str(), 0) == + ORIGINAL_LOCATION)) { // Our element is both in original position and do not have anchor by + // default so we skip it. + CVarSetInteger(cvarNameMargins.c_str(), false); // force set off + } else if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && + (CVarGetInteger(cvarPosType.c_str(), 0) != + ORIGINAL_LOCATION)) { // Our element is not in original position regarless it has no + // anchor by default since player made it anchored we can toggle + // margins CVarSetInteger(cvarNameMargins.c_str(), SetActivated); - } else if (strcmp(cvarName, MarginCvarNonAnchor[i]) != 0) { //Our elements has an anchor by default so regarless of it's position right now that okay to toggle margins. + } else if (strcmp(cvarName, MarginCvarNonAnchor[i]) != + 0) { // Our elements has an anchor by default so regarless of it's position right now + // that okay to toggle margins. CVarSetInteger(cvarNameMargins.c_str(), SetActivated); } } - } else { //Since the user requested to turn all margin off no need to do any check there. + } else { // Since the user requested to turn all margin off no need to do any check there. CVarSetInteger(cvarNameMargins.c_str(), SetActivated); } } @@ -511,19 +498,24 @@ void SetMarginAll(const char* ButtonName, bool SetActivated) { } void ResetPositionAll() { - if (ImGui::Button("Reset all positions")) { + if (UIWidgets::Button("Reset all positions", + UIWidgets::ButtonOptions() + .Size(ImVec2(200.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Revert every element to use their original position and no margins"))) { for (auto cvarName : MarginCvarList) { std::string cvarPosType = std::string(cvarName).append(".PosType"); std::string cvarNameMargins = std::string(cvarName).append(".UseMargins"); CVarSetInteger(cvarPosType.c_str(), 0); - CVarSetInteger(cvarNameMargins.c_str(), false); //Turn margin off to everythings as that original position. + CVarSetInteger(cvarNameMargins.c_str(), false); // Turn margin off to everythings as that original position. } } } int hue = 0; -// Runs every frame to update rainbow hue, a potential future optimization is to only run this a once or twice a second and increase the speed of the rainbow hue rotation. +// Runs every frame to update rainbow hue, a potential future optimization is to only run this a once or twice a second +// and increase the speed of the rainbow hue rotation. void CosmeticsUpdateTick() { int index = 0; float rainbowSpeed = CVarGetFloat(CVAR_COSMETIC("RainbowSpeed"), 0.6f); @@ -545,7 +537,7 @@ void CosmeticsUpdateTick() { cosmeticOption.currentColor.z = newColor.b / 255.0f; cosmeticOption.currentColor.w = newColor.a / 255.0f; - CVarSetColor(cosmeticOption.cvar, newColor); + CVarSetColor(cosmeticOption.valuesCvar, newColor); } // If we don't want the rainbow color on items to be synced, offset the index for each item in the loop. // Technically this would work if you replaced "60" with 1 but the hue would be so close it's @@ -562,501 +554,725 @@ void CosmeticsUpdateTick() { } /* - This is called every time a color is changed in the UI, and every frame to update colors that have rainbow mode enabled - The columns/arguments for PATCH_GFX are as follows: - 1. Display List: This should be a valid display list pointer, if you have errors listing one here make sure to include the appropriate header file up top - 2. Patch Name: Each of these MUST be unique, used for restoring the original DList command, if these are not unique bugs WILL happen + This is called every time a color is changed in the UI, and every frame to update colors that have rainbow mode + enabled The columns/arguments for PATCH_GFX are as follows: + 1. Display List: This should be a valid display list pointer, if you have errors listing one here make sure to + include the appropriate header file up top + 2. Patch Name: Each of these MUST be unique, used for restoring the original DList command, if these are not unique + bugs WILL happen 3. Changed Cvar: What determines if a patch should be applied or reset. - 4. GFX Command Index: Index of the GFX command you want to replace, the instructions on finding this are in the giant comment block above the cosmeticOptions map + 4. GFX Command Index: Index of the GFX command you want to replace, the instructions on finding this are in the + giant comment block above the cosmeticOptions map 5. GFX Command: The GFX command you want to insert */ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& magicFaroresPrimary = cosmeticOptions.at("Magic.FaroresPrimary"); if (manualChange || CVarGetInteger(magicFaroresPrimary.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(magicFaroresPrimary.cvar, magicFaroresPrimary.defaultColor); - PATCH_GFX(sInnerCylinderDL, "Magic_FaroresPrimary1", magicFaroresPrimary.changedCvar, 24, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(sOuterCylinderDL, "Magic_FaroresPrimary2", magicFaroresPrimary.changedCvar, 24, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(magicFaroresPrimary.valuesCvar, magicFaroresPrimary.defaultColor); + PATCH_GFX(sInnerCylinderDL, "Magic_FaroresPrimary1", magicFaroresPrimary.changedCvar, 24, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(sOuterCylinderDL, "Magic_FaroresPrimary2", magicFaroresPrimary.changedCvar, 24, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& magicFaroresSecondary = cosmeticOptions.at("Magic.FaroresSecondary"); if (manualChange || CVarGetInteger(magicFaroresSecondary.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(magicFaroresSecondary.cvar, magicFaroresSecondary.defaultColor); - PATCH_GFX(sInnerCylinderDL, "Magic_FaroresSecondary1", magicFaroresSecondary.changedCvar, 25, gsDPSetEnvColor(color.r, color.g, color.b, 255)); - PATCH_GFX(sOuterCylinderDL, "Magic_FaroresSecondary2", magicFaroresSecondary.changedCvar, 25, gsDPSetEnvColor(color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(magicFaroresSecondary.valuesCvar, magicFaroresSecondary.defaultColor); + PATCH_GFX(sInnerCylinderDL, "Magic_FaroresSecondary1", magicFaroresSecondary.changedCvar, 25, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(sOuterCylinderDL, "Magic_FaroresSecondary2", magicFaroresSecondary.changedCvar, 25, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); } static CosmeticOption& linkGoronTunic = cosmeticOptions.at("Link.GoronTunic"); if (manualChange || CVarGetInteger(linkGoronTunic.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(linkGoronTunic.cvar, linkGoronTunic.defaultColor); - PATCH_GFX(gGiGoronTunicColorDL, "Link_GoronTunic1", linkGoronTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGoronCollarColorDL, "Link_GoronTunic2", linkGoronTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiGoronTunicColorDL, "Link_GoronTunic3", linkGoronTunic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiGoronCollarColorDL, "Link_GoronTunic4", linkGoronTunic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + Color_RGBA8 color = CVarGetColor(linkGoronTunic.valuesCvar, linkGoronTunic.defaultColor); + PATCH_GFX(gGiGoronTunicColorDL, "Link_GoronTunic1", linkGoronTunic.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGoronCollarColorDL, "Link_GoronTunic2", linkGoronTunic.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiGoronTunicColorDL, "Link_GoronTunic3", linkGoronTunic.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiGoronCollarColorDL, "Link_GoronTunic4", linkGoronTunic.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); } static CosmeticOption& linkZoraTunic = cosmeticOptions.at("Link.ZoraTunic"); if (manualChange || CVarGetInteger(linkZoraTunic.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(linkZoraTunic.cvar, linkZoraTunic.defaultColor); - PATCH_GFX(gGiZoraTunicColorDL, "Link_ZoraTunic1", linkZoraTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiZoraCollarColorDL, "Link_ZoraTunic2", linkZoraTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiZoraTunicColorDL, "Link_ZoraTunic3", linkZoraTunic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiZoraCollarColorDL, "Link_ZoraTunic4", linkZoraTunic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + Color_RGBA8 color = CVarGetColor(linkZoraTunic.valuesCvar, linkZoraTunic.defaultColor); + PATCH_GFX(gGiZoraTunicColorDL, "Link_ZoraTunic1", linkZoraTunic.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiZoraCollarColorDL, "Link_ZoraTunic2", linkZoraTunic.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiZoraTunicColorDL, "Link_ZoraTunic3", linkZoraTunic.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiZoraCollarColorDL, "Link_ZoraTunic4", linkZoraTunic.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); } static CosmeticOption& linkHair = cosmeticOptions.at("Link.Hair"); if (manualChange || CVarGetInteger(linkHair.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(linkHair.cvar, linkHair.defaultColor); - PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair1", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair2", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair3", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair4", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(linkHair.valuesCvar, linkHair.defaultColor); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair1", linkHair.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair2", linkHair.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair3", linkHair.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair4", linkHair.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair5", linkHair.changedCvar, 46, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair6", linkHair.changedCvar, 54, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair7", linkHair.changedCvar, 136, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair8", linkHair.changedCvar, 162, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair9", linkHair.changedCvar, 101, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair10", linkHair.changedCvar, 118, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair11", linkHair.changedCvar, 125, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair12", linkHair.changedCvar, 159, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair13", linkHair.changedCvar, 102, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair14", linkHair.changedCvar, 122, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair5", linkHair.changedCvar, 46, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair6", linkHair.changedCvar, 54, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair7", linkHair.changedCvar, 136, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair8", linkHair.changedCvar, 162, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair9", linkHair.changedCvar, 101, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair10", linkHair.changedCvar, 118, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair11", linkHair.changedCvar, 125, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair12", linkHair.changedCvar, 159, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair13", linkHair.changedCvar, 102, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair14", linkHair.changedCvar, 122, gsSPGrayscale(false)); } } static CosmeticOption& linkLinen = cosmeticOptions.at("Link.Linen"); if (manualChange || CVarGetInteger(linkLinen.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(linkLinen.cvar, linkLinen.defaultColor); - PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen1", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen2", linkLinen.changedCvar, 83, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftArmOutNearDL, "Link_Linen3", linkLinen.changedCvar, 25, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen4", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen5", linkLinen.changedCvar, 70, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen6", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen7", linkLinen.changedCvar, 70, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightArmNearDL, "Link_Linen8", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftShoulderFarDL, "Link_Linen9", linkLinen.changedCvar, 55, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftShoulderNearDL, "Link_Linen10", linkLinen.changedCvar, 57, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightShoulderNearDL, "Link_Linen11", linkLinen.changedCvar, 57, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightShoulderFarDL, "Link_Linen12", linkLinen.changedCvar, 55, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultTorsoNearDL, "Link_Linen13", linkLinen.changedCvar, 66, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultTorsoFarDL, "Link_Linen14", linkLinen.changedCvar, 57, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightThighNearDL, "Link_Linen15", linkLinen.changedCvar, 53, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftThighNearDL, "Link_Linen16", linkLinen.changedCvar, 53, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightThighFarDL, "Link_Linen17", linkLinen.changedCvar, 54, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftThighFarDL, "Link_Linen18", linkLinen.changedCvar, 54, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Linen19", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Linen20", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Linen21", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Linen22", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(linkLinen.valuesCvar, linkLinen.defaultColor); + PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen1", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen2", linkLinen.changedCvar, 83, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftArmOutNearDL, "Link_Linen3", linkLinen.changedCvar, 25, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen4", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen5", linkLinen.changedCvar, 70, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen6", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen7", linkLinen.changedCvar, 70, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightArmNearDL, "Link_Linen8", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftShoulderFarDL, "Link_Linen9", linkLinen.changedCvar, 55, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftShoulderNearDL, "Link_Linen10", linkLinen.changedCvar, 57, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightShoulderNearDL, "Link_Linen11", linkLinen.changedCvar, 57, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightShoulderFarDL, "Link_Linen12", linkLinen.changedCvar, 55, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultTorsoNearDL, "Link_Linen13", linkLinen.changedCvar, 66, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultTorsoFarDL, "Link_Linen14", linkLinen.changedCvar, 57, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightThighNearDL, "Link_Linen15", linkLinen.changedCvar, 53, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftThighNearDL, "Link_Linen16", linkLinen.changedCvar, 53, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightThighFarDL, "Link_Linen17", linkLinen.changedCvar, 54, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftThighFarDL, "Link_Linen18", linkLinen.changedCvar, 54, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Linen19", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Linen20", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Linen21", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Linen22", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen23", linkLinen.changedCvar, 35, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultLeftArmOutNearDL, "Link_Linen24", linkLinen.changedCvar, 45, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen25", linkLinen.changedCvar, 40, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen26", linkLinen.changedCvar, 77, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen27", linkLinen.changedCvar, 35, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen28", linkLinen.changedCvar, 77, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultRightArmNearDL, "Link_Linen29", linkLinen.changedCvar, 42, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Linen30", linkLinen.changedCvar, 43, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Linen31", linkLinen.changedCvar, 43, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Linen32", linkLinen.changedCvar, 38, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Linen33", linkLinen.changedCvar, 38, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen23", linkLinen.changedCvar, 35, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftArmOutNearDL, "Link_Linen24", linkLinen.changedCvar, 45, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen25", linkLinen.changedCvar, 40, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen26", linkLinen.changedCvar, 77, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen27", linkLinen.changedCvar, 35, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen28", linkLinen.changedCvar, 77, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultRightArmNearDL, "Link_Linen29", linkLinen.changedCvar, 42, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Linen30", linkLinen.changedCvar, 43, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Linen31", linkLinen.changedCvar, 43, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Linen32", linkLinen.changedCvar, 38, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Linen33", linkLinen.changedCvar, 38, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); } } static CosmeticOption& linkBoots = cosmeticOptions.at("Link.Boots"); if (manualChange || CVarGetInteger(linkBoots.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(linkBoots.cvar, linkBoots.defaultColor); - PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots1", linkBoots.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots2", linkBoots.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Boots3", linkBoots.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Boots4", linkBoots.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(linkBoots.valuesCvar, linkBoots.defaultColor); + PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots1", linkBoots.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots2", linkBoots.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Boots3", linkBoots.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Boots4", linkBoots.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots5", linkBoots.changedCvar, 53, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots6", linkBoots.changedCvar, 69, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots7", linkBoots.changedCvar, 52, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots8", linkBoots.changedCvar, 61, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildLeftShinNearDL, "Link_Boots9", linkBoots.changedCvar, 53, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftShinNearDL, "Link_Boots10", linkBoots.changedCvar, 69, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildLeftShinFarDL, "Link_Boots11", linkBoots.changedCvar, 52, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftShinFarDL, "Link_Boots12", linkBoots.changedCvar, 61, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildRightFootNearDL, "Link_Boots13", linkBoots.changedCvar, 30, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightFootFarDL, "Link_Boots14", linkBoots.changedCvar, 30, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftFootNearDL, "Link_Boots15", linkBoots.changedCvar, 30, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftFootFarDL, "Link_Boots16", linkBoots.changedCvar, 30, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftThighNearDL, "Link_Boots17", linkBoots.changedCvar, 10, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildLeftThighFarDL, "Link_Boots18", linkBoots.changedCvar, 10, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildHeadNearDL, "Link_Boots19", linkBoots.changedCvar, 20, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildHeadFarDL, "Link_Boots20", linkBoots.changedCvar, 20, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Boots21", linkBoots.changedCvar, 57, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Boots22", linkBoots.changedCvar, 52, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Boots23", linkBoots.changedCvar, 57, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Boots24", linkBoots.changedCvar, 52, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftThighNearDL, "Link_Boots25", linkBoots.changedCvar, 10, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultLeftThighFarDL, "Link_Boots26", linkBoots.changedCvar, 10, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHeadNearDL, "Link_Boots27", linkBoots.changedCvar, 20, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHeadFarDL, "Link_Boots28", linkBoots.changedCvar, 20, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots5", linkBoots.changedCvar, 53, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots6", linkBoots.changedCvar, 69, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots7", linkBoots.changedCvar, 52, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots8", linkBoots.changedCvar, 61, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildLeftShinNearDL, "Link_Boots9", linkBoots.changedCvar, 53, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftShinNearDL, "Link_Boots10", linkBoots.changedCvar, 69, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildLeftShinFarDL, "Link_Boots11", linkBoots.changedCvar, 52, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftShinFarDL, "Link_Boots12", linkBoots.changedCvar, 61, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightFootNearDL, "Link_Boots13", linkBoots.changedCvar, 30, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightFootFarDL, "Link_Boots14", linkBoots.changedCvar, 30, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftFootNearDL, "Link_Boots15", linkBoots.changedCvar, 30, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftFootFarDL, "Link_Boots16", linkBoots.changedCvar, 30, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftThighNearDL, "Link_Boots17", linkBoots.changedCvar, 10, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildLeftThighFarDL, "Link_Boots18", linkBoots.changedCvar, 10, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Boots19", linkBoots.changedCvar, 20, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHeadFarDL, "Link_Boots20", linkBoots.changedCvar, 20, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Boots21", linkBoots.changedCvar, 57, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Boots22", linkBoots.changedCvar, 52, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Boots23", linkBoots.changedCvar, 57, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Boots24", linkBoots.changedCvar, 52, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultLeftThighNearDL, "Link_Boots25", linkBoots.changedCvar, 10, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultLeftThighFarDL, "Link_Boots26", linkBoots.changedCvar, 10, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHeadNearDL, "Link_Boots27", linkBoots.changedCvar, 20, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHeadFarDL, "Link_Boots28", linkBoots.changedCvar, 20, gsSPGrayscale(false)); } } static CosmeticOption& mirrorShieldBody = cosmeticOptions.at("MirrorShield.Body"); if (manualChange || CVarGetInteger(mirrorShieldBody.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(mirrorShieldBody.cvar, mirrorShieldBody.defaultColor); - PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Body1", mirrorShieldBody.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Body2", mirrorShieldBody.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Body3", mirrorShieldBody.changedCvar, 28, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Body4", mirrorShieldBody.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Body5", mirrorShieldBody.changedCvar, 28, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Body6", mirrorShieldBody.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Body7", mirrorShieldBody.changedCvar, 28, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Body8", mirrorShieldBody.changedCvar, 95, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(mirrorShieldBody.valuesCvar, mirrorShieldBody.defaultColor); + PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Body1", mirrorShieldBody.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Body2", mirrorShieldBody.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Body3", mirrorShieldBody.changedCvar, 28, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Body4", mirrorShieldBody.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Body5", mirrorShieldBody.changedCvar, 28, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Body6", mirrorShieldBody.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Body7", mirrorShieldBody.changedCvar, 28, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Body8", mirrorShieldBody.changedCvar, 95, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& mirrorShieldMirror = cosmeticOptions.at("MirrorShield.Mirror"); if (manualChange || CVarGetInteger(mirrorShieldMirror.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(mirrorShieldMirror.cvar, mirrorShieldMirror.defaultColor); - PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Mirror1", mirrorShieldMirror.changedCvar, 47, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Mirror2", mirrorShieldMirror.changedCvar, 48, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Mirror3", mirrorShieldMirror.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Mirror4", mirrorShieldMirror.changedCvar, 33, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Mirror5", mirrorShieldMirror.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Mirror6", mirrorShieldMirror.changedCvar, 33, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Mirror7", mirrorShieldMirror.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Mirror8", mirrorShieldMirror.changedCvar, 111, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(mirrorShieldMirror.valuesCvar, mirrorShieldMirror.defaultColor); + PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Mirror1", mirrorShieldMirror.changedCvar, 47, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Mirror2", mirrorShieldMirror.changedCvar, 48, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Mirror3", mirrorShieldMirror.changedCvar, + 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Mirror4", mirrorShieldMirror.changedCvar, 33, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Mirror5", mirrorShieldMirror.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Mirror6", mirrorShieldMirror.changedCvar, 33, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Mirror7", mirrorShieldMirror.changedCvar, + 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Mirror8", mirrorShieldMirror.changedCvar, + 111, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& mirrorShieldEmblem = cosmeticOptions.at("MirrorShield.Emblem"); if (manualChange || CVarGetInteger(mirrorShieldEmblem.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(mirrorShieldEmblem.cvar, mirrorShieldEmblem.defaultColor); - PATCH_GFX(gGiMirrorShieldSymbolDL, "MirrorShield_Emblem1", mirrorShieldEmblem.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 140)); - PATCH_GFX(gGiMirrorShieldSymbolDL, "MirrorShield_Emblem2", mirrorShieldEmblem.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Emblem3", mirrorShieldEmblem.changedCvar, 165, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Emblem4", mirrorShieldEmblem.changedCvar, 135, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Emblem5", mirrorShieldEmblem.changedCvar, 129, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Emblem6", mirrorShieldEmblem.changedCvar, 103, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Emblem7", mirrorShieldEmblem.changedCvar, 162, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Emblem8", mirrorShieldEmblem.changedCvar, 133, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(mirrorShieldEmblem.valuesCvar, mirrorShieldEmblem.defaultColor); + PATCH_GFX(gGiMirrorShieldSymbolDL, "MirrorShield_Emblem1", mirrorShieldEmblem.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 140)); + PATCH_GFX(gGiMirrorShieldSymbolDL, "MirrorShield_Emblem2", mirrorShieldEmblem.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Emblem3", mirrorShieldEmblem.changedCvar, + 165, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Emblem4", mirrorShieldEmblem.changedCvar, + 135, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Emblem5", mirrorShieldEmblem.changedCvar, 129, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Emblem6", mirrorShieldEmblem.changedCvar, 103, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Emblem7", mirrorShieldEmblem.changedCvar, + 162, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Emblem8", mirrorShieldEmblem.changedCvar, + 133, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& swordsKokiriBlade = cosmeticOptions.at("Swords.KokiriBlade"); if (manualChange || CVarGetInteger(swordsKokiriBlade.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsKokiriBlade.cvar, swordsKokiriBlade.defaultColor); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriBlade1", swordsKokiriBlade.changedCvar, 79, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriBlade2", swordsKokiriBlade.changedCvar, 75, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriBlade3", swordsKokiriBlade.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriBlade4", swordsKokiriBlade.changedCvar, 6, gsDPSetEnvColor(color.r / 4, color.g / 4, color.b / 4, 255)); + Color_RGBA8 color = CVarGetColor(swordsKokiriBlade.valuesCvar, swordsKokiriBlade.defaultColor); + PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriBlade1", swordsKokiriBlade.changedCvar, 79, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriBlade2", swordsKokiriBlade.changedCvar, 75, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriBlade3", swordsKokiriBlade.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriBlade4", swordsKokiriBlade.changedCvar, 6, + gsDPSetEnvColor(color.r / 4, color.g / 4, color.b / 4, 255)); } /* static CosmeticOption& swordsKokiriHilt = cosmeticOptions.at("Swords.KokiriHilt"); if (manualChange || CVarGetInteger(swordsKokiriHilt.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsKokiriHilt.cvar, swordsKokiriHilt.defaultColor); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt1", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriHilt2", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt3", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt4", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt5", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt6", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt7", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, "Swords_KokiriHilt8", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt9", swordsKokiriHilt.changedCvar, 64, gsDPSetPrimColor(0, 0, MAX(color.r - 50, 0), MAX(color.g - 50, 0), MAX(color.b - 50, 0), 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt10", swordsKokiriHilt.changedCvar, 66, gsDPSetEnvColor(MAX(color.r - 50, 0) / 3, MAX(color.g - 50, 0) / 3, MAX(color.b - 50, 0) / 3, 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt11", swordsKokiriHilt.changedCvar, 162, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt12", swordsKokiriHilt.changedCvar, 164, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + Color_RGBA8 color = CVarGetColor(swordsKokiriHilt.valuesCvar, swordsKokiriHilt.defaultColor); + PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt1", swordsKokiriHilt.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, + "Swords_KokiriHilt2", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt3", + swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt4", swordsKokiriHilt.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, + "Swords_KokiriHilt5", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt6", + swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt7", swordsKokiriHilt.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, + "Swords_KokiriHilt8", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt9", + swordsKokiriHilt.changedCvar, 64, gsDPSetPrimColor(0, 0, MAX(color.r - 50, 0), MAX(color.g - 50, 0), + MAX(color.b - 50, 0), 255)); PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt10", + swordsKokiriHilt.changedCvar, 66, gsDPSetEnvColor(MAX(color.r - 50, 0) / 3, MAX(color.g - 50, 0) / 3, + MAX(color.b - 50, 0) / 3, 255)); PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt11", + swordsKokiriHilt.changedCvar, 162, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt12", swordsKokiriHilt.changedCvar, + 164, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); if (manualChange) { - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt13", swordsKokiriHilt.changedCvar, 108, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt14", swordsKokiriHilt.changedCvar, 134, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriHilt15", swordsKokiriHilt.changedCvar, 106, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriHilt16", swordsKokiriHilt.changedCvar, 126, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt17", swordsKokiriHilt.changedCvar, 100, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt18", swordsKokiriHilt.changedCvar, 126, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt19", swordsKokiriHilt.changedCvar, 128, gsSPEndDisplayList()); - PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt20", swordsKokiriHilt.changedCvar, 98, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt21", swordsKokiriHilt.changedCvar, 118, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt22", swordsKokiriHilt.changedCvar, 120, gsSPEndDisplayList()); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt23", swordsKokiriHilt.changedCvar, 166, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt24", swordsKokiriHilt.changedCvar, 192, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt25", swordsKokiriHilt.changedCvar, 194, gsSPEndDisplayList()); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt26", swordsKokiriHilt.changedCvar, 156, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt27", swordsKokiriHilt.changedCvar, 176, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt28", swordsKokiriHilt.changedCvar, 178, gsSPEndDisplayList()); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt29", swordsKokiriHilt.changedCvar, 162, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt30", swordsKokiriHilt.changedCvar, 188, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt31", swordsKokiriHilt.changedCvar, 190, gsSPEndDisplayList()); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, "Swords_KokiriHilt32", swordsKokiriHilt.changedCvar, 98, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, "Swords_KokiriHilt33", swordsKokiriHilt.changedCvar, 118, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt13", swordsKokiriHilt.changedCvar, + 108, gsSPGrayscale(true)); PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt14", + swordsKokiriHilt.changedCvar, 134, gsSPGrayscale(false)); PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, + "Swords_KokiriHilt15", swordsKokiriHilt.changedCvar, 106, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriHilt16", swordsKokiriHilt.changedCvar, + 126, gsSPGrayscale(false)); PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt17", + swordsKokiriHilt.changedCvar, 100, gsSPGrayscale(true)); PATCH_GFX(gLinkChildSwordAndSheathNearDL, + "Swords_KokiriHilt18", swordsKokiriHilt.changedCvar, 126, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt19", swordsKokiriHilt.changedCvar, + 128, gsSPEndDisplayList()); PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt20", + swordsKokiriHilt.changedCvar, 98, gsSPGrayscale(true)); PATCH_GFX(gLinkChildSwordAndSheathFarDL, + "Swords_KokiriHilt21", swordsKokiriHilt.changedCvar, 118, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt22", swordsKokiriHilt.changedCvar, + 120, gsSPEndDisplayList()); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt23", + swordsKokiriHilt.changedCvar, 166, gsSPGrayscale(true)); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, + "Swords_KokiriHilt24", swordsKokiriHilt.changedCvar, 192, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt25", swordsKokiriHilt.changedCvar, + 194, gsSPEndDisplayList()); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt26", + swordsKokiriHilt.changedCvar, 156, gsSPGrayscale(true)); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, + "Swords_KokiriHilt27", swordsKokiriHilt.changedCvar, 176, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt28", swordsKokiriHilt.changedCvar, + 178, gsSPEndDisplayList()); PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt29", + swordsKokiriHilt.changedCvar, 162, gsSPGrayscale(true)); PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, + "Swords_KokiriHilt30", swordsKokiriHilt.changedCvar, 188, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt31", swordsKokiriHilt.changedCvar, + 190, gsSPEndDisplayList()); PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, "Swords_KokiriHilt32", + swordsKokiriHilt.changedCvar, 98, gsSPGrayscale(true)); PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, + "Swords_KokiriHilt33", swordsKokiriHilt.changedCvar, 118, gsSPGrayscale(false)); } } */ static CosmeticOption& swordsMasterBlade = cosmeticOptions.at("Swords.MasterBlade"); if (manualChange || CVarGetInteger(swordsMasterBlade.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsMasterBlade.cvar, swordsMasterBlade.defaultColor); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterBlade1", swordsMasterBlade.changedCvar, 60, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterBlade2", swordsMasterBlade.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterBlade3", swordsMasterBlade.changedCvar, 13, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterBlade4", swordsMasterBlade.changedCvar, 14, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterBlade5", swordsMasterBlade.changedCvar, 13, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterBlade6", swordsMasterBlade.changedCvar, 14, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + Color_RGBA8 color = CVarGetColor(swordsMasterBlade.valuesCvar, swordsMasterBlade.defaultColor); + PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterBlade1", swordsMasterBlade.changedCvar, 60, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterBlade2", swordsMasterBlade.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterBlade3", swordsMasterBlade.changedCvar, 13, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterBlade4", swordsMasterBlade.changedCvar, 14, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterBlade5", swordsMasterBlade.changedCvar, 13, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterBlade6", swordsMasterBlade.changedCvar, 14, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); } /* static CosmeticOption& swordsMasterHilt = cosmeticOptions.at("Swords.MasterHilt"); if (manualChange || CVarGetInteger(swordsMasterHilt.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsMasterHilt.cvar, swordsMasterHilt.defaultColor); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterHilt1", swordsMasterHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterHilt2", swordsMasterHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt3", swordsMasterHilt.changedCvar, 16, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt4", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt5", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt6", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt7", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, "Swords_MasterHilt8", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt9", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt10", swordsMasterHilt.changedCvar, 16, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(swordsMasterHilt.valuesCvar, swordsMasterHilt.defaultColor); + PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterHilt1", swordsMasterHilt.changedCvar, + 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, + "Swords_MasterHilt2", swordsMasterHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt3", + swordsMasterHilt.changedCvar, 16, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt4", swordsMasterHilt.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, + "Swords_MasterHilt5", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt6", + swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt7", swordsMasterHilt.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, + "Swords_MasterHilt8", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt9", + swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt10", swordsMasterHilt.changedCvar, + 16, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt11", swordsMasterHilt.changedCvar, 38, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt12", swordsMasterHilt.changedCvar, 64, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt13", swordsMasterHilt.changedCvar, 106, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt14", swordsMasterHilt.changedCvar, 120, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt15", swordsMasterHilt.changedCvar, 104, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt16", swordsMasterHilt.changedCvar, 182, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt17", swordsMasterHilt.changedCvar, 184, gsSPEndDisplayList()); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt18", swordsMasterHilt.changedCvar, 80, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt19", swordsMasterHilt.changedCvar, 94, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt20", swordsMasterHilt.changedCvar, 162, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt21", swordsMasterHilt.changedCvar, 180, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, "Swords_MasterHilt22", swordsMasterHilt.changedCvar, 154, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, "Swords_MasterHilt23", swordsMasterHilt.changedCvar, 232, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt24", swordsMasterHilt.changedCvar, 112, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt25", swordsMasterHilt.changedCvar, 130, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt26", swordsMasterHilt.changedCvar, 172, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt27", swordsMasterHilt.changedCvar, 186, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt28", swordsMasterHilt.changedCvar, 220, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt29", swordsMasterHilt.changedCvar, 298, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterHilt30", swordsMasterHilt.changedCvar, 38, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterHilt31", swordsMasterHilt.changedCvar, 112, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterHilt32", swordsMasterHilt.changedCvar, 86, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterHilt33", swordsMasterHilt.changedCvar, 208, gsSPGrayscale(false)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt34", swordsMasterHilt.changedCvar, 112, gsSPGrayscale(true)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt35", swordsMasterHilt.changedCvar, 278, gsSPGrayscale(false)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt36", swordsMasterHilt.changedCvar, 280, gsSPEndDisplayList()); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt37", swordsMasterHilt.changedCvar, 112, gsSPGrayscale(true)); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt38", swordsMasterHilt.changedCvar, 278, gsSPGrayscale(false)); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt39", swordsMasterHilt.changedCvar, 280, gsSPEndDisplayList()); + PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt11", swordsMasterHilt.changedCvar, + 38, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt12", + swordsMasterHilt.changedCvar, 64, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, + "Swords_MasterHilt13", swordsMasterHilt.changedCvar, 106, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt14", swordsMasterHilt.changedCvar, + 120, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt15", + swordsMasterHilt.changedCvar, 104, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, + "Swords_MasterHilt16", swordsMasterHilt.changedCvar, 182, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt17", swordsMasterHilt.changedCvar, + 184, gsSPEndDisplayList()); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt18", + swordsMasterHilt.changedCvar, 80, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, + "Swords_MasterHilt19", swordsMasterHilt.changedCvar, 94, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt20", swordsMasterHilt.changedCvar, + 162, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt21", + swordsMasterHilt.changedCvar, 180, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, "Swords_MasterHilt22", swordsMasterHilt.changedCvar, + 154, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, "Swords_MasterHilt23", + swordsMasterHilt.changedCvar, 232, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, + "Swords_MasterHilt24", swordsMasterHilt.changedCvar, 112, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt25", swordsMasterHilt.changedCvar, + 130, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt26", + swordsMasterHilt.changedCvar, 172, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, + "Swords_MasterHilt27", swordsMasterHilt.changedCvar, 186, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt28", swordsMasterHilt.changedCvar, + 220, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt29", + swordsMasterHilt.changedCvar, 298, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, + "Swords_MasterHilt30", swordsMasterHilt.changedCvar, 38, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterHilt31", swordsMasterHilt.changedCvar, + 112, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterHilt32", + swordsMasterHilt.changedCvar, 86, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, + "Swords_MasterHilt33", swordsMasterHilt.changedCvar, 208, gsSPGrayscale(false)); + PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt34", swordsMasterHilt.changedCvar, + 112, gsSPGrayscale(true)); PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt35", + swordsMasterHilt.changedCvar, 278, gsSPGrayscale(false)); PATCH_GFX(object_toki_objects_DL_001BD0, + "Swords_MasterHilt36", swordsMasterHilt.changedCvar, 280, gsSPEndDisplayList()); + PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt37", swordsMasterHilt.changedCvar, + 112, gsSPGrayscale(true)); PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt38", + swordsMasterHilt.changedCvar, 278, gsSPGrayscale(false)); PATCH_GFX(gGanonMasterSwordDL, + "Swords_MasterHilt39", swordsMasterHilt.changedCvar, 280, gsSPEndDisplayList()); } } */ static CosmeticOption& swordsBiggoronBlade = cosmeticOptions.at("Swords.BiggoronBlade"); if (manualChange || CVarGetInteger(swordsBiggoronBlade.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsBiggoronBlade.cvar, swordsBiggoronBlade.defaultColor); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronBlade1", swordsBiggoronBlade.changedCvar, 108, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronBlade2", swordsBiggoronBlade.changedCvar, 63, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronBlade3", swordsBiggoronBlade.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronBlade4", swordsBiggoronBlade.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + Color_RGBA8 color = CVarGetColor(swordsBiggoronBlade.valuesCvar, swordsBiggoronBlade.defaultColor); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronBlade1", swordsBiggoronBlade.changedCvar, 108, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronBlade2", swordsBiggoronBlade.changedCvar, 63, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronBlade3", swordsBiggoronBlade.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronBlade4", swordsBiggoronBlade.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); } /* static CosmeticOption& swordsBiggoronHilt = cosmeticOptions.at("Swords.BiggoronHilt"); if (manualChange || CVarGetInteger(swordsBiggoronHilt.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsBiggoronHilt.cvar, swordsBiggoronHilt.defaultColor); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt1", swordsBiggoronHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt2", swordsBiggoronHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt3", swordsBiggoronHilt.changedCvar, 74, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt4", swordsBiggoronHilt.changedCvar, 76, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt5", swordsBiggoronHilt.changedCvar, 154, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt6", swordsBiggoronHilt.changedCvar, 156, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + Color_RGBA8 color = CVarGetColor(swordsBiggoronHilt.valuesCvar, swordsBiggoronHilt.defaultColor); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt1", + swordsBiggoronHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt2", + swordsBiggoronHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt3", + swordsBiggoronHilt.changedCvar, 74, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt4", + swordsBiggoronHilt.changedCvar, 76, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt5", + swordsBiggoronHilt.changedCvar, 154, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt6", + swordsBiggoronHilt.changedCvar, 156, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); if (manualChange) { - PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt7", swordsBiggoronHilt.changedCvar, 278, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt8", swordsBiggoronHilt.changedCvar, 332, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt9", swordsBiggoronHilt.changedCvar, 334, gsSPEndDisplayList()); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt10", swordsBiggoronHilt.changedCvar, 38, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt11", swordsBiggoronHilt.changedCvar, 118, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt7", + swordsBiggoronHilt.changedCvar, 278, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, + "Swords_BiggoronHilt8", swordsBiggoronHilt.changedCvar, 332, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt9", + swordsBiggoronHilt.changedCvar, 334, gsSPEndDisplayList()); PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, + "Swords_BiggoronHilt10", swordsBiggoronHilt.changedCvar, 38, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt11", + swordsBiggoronHilt.changedCvar, 118, gsSPGrayscale(false)); } } */ static CosmeticOption& glovesGoronBracelet = cosmeticOptions.at("Gloves.GoronBracelet"); if (manualChange || CVarGetInteger(glovesGoronBracelet.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(glovesGoronBracelet.cvar, glovesGoronBracelet.defaultColor); - PATCH_GFX(gGiGoronBraceletDL, "Gloves_GoronBracelet1", glovesGoronBracelet.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGoronBraceletDL, "Gloves_GoronBracelet2", glovesGoronBracelet.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet3", glovesGoronBracelet.changedCvar, 3, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(glovesGoronBracelet.valuesCvar, glovesGoronBracelet.defaultColor); + PATCH_GFX(gGiGoronBraceletDL, "Gloves_GoronBracelet1", glovesGoronBracelet.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGoronBraceletDL, "Gloves_GoronBracelet2", glovesGoronBracelet.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet3", glovesGoronBracelet.changedCvar, 3, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet4", glovesGoronBracelet.changedCvar, 11, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet5", glovesGoronBracelet.changedCvar, 39, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet4", glovesGoronBracelet.changedCvar, 11, + gsSPGrayscale(true)); + PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet5", glovesGoronBracelet.changedCvar, 39, + gsSPGrayscale(false)); } } static CosmeticOption& glovesSilverGauntlets = cosmeticOptions.at("Gloves.SilverGauntlets"); if (manualChange || CVarGetInteger(glovesSilverGauntlets.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(glovesSilverGauntlets.cvar, glovesSilverGauntlets.defaultColor); - PATCH_GFX(gGiSilverGauntletsColorDL, "Gloves_SilverGauntlets1", glovesSilverGauntlets.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiSilverGauntletsColorDL, "Gloves_SilverGauntlets2", glovesSilverGauntlets.changedCvar, 4, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + Color_RGBA8 color = CVarGetColor(glovesSilverGauntlets.valuesCvar, glovesSilverGauntlets.defaultColor); + PATCH_GFX(gGiSilverGauntletsColorDL, "Gloves_SilverGauntlets1", glovesSilverGauntlets.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSilverGauntletsColorDL, "Gloves_SilverGauntlets2", glovesSilverGauntlets.changedCvar, 4, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); } static CosmeticOption& glovesGoldenGauntlets = cosmeticOptions.at("Gloves.GoldenGauntlets"); if (manualChange || CVarGetInteger(glovesGoldenGauntlets.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(glovesGoldenGauntlets.cvar, glovesGoldenGauntlets.defaultColor); - PATCH_GFX(gGiGoldenGauntletsColorDL, "Gloves_GoldenGauntlets1", glovesGoldenGauntlets.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGoldenGauntletsColorDL, "Gloves_GoldenGauntlets2", glovesGoldenGauntlets.changedCvar, 4, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + Color_RGBA8 color = CVarGetColor(glovesGoldenGauntlets.valuesCvar, glovesGoldenGauntlets.defaultColor); + PATCH_GFX(gGiGoldenGauntletsColorDL, "Gloves_GoldenGauntlets1", glovesGoldenGauntlets.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGoldenGauntletsColorDL, "Gloves_GoldenGauntlets2", glovesGoldenGauntlets.changedCvar, 4, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); } static CosmeticOption& glovesGauntletsGem = cosmeticOptions.at("Gloves.GauntletsGem"); if (manualChange || CVarGetInteger(glovesGauntletsGem.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(glovesGauntletsGem.cvar, glovesGauntletsGem.defaultColor); - PATCH_GFX(gGiGauntletsDL, "Gloves_GauntletsGem1", glovesGauntletsGem.changedCvar, 84, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGauntletsDL, "Gloves_GauntletsGem2", glovesGauntletsGem.changedCvar, 85, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultLeftGauntletPlate2DL, "Gloves_GauntletsGem3", glovesGauntletsGem.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightGauntletPlate2DL, "Gloves_GauntletsGem4", glovesGauntletsGem.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftGauntletPlate3DL, "Gloves_GauntletsGem5", glovesGauntletsGem.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightGauntletPlate3DL, "Gloves_GauntletsGem6", glovesGauntletsGem.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(glovesGauntletsGem.valuesCvar, glovesGauntletsGem.defaultColor); + PATCH_GFX(gGiGauntletsDL, "Gloves_GauntletsGem1", glovesGauntletsGem.changedCvar, 84, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGauntletsDL, "Gloves_GauntletsGem2", glovesGauntletsGem.changedCvar, 85, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultLeftGauntletPlate2DL, "Gloves_GauntletsGem3", glovesGauntletsGem.changedCvar, 42, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightGauntletPlate2DL, "Gloves_GauntletsGem4", glovesGauntletsGem.changedCvar, 42, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftGauntletPlate3DL, "Gloves_GauntletsGem5", glovesGauntletsGem.changedCvar, 42, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightGauntletPlate3DL, "Gloves_GauntletsGem6", glovesGauntletsGem.changedCvar, 42, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBoomerangBody = cosmeticOptions.at("Equipment.BoomerangBody"); if (manualChange || CVarGetInteger(equipmentBoomerangBody.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBoomerangBody.cvar, equipmentBoomerangBody.defaultColor); - PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangBody1", equipmentBoomerangBody.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangBody2", equipmentBoomerangBody.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkChildLeftFistAndBoomerangNearDL, "Equipment_BoomerangBody3", equipmentBoomerangBody.changedCvar, 34, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildLeftFistAndBoomerangFarDL, "Equipment_BoomerangBody4", equipmentBoomerangBody.changedCvar, 9, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gBoomerangDL, "Equipment_BoomerangBody5", equipmentBoomerangBody.changedCvar, 39, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentBoomerangBody.valuesCvar, equipmentBoomerangBody.defaultColor); + PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangBody1", equipmentBoomerangBody.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangBody2", equipmentBoomerangBody.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkChildLeftFistAndBoomerangNearDL, "Equipment_BoomerangBody3", equipmentBoomerangBody.changedCvar, + 34, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildLeftFistAndBoomerangFarDL, "Equipment_BoomerangBody4", equipmentBoomerangBody.changedCvar, + 9, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gBoomerangDL, "Equipment_BoomerangBody5", equipmentBoomerangBody.changedCvar, 39, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBoomerangGem = cosmeticOptions.at("Equipment.BoomerangGem"); if (manualChange || CVarGetInteger(equipmentBoomerangGem.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBoomerangGem.cvar, equipmentBoomerangGem.defaultColor); - PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangGem1", equipmentBoomerangGem.changedCvar, 84, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangGem2", equipmentBoomerangGem.changedCvar, 85, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkChildLeftFistAndBoomerangNearDL, "Equipment_BoomerangGem3", equipmentBoomerangGem.changedCvar, 16, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gBoomerangDL, "Equipment_BoomerangGem4", equipmentBoomerangGem.changedCvar, 23, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentBoomerangGem.valuesCvar, equipmentBoomerangGem.defaultColor); + PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangGem1", equipmentBoomerangGem.changedCvar, 84, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangGem2", equipmentBoomerangGem.changedCvar, 85, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkChildLeftFistAndBoomerangNearDL, "Equipment_BoomerangGem3", equipmentBoomerangGem.changedCvar, + 16, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gBoomerangDL, "Equipment_BoomerangGem4", equipmentBoomerangGem.changedCvar, 23, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); // There appears to be no gem rendered on the far LOD variant, not sure if this is an SOH bug or what. - // PATCH_GFX(gLinkChildLeftFistAndBoomerangFarDL, "Equipment_BoomerangGem5", equipmentBoomerangGem.changedCvar, 32, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + // PATCH_GFX(gLinkChildLeftFistAndBoomerangFarDL, "Equipment_BoomerangGem5", equipmentBoomerangGem.changedCvar, + // 32, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } /* static CosmeticOption& equipmentSlingshotBody = cosmeticOptions.at("Equipment.SlingshotBody"); if (manualChange || CVarGetInteger(equipmentSlingshotBody.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentSlingshotBody.cvar, equipmentSlingshotBody.defaultColor); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody1", equipmentSlingshotBody.changedCvar, 10, gsDPSetPrimColor(0, 0, MAX(color.r - 100, 0), MAX(color.g - 100, 0), MAX(color.b - 100, 0), 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody2", equipmentSlingshotBody.changedCvar, 12, gsDPSetEnvColor(MAX(color.r - 100, 0) / 3, MAX(color.g - 100, 0) / 3, MAX(color.b - 100, 0) / 3, 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody3", equipmentSlingshotBody.changedCvar, 74, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody4", equipmentSlingshotBody.changedCvar, 76, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody5", equipmentSlingshotBody.changedCvar, 128, gsDPSetPrimColor(0, 0, MAX(color.r - 100, 0), MAX(color.g - 100, 0), MAX(color.b - 100, 0), 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody6", equipmentSlingshotBody.changedCvar, 130, gsDPSetEnvColor(MAX(color.r - 100, 0) / 3, MAX(color.g - 100, 0) / 3, MAX(color.b - 100, 0) / 3, 255)); - PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, "Equipment_SlingshotBody7", equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, "Equipment_SlingshotBody8", equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, "Equipment_SlingshotBody9", equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentSlingshotBody.valuesCvar, equipmentSlingshotBody.defaultColor); + PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody1", + equipmentSlingshotBody.changedCvar, 10, gsDPSetPrimColor(0, 0, MAX(color.r - 100, 0), MAX(color.g - 100, 0), + MAX(color.b - 100, 0), 255)); PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody2", + equipmentSlingshotBody.changedCvar, 12, gsDPSetEnvColor(MAX(color.r - 100, 0) / 3, MAX(color.g - 100, 0) / 3, + MAX(color.b - 100, 0) / 3, 255)); PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody3", + equipmentSlingshotBody.changedCvar, 74, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody4", + equipmentSlingshotBody.changedCvar, 76, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody5", + equipmentSlingshotBody.changedCvar, 128, gsDPSetPrimColor(0, 0, MAX(color.r - 100, 0), MAX(color.g - 100, 0), + MAX(color.b - 100, 0), 255)); PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody6", + equipmentSlingshotBody.changedCvar, 130, gsDPSetEnvColor(MAX(color.r - 100, 0) / 3, MAX(color.g - 100, 0) / 3, + MAX(color.b - 100, 0) / 3, 255)); PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, "Equipment_SlingshotBody7", + equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, "Equipment_SlingshotBody8", + equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, "Equipment_SlingshotBody9", + equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, "Equipment_SlingshotBody10",equipmentSlingshotBody.changedCvar, 20, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, "Equipment_SlingshotBody11",equipmentSlingshotBody.changedCvar, 74, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, "Equipment_SlingshotBody12",equipmentSlingshotBody.changedCvar, 20, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, "Equipment_SlingshotBody13",equipmentSlingshotBody.changedCvar, 66, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, "Equipment_SlingshotBody14",equipmentSlingshotBody.changedCvar, 96, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, "Equipment_SlingshotBody15",equipmentSlingshotBody.changedCvar, 136, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, "Equipment_SlingshotBody16",equipmentSlingshotBody.changedCvar, 138, gsSPEndDisplayList()); + PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, + "Equipment_SlingshotBody10",equipmentSlingshotBody.changedCvar, 20, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, + "Equipment_SlingshotBody11",equipmentSlingshotBody.changedCvar, 74, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, + "Equipment_SlingshotBody12",equipmentSlingshotBody.changedCvar, 20, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, + "Equipment_SlingshotBody13",equipmentSlingshotBody.changedCvar, 66, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, + "Equipment_SlingshotBody14",equipmentSlingshotBody.changedCvar, 96, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, + "Equipment_SlingshotBody15",equipmentSlingshotBody.changedCvar, 136, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, + "Equipment_SlingshotBody16",equipmentSlingshotBody.changedCvar, 138, gsSPEndDisplayList()); } } */ static CosmeticOption& equipmentSlingshotString = cosmeticOptions.at("Equipment.SlingshotString"); if (manualChange || CVarGetInteger(equipmentSlingshotString.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentSlingshotString.cvar, equipmentSlingshotString.defaultColor); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotString1",equipmentSlingshotString.changedCvar, 75, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotString2",equipmentSlingshotString.changedCvar, 76, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gLinkChildSlingshotStringDL, "Equipment_SlingshotString3",equipmentSlingshotString.changedCvar, 9, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentSlingshotString.valuesCvar, equipmentSlingshotString.defaultColor); + PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotString1", equipmentSlingshotString.changedCvar, 75, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotString2", equipmentSlingshotString.changedCvar, 76, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gLinkChildSlingshotStringDL, "Equipment_SlingshotString3", equipmentSlingshotString.changedCvar, 9, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBowTips = cosmeticOptions.at("Equipment.BowTips"); if (manualChange || CVarGetInteger(equipmentBowTips.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBowTips.cvar, equipmentBowTips.defaultColor); - PATCH_GFX(gGiBowDL, "Equipment_BowTips1", equipmentBowTips.changedCvar, 86, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBowDL, "Equipment_BowTips2", equipmentBowTips.changedCvar, 87, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowTips3", equipmentBowTips.changedCvar, 34, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowTips4", equipmentBowTips.changedCvar, 26, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowTips5", equipmentBowTips.changedCvar, 25, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentBowTips.valuesCvar, equipmentBowTips.defaultColor); + PATCH_GFX(gGiBowDL, "Equipment_BowTips1", equipmentBowTips.changedCvar, 86, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowTips2", equipmentBowTips.changedCvar, 87, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowTips3", equipmentBowTips.changedCvar, 34, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowTips4", equipmentBowTips.changedCvar, 26, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowTips5", equipmentBowTips.changedCvar, 25, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBowString = cosmeticOptions.at("Equipment.BowString"); if (manualChange || CVarGetInteger(equipmentBowString.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBowString.cvar, equipmentBowString.defaultColor); - PATCH_GFX(gGiBowDL, "Equipment_BowString1", equipmentBowString.changedCvar, 105, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBowDL, "Equipment_BowString2", equipmentBowString.changedCvar, 106, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultBowStringDL, "Equipment_BowString3", equipmentBowString.changedCvar, 9, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentBowString.valuesCvar, equipmentBowString.defaultColor); + PATCH_GFX(gGiBowDL, "Equipment_BowString1", equipmentBowString.changedCvar, 105, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowString2", equipmentBowString.changedCvar, 106, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultBowStringDL, "Equipment_BowString3", equipmentBowString.changedCvar, 9, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBowBody = cosmeticOptions.at("Equipment.BowBody"); if (manualChange || CVarGetInteger(equipmentBowBody.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBowBody.cvar, equipmentBowBody.defaultColor); - PATCH_GFX(gGiBowDL, "Equipment_BowBody1", equipmentBowBody.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBowDL, "Equipment_BowBody2", equipmentBowBody.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowBody3", equipmentBowBody.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowBody4", equipmentBowBody.changedCvar, 33, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowBody5", equipmentBowBody.changedCvar, 31, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentBowBody.valuesCvar, equipmentBowBody.defaultColor); + PATCH_GFX(gGiBowDL, "Equipment_BowBody1", equipmentBowBody.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowBody2", equipmentBowBody.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowBody3", equipmentBowBody.changedCvar, 42, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowBody4", equipmentBowBody.changedCvar, 33, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowBody5", equipmentBowBody.changedCvar, 31, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBowHandle = cosmeticOptions.at("Equipment.BowHandle"); if (manualChange || CVarGetInteger(equipmentBowHandle.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBowHandle.cvar, equipmentBowHandle.defaultColor); - PATCH_GFX(gGiBowDL, "Equipment_BowHandle1", equipmentBowHandle.changedCvar, 51, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBowDL, "Equipment_BowHandle2", equipmentBowHandle.changedCvar, 52, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowHandle3", equipmentBowHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowHandle4", equipmentBowHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowHandle5", equipmentBowHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentBowHandle.valuesCvar, equipmentBowHandle.defaultColor); + PATCH_GFX(gGiBowDL, "Equipment_BowHandle1", equipmentBowHandle.changedCvar, 51, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowHandle2", equipmentBowHandle.changedCvar, 52, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowHandle3", equipmentBowHandle.changedCvar, + 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowHandle4", equipmentBowHandle.changedCvar, 18, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowHandle5", equipmentBowHandle.changedCvar, 18, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentHammerHead = cosmeticOptions.at("Equipment.HammerHead"); if (manualChange || CVarGetInteger(equipmentHammerHead.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentHammerHead.cvar, equipmentHammerHead.defaultColor); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHead1", equipmentHammerHead.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHead2", equipmentHammerHead.changedCvar, 6, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHead3", equipmentHammerHead.changedCvar, 68, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHead4", equipmentHammerHead.changedCvar, 69, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingHammerNearDL, "Equipment_HammerHead5", equipmentHammerHead.changedCvar, 38, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingHammerFarDL, "Equipment_HammerHead6", equipmentHammerHead.changedCvar, 38, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentHammerHead.valuesCvar, equipmentHammerHead.defaultColor); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHead1", equipmentHammerHead.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHead2", equipmentHammerHead.changedCvar, 6, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHead3", equipmentHammerHead.changedCvar, 68, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHead4", equipmentHammerHead.changedCvar, 69, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingHammerNearDL, "Equipment_HammerHead5", equipmentHammerHead.changedCvar, 38, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingHammerFarDL, "Equipment_HammerHead6", equipmentHammerHead.changedCvar, 38, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentHammerHandle = cosmeticOptions.at("Equipment.HammerHandle"); if (manualChange || CVarGetInteger(equipmentHammerHandle.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentHammerHandle.cvar, equipmentHammerHandle.defaultColor); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHandle1", equipmentHammerHandle.changedCvar, 84, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHandle2", equipmentHammerHandle.changedCvar, 85, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingHammerNearDL, "Equipment_HammerHandle5", equipmentHammerHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingHammerFarDL, "Equipment_HammerHandle6", equipmentHammerHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentHammerHandle.valuesCvar, equipmentHammerHandle.defaultColor); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHandle1", equipmentHammerHandle.changedCvar, 84, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHandle2", equipmentHammerHandle.changedCvar, 85, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingHammerNearDL, "Equipment_HammerHandle5", equipmentHammerHandle.changedCvar, + 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingHammerFarDL, "Equipment_HammerHandle6", equipmentHammerHandle.changedCvar, + 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentHookshotChain = cosmeticOptions.at("Equipment.HookshotChain"); if (manualChange || CVarGetInteger(equipmentHookshotChain.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentHookshotChain.cvar, equipmentHookshotChain.defaultColor); - PATCH_GFX(gLinkAdultHookshotChainDL, "Equipment_HookshotChain1", equipmentHookshotChain.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentHookshotChain.valuesCvar, equipmentHookshotChain.defaultColor); + PATCH_GFX(gLinkAdultHookshotChainDL, "Equipment_HookshotChain1", equipmentHookshotChain.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentChuFace = cosmeticOptions.at("Equipment.ChuFace"); if (manualChange || CVarGetInteger(equipmentChuFace.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentChuFace.cvar, equipmentChuFace.defaultColor); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuFace1", equipmentChuFace.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuFace2", equipmentChuFace.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gBombchuDL, "Equipment_ChuFace3", equipmentChuFace.changedCvar, 2, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentChuFace.valuesCvar, equipmentChuFace.defaultColor); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuFace1", equipmentChuFace.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuFace2", equipmentChuFace.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gBombchuDL, "Equipment_ChuFace3", equipmentChuFace.changedCvar, 2, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gBombchuDL, "Equipment_ChuFace4", equipmentChuFace.changedCvar, 10, gsSPGrayscale(true)); - PATCH_GFX(gBombchuDL, "Equipment_ChuFace5", equipmentChuFace.changedCvar, 27, gsSPGrayscale(false)); + PATCH_GFX(gBombchuDL, "Equipment_ChuFace4", equipmentChuFace.changedCvar, 10, gsSPGrayscale(true)); + PATCH_GFX(gBombchuDL, "Equipment_ChuFace5", equipmentChuFace.changedCvar, 27, gsSPGrayscale(false)); } } static CosmeticOption& equipmentChuBody = cosmeticOptions.at("Equipment.ChuBody"); if (manualChange || CVarGetInteger(equipmentChuBody.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentChuBody.cvar, equipmentChuBody.defaultColor); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody1", equipmentChuBody.changedCvar, 39, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody2", equipmentChuBody.changedCvar, 40, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody3", equipmentChuBody.changedCvar, 60, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody4", equipmentChuBody.changedCvar, 61, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gBombchuDL, "Equipment_ChuBody5", equipmentChuBody.changedCvar, 46, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentChuBody.valuesCvar, equipmentChuBody.defaultColor); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody1", equipmentChuBody.changedCvar, 39, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody2", equipmentChuBody.changedCvar, 40, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody3", equipmentChuBody.changedCvar, 60, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody4", equipmentChuBody.changedCvar, 61, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gBombchuDL, "Equipment_ChuBody5", equipmentChuBody.changedCvar, 46, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBunnyHood = cosmeticOptions.at("Equipment.BunnyHood"); if (manualChange || CVarGetInteger(equipmentBunnyHood.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBunnyHood.cvar, equipmentBunnyHood.defaultColor); - PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood1", equipmentBunnyHood.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood2", equipmentBunnyHood.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood3", equipmentBunnyHood.changedCvar, 83, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood4", equipmentBunnyHood.changedCvar, 84, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkChildBunnyHoodDL, "Equipment_BunnyHood5", equipmentBunnyHood.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(equipmentBunnyHood.valuesCvar, equipmentBunnyHood.defaultColor); + PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood1", equipmentBunnyHood.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood2", equipmentBunnyHood.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood3", equipmentBunnyHood.changedCvar, 83, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood4", equipmentBunnyHood.changedCvar, 84, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkChildBunnyHoodDL, "Equipment_BunnyHood5", equipmentBunnyHood.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkChildBunnyHoodDL, "Equipment_BunnyHood6", equipmentBunnyHood.changedCvar, 13, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildBunnyHoodDL, "Equipment_BunnyHood6", equipmentBunnyHood.changedCvar, 13, + gsSPGrayscale(true)); if (CVarGetInteger(equipmentBunnyHood.changedCvar, 0)) { - ResourceMgr_PatchGfxByName(gLinkChildBunnyHoodDL, "Equipment_BunnyHood7", 125, gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); + ResourceMgr_PatchGfxByName(gLinkChildBunnyHoodDL, "Equipment_BunnyHood7", 125, + gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); } else { ResourceMgr_UnpatchGfxByName(gLinkChildBunnyHoodDL, "Equipment_BunnyHood7"); } @@ -1065,17 +1281,24 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& consumableGreenRupee = cosmeticOptions.at("Consumable.GreenRupee"); if (manualChange || CVarGetInteger(consumableGreenRupee.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableGreenRupee.cvar, consumableGreenRupee.defaultColor); - PATCH_GFX(gGiGreenRupeeInnerColorDL, "Consumable_GreenRupee1", consumableGreenRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGreenRupeeInnerColorDL, "Consumable_GreenRupee2", consumableGreenRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiGreenRupeeOuterColorDL, "Consumable_GreenRupee3", consumableGreenRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); - PATCH_GFX(gGiGreenRupeeOuterColorDL, "Consumable_GreenRupee4", consumableGreenRupee.changedCvar, 4, gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); + Color_RGBA8 color = CVarGetColor(consumableGreenRupee.valuesCvar, consumableGreenRupee.defaultColor); + PATCH_GFX(gGiGreenRupeeInnerColorDL, "Consumable_GreenRupee1", consumableGreenRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGreenRupeeInnerColorDL, "Consumable_GreenRupee2", consumableGreenRupee.changedCvar, 4, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX( + gGiGreenRupeeOuterColorDL, "Consumable_GreenRupee3", consumableGreenRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); + PATCH_GFX(gGiGreenRupeeOuterColorDL, "Consumable_GreenRupee4", consumableGreenRupee.changedCvar, 4, + gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); // Greg Bridge if (Randomizer_GetSettingValue(RSK_RAINBOW_BRIDGE) == RO_BRIDGE_GREG) { ResourceMgr_PatchGfxByName(gRainbowBridgeDL, "RainbowBridge_StartGrayscale", 2, gsSPGrayscale(true)); - ResourceMgr_PatchGfxByName(gRainbowBridgeDL, "RainbowBridge_MakeGreen", 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, color.a)); - ResourceMgr_PatchGfxByName(gRainbowBridgeDL, "RainbowBridge_EndGrayscaleAndEndDlist", 79, gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); + ResourceMgr_PatchGfxByName(gRainbowBridgeDL, "RainbowBridge_MakeGreen", 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, color.a)); + ResourceMgr_PatchGfxByName(gRainbowBridgeDL, "RainbowBridge_EndGrayscaleAndEndDlist", 79, + gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); } else { ResourceMgr_UnpatchGfxByName(gRainbowBridgeDL, "RainbowBridge_StartGrayscale"); ResourceMgr_UnpatchGfxByName(gRainbowBridgeDL, "RainbowBridge_MakeGreen"); @@ -1084,127 +1307,188 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& consumableBlueRupee = cosmeticOptions.at("Consumable.BlueRupee"); if (manualChange || CVarGetInteger(consumableBlueRupee.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableBlueRupee.cvar, consumableBlueRupee.defaultColor); - PATCH_GFX(gGiBlueRupeeInnerColorDL, "Consumable_BlueRupee1", consumableBlueRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBlueRupeeInnerColorDL, "Consumable_BlueRupee2", consumableBlueRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiBlueRupeeOuterColorDL, "Consumable_BlueRupee3", consumableBlueRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); - PATCH_GFX(gGiBlueRupeeOuterColorDL, "Consumable_BlueRupee4", consumableBlueRupee.changedCvar, 4, gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); + Color_RGBA8 color = CVarGetColor(consumableBlueRupee.valuesCvar, consumableBlueRupee.defaultColor); + PATCH_GFX(gGiBlueRupeeInnerColorDL, "Consumable_BlueRupee1", consumableBlueRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBlueRupeeInnerColorDL, "Consumable_BlueRupee2", consumableBlueRupee.changedCvar, 4, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX( + gGiBlueRupeeOuterColorDL, "Consumable_BlueRupee3", consumableBlueRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); + PATCH_GFX(gGiBlueRupeeOuterColorDL, "Consumable_BlueRupee4", consumableBlueRupee.changedCvar, 4, + gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); } static CosmeticOption& consumableRedRupee = cosmeticOptions.at("Consumable.RedRupee"); if (manualChange || CVarGetInteger(consumableRedRupee.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableRedRupee.cvar, consumableRedRupee.defaultColor); - PATCH_GFX(gGiRedRupeeInnerColorDL, "Consumable_RedRupee1", consumableRedRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiRedRupeeInnerColorDL, "Consumable_RedRupee2", consumableRedRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiRedRupeeOuterColorDL, "Consumable_RedRupee3", consumableRedRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); - PATCH_GFX(gGiRedRupeeOuterColorDL, "Consumable_RedRupee4", consumableRedRupee.changedCvar, 4, gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); + Color_RGBA8 color = CVarGetColor(consumableRedRupee.valuesCvar, consumableRedRupee.defaultColor); + PATCH_GFX(gGiRedRupeeInnerColorDL, "Consumable_RedRupee1", consumableRedRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiRedRupeeInnerColorDL, "Consumable_RedRupee2", consumableRedRupee.changedCvar, 4, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX( + gGiRedRupeeOuterColorDL, "Consumable_RedRupee3", consumableRedRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); + PATCH_GFX(gGiRedRupeeOuterColorDL, "Consumable_RedRupee4", consumableRedRupee.changedCvar, 4, + gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); } static CosmeticOption& consumablePurpleRupee = cosmeticOptions.at("Consumable.PurpleRupee"); if (manualChange || CVarGetInteger(consumablePurpleRupee.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumablePurpleRupee.cvar, consumablePurpleRupee.defaultColor); - PATCH_GFX(gGiPurpleRupeeInnerColorDL, "Consumable_PurpleRupee1", consumablePurpleRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiPurpleRupeeInnerColorDL, "Consumable_PurpleRupee2", consumablePurpleRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiPurpleRupeeOuterColorDL, "Consumable_PurpleRupee3", consumablePurpleRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); - PATCH_GFX(gGiPurpleRupeeOuterColorDL, "Consumable_PurpleRupee4", consumablePurpleRupee.changedCvar, 4, gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); + Color_RGBA8 color = CVarGetColor(consumablePurpleRupee.valuesCvar, consumablePurpleRupee.defaultColor); + PATCH_GFX(gGiPurpleRupeeInnerColorDL, "Consumable_PurpleRupee1", consumablePurpleRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiPurpleRupeeInnerColorDL, "Consumable_PurpleRupee2", consumablePurpleRupee.changedCvar, 4, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX( + gGiPurpleRupeeOuterColorDL, "Consumable_PurpleRupee3", consumablePurpleRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); + PATCH_GFX(gGiPurpleRupeeOuterColorDL, "Consumable_PurpleRupee4", consumablePurpleRupee.changedCvar, 4, + gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); } static CosmeticOption& consumableGoldRupee = cosmeticOptions.at("Consumable.GoldRupee"); if (manualChange || CVarGetInteger(consumableGoldRupee.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableGoldRupee.cvar, consumableGoldRupee.defaultColor); - PATCH_GFX(gGiGoldRupeeInnerColorDL, "Consumable_GoldRupee1", consumableGoldRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGoldRupeeInnerColorDL, "Consumable_GoldRupee2", consumableGoldRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiGoldRupeeOuterColorDL, "Consumable_GoldRupee3", consumableGoldRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); - PATCH_GFX(gGiGoldRupeeOuterColorDL, "Consumable_GoldRupee4", consumableGoldRupee.changedCvar, 4, gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); + Color_RGBA8 color = CVarGetColor(consumableGoldRupee.valuesCvar, consumableGoldRupee.defaultColor); + PATCH_GFX(gGiGoldRupeeInnerColorDL, "Consumable_GoldRupee1", consumableGoldRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGoldRupeeInnerColorDL, "Consumable_GoldRupee2", consumableGoldRupee.changedCvar, 4, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX( + gGiGoldRupeeOuterColorDL, "Consumable_GoldRupee3", consumableGoldRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); + PATCH_GFX(gGiGoldRupeeOuterColorDL, "Consumable_GoldRupee4", consumableGoldRupee.changedCvar, 4, + gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); } static CosmeticOption& consumableHearts = cosmeticOptions.at("Consumable.Hearts"); if (manualChange || CVarGetInteger(consumableHearts.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableHearts.cvar, consumableHearts.defaultColor); + Color_RGBA8 color = CVarGetColor(consumableHearts.valuesCvar, consumableHearts.defaultColor); /* - PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts1", consumableHearts.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts2", consumableHearts.changedCvar, 26, gsSPGrayscale(true)); - PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts3", consumableHearts.changedCvar, 72, gsSPGrayscale(false)); - PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts4", consumableHearts.changedCvar, 74, gsSPEndDisplayList()); + PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts1", consumableHearts.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts2", + consumableHearts.changedCvar, 26, gsSPGrayscale(true)); PATCH_GFX(gGiRecoveryHeartDL, + "Consumable_Hearts3", consumableHearts.changedCvar, 72, gsSPGrayscale(false)); + PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts4", consumableHearts.changedCvar, + 74, gsSPEndDisplayList()); */ - PATCH_GFX(gGiHeartPieceDL, "Consumable_Hearts5", consumableHearts.changedCvar, 2, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiHeartPieceDL, "Consumable_Hearts6", consumableHearts.changedCvar, 6, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiHeartContainerDL, "Consumable_Hearts7", consumableHearts.changedCvar, 2, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiHeartContainerDL, "Consumable_Hearts8", consumableHearts.changedCvar, 6, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiRedPotColorDL, "Consumable_Hearts9", consumableHearts.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiRedPotColorDL, "Consumable_Hearts10", consumableHearts.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiHeartPieceDL, "Consumable_Hearts5", consumableHearts.changedCvar, 2, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHeartPieceDL, "Consumable_Hearts6", consumableHearts.changedCvar, 6, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiHeartContainerDL, "Consumable_Hearts7", consumableHearts.changedCvar, 2, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHeartContainerDL, "Consumable_Hearts8", consumableHearts.changedCvar, 6, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiRedPotColorDL, "Consumable_Hearts9", consumableHearts.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiRedPotColorDL, "Consumable_Hearts10", consumableHearts.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); } static CosmeticOption& consumableMagic = cosmeticOptions.at("Consumable.Magic"); if (manualChange || CVarGetInteger(consumableMagic.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableMagic.cvar, consumableMagic.defaultColor); - PATCH_GFX(gGiMagicJarSmallDL, "Consumable_Magic1", consumableMagic.changedCvar, 31, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiMagicJarSmallDL, "Consumable_Magic2", consumableMagic.changedCvar, 32, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiMagicJarLargeDL, "Consumable_Magic3", consumableMagic.changedCvar, 31, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiMagicJarLargeDL, "Consumable_Magic4", consumableMagic.changedCvar, 32, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiGreenPotColorDL, "Consumable_Magic5", consumableMagic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGreenPotColorDL, "Consumable_Magic6", consumableMagic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + Color_RGBA8 color = CVarGetColor(consumableMagic.valuesCvar, consumableMagic.defaultColor); + PATCH_GFX(gGiMagicJarSmallDL, "Consumable_Magic1", consumableMagic.changedCvar, 31, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiMagicJarSmallDL, "Consumable_Magic2", consumableMagic.changedCvar, 32, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiMagicJarLargeDL, "Consumable_Magic3", consumableMagic.changedCvar, 31, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiMagicJarLargeDL, "Consumable_Magic4", consumableMagic.changedCvar, 32, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiGreenPotColorDL, "Consumable_Magic5", consumableMagic.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGreenPotColorDL, "Consumable_Magic6", consumableMagic.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); } static CosmeticOption& npcGoldenSkulltula = cosmeticOptions.at("NPC.GoldenSkulltula"); if (manualChange || CVarGetInteger(npcGoldenSkulltula.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(npcGoldenSkulltula.cvar, npcGoldenSkulltula.defaultColor); - PATCH_GFX(gSkulltulaTokenDL, "NPC_GoldenSkulltula1", npcGoldenSkulltula.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gSkulltulaTokenDL, "NPC_GoldenSkulltula2", npcGoldenSkulltula.changedCvar, 6, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gSkulltulaTokenFlameDL, "NPC_GoldenSkulltula3", npcGoldenSkulltula.changedCvar, 32, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gSkulltulaTokenFlameDL, "NPC_GoldenSkulltula4", npcGoldenSkulltula.changedCvar, 33, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiSkulltulaTokenDL, "NPC_GoldenSkulltula5", npcGoldenSkulltula.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiSkulltulaTokenDL, "NPC_GoldenSkulltula6", npcGoldenSkulltula.changedCvar, 6, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiSkulltulaTokenFlameDL, "NPC_GoldenSkulltula7", npcGoldenSkulltula.changedCvar, 32, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiSkulltulaTokenFlameDL, "NPC_GoldenSkulltula8", npcGoldenSkulltula.changedCvar, 33, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(object_st_DL_003FB0, "NPC_GoldenSkulltula9", npcGoldenSkulltula.changedCvar, 118, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(object_st_DL_003FB0, "NPC_GoldenSkulltula10", npcGoldenSkulltula.changedCvar, 119, gsDPSetEnvColor(color.r / 4, color.g / 4, color.b / 4, 255)); + Color_RGBA8 color = CVarGetColor(npcGoldenSkulltula.valuesCvar, npcGoldenSkulltula.defaultColor); + PATCH_GFX(gSkulltulaTokenDL, "NPC_GoldenSkulltula1", npcGoldenSkulltula.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gSkulltulaTokenDL, "NPC_GoldenSkulltula2", npcGoldenSkulltula.changedCvar, 6, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gSkulltulaTokenFlameDL, "NPC_GoldenSkulltula3", npcGoldenSkulltula.changedCvar, 32, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gSkulltulaTokenFlameDL, "NPC_GoldenSkulltula4", npcGoldenSkulltula.changedCvar, 33, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiSkulltulaTokenDL, "NPC_GoldenSkulltula5", npcGoldenSkulltula.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSkulltulaTokenDL, "NPC_GoldenSkulltula6", npcGoldenSkulltula.changedCvar, 6, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiSkulltulaTokenFlameDL, "NPC_GoldenSkulltula7", npcGoldenSkulltula.changedCvar, 32, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSkulltulaTokenFlameDL, "NPC_GoldenSkulltula8", npcGoldenSkulltula.changedCvar, 33, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(object_st_DL_003FB0, "NPC_GoldenSkulltula9", npcGoldenSkulltula.changedCvar, 118, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(object_st_DL_003FB0, "NPC_GoldenSkulltula10", npcGoldenSkulltula.changedCvar, 119, + gsDPSetEnvColor(color.r / 4, color.g / 4, color.b / 4, 255)); } static CosmeticOption& npcGerudo = cosmeticOptions.at("NPC.Gerudo"); if (manualChange || CVarGetInteger(npcGerudo.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(npcGerudo.cvar, npcGerudo.defaultColor); - PATCH_GFX(gGerudoPurpleTorsoDL, "NPC_Gerudo1", npcGerudo.changedCvar, 139, gsDPSetEnvColor( color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleRightThighDL, "NPC_Gerudo2", npcGerudo.changedCvar, 11, gsDPSetEnvColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleLeftThighDL, "NPC_Gerudo3", npcGerudo.changedCvar, 11, gsDPSetEnvColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleVeilDL, "NPC_Gerudo4", npcGerudo.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleLeftShinDL, "NPC_Gerudo5", npcGerudo.changedCvar, 11, gsDPSetEnvColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleRightShinDL, "NPC_Gerudo6", npcGerudo.changedCvar, 11, gsDPSetEnvColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleLeftHandDL, "NPC_Gerudo7", npcGerudo.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleRightHandDL, "NPC_Gerudo8", npcGerudo.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(npcGerudo.valuesCvar, npcGerudo.defaultColor); + PATCH_GFX(gGerudoPurpleTorsoDL, "NPC_Gerudo1", npcGerudo.changedCvar, 139, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleRightThighDL, "NPC_Gerudo2", npcGerudo.changedCvar, 11, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleLeftThighDL, "NPC_Gerudo3", npcGerudo.changedCvar, 11, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleVeilDL, "NPC_Gerudo4", npcGerudo.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleLeftShinDL, "NPC_Gerudo5", npcGerudo.changedCvar, 11, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleRightShinDL, "NPC_Gerudo6", npcGerudo.changedCvar, 11, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleLeftHandDL, "NPC_Gerudo7", npcGerudo.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleRightHandDL, "NPC_Gerudo8", npcGerudo.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& npcMetalTrap = cosmeticOptions.at("NPC.MetalTrap"); if (manualChange || CVarGetInteger(npcMetalTrap.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(npcMetalTrap.cvar, npcMetalTrap.defaultColor); - PATCH_GFX(gSlidingBladeTrapDL, "NPC_MetalTrap1", npcMetalTrap.changedCvar, 59, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + Color_RGBA8 color = CVarGetColor(npcMetalTrap.valuesCvar, npcMetalTrap.defaultColor); + PATCH_GFX(gSlidingBladeTrapDL, "NPC_MetalTrap1", npcMetalTrap.changedCvar, 59, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& n64LogoRed = cosmeticOptions.at("Title.N64LogoRed"); if (manualChange || CVarGetInteger(n64LogoRed.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(n64LogoRed.cvar, n64LogoRed.defaultColor); - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoRed1", n64LogoRed.changedCvar, 17, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoRed2", n64LogoRed.changedCvar, 18, gsDPSetEnvColor(color.r, color.g, color.b, 128)); + Color_RGBA8 color = CVarGetColor(n64LogoRed.valuesCvar, n64LogoRed.defaultColor); + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoRed1", n64LogoRed.changedCvar, 17, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoRed2", n64LogoRed.changedCvar, 18, + gsDPSetEnvColor(color.r, color.g, color.b, 128)); } static CosmeticOption& n64LogoBlue = cosmeticOptions.at("Title.N64LogoBlue"); if (manualChange || CVarGetInteger(n64LogoBlue.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(n64LogoBlue.cvar, n64LogoBlue.defaultColor); - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoBlue1", n64LogoBlue.changedCvar, 29, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoBlue2", n64LogoBlue.changedCvar, 30, gsDPSetEnvColor(color.r, color.g, color.b, 128)); + Color_RGBA8 color = CVarGetColor(n64LogoBlue.valuesCvar, n64LogoBlue.defaultColor); + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoBlue1", n64LogoBlue.changedCvar, 29, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoBlue2", n64LogoBlue.changedCvar, 30, + gsDPSetEnvColor(color.r, color.g, color.b, 128)); } static CosmeticOption& n64LogoGreen = cosmeticOptions.at("Title.N64LogoGreen"); if (manualChange || CVarGetInteger(n64LogoGreen.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(n64LogoGreen.cvar, n64LogoGreen.defaultColor); - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoGreen1", n64LogoGreen.changedCvar, 56, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoGreen2", n64LogoGreen.changedCvar, 57, gsDPSetEnvColor(color.r, color.g, color.b, 128)); + Color_RGBA8 color = CVarGetColor(n64LogoGreen.valuesCvar, n64LogoGreen.defaultColor); + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoGreen1", n64LogoGreen.changedCvar, 56, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoGreen2", n64LogoGreen.changedCvar, 57, + gsDPSetEnvColor(color.r, color.g, color.b, 128)); } static CosmeticOption& n64LogoYellow = cosmeticOptions.at("Title.N64LogoYellow"); if (manualChange || CVarGetInteger(n64LogoYellow.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(n64LogoYellow.cvar, n64LogoYellow.defaultColor); - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoYellow1", n64LogoYellow.changedCvar, 81, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoYellow2", n64LogoYellow.changedCvar, 82, gsDPSetEnvColor(color.r, color.g, color.b, 128)); + Color_RGBA8 color = CVarGetColor(n64LogoYellow.valuesCvar, n64LogoYellow.defaultColor); + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoYellow1", n64LogoYellow.changedCvar, 81, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoYellow2", n64LogoYellow.changedCvar, 82, + gsDPSetEnvColor(color.r, color.g, color.b, 128)); } if (gPlayState != nullptr) { - if (CVarGetInteger(CVAR_COSMETIC("Link.BodyScale.Changed"), 0)) { + if (CVarGetInteger(CVAR_COSMETIC("Link.BodySize.Changed"), 0)) { static Player* player = GET_PLAYER(gPlayState); - float scale = CVarGetFloat(CVAR_COSMETIC("Link.BodyScale.Value"), 0.01f); + float scale = CVarGetFloat(CVAR_COSMETIC("Link.BodySize.Value"), 0.01f); player->actor.scale.x = scale; player->actor.scale.y = scale; player->actor.scale.z = scale; @@ -1213,12 +1497,10 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } extern "C" Color_RGBA8 CosmeticsEditor_GetDefaultValue(const char* id) { - return Color_RGBA8 { - (uint8_t)(cosmeticOptions[id].defaultColor.r * 255.0f), + return Color_RGBA8{ (uint8_t)(cosmeticOptions[id].defaultColor.r * 255.0f), (uint8_t)(cosmeticOptions[id].defaultColor.g * 255.0f), (uint8_t)(cosmeticOptions[id].defaultColor.b * 255.0f), - (uint8_t)(cosmeticOptions[id].defaultColor.a * 255.0f) - }; + (uint8_t)(cosmeticOptions[id].defaultColor.a * 255.0f) }; } void Table_InitHeader(bool has_header = true) { @@ -1227,53 +1509,81 @@ void Table_InitHeader(bool has_header = true) { } ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::AlignTextToFramePadding(); //This is to adjust Vertical pos of item in a cell to be normlized. + ImGui::AlignTextToFramePadding(); // This is to adjust Vertical pos of item in a cell to be normlized. ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 2); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - 60); } -void DrawUseMarginsSlider(const std::string ElementName, const std::string CvarName){ +void DrawUseMarginsSlider(const std::string ElementName, const std::string CvarName) { std::string CvarLabel = CvarName + ".UseMargins"; std::string Label = ElementName + " use margins"; - UIWidgets::EnhancementCheckbox(Label.c_str(), CvarLabel.c_str()); - UIWidgets::Tooltip("Using this allow you move the element with General margins sliders"); + UIWidgets::CVarCheckbox(Label.c_str(), CvarLabel.c_str(), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Using this allow you move the element with General margins sliders")); } -void DrawPositionsRadioBoxes(const std::string CvarName, bool NoAnchorEnabled = true){ +void DrawPositionsRadioBoxes(const std::string CvarName, bool NoAnchorEnabled = true) { std::string CvarLabel = CvarName + ".PosType"; - UIWidgets::EnhancementRadioButton("Original position", CvarLabel.c_str(), 0); - UIWidgets::Tooltip("This will use original intended elements position"); - UIWidgets::EnhancementRadioButton("Anchor to the left", CvarLabel.c_str(), 1); - UIWidgets::Tooltip("This will make your elements follow the left side of your game window"); - UIWidgets::EnhancementRadioButton("Anchor to the right", CvarLabel.c_str(), 2); - UIWidgets::Tooltip("This will make your elements follow the right side of your game window"); + UIWidgets::CVarRadioButton("Original position", CvarLabel.c_str(), 0, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will use original intended elements position")); + UIWidgets::CVarRadioButton("Anchor to the left", CvarLabel.c_str(), 1, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the left side of your game window")); + UIWidgets::CVarRadioButton("Anchor to the right", CvarLabel.c_str(), 2, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the right side of your game window")); if (NoAnchorEnabled) { - UIWidgets::EnhancementRadioButton("No anchors", CvarLabel.c_str(), 3); - UIWidgets::Tooltip("This will make your elements to not follow any side\nBetter used for center elements"); + UIWidgets::CVarRadioButton( + "No anchors", CvarLabel.c_str(), 3, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements to not follow any side\nBetter used for center elements")); } - UIWidgets::EnhancementRadioButton("Hidden", CvarLabel.c_str(), 4); - UIWidgets::Tooltip("This will make your elements hidden"); + UIWidgets::CVarRadioButton( + "Hidden", CvarLabel.c_str(), 4, + UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("This will make your elements hidden")); } -void DrawPositionSlider(const std::string CvarName, int MinY, int MaxY, int MinX, int MaxX){ +void DrawPositionSlider(const std::string CvarName, int MinY, int MaxY, int MinX, int MaxX) { std::string PosXCvar = CvarName + ".PosX"; std::string PosYCvar = CvarName + ".PosY"; std::string InvisibleLabelX = "##" + PosXCvar; std::string InvisibleLabelY = "##" + PosYCvar; - UIWidgets::EnhancementSliderInt("Up <-> Down : %d", InvisibleLabelY.c_str(), PosYCvar.c_str(), MinY, MaxY, "", 0); - UIWidgets::Tooltip("This slider is used to move Up and Down your elements."); - UIWidgets::EnhancementSliderInt("Left <-> Right : %d", InvisibleLabelX.c_str(), PosXCvar.c_str(), MinX, MaxX, "", 0); - UIWidgets::Tooltip("This slider is used to move Left and Right your elements."); + UIWidgets::CVarSliderInt("Up <-> Down : %d", PosYCvar.c_str(), + UIWidgets::IntSliderOptions() + .Min(MinY) + .Max(MaxY) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This slider is used to move Up and Down your elements.")); + UIWidgets::CVarSliderInt("Left <-> Right : %d", PosXCvar.c_str(), + UIWidgets::IntSliderOptions() + .Min(MinX) + .Max(MaxX) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This slider is used to move Left and Right your elements.")); } -void DrawScaleSlider(const std::string CvarName, float DefaultValue){ +void DrawScaleSlider(const std::string CvarName, float DefaultValue) { std::string InvisibleLabel = "##" + CvarName; std::string CvarLabel = CvarName + ".Scale"; - //Disabled for now. feature not done and several fixes needed to be merged. - //UIWidgets::EnhancementSliderFloat("Scale : %dx", InvisibleLabel.c_str(), CvarLabel.c_str(), 0.1f, 3.0f,"",DefaultValue,true); + // Disabled for now. feature not done and several fixes needed to be merged. + // UIWidgets::EnhancementSliderFloat("Scale : %dx", InvisibleLabel.c_str(), CvarLabel.c_str(), + // 0.1f, 3.0f,"",DefaultValue,true); } -void Draw_Table_Dropdown(const char* Header_Title, const char* Table_ID, const char* Column_Title, const char* Slider_Title, const char* Slider_ID, int MinY, int MaxY, int MinX, int MaxX, float Default_Value) { +void Draw_Table_Dropdown(const char* Header_Title, const char* Table_ID, const char* Column_Title, + const char* Slider_Title, const char* Slider_ID, int MinY, int MaxY, int MinX, int MaxX, + float Default_Value) { + UIWidgets::PushStyleHeader(THEME_COLOR); if (ImGui::CollapsingHeader(Header_Title)) { if (ImGui::BeginTable(Table_ID, 1, FlagsTable)) { ImGui::TableSetupColumn(Column_Title, FlagsCell, TablesCellsWidth); @@ -1282,13 +1592,16 @@ void Draw_Table_Dropdown(const char* Header_Title, const char* Table_ID, const c DrawPositionsRadioBoxes(Slider_ID); DrawPositionSlider(Slider_ID, MinY, MaxY, MinX, MaxX); DrawScaleSlider(Slider_ID, Default_Value); - ImGui::NewLine(); ImGui::EndTable(); } } + UIWidgets::PopStyleHeader(); } -void C_Button_Dropdown(const char* Header_Title, const char* Table_ID, const char* Column_Title, const char* Slider_Title, const char* Slider_ID, const char* Int_Type, float Slider_Scale_Value) { +void C_Button_Dropdown(const char* Header_Title, const char* Table_ID, const char* Column_Title, + const char* Slider_Title, const char* Slider_ID, const char* Int_Type, + float Slider_Scale_Value) { + UIWidgets::PushStyleHeader(THEME_COLOR); if (ImGui::CollapsingHeader(Header_Title)) { if (ImGui::BeginTable(Table_ID, 1, FlagsTable)) { ImGui::TableSetupColumn(Column_Title, FlagsCell, TablesCellsWidth); @@ -1297,19 +1610,20 @@ void C_Button_Dropdown(const char* Header_Title, const char* Table_ID, const cha DrawPositionsRadioBoxes(Slider_ID); s16 Min_X_CU = 0; s16 Max_X_CU = static_cast(ImGui::GetWindowViewport()->Size.x / 2); - if(CVarGetInteger(Int_Type, 0) == 2){ + if (CVarGetInteger(Int_Type, 0) == 2) { Max_X_CU = 294; - } else if(CVarGetInteger(Int_Type, 0) == 3){ + } else if (CVarGetInteger(Int_Type, 0) == 3) { Max_X_CU = static_cast(ImGui::GetWindowViewport()->Size.x / 2); - } else if(CVarGetInteger(Int_Type, 0) == 4){ + } else if (CVarGetInteger(Int_Type, 0) == 4) { Min_X_CU = static_cast(ImGui::GetWindowViewport()->Size.x / 2) * -1; } - DrawPositionSlider(Slider_ID, 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_CU, Max_X_CU); + DrawPositionSlider(Slider_ID, 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_CU, + Max_X_CU); DrawScaleSlider(Slider_ID, Slider_Scale_Value); - ImGui::NewLine(); ImGui::EndTable(); } - std::shared_ptr controller = Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(0); + std::shared_ptr controller = + Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(0); for (auto [id, mapping] : controller->GetButton(BTN_DDOWN)->GetAllButtonMappings()) { controller->GetButton(BTN_CUSTOM_OCARINA_NOTE_F4)->AddButtonMapping(mapping); } @@ -1323,38 +1637,67 @@ void C_Button_Dropdown(const char* Header_Title, const char* Table_ID, const cha controller->GetButton(BTN_CUSTOM_OCARINA_NOTE_D5)->AddButtonMapping(mapping); } } + UIWidgets::PopStyleHeader(); } -void Draw_Placements(){ - if (ImGui::BeginTable("tableMargins", 1, FlagsTable)) { - ImGui::TableSetupColumn("General margins settings", FlagsCell, TablesCellsWidth); - Table_InitHeader(); - UIWidgets::EnhancementSliderInt("Top : %dx", "##UIMARGINT", CVAR_COSMETIC("HUD.Margin.T"), static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1, 25, "", 0); - UIWidgets::EnhancementSliderInt("Left: %dx", "##UIMARGINL", CVAR_COSMETIC("HUD.Margin.L"), -25, static_cast(ImGui::GetWindowViewport()->Size.x), "", 0); - UIWidgets::EnhancementSliderInt("Right: %dx", "##UIMARGINR", CVAR_COSMETIC("HUD.Margin.R"), static_cast(ImGui::GetWindowViewport()->Size.x) * -1, 25, "", 0); - UIWidgets::EnhancementSliderInt("Bottom: %dx", "##UIMARGINB", CVAR_COSMETIC("HUD.Margin.B"), static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1, 25, "", 0); - SetMarginAll("All margins on",true); - UIWidgets::Tooltip("Set most of the elements to use margins\nSome elements with default position will not be affected\nElements without Anchor or Hidden will not be turned on"); - ImGui::SameLine(); - SetMarginAll("All margins off",false); - UIWidgets::Tooltip("Set all of the elements to not use margins"); - ImGui::SameLine(); - ResetPositionAll(); - UIWidgets::Tooltip("Revert every element to use their original position and no margins"); - ImGui::NewLine(); - ImGui::EndTable(); - } +void Draw_Placements() { + UIWidgets::PushStyleHeader(THEME_COLOR); + ImGui::SeparatorText("General Margins Settings"); + UIWidgets::CVarSliderInt("Top: %dpx", CVAR_COSMETIC("HUD.Margin.T"), + UIWidgets::IntSliderOptions() + .Min(static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1) + .Max(25) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + UIWidgets::CVarSliderInt("Left: %dpx", CVAR_COSMETIC("HUD.Margin.L"), + UIWidgets::IntSliderOptions() + .Min(-25) + .Max(static_cast(ImGui::GetWindowViewport()->Size.x)) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + UIWidgets::CVarSliderInt("Right: %dpx", CVAR_COSMETIC("HUD.Margin.R"), + UIWidgets::IntSliderOptions() + .Min(static_cast(ImGui::GetWindowViewport()->Size.x) * -1) + .Max(25) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + UIWidgets::CVarSliderInt("Bottom: %dpx", CVAR_COSMETIC("HUD.Margin.B"), + UIWidgets::IntSliderOptions() + .Min(static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1) + .Max(25) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + SetMarginAll("All margins on", true, + "Set most of the elements to use margins\nSome elements with default position will not be " + "affected\nElements without Anchor or Hidden will not be turned on"); + ImGui::SameLine(); + SetMarginAll("All margins off", false, "Set all of the elements to not use margins"); + ImGui::SameLine(); + ResetPositionAll(); + UIWidgets::Separator(true, true, 2.0f, 2.0f); if (ImGui::CollapsingHeader("Hearts count position")) { if (ImGui::BeginTable("tableHeartsCounts", 1, FlagsTable)) { ImGui::TableSetupColumn("Hearts counts settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); DrawUseMarginsSlider("Hearts counts", CVAR_COSMETIC("HUD.Hearts")); DrawPositionsRadioBoxes(CVAR_COSMETIC("HUD.HeartsCount")); - DrawPositionSlider(CVAR_COSMETIC("HUD.HeartsCount"), -22, static_cast(ImGui::GetWindowViewport()->Size.y), -125, static_cast(ImGui::GetWindowViewport()->Size.x)); + DrawPositionSlider(CVAR_COSMETIC("HUD.HeartsCount"), -22, + static_cast(ImGui::GetWindowViewport()->Size.y), -125, + static_cast(ImGui::GetWindowViewport()->Size.x)); DrawScaleSlider(CVAR_COSMETIC("HUD.HeartsCount"), 0.7f); - UIWidgets::EnhancementSliderInt("Heart line length : %d", "##HeartLineLength", CVAR_COSMETIC("HUD.Hearts.LineLength"), 0, 20, "", 10); - UIWidgets::Tooltip("This will set the length of a row of hearts. Set to 0 for unlimited length."); - ImGui::NewLine(); + UIWidgets::CVarSliderInt( + "Heart line length : %d", CVAR_COSMETIC("HUD.Hearts.LineLength"), + UIWidgets::IntSliderOptions() + .Min(0) + .Max(20) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This will set the length of a row of hearts. Set to 0 for unlimited length.")); ImGui::EndTable(); } } @@ -1364,15 +1707,20 @@ void Draw_Placements(){ Table_InitHeader(false); DrawUseMarginsSlider("Magic meter", CVAR_COSMETIC("HUD.MagicBar")); DrawPositionsRadioBoxes(CVAR_COSMETIC("HUD.MagicBar")); - UIWidgets::EnhancementRadioButton("Anchor to life bar", CVAR_COSMETIC("HUD.MagicBar.PosType"), 5); - UIWidgets::Tooltip("This will make your elements follow the bottom of the life meter"); - DrawPositionSlider(CVAR_COSMETIC("HUD.MagicBar"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -5, static_cast(ImGui::GetWindowViewport()->Size.x / 2)); + UIWidgets::CVarRadioButton( + "Anchor to life bar", CVAR_COSMETIC("HUD.MagicBar.PosType"), 5, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the bottom of the life meter")); + DrawPositionSlider(CVAR_COSMETIC("HUD.MagicBar"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), -5, + static_cast(ImGui::GetWindowViewport()->Size.x / 2)); DrawScaleSlider(CVAR_COSMETIC("HUD.MagicBar"), 1.0f); - ImGui::NewLine(); ImGui::EndTable(); } } - if (CVarGetInteger(CVAR_ENHANCEMENT("VisualAgony"), 0) && ImGui::CollapsingHeader("Visual stone of agony position")) { + if (CVarGetInteger(CVAR_ENHANCEMENT("VisualAgony"), 0) && + ImGui::CollapsingHeader("Visual stone of agony position")) { if (ImGui::BeginTable("tabledvisualstoneofagony", 1, FlagsTable)) { ImGui::TableSetupColumn("Visual stone of agony settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); @@ -1380,24 +1728,34 @@ void Draw_Placements(){ DrawPositionsRadioBoxes(CVAR_COSMETIC("HUD.VisualSoA")); s16 Min_X_VSOA = 0; s16 Max_X_VSOA = static_cast(ImGui::GetWindowViewport()->Size.x / 2); - if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == ANCHOR_RIGHT){ + if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == ANCHOR_RIGHT) { Max_X_VSOA = 290; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == HIDDEN){ + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == HIDDEN) { Min_X_VSOA = static_cast(ImGui::GetWindowViewport()->Size.x / 2) * -1; } - DrawPositionSlider(CVAR_COSMETIC("HUD.VisualSoA"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_VSOA, Max_X_VSOA); + DrawPositionSlider(CVAR_COSMETIC("HUD.VisualSoA"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_VSOA, Max_X_VSOA); DrawScaleSlider(CVAR_COSMETIC("HUD.VisualSoA"), 1.0f); - ImGui::NewLine(); ImGui::EndTable(); } } - Draw_Table_Dropdown("B Button position", "tablebbtn", "B Button settings", "B Button", CVAR_COSMETIC("HUD.BButton"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 4) + 50, -1, static_cast(ImGui::GetWindowViewport()->Size.x) - 50, 0.95f); - Draw_Table_Dropdown("A Button position", "tableabtn", "A Button settings", "A Button", CVAR_COSMETIC("HUD.AButton"), -10, static_cast(ImGui::GetWindowViewport()->Size.y / 4) + 50, -20, static_cast(ImGui::GetWindowViewport()->Size.x) - 50, 0.95f); - Draw_Table_Dropdown("Start Button position", "tablestartbtn", "Start Button settings", "Start Button", CVAR_COSMETIC("HUD.StartButton"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), 0, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 70, 0.75f); - C_Button_Dropdown("C Button Up position", "tablecubtn", "C Button Up settings", "C Button Up", CVAR_COSMETIC("HUD.CUpButton"), CVAR_COSMETIC("HUD.CUpButton.PosType"), 0.5f); - C_Button_Dropdown("C Button Down position", "tablecdbtn", "C Button Down settings", "C Button Down", CVAR_COSMETIC("HUD.CDownButton"), CVAR_COSMETIC("HUD.CDownButton.PosType"), 0.87f); - C_Button_Dropdown("C Button Left position", "tableclbtn", "C Button Left settings", "C Button Left", CVAR_COSMETIC("HUD.CLeftButton"), CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0.87f); - C_Button_Dropdown("C Button Right position", "tablecrbtn", "C Button Right settings", "C Button Right", CVAR_COSMETIC("HUD.CRightButton"), CVAR_COSMETIC("HUD.CRightButton.PosType"), 0.87f); + Draw_Table_Dropdown("B Button position", "tablebbtn", "B Button settings", "B Button", CVAR_COSMETIC("HUD.BButton"), + 0, static_cast(ImGui::GetWindowViewport()->Size.y / 4) + 50, -1, + static_cast(ImGui::GetWindowViewport()->Size.x) - 50, 0.95f); + Draw_Table_Dropdown("A Button position", "tableabtn", "A Button settings", "A Button", CVAR_COSMETIC("HUD.AButton"), + -10, static_cast(ImGui::GetWindowViewport()->Size.y / 4) + 50, -20, + static_cast(ImGui::GetWindowViewport()->Size.x) - 50, 0.95f); + Draw_Table_Dropdown("Start Button position", "tablestartbtn", "Start Button settings", "Start Button", + CVAR_COSMETIC("HUD.StartButton"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), + 0, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 70, 0.75f); + C_Button_Dropdown("C Button Up position", "tablecubtn", "C Button Up settings", "C Button Up", + CVAR_COSMETIC("HUD.CUpButton"), CVAR_COSMETIC("HUD.CUpButton.PosType"), 0.5f); + C_Button_Dropdown("C Button Down position", "tablecdbtn", "C Button Down settings", "C Button Down", + CVAR_COSMETIC("HUD.CDownButton"), CVAR_COSMETIC("HUD.CDownButton.PosType"), 0.87f); + C_Button_Dropdown("C Button Left position", "tableclbtn", "C Button Left settings", "C Button Left", + CVAR_COSMETIC("HUD.CLeftButton"), CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0.87f); + C_Button_Dropdown("C Button Right position", "tablecrbtn", "C Button Right settings", "C Button Right", + CVAR_COSMETIC("HUD.CRightButton"), CVAR_COSMETIC("HUD.CRightButton.PosType"), 0.87f); if (CVarGetInteger(CVAR_ENHANCEMENT("DpadEquips"), 0) && ImGui::CollapsingHeader("DPad items position")) { if (ImGui::BeginTable("tabledpaditems", 1, FlagsTable)) { ImGui::TableSetupColumn("DPad items settings", FlagsCell, TablesCellsWidth); @@ -1411,95 +1769,136 @@ void Draw_Placements(){ } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == HIDDEN) { Min_X_Dpad = static_cast(ImGui::GetWindowViewport()->Size.x / 2) * -1; } - DrawPositionSlider(CVAR_COSMETIC("HUD.Dpad"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_Dpad, Max_X_Dpad); + DrawPositionSlider(CVAR_COSMETIC("HUD.Dpad"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), + Min_X_Dpad, Max_X_Dpad); DrawScaleSlider(CVAR_COSMETIC("HUD.Dpad"), 1.0f); - ImGui::NewLine(); ImGui::EndTable(); } } - Draw_Table_Dropdown("Minimaps position", "tableminimapspos", "minimaps settings", "Minimap", CVAR_COSMETIC("HUD.Minimap"), - static_cast(ImGui::GetWindowViewport()->Size.y / 3) * -1, static_cast(ImGui::GetWindowViewport()->Size.y / 3), static_cast(ImGui::GetWindowViewport()->Size.x) * -1, static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); - Draw_Table_Dropdown("Small Keys counter position", "tablesmolekeys", "Small Keys counter settings", "Small Keys counter", CVAR_COSMETIC("HUD.SmallKey"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 3), -1, static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); - Draw_Table_Dropdown("Rupee counter position", "tablerupeecount", "Rupee counter settings", "Rupee counter", CVAR_COSMETIC("HUD.Rupees"), - -2, static_cast(ImGui::GetWindowViewport()->Size.y / 3), -3, static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); + Draw_Table_Dropdown("Minimaps position", "tableminimapspos", "minimaps settings", "Minimap", + CVAR_COSMETIC("HUD.Minimap"), static_cast(ImGui::GetWindowViewport()->Size.y / 3) * -1, + static_cast(ImGui::GetWindowViewport()->Size.y / 3), + static_cast(ImGui::GetWindowViewport()->Size.x) * -1, + static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); + Draw_Table_Dropdown("Small Keys counter position", "tablesmolekeys", "Small Keys counter settings", + "Small Keys counter", CVAR_COSMETIC("HUD.SmallKey"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 3), -1, + static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); + Draw_Table_Dropdown("Rupee counter position", "tablerupeecount", "Rupee counter settings", "Rupee counter", + CVAR_COSMETIC("HUD.Rupees"), -2, static_cast(ImGui::GetWindowViewport()->Size.y / 3), -3, + static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); Draw_Table_Dropdown("Carrots position", "tableCarrots", "Carrots settings", "Carrots", CVAR_COSMETIC("HUD.Carrots"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 25, 1.0f); - Draw_Table_Dropdown("Timers position", "tabletimers", "Timers settings", "Timers", CVAR_COSMETIC("HUD.Timers"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) - 50, 1.0f); - Draw_Table_Dropdown("Archery Scores position", "tablearchery", "Archery Scores settings", "Archery scores", CVAR_COSMETIC("HUD.ArcheryScore"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) - 50, 1.0f); - Draw_Table_Dropdown("Title cards (Maps) position", "tabletcmaps", "Titlecard maps settings", "Title cards (overworld)", CVAR_COSMETIC("HUD.TitleCard.Map"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); - Draw_Table_Dropdown("Title cards (Bosses) position", "tabletcbosses", "Title cards (Bosses) settings", "Title cards (Bosses)", CVAR_COSMETIC("HUD.TitleCard.Boss"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); - Draw_Table_Dropdown("In-game Gameplay Timer position", "tablegameplaytimer", "In-game Gameplay Timer settings", "In-game Gameplay Timer", CVAR_COSMETIC("HUD.IGT"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); + 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, + static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 25, 1.0f); + Draw_Table_Dropdown("Timers position", "tabletimers", "Timers settings", "Timers", CVAR_COSMETIC("HUD.Timers"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, + static_cast(ImGui::GetWindowViewport()->Size.x / 2) - 50, 1.0f); + Draw_Table_Dropdown("Archery Scores position", "tablearchery", "Archery Scores settings", "Archery scores", + CVAR_COSMETIC("HUD.ArcheryScore"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), + -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) - 50, 1.0f); + Draw_Table_Dropdown("Title cards (Maps) position", "tabletcmaps", "Titlecard maps settings", + "Title cards (overworld)", CVAR_COSMETIC("HUD.TitleCard.Map"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, + static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); + Draw_Table_Dropdown("Title cards (Bosses) position", "tabletcbosses", "Title cards (Bosses) settings", + "Title cards (Bosses)", CVAR_COSMETIC("HUD.TitleCard.Boss"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, + static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); + Draw_Table_Dropdown("In-game Gameplay Timer position", "tablegameplaytimer", "In-game Gameplay Timer settings", + "In-game Gameplay Timer", CVAR_COSMETIC("HUD.IGT"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, + static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); if (ImGui::CollapsingHeader("Enemy Health Bar position")) { if (ImGui::BeginTable("enemyhealthbar", 1, FlagsTable)) { ImGui::TableSetupColumn("Enemy Health Bar settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); std::string posTypeCVar = CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"); - UIWidgets::EnhancementRadioButton("Anchor to Enemy", posTypeCVar.c_str(), ENEMYHEALTH_ANCHOR_ACTOR); - UIWidgets::Tooltip("This will use enemy on screen position"); - UIWidgets::EnhancementRadioButton("Anchor to the top", posTypeCVar.c_str(), ENEMYHEALTH_ANCHOR_TOP); - UIWidgets::Tooltip("This will make your elements follow the top edge of your game window"); - UIWidgets::EnhancementRadioButton("Anchor to the bottom", posTypeCVar.c_str(), ENEMYHEALTH_ANCHOR_BOTTOM); - UIWidgets::Tooltip("This will make your elements follow the bottom edge of your game window"); - DrawPositionSlider(CVAR_COSMETIC("HUD.EnemyHealthBar."), -SCREEN_HEIGHT, SCREEN_HEIGHT, -static_cast(ImGui::GetWindowViewport()->Size.x / 2), static_cast(ImGui::GetWindowViewport()->Size.x / 2)); - if (UIWidgets::EnhancementSliderInt("Health Bar Width: %d", "##EnemyHealthBarWidth", CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Value"), 32, 128, "", 64)) { + UIWidgets::CVarRadioButton( + "Anchor to Enemy", CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"), ENEMYHEALTH_ANCHOR_ACTOR, + UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("This will use enemy on screen position")); + UIWidgets::CVarRadioButton( + "Anchor to the top", CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"), ENEMYHEALTH_ANCHOR_TOP, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the top edge of your game window")); + UIWidgets::CVarRadioButton( + "Anchor to the bottom", CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"), ENEMYHEALTH_ANCHOR_BOTTOM, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the bottom edge of your game window")); + DrawPositionSlider(CVAR_COSMETIC("HUD.EnemyHealthBar."), -SCREEN_HEIGHT, SCREEN_HEIGHT, + -static_cast(ImGui::GetWindowViewport()->Size.x / 2), + static_cast(ImGui::GetWindowViewport()->Size.x / 2)); + if (UIWidgets::CVarSliderInt("Health Bar Width: %d", CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Value"), + UIWidgets::IntSliderOptions() + .Min(32) + .Max(128) + .DefaultValue(64) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This will change the width of the health bar"))) { CVarSetInteger(CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Changed"), 1); } - UIWidgets::Tooltip("This will change the width of the health bar"); ImGui::SameLine(); - if (ImGui::Button("Reset##EnemyHealthBarWidth")) { + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); + if (UIWidgets::Button("Reset##EnemyHealthBarWidth", + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Value")); CVarClear(CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Changed")); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - ImGui::NewLine(); ImGui::EndTable(); } } + UIWidgets::PopStyleHeader(); } void Reset_Option_Single(const char* Button_Title, const char* name) { ImGui::SameLine(); - if (ImGui::Button(Button_Title)) { + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); + if (UIWidgets::Button(Button_Title, UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(name); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } void Reset_Option_Double(const char* Button_Title, const char* name) { ImGui::SameLine(); - if (ImGui::Button(Button_Title)) { + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); + if (UIWidgets::Button(Button_Title, UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear((std::string(name) + ".Value").c_str()); CVarClear((std::string(name) + ".Changed").c_str()); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } void DrawSillyTab() { ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - if (UIWidgets::EnhancementCheckbox("Let It Snow", CVAR_GENERAL("LetItSnow"))) { - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - UIWidgets::Tooltip("Makes snow fall, changes chest texture colors to red and green, etc, for December holidays.\nWill reset on restart outside of December 23-25."); + UIWidgets::CVarCheckbox("Let It Snow", CVAR_GENERAL("LetItSnow"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Makes snow fall, changes chest texture colors to red and green, etc, for " + "December holidays.\nWill reset on restart outside of December 23-25.")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - if (UIWidgets::EnhancementSliderFloat("Link Body Scale: %.3fx", "##Link_BodyScale", CVAR_COSMETIC("Link.BodyScale.Value"), 0.001f, 0.025f, "", 0.01f, true)) { - CVarSetInteger(CVAR_COSMETIC("Link.BodyScale.Changed"), 1); + if (UIWidgets::CVarSliderFloat("Link Body Size", CVAR_COSMETIC("Link.BodySize.Value"), + UIWidgets::FloatSliderOptions() + .Format("%.3f") + .Min(0.001f) + .Max(0.05f) + .DefaultValue(0.01f) + .Step(0.001f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { + CVarSetInteger(CVAR_COSMETIC("Link.BodySize.Changed"), 1); } ImGui::SameLine(); - if (ImGui::Button("Reset##Link_BodyScale")) { - CVarClear(CVAR_COSMETIC("Link.BodyScale.Value")); - CVarClear(CVAR_COSMETIC("Link.BodyScale.Changed")); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); + if (UIWidgets::Button("Reset##Link_BodySize", + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { + CVarClear(CVAR_COSMETIC("Link.BodySize.Value")); + CVarClear(CVAR_COSMETIC("Link.BodySize.Changed")); if (gPlayState != nullptr) { static Player* player = GET_PLAYER(gPlayState); player->actor.scale.x = 0.01f; @@ -1508,69 +1907,142 @@ void DrawSillyTab() { } } - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); - - if (UIWidgets::EnhancementSliderFloat("Link Head Scale: %.2fx", "##Link_HeadScale", CVAR_COSMETIC("Link.HeadScale.Value"), 0.4f, 4.0f, "", 1.0f, false)) { + UIWidgets::Separator(true, true, 2.0f, 2.0f); + if (UIWidgets::CVarSliderFloat("Link Head Scale", CVAR_COSMETIC("Link.HeadScale.Value"), + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { CVarSetInteger(CVAR_COSMETIC("Link.HeadScale.Changed"), 1); } Reset_Option_Double("Reset##Link_HeadScale", CVAR_COSMETIC("Link.HeadScale")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - if (UIWidgets::EnhancementSliderFloat("Link Sword Scale: %f", "##Link_SwordScale", CVAR_COSMETIC("Link.SwordScale.Value"), 1.0f, 2.5f, "", 1.0f, false)) { + if (UIWidgets::CVarSliderFloat("Link Sword Scale", CVAR_COSMETIC("Link.SwordScale.Value"), + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { CVarSetInteger(CVAR_COSMETIC("Link.SwordScale.Changed"), 1); } Reset_Option_Double("Reset##Link_SwordScale", CVAR_COSMETIC("Link.SwordScale")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - UIWidgets::EnhancementSliderFloat("Bunny Hood Length: %f", "##BunnyHood_EarLength", CVAR_COSMETIC("BunnyHood.EarLength"), -300.0f, 1000.0f, "", 0.0f, false); + UIWidgets::CVarSliderFloat("Bunny Hood Length", CVAR_COSMETIC("BunnyHood.EarLength"), + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(-300.0f) + .Max(1000.0f) + .DefaultValue(0.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##BunnyHood_EarLength", CVAR_COSMETIC("BunnyHood.EarLength")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - UIWidgets::EnhancementSliderFloat("Bunny Hood Spread: %f", "##BunnyHood_EarSpread", CVAR_COSMETIC("BunnyHood.EarSpread"), -300.0f, 500.0f, "", 0.0f, false); + UIWidgets::CVarSliderFloat("Bunny Hood Spread", CVAR_COSMETIC("BunnyHood.EarSpread"), + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(-300.0f) + .Max(500.0f) + .DefaultValue(0.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##BunnyHood_EarSpread", CVAR_COSMETIC("BunnyHood.EarSpread")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - UIWidgets::EnhancementSliderFloat("Goron Neck Length: %f", "##Goron_NeckLength", CVAR_COSMETIC("Goron.NeckLength"), 0.0f, 5000.0f, "", 0.0f, false); + UIWidgets::CVarSliderFloat("Goron Neck Length", CVAR_COSMETIC("Goron.NeckLength"), + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(0.0f) + .Max(5000.0f) + .DefaultValue(0.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##Goron_NeckLength", CVAR_COSMETIC("Goron.NeckLength")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - UIWidgets::EnhancementCheckbox("Unfix Goron Spin", CVAR_COSMETIC("UnfixGoronSpin")); + UIWidgets::CVarCheckbox("Unfix Goron Spin", CVAR_COSMETIC("UnfixGoronSpin"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - UIWidgets::EnhancementSliderFloat("Fairies Size: %f", "##Fairies_Size", CVAR_COSMETIC("Fairies.Size"), 0.25f, 5.0f, "", 1.0f, false); + UIWidgets::CVarSliderFloat("Fairies Size", CVAR_COSMETIC("Fairies.Size"), + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##Fairies_Size", CVAR_COSMETIC("Fairies.Size")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - UIWidgets::EnhancementSliderFloat("N64 Logo Spin Speed: %f", "##N64Logo_SpinSpeed", CVAR_COSMETIC("N64Logo.SpinSpeed"), 0.25f, 5.0f, "", 1.0f, false); + UIWidgets::CVarSliderFloat("N64 Logo Spin Speed", CVAR_COSMETIC("N64Logo.SpinSpeed"), + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##N64Logo_SpinSpeed", CVAR_COSMETIC("N64Logo.SpinSpeed")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - UIWidgets::EnhancementSliderFloat("Moon Size: %f", "##Moon_Size", CVAR_COSMETIC("Moon.Size"), 0.5f, 2.0f, "", 1.0f, false); + UIWidgets::CVarSliderFloat("Moon Size", CVAR_COSMETIC("Moon.Size"), + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##Moon_Size", CVAR_COSMETIC("Moon.Size")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - if (UIWidgets::EnhancementSliderFloat("Kak Windmill Speed: %f", "##Kak_Windmill_Speed", CVAR_COSMETIC("Kak.Windmill_Speed.Value"), 100.0f, 6000.0f, "", 100.0f, false)) { + if (UIWidgets::CVarSliderFloat("Kak Windmill Speed", CVAR_COSMETIC("Kak.Windmill_Speed.Value"), + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(100.0f) + .Max(6000.0f) + .DefaultValue(100.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { CVarSetInteger(CVAR_COSMETIC("Kak.Windmill_Speed.Changed"), 1); } Reset_Option_Double("Reset##Kak_Windmill_Speed", CVAR_COSMETIC("Kak.Windmill_Speed")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); ImGui::EndDisabled(); } // Copies the RGB values from one cosmetic option to another, multiplied by the passed in amount, this // allows you create and use multiple shades of the same color. -void CopyMultipliedColor(CosmeticOption& cosmeticOptionSrc, CosmeticOption& cosmeticOptionTarget, float amount = 0.75f) { +void CopyMultipliedColor(CosmeticOption& cosmeticOptionSrc, CosmeticOption& cosmeticOptionTarget, + float amount = 0.75f) { Color_RGBA8 newColor; newColor.r = static_cast(MIN((cosmeticOptionSrc.currentColor.x * 255.0f) * amount, 255)); newColor.g = static_cast(MIN((cosmeticOptionSrc.currentColor.y * 255.0f) * amount, 255)); @@ -1582,7 +2054,7 @@ void CopyMultipliedColor(CosmeticOption& cosmeticOptionSrc, CosmeticOption& cosm cosmeticOptionTarget.currentColor.z = newColor.b / 255.0f; cosmeticOptionTarget.currentColor.w = newColor.a / 255.0f; - CVarSetColor(cosmeticOptionTarget.cvar, newColor); + CVarSetColor(cosmeticOptionTarget.valuesCvar, newColor); CVarSetInteger((cosmeticOptionTarget.rainbowCvar), 0); CVarSetInteger((cosmeticOptionTarget.changedCvar), 1); } @@ -1642,14 +2114,15 @@ void RandomizeColor(CosmeticOption& cosmeticOption) { cosmeticOption.currentColor.z = newColor.b / 255.0f; cosmeticOption.currentColor.w = newColor.a / 255.0f; - CVarSetColor(cosmeticOption.cvar, newColor); + CVarSetColor(cosmeticOption.valuesCvar, newColor); CVarSetInteger(cosmeticOption.rainbowCvar, 0); CVarSetInteger(cosmeticOption.changedCvar, 1); ApplySideEffects(cosmeticOption); } void ResetColor(CosmeticOption& cosmeticOption) { - Color_RGBA8 defaultColor = {cosmeticOption.defaultColor.r, cosmeticOption.defaultColor.g, cosmeticOption.defaultColor.b, cosmeticOption.defaultColor.a}; + Color_RGBA8 defaultColor = { cosmeticOption.defaultColor.r, cosmeticOption.defaultColor.g, + cosmeticOption.defaultColor.b, cosmeticOption.defaultColor.a }; cosmeticOption.currentColor.x = defaultColor.r / 255.0f; cosmeticOption.currentColor.y = defaultColor.g / 255.0f; cosmeticOption.currentColor.z = defaultColor.b / 255.0f; @@ -1658,12 +2131,12 @@ void ResetColor(CosmeticOption& cosmeticOption) { CVarClear(cosmeticOption.changedCvar); CVarClear(cosmeticOption.rainbowCvar); CVarClear(cosmeticOption.lockedCvar); - CVarClear(cosmeticOption.cvar); - CVarClear((std::string(cosmeticOption.cvar) + ".R").c_str()); - CVarClear((std::string(cosmeticOption.cvar) + ".G").c_str()); - CVarClear((std::string(cosmeticOption.cvar) + ".B").c_str()); - CVarClear((std::string(cosmeticOption.cvar) + ".A").c_str()); - CVarClear((std::string(cosmeticOption.cvar) + ".Type").c_str()); + CVarClear(cosmeticOption.valuesCvar); + CVarClear((std::string(cosmeticOption.valuesCvar) + ".R").c_str()); + CVarClear((std::string(cosmeticOption.valuesCvar) + ".G").c_str()); + CVarClear((std::string(cosmeticOption.valuesCvar) + ".B").c_str()); + CVarClear((std::string(cosmeticOption.valuesCvar) + ".A").c_str()); + CVarClear((std::string(cosmeticOption.valuesCvar) + ".Type").c_str()); // This portion should match 1:1 the multiplied colors in `ApplySideEffect()` if (cosmeticOption.label == "Bow Body") { @@ -1709,40 +2182,27 @@ void ResetColor(CosmeticOption& cosmeticOption) { } void DrawCosmeticRow(CosmeticOption& cosmeticOption) { - bool colorChanged; - if (cosmeticOption.supportsAlpha) { - colorChanged = ImGui::ColorEdit4(cosmeticOption.label.c_str(), (float*)&cosmeticOption.currentColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel); - } else { - colorChanged = ImGui::ColorEdit3(cosmeticOption.label.c_str(), (float*)&cosmeticOption.currentColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel); - } - if (colorChanged) { - Color_RGBA8 color; - color.r = static_cast(cosmeticOption.currentColor.x * 255.0f); - color.g = static_cast(cosmeticOption.currentColor.y * 255.0f); - color.b = static_cast(cosmeticOption.currentColor.z * 255.0f); - color.a = static_cast(cosmeticOption.currentColor.w * 255.0f); - - CVarSetColor(cosmeticOption.cvar, color); + if (UIWidgets::CVarColorPicker(cosmeticOption.label.c_str(), cosmeticOption.cvar, cosmeticOption.defaultColor, + cosmeticOption.supportsAlpha, 0, THEME_COLOR)) { CVarSetInteger((cosmeticOption.rainbowCvar), 0); CVarSetInteger((cosmeticOption.changedCvar), 1); ApplySideEffects(cosmeticOption); ApplyOrResetCustomGfxPatches(); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - ImGui::SameLine(); - ImGui::Text("%s", cosmeticOption.label.c_str()); - //the longest option name - ImGui::SameLine((ImGui::CalcTextSize("Message Light Blue (None No Shadow) Color").x * 1.0f) + 60.0f); - if (ImGui::Button(("Random##" + cosmeticOption.label).c_str())) { + // the longest option name + ImGui::SameLine((ImGui::CalcTextSize("Message Light Blue (None No Shadow)").x * 1.0f) + 60.0f); + if (UIWidgets::Button( + ("Random##" + cosmeticOption.label).c_str(), + UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)).Color(THEME_COLOR))) { RandomizeColor(cosmeticOption); ApplyOrResetCustomGfxPatches(); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } if (cosmeticOption.supportsRainbow) { ImGui::SameLine(); - bool isRainbow = (bool)CVarGetInteger((cosmeticOption.rainbowCvar), 0); - if (ImGui::Checkbox(("Rainbow##" + cosmeticOption.label).c_str(), &isRainbow)) { - CVarSetInteger((cosmeticOption.rainbowCvar), isRainbow); + if (UIWidgets::CVarCheckbox(("Rainbow##" + cosmeticOption.label).c_str(), cosmeticOption.rainbowCvar, + UIWidgets::CheckboxOptions().Color(THEME_COLOR))) { CVarSetInteger((cosmeticOption.changedCvar), 1); ApplySideEffects(cosmeticOption); ApplyOrResetCustomGfxPatches(); @@ -1750,14 +2210,14 @@ void DrawCosmeticRow(CosmeticOption& cosmeticOption) { } } ImGui::SameLine(); - bool isLocked = (bool)CVarGetInteger((cosmeticOption.lockedCvar), 0); - if (ImGui::Checkbox(("Locked##" + cosmeticOption.label).c_str(), &isLocked)) { - CVarSetInteger((cosmeticOption.lockedCvar), isLocked); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } + + UIWidgets::CVarCheckbox(("Locked##" + cosmeticOption.label).c_str(), cosmeticOption.lockedCvar, + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + if (CVarGetInteger((cosmeticOption.changedCvar), 0)) { ImGui::SameLine(); - if (ImGui::Button(("Reset##" + cosmeticOption.label).c_str())) { + if (UIWidgets::Button(("Reset##" + cosmeticOption.label).c_str(), + UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)))) { ResetColor(cosmeticOption); ApplyOrResetCustomGfxPatches(); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); @@ -1769,32 +2229,37 @@ void DrawCosmeticGroup(CosmeticGroup cosmeticGroup) { std::string label = groupLabels.at(cosmeticGroup); ImGui::Text("%s", label.c_str()); // the longest option name - ImGui::SameLine((ImGui::CalcTextSize("Message Light Blue (None No Shadow) Color").x * 1.0f) + 60.0f); - if (ImGui::Button(("Random##" + label).c_str())) { + ImGui::SameLine((ImGui::CalcTextSize("Message Light Blue (None No Shadow)").x * 1.0f) + 60.0f); + if (UIWidgets::Button( + ("Random##" + label).c_str(), + UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { - if (cosmeticOption.group == cosmeticGroup && (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) && !CVarGetInteger(cosmeticOption.lockedCvar, 0)) { + if (cosmeticOption.group == cosmeticGroup && + (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) && + !CVarGetInteger(cosmeticOption.lockedCvar, 0)) { RandomizeColor(cosmeticOption); } } ApplyOrResetCustomGfxPatches(); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } ImGui::SameLine(); - if (ImGui::Button(("Reset##" + label).c_str())) { + if (UIWidgets::Button(("Reset##" + label).c_str(), + UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.group == cosmeticGroup && !CVarGetInteger(cosmeticOption.lockedCvar, 0)) { ResetColor(cosmeticOption); } } ApplyOrResetCustomGfxPatches(); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } + UIWidgets::Spacer(); for (auto& [id, cosmeticOption] : cosmeticOptions) { - if (cosmeticOption.group == cosmeticGroup && (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0))) { + if (cosmeticOption.group == cosmeticGroup && + (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0))) { DrawCosmeticRow(cosmeticOption); } } - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); } static const char* colorSchemes[2] = { @@ -1807,193 +2272,199 @@ void CosmeticsEditorWindow::ApplyDungeonKeyColors() { ResetColor(cosmeticOptions.at("Key.KeyringRing")); // Forest Temple - CVarSetColor(cosmeticOptions["Key.ForestSmallBody"].cvar, { 4, 195, 46, 255 }); + CVarSetColor(cosmeticOptions["Key.ForestSmallBody"].valuesCvar, { 4, 195, 46, 255 }); CVarSetInteger(cosmeticOptions["Key.ForestSmallBody"].changedCvar, 1); cosmeticOptions["Key.ForestSmallBody"].currentColor = { 4 / 255.0f, 195 / 255.0f, 46 / 255.0f, 255 / 255.0f }; ResetColor(cosmeticOptions.at("Key.ForestSmallEmblem")); ResetColor(cosmeticOptions.at("Key.ForestBossBody")); - CVarSetColor(cosmeticOptions["Key.ForestBossGem"].cvar, { 0, 255, 0, 255 }); + CVarSetColor(cosmeticOptions["Key.ForestBossGem"].valuesCvar, { 0, 255, 0, 255 }); CVarSetInteger(cosmeticOptions["Key.ForestBossGem"].changedCvar, 1); cosmeticOptions["Key.ForestBossGem"].currentColor = { 0, 255 / 255.0f, 0, 255 / 255.0f }; // Fire Temple - CVarSetColor(cosmeticOptions["Key.FireSmallBody"].cvar, { 237, 95, 95, 255 }); + CVarSetColor(cosmeticOptions["Key.FireSmallBody"].valuesCvar, { 237, 95, 95, 255 }); CVarSetInteger(cosmeticOptions["Key.FireSmallBody"].changedCvar, 1); cosmeticOptions["Key.FireSmallBody"].currentColor = { 237 / 255.0f, 95 / 255.0f, 95 / 255.0f, 255 / 255.0f }; ResetColor(cosmeticOptions.at("Key.FireSmallEmblem")); ResetColor(cosmeticOptions.at("Key.FireBossBody")); - CVarSetColor(cosmeticOptions["Key.FireBossGem"].cvar, { 255, 30, 0, 255 }); + CVarSetColor(cosmeticOptions["Key.FireBossGem"].valuesCvar, { 255, 30, 0, 255 }); CVarSetInteger(cosmeticOptions["Key.FireBossGem"].changedCvar, 1); cosmeticOptions["Key.FireBossGem"].currentColor = { 255 / 255.0f, 30 / 255.0f, 0, 255 / 255.0f }; // Water Temple - CVarSetColor(cosmeticOptions["Key.WaterSmallBody"].cvar, { 85, 180, 223, 255 }); + CVarSetColor(cosmeticOptions["Key.WaterSmallBody"].valuesCvar, { 85, 180, 223, 255 }); CVarSetInteger(cosmeticOptions["Key.WaterSmallBody"].changedCvar, 1); cosmeticOptions["Key.WaterSmallBody"].currentColor = { 85 / 255.0f, 180 / 255.0f, 223 / 255.0f, 255 / 255.0f }; ResetColor(cosmeticOptions.at("Key.WaterSmallEmblem")); ResetColor(cosmeticOptions.at("Key.WaterBossBody")); - CVarSetColor(cosmeticOptions["Key.WaterBossGem"].cvar, { 0, 137, 255, 255 }); + CVarSetColor(cosmeticOptions["Key.WaterBossGem"].valuesCvar, { 0, 137, 255, 255 }); CVarSetInteger(cosmeticOptions["Key.WaterBossGem"].changedCvar, 1); cosmeticOptions["Key.WaterBossGem"].currentColor = { 0, 137 / 255.0f, 255 / 255.0f, 255 / 255.0f }; // Spirit Temple - CVarSetColor(cosmeticOptions["Key.SpiritSmallBody"].cvar, { 222, 158, 47, 255 }); + CVarSetColor(cosmeticOptions["Key.SpiritSmallBody"].valuesCvar, { 222, 158, 47, 255 }); CVarSetInteger(cosmeticOptions["Key.SpiritSmallBody"].changedCvar, 1); cosmeticOptions["Key.SpiritSmallBody"].currentColor = { 222 / 255.0f, 158 / 255.0f, 47 / 255.0f, 255 / 255.0f }; ResetColor(cosmeticOptions.at("Key.SpiritSmallEmblem")); ResetColor(cosmeticOptions.at("Key.SpiritBossBody")); - CVarSetColor(cosmeticOptions["Key.SpiritBossGem"].cvar, { 255, 85, 0, 255 }); + CVarSetColor(cosmeticOptions["Key.SpiritBossGem"].valuesCvar, { 255, 85, 0, 255 }); CVarSetInteger(cosmeticOptions["Key.SpiritBossGem"].changedCvar, 1); cosmeticOptions["Key.SpiritBossGem"].currentColor = { 255 / 255.0f, 85 / 255.0f, 0, 255 / 255.0f }; // Shadow Temple - CVarSetColor(cosmeticOptions["Key.ShadowSmallBody"].cvar, { 126, 16, 177, 255 }); + CVarSetColor(cosmeticOptions["Key.ShadowSmallBody"].valuesCvar, { 126, 16, 177, 255 }); CVarSetInteger(cosmeticOptions["Key.ShadowSmallBody"].changedCvar, 1); cosmeticOptions["Key.ShadowSmallBody"].currentColor = { 126 / 255.0f, 16 / 255.0f, 177 / 255.0f, 255 / 255.0f }; ResetColor(cosmeticOptions.at("Key.ShadowSmallEmblem")); ResetColor(cosmeticOptions.at("Key.ShadowBossBody")); - CVarSetColor(cosmeticOptions["Key.ShadowBossGem"].cvar, { 153, 0, 255, 255 }); + CVarSetColor(cosmeticOptions["Key.ShadowBossGem"].valuesCvar, { 153, 0, 255, 255 }); CVarSetInteger(cosmeticOptions["Key.ShadowBossGem"].changedCvar, 1); cosmeticOptions["Key.ShadowBossGem"].currentColor = { 153 / 255.0f, 0, 255 / 255.0f, 255 / 255.0f }; // Ganon's Tower - CVarSetColor(cosmeticOptions["Key.GanonsSmallBody"].cvar, { 80, 80, 80, 255 }); + CVarSetColor(cosmeticOptions["Key.GanonsSmallBody"].valuesCvar, { 80, 80, 80, 255 }); CVarSetInteger(cosmeticOptions["Key.GanonsSmallBody"].changedCvar, 1); cosmeticOptions["Key.GanonsSmallBody"].currentColor = { 80 / 255.0f, 80 / 255.0f, 80 / 255.0f, 255 / 255.0f }; ResetColor(cosmeticOptions.at("Key.GanonsSmallEmblem")); - CVarSetColor(cosmeticOptions["Key.GanonsBossBody"].cvar, { 80, 80, 80, 255 }); + CVarSetColor(cosmeticOptions["Key.GanonsBossBody"].valuesCvar, { 80, 80, 80, 255 }); CVarSetInteger(cosmeticOptions["Key.GanonsBossBody"].changedCvar, 1); cosmeticOptions["Key.GanonsBossBody"].currentColor = { 80 / 255.0f, 80 / 255.0f, 80 / 255.0f, 255 / 255.0f }; - CVarSetColor(cosmeticOptions["Key.GanonsBossGem"].cvar, { 255, 0, 0, 255 }); + CVarSetColor(cosmeticOptions["Key.GanonsBossGem"].valuesCvar, { 255, 0, 0, 255 }); CVarSetInteger(cosmeticOptions["Key.GanonsBossGem"].changedCvar, 1); cosmeticOptions["Key.GanonsBossGem"].currentColor = { 255 / 255.0f, 0, 0, 255 / 255.0f }; // Bottom of the Well - CVarSetColor(cosmeticOptions["Key.WellSmallBody"].cvar, { 227, 110, 255, 255 }); + CVarSetColor(cosmeticOptions["Key.WellSmallBody"].valuesCvar, { 227, 110, 255, 255 }); CVarSetInteger(cosmeticOptions["Key.WellSmallBody"].changedCvar, 1); cosmeticOptions["Key.WellSmallBody"].currentColor = { 227 / 255.0f, 110 / 255.0f, 255 / 255.0f, 255 / 255.0f }; ResetColor(cosmeticOptions.at("Key.WellSmallEmblem")); // Gerudo Training Ground - CVarSetColor(cosmeticOptions["Key.GTGSmallBody"].cvar, { 221, 212, 60, 255 }); + CVarSetColor(cosmeticOptions["Key.GTGSmallBody"].valuesCvar, { 221, 212, 60, 255 }); CVarSetInteger(cosmeticOptions["Key.GTGSmallBody"].changedCvar, 1); cosmeticOptions["Key.GTGSmallBody"].currentColor = { 221 / 255.0f, 212 / 255.0f, 60 / 255.0f, 255 / 255.0f }; ResetColor(cosmeticOptions.at("Key.GTGSmallEmblem")); // Gerudo Fortress - CVarSetColor(cosmeticOptions["Key.FortSmallBody"].cvar, { 255, 255, 255, 255 }); + CVarSetColor(cosmeticOptions["Key.FortSmallBody"].valuesCvar, { 255, 255, 255, 255 }); CVarSetInteger(cosmeticOptions["Key.FortSmallBody"].changedCvar, 1); cosmeticOptions["Key.FortSmallBody"].currentColor = { 255 / 255.0f, 255 / 255.0f, 255 / 255.0f, 255 / 255.0f }; ResetColor(cosmeticOptions.at("Key.FortSmallEmblem")); } void CosmeticsEditorWindow::DrawElement() { - ImGui::Text("Color Scheme"); - ImGui::SameLine(); - UIWidgets::EnhancementCombobox(CVAR_COSMETIC("DefaultColorScheme"), colorSchemes, COLORSCHEME_N64); - UIWidgets::EnhancementCheckbox("Advanced Mode", CVAR_COSMETIC("AdvancedMode")); - UIWidgets::InsertHelpHoverText( - "Some cosmetic options may not apply if you have any mods that provide custom models for the cosmetic option.\n\n" - "For example, if you have custom Link model, then the Link's Hair color option will most likely not apply." - ); - + UIWidgets::CVarCombobox("Color Scheme", CVAR_COSMETIC("DefaultColorScheme"), colorSchemes, + UIWidgets::ComboboxOptions() + .DefaultIndex(COLORSCHEME_N64) + .Color(THEME_COLOR) + .LabelPosition(UIWidgets::LabelPositions::Near) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right)); + UIWidgets::CVarCheckbox("Sync Rainbow colors", CVAR_COSMETIC("RainbowSync"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarSliderFloat("Rainbow Speed", CVAR_COSMETIC("RainbowSpeed"), + UIWidgets::FloatSliderOptions() + .Format("%.2f") + .Min(0.01f) + .Max(1.0f) + .DefaultValue(0.6f) + .Step(0.01f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + UIWidgets::CVarCheckbox("Randomize All on New Scene", CVAR_COSMETIC("RandomizeAllOnNewScene"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Enables randomizing all unlocked cosmetics when you enter a new scene.")); + ImGui::EndDisabled(); + UIWidgets::CVarCheckbox( + "Advanced Mode", CVAR_COSMETIC("AdvancedMode"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip( + "Some cosmetic options may not apply if you have any mods that provide custom models for the cosmetic " + "option.\n\n" + "For example, if you have custom Link model, then the Link's Hair color option will most likely not " + "apply.")); if (CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { - if (ImGui::Button("Lock All Advanced", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { + if (UIWidgets::Button("Lock All Advanced", + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.advancedOption) { CVarSetInteger(cosmeticOption.lockedCvar, 1); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } ImGui::SameLine(); - if (ImGui::Button("Unlock All Advanced", ImVec2(ImGui::GetContentRegionAvail().x, 30.0f))) { + if (UIWidgets::Button("Unlock All Advanced", + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.advancedOption) { CVarSetInteger(cosmeticOption.lockedCvar, 0); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } - UIWidgets::EnhancementCheckbox("Sync Rainbow colors", CVAR_COSMETIC("RainbowSync")); - UIWidgets::EnhancementSliderFloat("Rainbow Speed: %.3f", "##rainbowSpeed", CVAR_COSMETIC("RainbowSpeed"), 0.03f, 1.0f, "", 0.6f, false, true); - UIWidgets::EnhancementCheckbox("Randomize All on New Scene", CVAR_COSMETIC("RandomizeAllOnNewScene")); - UIWidgets::Tooltip("Enables randomizing all unlocked cosmetics when you enter a new scene."); - - if (ImGui::Button("Randomize All", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + if (UIWidgets::Button("Randomize All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { CosmeticsEditor_RandomizeAll(); } - ImGui::SameLine(); - if (ImGui::Button("Reset All", ImVec2(ImGui::GetContentRegionAvail().x, 30.0f))) { - for (auto& [id, cosmeticOption] : cosmeticOptions) { - if (!CVarGetInteger(cosmeticOption.lockedCvar, 0)) { - ResetColor(cosmeticOption); - } - } - ApplyOrResetCustomGfxPatches(); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } + ImGui::EndDisabled(); - if (ImGui::Button("Lock All", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { + ImGui::SameLine(); + if (UIWidgets::Button("Reset All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { + CosmeticsEditor_ResetAll(); + } + if (UIWidgets::Button("Lock All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { CVarSetInteger(cosmeticOption.lockedCvar, 1); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } ImGui::SameLine(); - if (ImGui::Button("Unlock All", ImVec2(ImGui::GetContentRegionAvail().x, 30.0f))) { + if (UIWidgets::Button("Unlock All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { CVarSetInteger(cosmeticOption.lockedCvar, 0); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - if (ImGui::Button("Rainbow All", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + if (UIWidgets::Button("Rainbow All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { - if ( - !CVarGetInteger(cosmeticOption.lockedCvar, 0) && - ( - !cosmeticOption.advancedOption || - CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0) - ) - ) { + if (!CVarGetInteger(cosmeticOption.lockedCvar, 0) && + (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0))) { CVarSetInteger(cosmeticOption.rainbowCvar, 1); CVarSetInteger(cosmeticOption.changedCvar, 1); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } + ImGui::EndDisabled(); + ImGui::SameLine(); - if (ImGui::Button("Un-Rainbow All", ImVec2(ImGui::GetContentRegionAvail().x, 30.0f))) { + if (UIWidgets::Button("Un-Rainbow All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { - if ( - !CVarGetInteger(cosmeticOption.lockedCvar, 0) && - ( - !cosmeticOption.advancedOption || - CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0) - ) - ) { + if (!CVarGetInteger(cosmeticOption.lockedCvar, 0) && + (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0))) { CVarSetInteger(cosmeticOption.rainbowCvar, 0); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } + UIWidgets::Spacer(3.0f); + + UIWidgets::PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("CosmeticsContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { if (ImGui::BeginTabItem("Link & Items")) { - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_LINK); DrawCosmeticGroup(COSMETICS_GROUP_GLOVES); @@ -2006,47 +2477,56 @@ void CosmeticsEditorWindow::DrawElement() { if (ImGui::BeginTabItem("Keys")) { - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - if (ImGui::Button("Give all keys dungeon-specific colors", ImVec2(300.0f, 30.0f))) { + if (UIWidgets::Button("Give all keys dungeon-specific colors", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { ApplyDungeonKeyColors(); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_KEYRING); DrawCosmeticGroup(COSMETICS_GROUP_SMALL_KEYS); DrawCosmeticGroup(COSMETICS_GROUP_BOSS_KEYS); + ImGui::EndDisabled(); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Effects")) { - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_MAGIC); DrawCosmeticGroup(COSMETICS_GROUP_ARROWS); DrawCosmeticGroup(COSMETICS_GROUP_SPIN_ATTACK); DrawCosmeticGroup(COSMETICS_GROUP_TRAILS); - if (UIWidgets::EnhancementSliderInt("Trails Duration: %d", "##Trails_Duration", CVAR_COSMETIC("Trails.Duration.Value"), 2, 20, "", 4)) { + if (UIWidgets::CVarSliderInt("Trails Duration: %d", CVAR_COSMETIC("Trails.Duration.Value"), + UIWidgets::IntSliderOptions() + .Min(2) + .Max(20) + .DefaultValue(4) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { CVarSetInteger(CVAR_COSMETIC("Trails.Duration.Changed"), 1); } ImGui::SameLine(); - if (ImGui::Button("Reset##Trails_Duration")) { + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); + if (UIWidgets::Button("Reset##Trails_Duration", + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(CVAR_COSMETIC("Trails.Duration.Value")); CVarClear(CVAR_COSMETIC("Trails.Duration.Changed")); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("World & NPCs")) { - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_WORLD); DrawCosmeticGroup(COSMETICS_GROUP_NAVI); @@ -2060,7 +2540,7 @@ void CosmeticsEditorWindow::DrawElement() { } if (ImGui::BeginTabItem("HUD")) { - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_HUD); DrawCosmeticGroup(COSMETICS_GROUP_TITLE); @@ -2074,6 +2554,7 @@ void CosmeticsEditorWindow::DrawElement() { if (CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { if (ImGui::BeginTabItem("Pause Menu")) { + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_KALEIDO); ImGui::EndTabItem(); } @@ -2081,24 +2562,23 @@ void CosmeticsEditorWindow::DrawElement() { if (CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { if (ImGui::BeginTabItem("Message")) { + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_MESSAGE); ImGui::EndTabItem(); } } ImGui::EndTabBar(); } + UIWidgets::PopStyleTabs(); } void RegisterOnLoadGameHook() { - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { - ApplyOrResetCustomGfxPatches(); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t fileNum) { ApplyOrResetCustomGfxPatches(); }); } void RegisterOnGameFrameUpdateHook() { - GameInteractor::Instance->RegisterGameHook([]() { - CosmeticsUpdateTick(); - }); + GameInteractor::Instance->RegisterGameHook([]() { CosmeticsUpdateTick(); }); } void Cosmetics_RegisterOnSceneInitHook() { @@ -2112,8 +2592,9 @@ void Cosmetics_RegisterOnSceneInitHook() { void CosmeticsEditorWindow::InitElement() { // Convert the `current color` into the format that the ImGui color picker expects for (auto& [id, cosmeticOption] : cosmeticOptions) { - Color_RGBA8 defaultColor = {cosmeticOption.defaultColor.r, cosmeticOption.defaultColor.g, cosmeticOption.defaultColor.b, cosmeticOption.defaultColor.a}; - Color_RGBA8 cvarColor = CVarGetColor(cosmeticOption.cvar, defaultColor); + Color_RGBA8 defaultColor = { cosmeticOption.defaultColor.r, cosmeticOption.defaultColor.g, + cosmeticOption.defaultColor.b, cosmeticOption.defaultColor.a }; + Color_RGBA8 cvarColor = CVarGetColor(cosmeticOption.valuesCvar, defaultColor); cosmeticOption.currentColor.x = cvarColor.r / 255.0f; cosmeticOption.currentColor.y = cvarColor.g / 255.0f; diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h index c9a28ef295..e10583081d 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h @@ -1,8 +1,9 @@ #pragma once #include -// Not to be confused with tabs, groups are 1:1 with the boxes shown in the UI, grouping them allows us to reset/randomize -// every item in a group at once. If you are looking for tabs they are rendered manually in ImGui in `DrawCosmeticsEditor` +// Not to be confused with tabs, groups are 1:1 with the boxes shown in the UI, grouping them allows us to +// reset/randomize every item in a group at once. If you are looking for tabs they are rendered manually in ImGui in +// `DrawCosmeticsEditor` typedef enum { COSMETICS_GROUP_LINK, COSMETICS_GROUP_MIRRORSHIELD, @@ -25,14 +26,14 @@ typedef enum { COSMETICS_GROUP_NAVI, COSMETICS_GROUP_IVAN, COSMETICS_GROUP_MESSAGE, - COSMETICS_GROUP_MAX + COSMETICS_GROUP_MAX, } CosmeticGroup; #ifdef __cplusplus extern "C" { #endif //__cplusplus - Color_RGBA8 CosmeticsEditor_GetDefaultValue(const char* id); +Color_RGBA8 CosmeticsEditor_GetDefaultValue(const char* id); #ifdef __cplusplus } @@ -50,22 +51,22 @@ typedef struct { static float TablesCellsWidth = 300.0f; static ImGuiTableColumnFlags FlagsTable = ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV; -static ImGuiTableColumnFlags FlagsCell = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort; +static ImGuiTableColumnFlags FlagsCell = + ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort; -ImVec4 GetRandomValue(); void CosmeticsEditor_RandomizeAll(); void CosmeticsEditor_RandomizeGroup(CosmeticGroup group); void CosmeticsEditor_ResetAll(); void CosmeticsEditor_ResetGroup(CosmeticGroup group); void ApplyOrResetCustomGfxPatches(bool manualChange = true); -class CosmeticsEditorWindow : public Ship::GuiWindow { +class CosmeticsEditorWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void InitElement() override; void DrawElement() override; void ApplyDungeonKeyColors(); - void UpdateElement() override {}; + void UpdateElement() override{}; }; #endif //__cplusplus \ No newline at end of file diff --git a/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp b/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp index 2d750ab5d0..029284fa40 100644 --- a/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp +++ b/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp @@ -68,9 +68,10 @@ extern "C" void CustomLogoTitle_Draw(TitleContext* titleContext, uint8_t logoToD gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE); gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF2, G_RM_OPA_CI | CVG_DST_WRAP); gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, PRIMITIVE, ENV_ALPHA, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT, - COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0); + COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0); if (CVarGetInteger(CVAR_COSMETIC("Title.NintendoLogo.Changed"), 0)) { - Color_RGB8 nintendoLogoColor = CVarGetColor24(CVAR_COSMETIC("Title.NintendoLogo.Value"), Color_RGB8{0, 0, 255}); + Color_RGB8 nintendoLogoColor = + CVarGetColor24(CVAR_COSMETIC("Title.NintendoLogo.Value"), Color_RGB8{ 0, 0, 255 }); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); gDPSetEnvColor(POLY_OPA_DISP++, nintendoLogoColor.r, nintendoLogoColor.g, nintendoLogoColor.b, 128); } else { @@ -79,16 +80,16 @@ extern "C" void CustomLogoTitle_Draw(TitleContext* titleContext, uint8_t logoToD } gDPLoadMultiBlock(POLY_OPA_DISP++, nintendo_rogo_static_Tex_001800, 0x100, 1, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, 2, 11); + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, 2, 11); - for (idx = 0, y = 94; idx < 16; idx++, y += 2) - { - gDPLoadMultiTile(POLY_OPA_DISP++, (logoToDraw == LOGO_TO_DRAW_N64) ? nintendo_rogo_static_Tex_000000 : nintendo_rogo_static_Tex_LUS_000000, 0, G_TX_RENDERTILE, G_IM_FMT_I, G_IM_SIZ_8b, 192, 32, - 0, idx * 2, 192 - 1, (idx + 1) * 2 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, - G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - - gDPSetTileSize(POLY_OPA_DISP++, 0, 0, 0, (192 - 1) << G_TEXTURE_IMAGE_FRAC, - (2 - 1) << G_TEXTURE_IMAGE_FRAC); + for (idx = 0, y = 94; idx < 16; idx++, y += 2) { + gDPLoadMultiTile( + POLY_OPA_DISP++, + (logoToDraw == LOGO_TO_DRAW_N64) ? nintendo_rogo_static_Tex_000000 : nintendo_rogo_static_Tex_LUS_000000, 0, + G_TX_RENDERTILE, G_IM_FMT_I, G_IM_SIZ_8b, 192, 32, 0, idx * 2, 192 - 1, (idx + 1) * 2 - 1, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + gDPSetTileSize(POLY_OPA_DISP++, 0, 0, 0, (192 - 1) << G_TEXTURE_IMAGE_FRAC, (2 - 1) << G_TEXTURE_IMAGE_FRAC); gDPSetTileSize(POLY_OPA_DISP++, 1, titleContext->uls, (titleContext->ult & 0x7F) - idx * 4, 0, 0); gSPTextureRectangle(POLY_OPA_DISP++, 388, y << 2, 1156, (y + 2) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); @@ -99,13 +100,13 @@ extern "C" void CustomLogoTitle_Draw(TitleContext* titleContext, uint8_t logoToD f32 scale = 0.4f; gSPSegment(POLY_OPA_DISP++, 0x08, - (uintptr_t)Gfx_TwoTexScroll(titleContext->state.gfxCtx, 0, 0, (0 - 1) % 128, 32, 32, 1, - 0, (1 * -2) % 128, 32, 32)); + (uintptr_t)Gfx_TwoTexScroll(titleContext->state.gfxCtx, 0, 0, (0 - 1) % 128, 32, 32, 1, 0, + (1 * -2) % 128, 32, 32)); Matrix_Translate(0.0f, -10.0f, 0.0f, MTXMODE_APPLY); Matrix_Scale(scale, scale, scale, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(titleContext->state.gfxCtx), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gDPSetEnvColor(POLY_OPA_DISP++, 0, 50, 100, 255); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gEffIceFragment3DL); } @@ -117,7 +118,7 @@ extern "C" void CustomLogoTitle_Draw(TitleContext* titleContext, uint8_t logoToD CLOSE_DISPS(titleContext->state.gfxCtx); } -#define CVAR_BOOTSEQUENCE_NAME CVAR_ENHANCEMENT("BootSequence") +#define CVAR_BOOTSEQUENCE_NAME CVAR_SETTING("BootSequence") #define CVAR_BOOTSEQUENCE_DEFAULT BOOTSEQUENCE_DEFAULT #define CVAR_BOOTSEQUENCE_VALUE CVarGetInteger(CVAR_BOOTSEQUENCE_NAME, CVAR_BOOTSEQUENCE_DEFAULT) @@ -150,7 +151,7 @@ extern "C" void CustomLogoTitle_Main(TitleContext* titleContext) { gSaveContext.natureAmbienceId = 0xFF; gSaveContext.gameMode = GAMEMODE_TITLE_SCREEN; titleContext->state.running = false; - + logosSeen++; if (CVAR_BOOTSEQUENCE_VALUE == BOOTSEQUENCE_DEFAULT && logosSeen == 1) { @@ -171,7 +172,7 @@ extern "C" void CustomLogoTitle_Main(TitleContext* titleContext) { // // // // // Always -// +// void OnZTitleInitReplaceTitleMainWithCustom(void* gameState) { TitleContext* titleContext = (TitleContext*)gameState; @@ -198,7 +199,7 @@ static RegisterShipInitFunc initFuncAlways(RegisterCustomLogoTitle); // // // // // // // Bootsequence -// +// void OnZTitleUpdateSkipToFileSelect(void* gameState) { TitleContext* titleContext = (TitleContext*)gameState; @@ -219,7 +220,7 @@ static RegisterShipInitFunc initFuncBootsequence(RegisterCustomLogoTitleBootsequ // // // // // // // Let it Snow -// +// #define CVAR_LETITSNOW_NAME CVAR_GENERAL("LetItSnow") #define CVAR_LETITSNOW_DEFAULT 0 diff --git a/soh/soh/Enhancements/cosmetics/NoMasterSword.cpp b/soh/soh/Enhancements/cosmetics/NoMasterSword.cpp index 4d4b267159..be011c675b 100644 --- a/soh/soh/Enhancements/cosmetics/NoMasterSword.cpp +++ b/soh/soh/Enhancements/cosmetics/NoMasterSword.cpp @@ -19,10 +19,10 @@ void UpdateNoMSPatch() { bool shouldPatch = (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_MASTER && gSaveContext.equips.buttonItems[0] != ITEM_SWORD_BGS && gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KNIFE && - (gSaveContext.equips.buttonItems[0] != ITEM_FISHING_POLE || - (!CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) && - !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON) && - !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)))); + (gSaveContext.equips.buttonItems[0] != ITEM_FISHING_POLE || + (!CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) && + !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON) && + !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)))); if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) && shouldPatch) { // Patching if conditions are met @@ -38,9 +38,12 @@ void UpdateNoMSPatch() { std::string patchName = "adultNoMS." + std::to_string(3) + "." + std::to_string(i); ResourceMgr_PatchGfxByName(gLinkAdultMirrorShieldSwordAndSheathFarDL, patchName.c_str(), i, gsDPNoOp()); } - ResourceMgr_PatchGfxByName(gLinkAdultHylianShieldSwordAndSheathNearDL, "adultNoMSHylianShield1", 75, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultHylianShieldSwordAndSheathFarDL, "adultNoMSHylianShield2", 71, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultMasterSwordAndSheathNearDL, "adultNoMasterSword1", 2, gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultHylianShieldSwordAndSheathNearDL, "adultNoMSHylianShield1", 75, + gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultHylianShieldSwordAndSheathFarDL, "adultNoMSHylianShield2", 71, + gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultMasterSwordAndSheathNearDL, "adultNoMasterSword1", 2, + gsSPEndDisplayList()); ResourceMgr_PatchGfxByName(gLinkAdultMasterSwordAndSheathFarDL, "adultNoMasterSword2", 2, gsSPEndDisplayList()); } else { // Unpatching if conditions are not met @@ -80,26 +83,27 @@ void RegisterNoMasterSword() { *should = false; } }); - + // skip post pedestal animation when we don't have a master sword COND_VB_SHOULD(VB_EXECUTE_PLAYER_STARTMODE_FUNC, IS_RANDO && MASTER_SWORD_SHUFFLED, { int32_t startMode = va_arg(args, int32_t); Player* player = GET_PLAYER(gPlayState); - if (startMode == PLAYER_START_MODE_TIME_TRAVEL && !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) { + if (startMode == PLAYER_START_MODE_TIME_TRAVEL && + !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) { // don't run the vanilla startMode func *should = false; - + // position link correctly Math_Vec3f_Copy(&player->actor.world.pos, &D_808546F4); player->yaw = player->actor.shape.rot.y = -0x8000; - + // execute the idle startMode func Player_StartMode_Idle(gPlayState, player); } }); - COND_HOOK(OnPlayerUpdate, IS_RANDO, []{ + COND_HOOK(OnPlayerUpdate, IS_RANDO, [] { static uint16_t lastItemOnB = gSaveContext.equips.buttonItems[0]; if (lastItemOnB != gSaveContext.equips.buttonItems[0]) { UpdateNoMSPatch(); diff --git a/soh/soh/Enhancements/cosmetics/TimeFlowFileSelect.cpp b/soh/soh/Enhancements/cosmetics/TimeFlowFileSelect.cpp new file mode 100644 index 0000000000..d33f4f7e8e --- /dev/null +++ b/soh/soh/Enhancements/cosmetics/TimeFlowFileSelect.cpp @@ -0,0 +1,20 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" SaveContext gSaveContext; + +static constexpr int32_t CVAR_TIMEFLOWFILESELECT_DEFAULT = 0; +#define CVAR_TIMEFLOWFILESELECT_NAME CVAR_ENHANCEMENT("TimeFlowFileSelect") +#define CVAR_TIMEFLOWFILESELECT_VALUE CVarGetInteger(CVAR_TIMEFLOWFILESELECT_NAME, CVAR_TIMEFLOWFILESELECT_DEFAULT) + +void OnFileChooseMainTimeFlowFileSelect(void* gameState) { + gSaveContext.skyboxTime += 0x10; +} + +void RegisterTimeFlowFileSelect() { + COND_HOOK(OnFileChooseMain, CVAR_TIMEFLOWFILESELECT_VALUE, OnFileChooseMainTimeFlowFileSelect); +} + +static RegisterShipInitFunc initFunc_TimeFlowFileSelect(RegisterTimeFlowFileSelect, { CVAR_TIMEFLOWFILESELECT_NAME }); diff --git a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp index 75f6bd35d3..b2b473166d 100644 --- a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp +++ b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp @@ -18,125 +18,212 @@ typedef struct { int startInstruction; } DListPatchInfo; -static DListPatchInfo freezardEffectDListPatchInfos[] = { - { gFreezardIntactDL, 5 }, - { gFreezardTopRightHornChippedDL, 5 }, - { gFreezardHeadChippedDL, 5 }, - { gFreezardIceTriangleDL, 5 }, +static DListPatchInfo freezardBodyDListPatchInfos[] = { + { gFreezardIntactDL, 5 }, { gFreezardTopRightHornChippedDL, 5 }, + { gFreezardHeadChippedDL, 5 }, { gFreezardIceTriangleDL, 5 }, { gFreezardIceRockDL, 5 }, }; static DListPatchInfo ironKnuckleDListPatchInfos[] = { + // VambraceLeft { object_ik_DL_01BE98, 39 }, { object_ik_DL_01BE98, 59 }, + // ArmLeft { object_ik_DL_01C130, 38 }, + // VambraceRight { object_ik_DL_01C2B8, 39 }, { object_ik_DL_01C2B8, 59 }, + // ArmRight { object_ik_DL_01C550, 38 }, + // Waist { object_ik_DL_01C7B8, 8 }, { object_ik_DL_01C7B8, 28 }, + // PauldronLeft { object_ik_DL_01CB58, 8 }, { object_ik_DL_01CB58, 31 }, + // BootTipLeft { object_ik_DL_01CCA0, 15 }, { object_ik_DL_01CCA0, 37 }, { object_ik_DL_01CCA0, 52 }, { object_ik_DL_01CCA0, 68 }, + // WaistArmorLeft { object_ik_DL_01CEE0, 27 }, { object_ik_DL_01CEE0, 46 }, { object_ik_DL_01CEE0, 125 }, + // PauldronRight { object_ik_DL_01D2B0, 8 }, { object_ik_DL_01D2B0, 32 }, - + + // BootTipRight { object_ik_DL_01D3F8, 15 }, { object_ik_DL_01D3F8, 37 }, { object_ik_DL_01D3F8, 52 }, { object_ik_DL_01D3F8, 68 }, + // WaistArmorRight { object_ik_DL_01D638, 23 }, { object_ik_DL_01D638, 42 }, { object_ik_DL_01D638, 110 }, }; +static DListPatchInfo arrowTipDListPatchInfos[] = { + { gArrowNearDL, 46 }, + { gArrowFarDL, 5 }, +}; + +void PatchArrowTipTexture() { + // Custom texture for Arrow tips that accounts for overflow texture reading + Gfx arrowTipTextureWithOverflowFixGfx = + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, gHilite2Tex_Overflow); + + // Gfx instructions to fix authentic vanilla bug where the Arrow tips texture is read as the wrong size + Gfx arrowTipTextureWithSizeFixGfx[] = { + gsDPLoadTextureBlock(gHilite2Tex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_MIRROR | G_TX_WRAP, 5, 5, 1, 1), + }; + + bool fixTexturesOOB = CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0); + + for (const auto& patchInfo : arrowTipDListPatchInfos) { + const char* dlist = patchInfo.dlist; + int start = patchInfo.startInstruction; + + // Patch using custom overflowed texture + if (!fixTexturesOOB) { + // Unpatch the other texture fix + for (size_t i = 4; i < 8; i++) { + int instruction = start + i; + std::string unpatchName = "arrowTipTextureWithSizeFix_" + std::to_string(instruction); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); + } + + std::string patchName = "arrowTipTextureWithOverflowFix_" + std::to_string(start); + std::string patchName2 = "arrowTipTextureWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, arrowTipTextureWithOverflowFixGfx); + ResourceMgr_PatchGfxByName(dlist, patchName2.c_str(), start + 1, gsSPNoOp()); + } else { // Patch texture to use correct image size/fmt + // Unpatch the other texture fix + std::string unpatchName = "arrowTipTextureWithOverflowFix_" + std::to_string(start); + std::string unpatchName2 = "arrowTipTextureWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName2.c_str()); + + for (size_t i = 4; i < 8; i++) { + int instruction = start + i; + std::string patchName = "arrowTipTextureWithSizeFix_" + std::to_string(instruction); + + if (i == 0) { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gsSPNoOp()); + } else { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, + arrowTipTextureWithSizeFixGfx[i - 1]); + } + } + } + } +} + void PatchDekuStickTextureOverflow() { // Custom texture for holding Deku Stick that accounts for overflow texture reading - Gfx gDekuStickOverflowTexFix = gsDPSetTextureImage(G_IM_FMT_I, G_IM_SIZ_8b, 1, gDekuStickOverflowTex); + Gfx dekuSticTexkWithOverflowFixGfx = gsDPSetTextureImage(G_IM_FMT_I, G_IM_SIZ_8b, 1, gDekuStickOverflowTex); // Gfx instructions to fix authentic vanilla bug where the Deku Stick texture is read as the wrong size - Gfx gDekuStickTexFix[] = { + Gfx dekuStickTexWithSizeFixGfx[] = { gsDPLoadTextureBlock(gDekuStickTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 8, 0, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMIRROR | G_TX_WRAP, 4, 4, G_TX_NOLOD, G_TX_NOLOD) + G_TX_NOMIRROR | G_TX_WRAP, 4, 4, G_TX_NOLOD, G_TX_NOLOD), }; const char* dlist = gLinkChildLinkDekuStickDL; int start = 5; + // Patch using custom overflowed texture if (!CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0)) { // Unpatch the other texture fix - for (size_t i = 0; i < 7; i++) { - int instruction = start + (i == 0 ? 0 : i + 1); - std::string unpatchName = "DekuStickFix" + std::to_string(instruction); + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string unpatchName = "dekuStickWithSizeFix_" + std::to_string(instruction); ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); } - std::string patchName = "DekuStickOverflow" + std::to_string(start); - ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, gDekuStickOverflowTexFix); - } else { + std::string patchName = "dekuStickWithOverflowFix_" + std::to_string(start); + std::string patchName2 = "dekuStickWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, dekuSticTexkWithOverflowFixGfx); + ResourceMgr_PatchGfxByName(dlist, patchName2.c_str(), start + 1, gsSPNoOp()); + } else { // Patch texture to use correct image size/fmt // Unpatch the other texture fix - std::string unpatchName = "DekuStickOverflow" + std::to_string(start); + std::string unpatchName = "dekuStickWithOverflowFix_" + std::to_string(start); + std::string unpatchName2 = "dekuStickWithOverflowFix_" + std::to_string(start + 1); ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); - - for (size_t i = 0; i < 7; i++) { - int instruction = start + (i == 0 ? 0 : i + 1); - std::string patchName = "DekuStickFix" + std::to_string(instruction); - ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gDekuStickTexFix[i]); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName2.c_str()); + + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string patchName = "dekuStickWithSizeFix_" + std::to_string(instruction); + + if (i == 0) { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gsSPNoOp()); + } else { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, dekuStickTexWithSizeFixGfx[i - 1]); + } } } } void PatchFreezardTextureOverflow() { // Custom texture for Freezard effect that accounts for overflow texture reading - Gfx gEffUnknown12OverflowTextFix = gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, gEffUnknown12OverflowTex); + Gfx freezardBodyTextureWithOverflowFixGfx = + gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, gEffUnknown12OverflowTex); // Gfx instructions to fix authentic vanilla bug where the Freezard effect texture is read as the wrong format - Gfx gEffUnknown12TexFix[] = { - gsDPLoadTextureBlock(gEffUnknown12Tex, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | - G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD) + Gfx freezardBodyTextureWithFormatFixGfx[] = { + gsDPLoadTextureBlock(gEffUnknown12Tex, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD), }; - for (const auto& patchInfo : freezardEffectDListPatchInfos) { + bool fixTexturesOOB = CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0); + + for (const auto& patchInfo : freezardBodyDListPatchInfos) { const char* dlist = patchInfo.dlist; int start = patchInfo.startInstruction; - char patchNameBuf[24]; - // Patch using custom overflowed texture - if (!CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0)) { + if (!fixTexturesOOB) { // Unpatch the other texture fix - for (size_t i = 0; i < 7; i++) { - int instruction = start + (i == 0 ? 0 : i + 1); - std::string unpatchName = "gEffUnknown12Fix" + std::to_string(instruction); + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string unpatchName = "freezardBodyTextureWithFormatFix_" + std::to_string(instruction); ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); } - std::string patchName = "gEffUnknown12Overflow" + std::to_string(start); - ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, gEffUnknown12OverflowTextFix); - } else { // Patch texture to use correct image size + std::string patchName = "freezardBodyTextureWithOverflowFix_" + std::to_string(start); + std::string patchName2 = "freezardBodyTextureWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, freezardBodyTextureWithOverflowFixGfx); + ResourceMgr_PatchGfxByName(dlist, patchName2.c_str(), start + 1, gsSPNoOp()); + } else { // Patch texture to use correct image size/fmt // Unpatch the other texture fix - std::string unpatchName = "gEffUnknown12Overflow" + std::to_string(start); + std::string unpatchName = "freezardBodyTextureWithOverflowFix_" + std::to_string(start); + std::string unpatchName2 = "freezardBodyTextureWithOverflowFix_" + std::to_string(start + 1); ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName2.c_str()); - for (size_t i = 0; i < 7; i++) { - int instruction = start + (i == 0 ? 0 : i + 1); - std::string patchName = "gEffUnknown12Fix" + std::to_string(instruction); - ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gEffUnknown12TexFix[i]); + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string patchName = "freezardBodyTextureWithFormatFix_" + std::to_string(instruction); + + if (i == 0) { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gsSPNoOp()); + } else { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, + freezardBodyTextureWithFormatFixGfx[i - 1]); + } } } } @@ -144,51 +231,74 @@ void PatchFreezardTextureOverflow() { void PatchIronKnuckleTextureOverflow() { // Custom texture for Iron Knuckle that accounts for overflow texture reading - Gfx gIronKnuckleMetalOverflowTexFix = gsDPSetTextureImage(G_IM_FMT_I, G_IM_SIZ_8b, 1, gIronKnuckleMetalOverflowTex); + Gfx ironKnuckleFireTexWithOverflowFixGfx = + gsDPSetTextureImage(G_IM_FMT_I, G_IM_SIZ_8b, 1, gIronKnuckleMetalOverflowTex); // Gfx instructions to fix authentic vanilla bug where the Iron Knuckle texture is read as the wrong format - Gfx gIronKnuckleMetalTexFix[] = { - gsDPLoadTextureBlock(gIronKnuckleMetalTex, G_IM_FMT_I, G_IM_SIZ_4b, 32, 64, 0, G_TX_MIRROR | G_TX_WRAP, - G_TX_MIRROR | G_TX_WRAP, 5, 6, G_TX_NOLOD, G_TX_NOLOD) + Gfx ironKnuckleFireTexWithFormatFixGfx[] = { + gsDPLoadTextureBlock_4b(gIronKnuckleMetalTex, G_IM_FMT_I, 32, 64, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_MIRROR | G_TX_WRAP, 5, 6, G_TX_NOLOD, G_TX_NOLOD), }; + bool fixTexturesOOB = CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0); + for (const auto& patchInfo : ironKnuckleDListPatchInfos) { const char* dlist = patchInfo.dlist; int start = patchInfo.startInstruction; - // OTRTODO: Patching to use the correct size format for Iron Knuckle causes a tile size failure - // Until this is solved, Iron Knuckle will be hardcoded to always display with the "authentic" texture fix - // Patch using custom overflowed texture - // if (!CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0)) { + if (!fixTexturesOOB) { // Unpatch the other texture fix - for (size_t i = 0; i < 7; i++) { - int instruction = start + (i == 0 ? 0 : i + 1); - std::string unpatchName = "MetalTexFix" + std::to_string(instruction); + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string unpatchName = "ironKnuckleFireTexWithSizeFix_" + std::to_string(instruction); ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); } - std::string patchName = "MetalTexOverflow" + std::to_string(start); - ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, gIronKnuckleMetalOverflowTexFix); - // } else { // Patch texture to use correct image size - // // Unpatch the other texture fix - // std::string unpatchName = "MetalTexOverflow" + std::to_string(start); - // ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); + std::string patchName = "ironKnuckleFireTexWithOverflowFix_" + std::to_string(start); + std::string patchName2 = "ironKnuckleFireTexWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, ironKnuckleFireTexWithOverflowFixGfx); + ResourceMgr_PatchGfxByName(dlist, patchName2.c_str(), start + 1, ironKnuckleFireTexWithOverflowFixGfx); + } else { // Patch texture to use correct image size/fmt + // Unpatch the other texture fix + std::string unpatchName = "ironKnuckleFireTexWithOverflowFix_" + std::to_string(start); + std::string unpatchName2 = "ironKnuckleFireTexWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName2.c_str()); - // // Patch texture to use correct image size - // for (size_t i = 0; i < 7; i++) { - // int instruction = start + (i == 0 ? 0 : i + 1); - // std::string patchName = "MetalTexFix" + std::to_string(instruction); - // ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gIronKnuckleMetalTexFix[i]); - // } - // } + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string patchName = "ironKnuckleFireTexWithSizeFix_" + std::to_string(instruction); + + if (i == 0) { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gsSPNoOp()); + } else { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, + ironKnuckleFireTexWithFormatFixGfx[i - 1]); + } + } + } } } +void PatchBoulderFragment() { + // The boulder fragment renders invisible due to the change made by https://github.com/Kenix3/libultraship/pull/721 + // Until it is known wether this change is approriate or something else should be done to it, the following patches + // adjust the render mode for the DL to not become invisible + ResourceMgr_PatchGfxByName(gBoulderFragmentsDL, "boulderFragmentRenderFix3", 3, + gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2)); + ResourceMgr_PatchGfxByName(gBoulderFragmentsDL, "boulderFragmentRenderFix6", 6, + gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2)); +} + void ApplyAuthenticGfxPatches() { + // Overflow textures + PatchArrowTipTexture(); PatchDekuStickTextureOverflow(); PatchFreezardTextureOverflow(); PatchIronKnuckleTextureOverflow(); + + PatchBoulderFragment(); } // Patches the Sold Out GI DL to render the texture in the mirror boundary @@ -240,7 +350,8 @@ void PatchMirroredSoldOutGI() { void PatchMirroredSunSongEtching() { // Only using these strings for graphics patching lookup, we don't need aligned assets here static const char gRoyalGraveBackRoomDL[] = "__OTR__scenes/shared/hakaana_ouke_scene/hakaana_ouke_room_2DL_005040"; - static const char gRoyalGraveBackRoomSongVtx[] = "__OTR__scenes/shared/hakaana_ouke_scene/hakaana_ouke_room_2Vtx_004F80"; + static const char gRoyalGraveBackRoomSongVtx[] = + "__OTR__scenes/shared/hakaana_ouke_scene/hakaana_ouke_room_2Vtx_004F80"; static Vtx* mirroredSunSongVtx; @@ -248,7 +359,7 @@ void PatchMirroredSunSongEtching() { // Only need to patch over the two SetTile commands to get the MIRROR effect Gfx mirroredSunSongTex[] = { gsDPLoadTextureBlock("", G_IM_FMT_IA, G_IM_SIZ_8b, 128, 32, 0, G_TX_MIRROR | G_TX_WRAP, - G_TX_NOMIRROR | G_TX_CLAMP, 7, 5, G_TX_NOLOD, G_TX_NOLOD) + G_TX_NOMIRROR | G_TX_CLAMP, 7, 5, G_TX_NOLOD, G_TX_NOLOD), }; if (CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0)) { @@ -266,7 +377,8 @@ void PatchMirroredSunSongEtching() { ResourceMgr_PatchGfxByName(gRoyalGraveBackRoomDL, "RoyalGraveSunSongTexture_1", 13, mirroredSunSongTex[1]); ResourceMgr_PatchGfxByName(gRoyalGraveBackRoomDL, "RoyalGraveSunSongTexture_2", 17, mirroredSunSongTex[5]); - ResourceMgr_PatchGfxByName(gRoyalGraveBackRoomDL, "RoyalGraveSunSongTextureCords_1", 24, gsSPVertex(mirroredSunSongVtx, 4, 0)); + ResourceMgr_PatchGfxByName(gRoyalGraveBackRoomDL, "RoyalGraveSunSongTextureCords_1", 24, + gsSPVertex(mirroredSunSongVtx, 4, 0)); // noop as the original vertex command is 128 bit wide ResourceMgr_PatchGfxByName(gRoyalGraveBackRoomDL, "RoyalGraveSunSongTextureCords_2", 25, gsSPNoOp()); } else { diff --git a/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h b/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h index 7fc454117c..fec112c42c 100644 --- a/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h +++ b/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h @@ -1,6 +1,6 @@ typedef enum { COLORSCHEME_N64, - COLORSCHEME_GAMECUBE + COLORSCHEME_GAMECUBE, } DefaultColorScheme; typedef enum { @@ -9,11 +9,11 @@ typedef enum { ENEMYHEALTH_ANCHOR_BOTTOM, } EnemyHealthBarAnchorType; -typedef enum { - ORIGINAL_LOCATION, - ANCHOR_LEFT, - ANCHOR_RIGHT, - ANCHOR_NONE, - HIDDEN, - ANCHOR_TO_LIFE_METER +typedef enum { + ORIGINAL_LOCATION, + ANCHOR_LEFT, + ANCHOR_RIGHT, + ANCHOR_NONE, + HIDDEN, + ANCHOR_TO_LIFE_METER, } PosType; diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index 4d4d27b3f5..0ebba19ec2 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -16,35 +16,24 @@ static const std::unordered_map textBoxSpecialCharacters = { { "è", 0x95 }, { "é", 0x96 }, { "ê", 0x97 }, { "ë", 0x98 }, { "ï", 0x99 }, { "ô", 0x9A }, { "ö", 0x9B }, { "ù", 0x9C }, { "û", 0x9D }, { "ü", 0x9E } }; -static const std::unordered_map percentColors = { { "w", QM_WHITE }, { "r", QM_RED }, { "g", QM_GREEN }, - { "b", QM_BLUE }, { "c", QM_LBLUE }, { "p", QM_PINK }, - { "y", QM_YELLOW }, { "B", QM_BLACK } }; +static const std::unordered_map percentColors = { + { "w", QM_WHITE }, { "r", QM_RED }, { "g", QM_GREEN }, { "b", QM_BLUE }, + { "c", QM_LBLUE }, { "p", QM_PINK }, { "y", QM_YELLOW }, { "B", QM_BLACK }, +}; -static const std::unordered_map colorToPercent = { { QM_WHITE, "%w" }, { QM_RED, "%r"}, { QM_GREEN, "%g" }, - { QM_BLUE, "%b" }, { QM_LBLUE, "%c"}, { QM_PINK, "%p" }, - { QM_YELLOW, "%y" }, { QM_BLACK, "%B" } }; +static const std::unordered_map colorToPercent = { + { QM_WHITE, "%w" }, { QM_RED, "%r" }, { QM_GREEN, "%g" }, { QM_BLUE, "%b" }, + { QM_LBLUE, "%c" }, { QM_PINK, "%p" }, { QM_YELLOW, "%y" }, { QM_BLACK, "%B" }, +}; static const std::unordered_map altarIcons = { - { "0", ITEM_KOKIRI_EMERALD }, - { "1", ITEM_GORON_RUBY }, - { "2", ITEM_ZORA_SAPPHIRE }, - { "8", ITEM_MEDALLION_LIGHT }, - { "3", ITEM_MEDALLION_FOREST }, - { "4", ITEM_MEDALLION_FIRE }, - { "5", ITEM_MEDALLION_WATER }, - { "6", ITEM_MEDALLION_SPIRIT }, - { "7", ITEM_MEDALLION_SHADOW }, - { "l", ITEM_ARROW_LIGHT }, - { "b", ITEM_KEY_BOSS }, - { "o", ITEM_SWORD_MASTER }, - { "c", ITEM_OCARINA_FAIRY }, - { "i", ITEM_OCARINA_TIME }, - { "L", ITEM_BOW_ARROW_LIGHT }, - { "k", ITEM_TUNIC_KOKIRI }, - { "m", ITEM_DUNGEON_MAP }, - { "C", ITEM_COMPASS }, - { "s", ITEM_SKULL_TOKEN }, - { "g", ITEM_MASK_GORON } + { "0", ITEM_KOKIRI_EMERALD }, { "1", ITEM_GORON_RUBY }, { "2", ITEM_ZORA_SAPPHIRE }, + { "8", ITEM_MEDALLION_LIGHT }, { "3", ITEM_MEDALLION_FOREST }, { "4", ITEM_MEDALLION_FIRE }, + { "5", ITEM_MEDALLION_WATER }, { "6", ITEM_MEDALLION_SPIRIT }, { "7", ITEM_MEDALLION_SHADOW }, + { "l", ITEM_ARROW_LIGHT }, { "b", ITEM_KEY_BOSS }, { "o", ITEM_SWORD_MASTER }, + { "c", ITEM_OCARINA_FAIRY }, { "i", ITEM_OCARINA_TIME }, { "L", ITEM_BOW_ARROW_LIGHT }, + { "k", ITEM_TUNIC_KOKIRI }, { "m", ITEM_DUNGEON_MAP }, { "C", ITEM_COMPASS }, + { "s", ITEM_SKULL_TOKEN }, { "g", ITEM_MASK_GORON }, }; static std::map pixelWidthTable = { @@ -72,19 +61,20 @@ static std::map pixelWidthTable = { { "í", 5 }, { "î", 5 }, { "ï", 5 }, { "ð", 7 }, { "ñ", 7 }, { "ò", 7 }, { "ó", 7 }, { "ô", 7 }, { "õ", 7 }, { "ö", 7 }, { "÷", 11 }, { "ø", 9 }, { "ù", 7 }, { "ú", 7 }, { "û", 7 }, { "ü", 7 }, { "ý", 8 }, { "þ", 8 }, { "ÿ", 8 }, { "Œ", 11 }, { "œ", 11 }, { "„", 5 }, { "”", 5 }, { "€", 10 }, - { "Ÿ", 10 }, { "~", 8 } + { "Ÿ", 10 }, { "~", 8 }, }; CustomMessage::CustomMessage(std::string english_, std::string german_, std::string french_, TextBoxType type_, TextBoxPosition position_) - : type(type_), position(position_){ + : type(type_), position(position_) { messages[LANGUAGE_ENG] = std::move(english_); messages[LANGUAGE_GER] = std::move(german_); messages[LANGUAGE_FRA] = std::move(french_); } -CustomMessage::CustomMessage(std::string english_, std::string german_, std::string french_, std::vector colors_, - std::vector capital_, TextBoxType type_, TextBoxPosition position_) { +CustomMessage::CustomMessage(std::string english_, std::string german_, std::string french_, + std::vector colors_, std::vector capital_, TextBoxType type_, + TextBoxPosition position_) { messages[LANGUAGE_ENG] = std::move(english_); messages[LANGUAGE_GER] = std::move(german_); messages[LANGUAGE_FRA] = std::move(french_); @@ -99,7 +89,8 @@ CustomMessage::CustomMessage(std::string english_, TextBoxType type_, TextBoxPos messages[LANGUAGE_ENG] = std::move(english_); } -CustomMessage::CustomMessage(std::string english_, std::vector colors_, std::vector capital_, TextBoxType type_, TextBoxPosition position_){ +CustomMessage::CustomMessage(std::string english_, std::vector colors_, std::vector capital_, + TextBoxType type_, TextBoxPosition position_) { messages[LANGUAGE_ENG] = std::move(english_); colors = colors_; capital = capital_; @@ -107,13 +98,50 @@ CustomMessage::CustomMessage(std::string english_, std::vector colo position = position_; } -CustomMessage::CustomMessage(Text text, TextBoxType type_,TextBoxPosition position_) +CustomMessage::CustomMessage(Text text, TextBoxType type_, TextBoxPosition position_) : type(type_), position(position_) { messages[LANGUAGE_ENG] = text.GetEnglish(); messages[LANGUAGE_GER] = text.GetGerman(); messages[LANGUAGE_FRA] = text.GetFrench(); } +typedef struct { + u16 textId; + u8 typePos; + const char* segment; + u32 msgSize; +} MessageTableEntry; + +extern "C" MessageTableEntry* sNesMessageEntryTablePtr; +extern "C" MessageTableEntry* sGerMessageEntryTablePtr; +extern "C" MessageTableEntry* sFraMessageEntryTablePtr; + +CustomMessage CustomMessage::LoadVanillaMessageTableEntry(uint16_t textId) { + const char* foundSeg; + const char* nextSeg; + MessageTableEntry* msgEntry = sNesMessageEntryTablePtr; + u16 bufferId = textId; + CustomMessage msg; + if (gSaveContext.language == LANGUAGE_GER) { + msgEntry = sGerMessageEntryTablePtr; + } else if (gSaveContext.language == LANGUAGE_FRA) { + msgEntry = sFraMessageEntryTablePtr; + } + while (msgEntry->textId != 0xFFFF) { + if (msgEntry->textId == bufferId) { + TextBoxPosition position = static_cast(msgEntry->typePos & 0xF); + TextBoxType type = static_cast(msgEntry->typePos >> 4); + // uint8_t icon = msgEntry->segment[1]; + std::string message = std::string(msgEntry->segment, msgEntry->msgSize); + msg = CustomMessage(message, type, position); + // msg.Format(static_cast(icon)); + return msg; + } + msgEntry++; + } + return CustomMessage(); +} + const std::string CustomMessage::GetEnglish(MessageFormat format) const { return GetForLanguage(LANGUAGE_ENG, format); } @@ -127,31 +155,32 @@ const std::string CustomMessage::GetFrench(MessageFormat format) const { } const std::string CustomMessage::GetForCurrentLanguage(MessageFormat format) const { - return GetForLanguage(gSaveContext.language, format); + return GetForLanguage( + ((Language)gSaveContext.language == LANGUAGE_JPN) ? LANGUAGE_ENG : (Language)gSaveContext.language, format); } const std::string CustomMessage::GetForLanguage(uint8_t language, MessageFormat format) const { - std::string output = messages[language].length() > 0 ? messages[language] : messages[LANGUAGE_ENG]; + std::string output = !messages[language].starts_with(TODO_TRANSLATE) ? messages[language] : messages[LANGUAGE_ENG]; ProcessMessageFormat(output, format); return output; } -const std::vector CustomMessage::GetAllMessages(MessageFormat format) const{ +const std::vector CustomMessage::GetAllMessages(MessageFormat format) const { std::vector output = messages; - for (auto str : output){ + for (auto str : output) { ProcessMessageFormat(str, format); } return output; } void CustomMessage::ProcessMessageFormat(std::string& str, MessageFormat format) const { - if (format == MF_FORMATTED){ + if (format == MF_FORMATTED) { FormatString(str); - } else if (format == MF_CLEAN){ + } else if (format == MF_CLEAN) { CleanString(str); - } else if (format == MF_AUTO_FORMAT){ + } else if (format == MF_AUTO_FORMAT) { AutoFormatString(str); - }else if (format == MF_ENCODE){ + } else if (format == MF_ENCODE) { EncodeColors(str); } } @@ -160,14 +189,14 @@ const std::vector& CustomMessage::GetCapital() const { return capital; } -void CustomMessage::SetCapital(std::vector capital_){ +void CustomMessage::SetCapital(std::vector capital_) { capital = capital_; } const std::vector& CustomMessage::GetColors() const { return colors; } -void CustomMessage::SetColors(std::vector colors_){ +void CustomMessage::SetColors(std::vector colors_) { colors = colors_; } @@ -175,7 +204,7 @@ const TextBoxType& CustomMessage::GetTextBoxType() const { return type; } -void CustomMessage::SetTextBoxType(TextBoxType boxType){ +void CustomMessage::SetTextBoxType(TextBoxType boxType) { type = boxType; } @@ -186,19 +215,19 @@ const TextBoxPosition& CustomMessage::GetTextBoxPosition() const { CustomMessage CustomMessage::operator+(const CustomMessage& right) const { std::vector newColors = colors; std::vector rColors = right.GetColors(); - for (auto color: rColors){ + for (auto color : rColors) { newColors.push_back(color); } std::vector newCapital = capital; newCapital.insert(newCapital.end(), right.GetCapital().begin(), right.GetCapital().end()); return CustomMessage(messages[LANGUAGE_ENG] + right.GetEnglish(MF_RAW), messages[LANGUAGE_GER] + right.GetGerman(MF_RAW), - messages[LANGUAGE_FRA] + right.GetFrench(MF_RAW), - newColors, newCapital, type, position); + messages[LANGUAGE_FRA] + right.GetFrench(MF_RAW), newColors, newCapital, type, position); } CustomMessage CustomMessage::operator+(const std::string& right) const { - return CustomMessage(messages[LANGUAGE_ENG] + right, messages[LANGUAGE_GER] + right, messages[LANGUAGE_FRA] + right); + return CustomMessage(messages[LANGUAGE_ENG] + right, messages[LANGUAGE_GER] + right, + messages[LANGUAGE_FRA] + right); } void CustomMessage::operator+=(const CustomMessage& right) { @@ -220,8 +249,8 @@ bool CustomMessage::operator==(const CustomMessage& operand) const { } bool CustomMessage::operator==(const std::string& operand) const { - for (auto str: messages){ - if (str == operand){ + for (auto str : messages) { + if (str == operand) { return true; } } @@ -243,17 +272,21 @@ void CustomMessage::Replace(std::string&& oldStr, std::string&& newStr) { } void CustomMessage::Replace(std::string&& oldStr, CustomMessage newMessage) { - for (uint8_t language = 0; language < LANGUAGE_MAX; language++) { + for (uint8_t language = 0; language < LANGUAGE_MAX - 1; language++) { size_t position = messages[language].find(oldStr); + std::string newMsg = newMessage.messages[language]; + if (language != LANGUAGE_ENG && newMsg == TODO_TRANSLATE) { + newMsg = newMessage.messages[LANGUAGE_ENG]; + } while (position != std::string::npos) { - messages[language].replace(position, oldStr.length(), newMessage.messages[language]); + messages[language].replace(position, oldStr.length(), newMsg); position = messages[language].find(oldStr); } } } void CustomMessage::Format(ItemID iid) { - for (std::string &str : messages) { + for (std::string& str : messages) { str.insert(0, ITEM_OBTAINED(iid)); size_t start_pos = 0; std::replace(str.begin(), str.end(), '&', NEWLINE()[0]); @@ -303,7 +336,7 @@ void CustomMessage::FormatString(std::string& str) const { str += MESSAGE_END(); } -void DeleteControlCode(std::string& str, std::string code){ +void DeleteControlCode(std::string& str, std::string code) { size_t start_pos = 0; while ((start_pos = str.find(code, start_pos)) != std::string::npos) { str.replace(start_pos, code.length(), ""); @@ -324,56 +357,57 @@ void CustomMessage::CleanString(std::string& str) const { } static size_t NextLineLength(const std::string* textStr, const size_t lastNewline, bool hasIcon = false) { - const size_t maxLinePixelWidth = hasIcon ? 200 : 216; + const size_t maxLinePixelWidth = hasIcon ? 200 : 216; - size_t totalPixelWidth = 0; - size_t currentPos = lastNewline; + size_t totalPixelWidth = 0; + size_t currentPos = lastNewline; - // Looping through the string from the lastNewline until the total - // width of counted characters exceeds the maximum pixels in a line. - size_t nextPosJump = 0; - while (totalPixelWidth < maxLinePixelWidth && currentPos < textStr->length()) { - // Skip over control codes - if (textStr->at(currentPos) == '%') { - nextPosJump = 2; - } else if (textStr->at(currentPos) == '$') { - nextPosJump = 2; - } else if (textStr->at(currentPos) == '@') { - nextPosJump = 1; - // Assume worst case for player name 12 * 8 (widest character * longest name length) - totalPixelWidth += 96; - } else if (textStr->at(currentPos) == '\x05') { - // Skip colour control characters. - nextPosJump = 2; - } else if (textStr->at(currentPos) == '\x1E') { - //For the high score char, we have to take the next Char, then use that to get a worst case scenario. - if (textStr->at(currentPos+1) == '\x01'){ - totalPixelWidth += 28; - } - nextPosJump = 2; - } else { - // Some characters only one byte while others are two bytes - // So check both possibilities when checking for a character - if (pixelWidthTable.count(textStr->substr(currentPos, 1))) { - totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 1)]; - nextPosJump = 1; - } else if (pixelWidthTable.count(textStr->substr(currentPos, 2))) { - totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 2)]; - nextPosJump = 2; - } else { - SPDLOG_DEBUG("Table does not contain " + textStr->substr(currentPos, 1) + "/" + textStr->substr(currentPos, 2)); - SPDLOG_DEBUG("Full string: " + *textStr); - nextPosJump = 1; - } + // Looping through the string from the lastNewline until the total + // width of counted characters exceeds the maximum pixels in a line. + size_t nextPosJump = 0; + while (totalPixelWidth < maxLinePixelWidth && currentPos < textStr->length()) { + // Skip over control codes + if (textStr->at(currentPos) == '%') { + nextPosJump = 2; + } else if (textStr->at(currentPos) == '$') { + nextPosJump = 2; + } else if (textStr->at(currentPos) == '@') { + nextPosJump = 1; + // Assume worst case for player name 12 * 8 (widest character * longest name length) + totalPixelWidth += 96; + } else if (textStr->at(currentPos) == '\x05') { + // Skip colour control characters. + nextPosJump = 2; + } else if (textStr->at(currentPos) == '\x1E') { + // For the high score char, we have to take the next Char, then use that to get a worst case scenario. + if (textStr->at(currentPos + 1) == '\x01') { + totalPixelWidth += 28; + } + nextPosJump = 2; + } else { + // Some characters only one byte while others are two bytes + // So check both possibilities when checking for a character + if (pixelWidthTable.count(textStr->substr(currentPos, 1))) { + totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 1)]; + nextPosJump = 1; + } else if (pixelWidthTable.count(textStr->substr(currentPos, 2))) { + totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 2)]; + nextPosJump = 2; + } else { + SPDLOG_DEBUG("Table does not contain " + textStr->substr(currentPos, 1) + "/" + + textStr->substr(currentPos, 2)); + SPDLOG_DEBUG("Full string: " + *textStr); + nextPosJump = 1; + } + } + currentPos += nextPosJump; + } + // return the total number of characters we looped through + if (totalPixelWidth > maxLinePixelWidth && textStr->at(currentPos - nextPosJump) != ' ') { + return currentPos - lastNewline - nextPosJump; + } else { + return currentPos - lastNewline; } - currentPos += nextPosJump; - } - // return the total number of characters we looped through - if (totalPixelWidth > maxLinePixelWidth && textStr->at(currentPos - nextPosJump) != ' ') { - return currentPos - lastNewline - nextPosJump; - } else { - return currentPos - lastNewline; - } } size_t CustomMessage::FindNEWLINE(std::string& str, size_t lastNewline) const { @@ -435,6 +469,27 @@ size_t CustomMessage::FindNEWLINE(std::string& str, size_t lastNewline) const { return newLine; } +bool CustomMessage::AddBreakString(std::string& str, size_t pos, std::string breakString) const { + if (str[pos] == ' ' || str[pos] == '&') { + str.replace(pos, 1, breakString); + return false; + } else { + if (pos <= str.size() - 1) { + // If the next char is a new textbox, it has priority, ignore whatever we are replacing it with + if (str[pos + 1] == '^') { + return false; + // otherwise, if it is a line break or space, replace it + } else if (str[pos + 1] == ' ' || str[pos + 1] == '&') { + str.replace(pos + 1, 1, breakString); + return false; + } + } + // otherwise insert after it + str.insert(pos + 1, breakString); + return true; + } +} + void CustomMessage::AutoFormatString(std::string& str) const { ReplaceAltarIcons(str); ReplaceColors(str); @@ -447,22 +502,21 @@ void CustomMessage::AutoFormatString(std::string& str) const { while (lastNewline + lineLength < str.length() || yesNo != std::string::npos) { const size_t carrot = str.find('^', lastNewline); const size_t ampersand = str.find('&', lastNewline); - const size_t lastSpace = str.rfind(' ', lastNewline + lineLength); size_t waitForInput = str.find(WAIT_FOR_INPUT()[0], lastNewline); size_t newLine = FindNEWLINE(str, lastNewline); - if (carrot < waitForInput){ + if (carrot < waitForInput) { waitForInput = carrot; } - if (ampersand < newLine){ + if (ampersand < newLine) { newLine = ampersand; } - if (lineCount != 3 && yesNo < lastNewline + lineLength && yesNo < waitForInput && yesNo < newLine){ - if (lineCount >= 4){ + if (lineCount != 3 && yesNo < lastNewline + lineLength && yesNo < waitForInput && yesNo < newLine) { + if (lineCount >= 4) { str.replace(yesNo, 1, "^&&\x1B"); lineCount = 3; lastNewline = yesNo + 3; } else { - while(lineCount < 3){ + while (lineCount < 3) { str.replace(yesNo, 1, "&\x1B"); yesNo++; lineCount++; @@ -470,7 +524,7 @@ void CustomMessage::AutoFormatString(std::string& str) const { lastNewline = yesNo; } } else { - if (lineCount < 4){ + if (lineCount < 4) { // replace '&' first if it's within the newline range if (newLine < lastNewline + lineLength) { lastNewline = newLine + 1; @@ -479,21 +533,33 @@ void CustomMessage::AutoFormatString(std::string& str) const { lastNewline = waitForInput + 1; lineCount = 0; // some lines need to be split but don't have spaces, look for periods instead - } else if (lastSpace == std::string::npos) { - const size_t lastPeriod = str.rfind('.', lastNewline + lineLength); - str.replace(lastPeriod, 1, ".&"); - lastNewline = lastPeriod + 2; } else { - str.replace(lastSpace, 1, "&"); - lastNewline = lastSpace + 1; + const size_t lastBreak = + str.find_last_of(static_cast(".,!?- "), lastNewline + lineLength); + // if none exist or we go backwards, we look forward for a something and allow the overflow + if (lastBreak == std::string::npos || lastBreak < lastNewline) { + const size_t nextBreak = str.find_first_of(static_cast(".,!?- &^"), lastNewline); + if (str[nextBreak] == '^') { + lastNewline = nextBreak + 1; + lineCount = 0; // increments to 1 at the end + } else if (str[nextBreak] == '&') { + lastNewline = nextBreak + 1; + } else { + bool isAdded = AddBreakString(str, nextBreak, "&"); + lastNewline = nextBreak + 1 + isAdded; + } + } else { + bool isAdded = AddBreakString(str, lastBreak, "&"); + lastNewline = lastBreak + 1 + isAdded; + } } lineCount += 1; - } else { + } else { const size_t lastColor = str.rfind("\x05"s, lastNewline + lineLength); std::string colorText = ""; - //check if we are on a non default colour, as ^ resets it, and readd if needed - if (lastColor != std::string::npos && str[lastColor+1] != 0){ - colorText = "\x05"s + str[lastColor+1]; + // check if we are on a non default colour, as ^ resets it, and readd if needed + if (lastColor != std::string::npos && str[lastColor + 1] != 0) { + colorText = "\x05"s + str[lastColor + 1]; } // replace '&' first if it's within the newline range if (ampersand < lastNewline + lineLength) { @@ -502,14 +568,23 @@ void CustomMessage::AutoFormatString(std::string& str) const { // or move the lastNewline cursor to the next line if a '^' is encountered. } else if (carrot < lastNewline + lineLength) { lastNewline = carrot + 1; - // some lines need to be split but don't have spaces, look for periods instead - } else if (lastSpace == std::string::npos) { - const size_t lastPeriod = str.rfind('.', lastNewline + lineLength); - str.replace(lastPeriod, 1, ".^" + colorText); - lastNewline = lastPeriod + 2; + // some lines need to be split but don't have spaces, look for punctuation instead } else { - str.replace(lastSpace, 1, "^" + colorText); - lastNewline = lastSpace + 1; + const size_t lastBreak = + str.find_last_of(static_cast(".,!?- &"), lastNewline + lineLength); + // if none exist or we go backwards, we look forward for a something and allow the overflow + if (lastBreak == std::string::npos || lastBreak < lastNewline) { + const size_t nextBreak = str.find_first_of(static_cast(".,!?- &^"), lastNewline); + if (str[nextBreak] == '^') { + lastNewline = nextBreak + 1; + } else { + bool isAdded = AddBreakString(str, nextBreak, "^" + colorText); + lastNewline = nextBreak + 1 + isAdded; + } + } else { + bool isAdded = AddBreakString(str, lastBreak, "^" + colorText); + lastNewline = lastBreak + 1 + isAdded; + } } lineCount = 1; } @@ -526,7 +601,7 @@ void CustomMessage::AutoFormatString(std::string& str) const { str += MESSAGE_END(); } -void CustomMessage::InsertNumber(uint8_t num){ +void CustomMessage::InsertNumber(uint8_t num) { for (std::string& str : messages) { size_t firstBar = str.find('|'); if (firstBar != std::string::npos) { @@ -543,11 +618,33 @@ void CustomMessage::InsertNumber(uint8_t num){ } } } - //remove the remaining bar + // remove the remaining bar this->Replace("|", ""); Replace("[[d]]", std::to_string(num)); } +void CustomMessage::SetSingularPlural() { + for (std::string& str : messages) { + size_t firstBar = str.find('|'); + if (firstBar != std::string::npos) { + size_t euroSign = str.find("€"); + size_t secondBar = str.find('|', firstBar + 1); + if (secondBar != std::string::npos) { + size_t thirdBar = str.find('|', secondBar + 1); + if (thirdBar != std::string::npos) { + if (euroSign == std::string::npos) { + str.erase(secondBar, thirdBar - secondBar); + } else { + str.erase(firstBar, secondBar - firstBar); + } + } + } + } + } + // remove the remaining bar + this->Replace("|", ""); + this->Replace("€", ""); +} void CustomMessage::Capitalize() { for (std::string str : messages) { @@ -587,7 +684,7 @@ const char* Interface_ReplaceSpecialCharacters(char text[]) { } void CustomMessage::EncodeColors(std::string& str) const { - for (std::string color: colors) { + for (std::string color : colors) { if (const size_t firstHashtag = str.find('#'); firstHashtag != std::string::npos) { str.replace(firstHashtag, 1, colorToPercent.at(color)); if (const size_t secondHashtag = str.find('#', firstHashtag + 1); secondHashtag != std::string::npos) { @@ -626,13 +723,13 @@ void CustomMessage::ReplaceAltarIcons(std::string& str) const { } } -void CustomMessage::InsertNames(std::vector toInsert){ - for(uint8_t a = 0; a < toInsert.size(); a++){ +void CustomMessage::InsertNames(std::vector toInsert) { + for (uint8_t a = 0; a < toInsert.size(); a++) { CustomMessage temp = toInsert[a]; - if ((capital.size() > a) && (capital[a] = true)){ + if ((capital.size() > a) && (capital[a] = true)) { temp.Capitalize(); - } - Replace("[[" + std::to_string(a+1) + "]]", temp); + } + Replace("[[" + std::to_string(a + 1) + "]]", temp); } } @@ -697,16 +794,16 @@ CustomMessage CustomMessageManager::RetrieveMessage(std::string tableID, uint16_ } CustomMessage message = foundMessage->second; - if (format == MF_FORMATTED){ + if (format == MF_FORMATTED) { message.Format(); - } else if (format == MF_AUTO_FORMAT){ + } else if (format == MF_AUTO_FORMAT) { message.AutoFormat(); - } else if (format == MF_CLEAN){ + } else if (format == MF_CLEAN) { message.Clean(); - } else if (format == MF_ENCODE){ + } else if (format == MF_ENCODE) { message.Encode(); } - + return message; } @@ -720,7 +817,7 @@ bool CustomMessageManager::ClearMessageTable(std::string tableID) { return true; } -bool CustomMessageManager::AddCustomMessageTable(std::string tableID) { +bool CustomMessageManager::AddCustomMessageTable(std::string tableID) { CustomMessageTable newMessageTable; return messageTables.emplace(tableID, newMessageTable).second; } diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index e8a9690649..51bb84eb88 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -6,6 +6,7 @@ #include #include "../../../include/z64item.h" +#include "../../../include/z64.h" #include "../../../include/message_data_textbox_types.h" #include "../randomizer/3drando/text.hpp" @@ -20,7 +21,7 @@ #define QM_YELLOW "\x46" #define QM_BLACK "\x47" -#define HS_HORSE_ARCHERY "\x00"s //HS_HBA is an enum already +#define HS_HORSE_ARCHERY "\x00"s // HS_HBA is an enum already typedef enum { MF_FORMATTED, @@ -41,19 +42,24 @@ class CustomMessage { CustomMessage() = default; CustomMessage(std::string english_, std::string german_, std::string french_, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); - CustomMessage(std::string english_, std::string german_, std::string french_, std::vector colors_, std::vector capital_ = {}, - TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); - CustomMessage(std::string english_, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); - CustomMessage(std::string english_, std::vector colors_, std::vector capital_ = {}, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); + CustomMessage(std::string english_, std::string german_, std::string french_, std::vector colors_, + std::vector capital_ = {}, TextBoxType type_ = TEXTBOX_TYPE_BLACK, + TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); + CustomMessage(std::string english_, TextBoxType type_ = TEXTBOX_TYPE_BLACK, + TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); + CustomMessage(std::string english_, std::vector colors_, std::vector capital_ = {}, + TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); CustomMessage(Text text, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); - static std::string MESSAGE_END() ; - static std::string ITEM_OBTAINED(uint8_t x) ; - static std::string NEWLINE() ; - static std::string COLOR(std::string x) ; - static std::string POINTS(std::string x) ;//HIGH_SCORE is also a macro - static std::string WAIT_FOR_INPUT() ; - static std::string PLAYER_NAME() ; + static CustomMessage LoadVanillaMessageTableEntry(uint16_t textId); + + static std::string MESSAGE_END(); + static std::string ITEM_OBTAINED(uint8_t x); + static std::string NEWLINE(); + static std::string COLOR(std::string x); + static std::string POINTS(std::string x); // HIGH_SCORE is also a macro + static std::string WAIT_FOR_INPUT(); + static std::string PLAYER_NAME(); const std::string GetEnglish(MessageFormat format = MF_FORMATTED) const; const std::string GetFrench(MessageFormat format = MF_FORMATTED) const; @@ -147,6 +153,13 @@ class CustomMessage { */ void InsertNumber(uint8_t num); + /** + * @brief A € sign at the end of an item name signals that it is plural. + * If a hint text has |singular|plural| forms specified, the unused one get's deleted. + * If no € sign is present, the singular form is used. + */ + void SetSingularPlural(); + /** * @brief Replaces various symbols with the control codes necessary to * display them in OoT's textboxes. i.e. special characters, colors, newlines, @@ -155,13 +168,13 @@ class CustomMessage { void Format(); /** - * @brief formats the message specifically to fit in OoT's + * @brief formats the message specifically to fit in OoT's * textboxes, and use it's formatting. */ void AutoFormat(); /** - * @brief Removes all OoT formatting from the message, + * @brief Removes all OoT formatting from the message, * making it a good form for writing into spoiler logs. */ void Clean(); @@ -177,15 +190,26 @@ class CustomMessage { * . i.e. special characters, colors, newlines, wait for input, etc. */ void FormatString(std::string& str) const; - + /** * @brief finds NEWLINEs in a string, while filtering * /x01's that are used as opperands */ size_t FindNEWLINE(std::string& str, size_t lastNewline) const; - + /** - * @brief formats the string specifically to fit in OoT's + * @brief Inserts a string into another string, following the rules + * of auto-format inserting new lines: spaces and & are replaced while + * other chars are appended to. + * + * @param str the string we are inserting into + * @param pos the position in the string to insert + * @param breakString the string we are inserting + */ + bool AddBreakString(std::string& str, size_t pos, std::string breakString) const; + + /** + * @brief formats the string specifically to fit in OoT's * textboxes, and use it's formatting. * RANDOTODO whoever knows exactly what this does check my adaption */ @@ -198,7 +222,7 @@ class CustomMessage { void CleanString(std::string& str) const; private: - std::vector messages = {"","",""}; + std::vector messages = { "", TODO_TRANSLATE, TODO_TRANSLATE }; TextBoxType type = TEXTBOX_TYPE_BLACK; TextBoxPosition position = TEXTBOX_POS_BOTTOM; std::vector colors = {}; diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index 4a039987ed..b5bc0fd6e8 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -11,7 +11,7 @@ typedef enum { TEXT_SKULLTULA_PEOPLE_STARTING_TO_WEAKEN = 0x0024, TEXT_SKULLTULA_PEOPLE_WE_LOOK_LIKE_THIS = 0x0025, TEXT_SKULLTULA_PEOPLE_GS_TUTORIAL = 0x0026, - TEXT_SKULLTULA_PEOPLE_MAKE_YOU_VERY_RICH = 0x0027, + TEXT_SKULLTULA_PEOPLE_MAKE_YOU_VERY_RICH = 0x0027, TEXT_SKULLTULA_PEOPLE_CURSE_HAS_BEEN_BROKEN = 0x0028, TEXT_SKULLTULA_PEOPLE_SAVING_MY_KIDS = 0x0029, TEXT_ITEM_KEY_SMALL = 0x0060, @@ -96,7 +96,7 @@ typedef enum { TEXT_MALON_HOW_IS_EPONA_DOING = 0x2001, TEXT_MALON_EPONA_LOOKS_GREAT = 0x2002, TEXT_MALON_OBSTICLE_COURSE = 0x2003, - TEXT_MALON_EVERYONE_TURNING_EVIL = 0x204C, + TEXT_MALON_EVERYONE_TURNING_EVIL = 0x204C, TEXT_MALON_I_SING_THIS_SONG = 0x2050, TEXT_MALON_EVERYONE_LIKED_SONG = 0x2051, TEXT_MALON_EPONA_LIKED_SONG = 0x2052, @@ -162,6 +162,8 @@ typedef enum { TEXT_ANJU_THANKS_FOR_FINDING_MY_CUCCOS = 0x503B, TEXT_ANJU_ROUND_THEM_UP_OR_YOULL_PAY = 0x503C, TEXT_ANJU_DONT_TEASE_MY_CUCCOS = 0x503D, + TEXT_BIG_POE_COLLECTED_RANDO = 0x5090, + TEXT_GERUDO_GUARD_FRIENDLY = 0x6005, TEXT_HBA_NOT_ON_HORSE = 0x603F, TEXT_HBA_INITIAL_EXPLAINATION = 0x6040, TEXT_HBA_WANT_TO_TRY_AGAIN_YES_NO = 0x6041, @@ -211,6 +213,6 @@ typedef struct { { giid, iid, message, message, message } #define GIMESSAGE_NO_GERMAN(giid, iid, english, french) \ - { giid, iid, english, english, french } + { giid, iid, english, english, french } #endif diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 57852fb634..c609dd2a19 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -11,6 +11,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/cosmetics/CosmeticsEditor.h" #include "soh/Enhancements/audio/AudioEditor.h" +#include "soh/Enhancements/randomizer/logic.h" #define Path _Path #define PATH_HACK @@ -36,10 +37,17 @@ extern PlayState* gPlayState; #define CMD_REGISTER Ship::Context::GetInstance()->GetConsole()->AddCommand // TODO: Commands should be using the output passed in. -#define ERROR_MESSAGE std::reinterpret_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->SendErrorMessage -#define INFO_MESSAGE std::reinterpret_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->SendInfoMessage +#define ERROR_MESSAGE \ + std::reinterpret_pointer_cast( \ + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console")) \ + ->SendErrorMessage +#define INFO_MESSAGE \ + std::reinterpret_pointer_cast( \ + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console")) \ + ->SendInfoMessage -static bool ActorSpawnHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool ActorSpawnHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if ((args.size() != 9) && (args.size() != 3) && (args.size() != 6)) { ERROR_MESSAGE("Not enough arguments passed to actorspawn"); return 1; @@ -79,6 +87,7 @@ static bool ActorSpawnHandler(std::shared_ptr Console, const std: if (args[8][0] != ',') { spawnPoint.rot.z = std::stoi(args[8]); } + [[fallthrough]]; case 6: if (args[3][0] != ',') { spawnPoint.pos.x = std::stoi(args[3]); @@ -99,7 +108,8 @@ static bool ActorSpawnHandler(std::shared_ptr Console, const std: return 0; } -static bool KillPlayerHandler(std::shared_ptr Console, const std::vector&, std::string* output) { +static bool KillPlayerHandler(std::shared_ptr Console, const std::vector&, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::SetPlayerHealth(); dynamic_cast(effect)->parameters[0] = 0; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -112,7 +122,8 @@ static bool KillPlayerHandler(std::shared_ptr Console, const std: } } -static bool SetPlayerHealthHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool SetPlayerHealthHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -143,7 +154,8 @@ static bool SetPlayerHealthHandler(std::shared_ptr Console, const } } -static bool LoadSceneHandler(std::shared_ptr Console, const std::vector&, std::string* output) { +static bool LoadSceneHandler(std::shared_ptr Console, const std::vector&, + std::string* output) { gSaveContext.respawnFlag = 0; gSaveContext.seqId = 0xFF; gSaveContext.gameMode = GAMEMODE_NORMAL; @@ -151,7 +163,8 @@ static bool LoadSceneHandler(std::shared_ptr Console, const std:: return 0; } -static bool RupeeHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool RupeeHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { return 1; } @@ -159,8 +172,7 @@ static bool RupeeHandler(std::shared_ptr Console, const std::vect int rupeeAmount; try { rupeeAmount = std::stoi(args[1]); - } - catch (std::invalid_argument const& ex) { + } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Rupee count must be an integer."); return 1; } @@ -170,13 +182,14 @@ static bool RupeeHandler(std::shared_ptr Console, const std::vect return 1; } - gSaveContext.rupees = rupeeAmount; + gSaveContext.rupees = rupeeAmount; INFO_MESSAGE("Set rupee count to %u", rupeeAmount); return 0; } -static bool SetPosHandler(std::shared_ptr Console, const std::vector args, std::string* output) { +static bool SetPosHandler(std::shared_ptr Console, const std::vector args, + std::string* output) { if (gPlayState == nullptr) { ERROR_MESSAGE("PlayState == nullptr"); return 1; @@ -185,9 +198,8 @@ static bool SetPosHandler(std::shared_ptr Console, const std::vec Player* player = GET_PLAYER(gPlayState); if (args.size() == 1) { - INFO_MESSAGE("Player position is [ %.2f, %.2f, %.2f ]", player->actor.world.pos.x, - player->actor.world.pos.y, - player->actor.world.pos.z); + INFO_MESSAGE("Player position is [ %.2f, %.2f, %.2f ]", player->actor.world.pos.x, player->actor.world.pos.y, + player->actor.world.pos.z); return 0; } if (args.size() < 4) @@ -197,9 +209,8 @@ static bool SetPosHandler(std::shared_ptr Console, const std::vec player->actor.world.pos.y = std::stof(args[2]); player->actor.world.pos.z = std::stof(args[3]); - INFO_MESSAGE("Set player position to [ %.2f, %.2f, %.2f ]", player->actor.world.pos.x, - player->actor.world.pos.y, - player->actor.world.pos.z); + INFO_MESSAGE("Set player position to [ %.2f, %.2f, %.2f ]", player->actor.world.pos.x, player->actor.world.pos.y, + player->actor.world.pos.z); return 0; } @@ -214,14 +225,13 @@ static bool ResetHandler(std::shared_ptr Console, std::vector ammoItems{ - { "sticks", ITEM_STICK }, { "nuts", ITEM_NUT }, - { "bombs", ITEM_BOMB }, { "seeds", ITEM_SLINGSHOT }, - { "arrows", ITEM_BOW }, { "bombchus", ITEM_BOMBCHU }, - { "beans", ITEM_BEAN } +const static std::map ammoItems{ + { "sticks", ITEM_STICK }, { "nuts", ITEM_NUT }, { "bombs", ITEM_BOMB }, { "seeds", ITEM_SLINGSHOT }, + { "arrows", ITEM_BOW }, { "bombchus", ITEM_BOMBCHU }, { "beans", ITEM_BEAN }, }; -static bool AddAmmoHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool AddAmmoHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 3) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -242,7 +252,8 @@ static bool AddAmmoHandler(std::shared_ptr Console, const std::ve const auto& it = ammoItems.find(args[1]); if (it == ammoItems.end()) { - ERROR_MESSAGE("Invalid ammo type. Options are 'sticks', 'nuts', 'bombs', 'seeds', 'arrows', 'bombchus' and 'beans'"); + ERROR_MESSAGE( + "Invalid ammo type. Options are 'sticks', 'nuts', 'bombs', 'seeds', 'arrows', 'bombchus' and 'beans'"); return 1; } @@ -260,7 +271,8 @@ static bool AddAmmoHandler(std::shared_ptr Console, const std::ve } } -static bool TakeAmmoHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool TakeAmmoHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 3) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -301,13 +313,22 @@ static bool TakeAmmoHandler(std::shared_ptr Console, const std::v } const static std::map bottleItems{ - { "green_potion", ITEM_POTION_GREEN }, { "red_potion", ITEM_POTION_RED }, { "blue_potion", ITEM_POTION_BLUE }, - { "milk", ITEM_MILK }, { "half_milk", ITEM_MILK_HALF }, { "fairy", ITEM_FAIRY }, - { "bugs", ITEM_BUG }, { "fish", ITEM_FISH }, { "poe", ITEM_POE }, - { "big_poe", ITEM_BIG_POE }, { "blue_fire", ITEM_BLUE_FIRE }, { "rutos_letter", ITEM_LETTER_RUTO }, + { "green_potion", ITEM_POTION_GREEN }, + { "red_potion", ITEM_POTION_RED }, + { "blue_potion", ITEM_POTION_BLUE }, + { "milk", ITEM_MILK }, + { "half_milk", ITEM_MILK_HALF }, + { "fairy", ITEM_FAIRY }, + { "bugs", ITEM_BUG }, + { "fish", ITEM_FISH }, + { "poe", ITEM_POE }, + { "big_poe", ITEM_BIG_POE }, + { "blue_fire", ITEM_BLUE_FIRE }, + { "rutos_letter", ITEM_LETTER_RUTO }, }; -static bool BottleHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool BottleHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 3) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -328,7 +349,7 @@ static bool BottleHandler(std::shared_ptr Console, const std::vec const auto& it = bottleItems.find(args[1]); - if (it == bottleItems.end()) { + if (it == bottleItems.end()) { ERROR_MESSAGE("Invalid item passed"); return 1; } @@ -339,7 +360,8 @@ static bool BottleHandler(std::shared_ptr Console, const std::vec return 0; } -static bool BHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool BHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -349,7 +371,8 @@ static bool BHandler(std::shared_ptr Console, const std::vector Console, const std::vector& args, std::string* output) { +static bool ItemHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 3) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -360,7 +383,8 @@ static bool ItemHandler(std::shared_ptr Console, const std::vecto return 0; } -static bool GiveItemHandler(std::shared_ptr Console, const std::vector args, std::string* output) { +static bool GiveItemHandler(std::shared_ptr Console, const std::vector args, + std::string* output) { if (args.size() < 3) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -381,7 +405,8 @@ static bool GiveItemHandler(std::shared_ptr Console, const std::v return 0; } -static bool EntranceHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool EntranceHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -403,15 +428,16 @@ static bool EntranceHandler(std::shared_ptr Console, const std::v return 0; } -static bool VoidHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool VoidHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (gPlayState != nullptr) { - gSaveContext.respawn[RESPAWN_MODE_DOWN].tempSwchFlags = gPlayState->actorCtx.flags.tempSwch; - gSaveContext.respawn[RESPAWN_MODE_DOWN].tempCollectFlags = gPlayState->actorCtx.flags.tempCollect; - gSaveContext.respawnFlag = 1; - gPlayState->transitionTrigger = TRANS_TRIGGER_START; - gPlayState->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex; - gPlayState->transitionType = TRANS_TYPE_FADE_BLACK; - gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.respawn[RESPAWN_MODE_DOWN].tempSwchFlags = gPlayState->actorCtx.flags.tempSwch; + gSaveContext.respawn[RESPAWN_MODE_DOWN].tempCollectFlags = gPlayState->actorCtx.flags.tempCollect; + gSaveContext.respawnFlag = 1; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex; + gPlayState->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; } else { ERROR_MESSAGE("gPlayState == nullptr"); return 1; @@ -419,7 +445,8 @@ static bool VoidHandler(std::shared_ptr Console, const std::vecto return 0; } -static bool ReloadHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool ReloadHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (gPlayState != nullptr) { gPlayState->nextEntranceIndex = gSaveContext.entranceIndex; gPlayState->transitionTrigger = TRANS_TRIGGER_START; @@ -432,11 +459,10 @@ static bool ReloadHandler(std::shared_ptr Console, const std::vec return 0; } -const static std::map fw_options { - { "clear", 0}, {"warp", 1}, {"backup", 2} -}; +const static std::map fw_options{ { "clear", 0 }, { "warp", 1 }, { "backup", 2 } }; -static bool FWHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool FWHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -447,16 +473,16 @@ static bool FWHandler(std::shared_ptr Console, const std::vector< ERROR_MESSAGE("[SOH] Invalid option. Options are 'clear', 'warp', 'backup'"); return 1; } - + if (gPlayState != nullptr) { FaroresWindData clear = {}; - switch(it->second) { - case 0: //clear + switch (it->second) { + case 0: // clear gSaveContext.fw = clear; INFO_MESSAGE("[SOH] Farore's wind point cleared! Reload scene to take effect."); return 0; break; - case 1: //warp + case 1: // warp if (gSaveContext.respawn[RESPAWN_MODE_TOP].data > 0) { gPlayState->transitionTrigger = TRANS_TRIGGER_START; gPlayState->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_TOP].entranceIndex; @@ -467,7 +493,7 @@ static bool FWHandler(std::shared_ptr Console, const std::vector< } return 0; break; - case 2: //backup + case 2: // backup if (CVarGetInteger(CVAR_ENHANCEMENT("BetterFarore"), 0)) { gSaveContext.fw = gSaveContext.ship.backupFW; gSaveContext.fw.set = 1; @@ -479,16 +505,16 @@ static bool FWHandler(std::shared_ptr Console, const std::vector< } break; } - } - else { + } else { ERROR_MESSAGE("gPlayState == nullptr"); return 1; } - + return 0; } -static bool FileSelectHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool FileSelectHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (gGameState == nullptr) { ERROR_MESSAGE("gGameState == nullptr"); return 1; @@ -500,12 +526,14 @@ static bool FileSelectHandler(std::shared_ptr Console, const std: return 0; } -static bool QuitHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool QuitHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { Ship::Context::GetInstance()->GetWindow()->Close(); return 0; } -static bool SaveStateHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool SaveStateHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot(); const SaveStateReturn rtn = OTRGlobals::Instance->gSaveStateMgr->AddRequest({ slot, RequestType::SAVE }); @@ -521,7 +549,8 @@ static bool SaveStateHandler(std::shared_ptr Console, const std:: } } -static bool LoadStateHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool LoadStateHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot(); const SaveStateReturn rtn = OTRGlobals::Instance->gSaveStateMgr->AddRequest({ slot, RequestType::LOAD }); @@ -541,10 +570,10 @@ static bool LoadStateHandler(std::shared_ptr Console, const std:: default: return 1; } - } -static bool StateSlotSelectHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool StateSlotSelectHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -564,12 +593,12 @@ static bool StateSlotSelectHandler(std::shared_ptr Console, const } OTRGlobals::Instance->gSaveStateMgr->SetCurrentSlot(slot); - INFO_MESSAGE("[SOH] Slot %u selected", - OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot()); + INFO_MESSAGE("[SOH] Slot %u selected", OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot()); return 0; } -static bool InvisibleHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool InvisibleHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -584,19 +613,19 @@ static bool InvisibleHandler(std::shared_ptr Console, const std:: } RemovableGameInteractionEffect* effect = new GameInteractionEffect::InvisibleLink(); - GameInteractionEffectQueryResult result = + GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] Invisible Link %s", state ? "enabled" : "disabled"); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not %s Invisible Link.", - state ? "enable" : "disable"); + INFO_MESSAGE("[SOH] Command failed: Could not %s Invisible Link.", state ? "enable" : "disable"); return 1; } } -static bool GiantLinkHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool GiantLinkHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -618,13 +647,13 @@ static bool GiantLinkHandler(std::shared_ptr Console, const std:: INFO_MESSAGE("[SOH] Giant Link %s", state ? "enabled" : "disabled"); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not %s Giant Link.", - state ? "enable" : "disable"); + INFO_MESSAGE("[SOH] Command failed: Could not %s Giant Link.", state ? "enable" : "disable"); return 1; } } -static bool MinishLinkHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool MinishLinkHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -646,13 +675,13 @@ static bool MinishLinkHandler(std::shared_ptr Console, const std: INFO_MESSAGE("[SOH] Minish Link %s", state ? "enabled" : "disabled"); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not %s Minish Link.", - state ? "enable" : "disable"); + INFO_MESSAGE("[SOH] Command failed: Could not %s Minish Link.", state ? "enable" : "disable"); return 1; } } -static bool AddHeartContainerHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool AddHeartContainerHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -683,7 +712,8 @@ static bool AddHeartContainerHandler(std::shared_ptr Console, con } } -static bool RemoveHeartContainerHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool RemoveHeartContainerHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -714,7 +744,8 @@ static bool RemoveHeartContainerHandler(std::shared_ptr Console, } } -static bool GravityHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool GravityHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -723,12 +754,13 @@ static bool GravityHandler(std::shared_ptr Console, const std::ve GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyGravity(); try { - dynamic_cast(effect)->parameters[0] = Ship::Math::clamp(std::stoi(args[1], nullptr, 10), GI_GRAVITY_LEVEL_LIGHT, GI_GRAVITY_LEVEL_HEAVY); + dynamic_cast(effect)->parameters[0] = + Ship::Math::clamp(std::stoi(args[1], nullptr, 10), GI_GRAVITY_LEVEL_LIGHT, GI_GRAVITY_LEVEL_HEAVY); } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Gravity value must be a number."); return 1; } - + GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] Updated gravity."); @@ -739,7 +771,8 @@ static bool GravityHandler(std::shared_ptr Console, const std::ve } } -static bool NoUIHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool NoUIHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -752,7 +785,7 @@ static bool NoUIHandler(std::shared_ptr Console, const std::vecto ERROR_MESSAGE("[SOH] No UI value must be a number."); return 1; } - + RemovableGameInteractionEffect* effect = new GameInteractionEffect::NoUI(); GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -761,13 +794,13 @@ static bool NoUIHandler(std::shared_ptr Console, const std::vecto INFO_MESSAGE("[SOH] No UI %s", state ? "enabled" : "disabled"); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not %s No UI.", - state ? "enable" : "disable"); + INFO_MESSAGE("[SOH] Command failed: Could not %s No UI.", state ? "enable" : "disable"); return 1; } } -static bool FreezeHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool FreezeHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::FreezePlayer(); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -780,7 +813,8 @@ static bool FreezeHandler(std::shared_ptr Console, const std::vec } } -static bool DefenseModifierHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool DefenseModifierHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -796,7 +830,8 @@ static bool DefenseModifierHandler(std::shared_ptr Console, const GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { - INFO_MESSAGE("[SOH] Defense modifier set to %d", dynamic_cast(effect)->parameters[0]); + INFO_MESSAGE("[SOH] Defense modifier set to %d", + dynamic_cast(effect)->parameters[0]); return 0; } else { INFO_MESSAGE("[SOH] Command failed: Could not set defense modifier."); @@ -804,7 +839,8 @@ static bool DefenseModifierHandler(std::shared_ptr Console, const } } -static bool DamageHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool DamageHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -834,7 +870,8 @@ static bool DamageHandler(std::shared_ptr Console, const std::vec } } -static bool HealHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool HealHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -864,7 +901,8 @@ static bool HealHandler(std::shared_ptr Console, const std::vecto } } -static bool FillMagicHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool FillMagicHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::FillMagic(); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -877,7 +915,8 @@ static bool FillMagicHandler(std::shared_ptr Console, const std:: } } -static bool EmptyMagicHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool EmptyMagicHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::EmptyMagic(); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -890,12 +929,13 @@ static bool EmptyMagicHandler(std::shared_ptr Console, const std: } } -static bool NoZHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { - if (args.size() < 2) { +static bool NoZHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { + if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; } - uint8_t state; + uint8_t state; try { state = std::stoi(args[1], nullptr, 10) == 0 ? 0 : 1; @@ -912,13 +952,13 @@ static bool NoZHandler(std::shared_ptr Console, const std::vector INFO_MESSAGE("[SOH] NoZ " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " NoZ."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + " NoZ."); return 1; } } -static bool OneHitKOHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool OneHitKOHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -940,13 +980,13 @@ static bool OneHitKOHandler(std::shared_ptr Console, const std::v INFO_MESSAGE("[SOH] One-hit KO " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " One-hit KO."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + " One-hit KO."); return 1; } } -static bool PacifistHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool PacifistHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -968,13 +1008,13 @@ static bool PacifistHandler(std::shared_ptr Console, const std::v INFO_MESSAGE("[SOH] Pacifist " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " Pacifist."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + " Pacifist."); return 1; } } -static bool PaperLinkHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool PaperLinkHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -997,13 +1037,13 @@ static bool PaperLinkHandler(std::shared_ptr Console, const std:: INFO_MESSAGE("[SOH] Paper Link " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " Paper Link."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + " Paper Link."); return 1; } } -static bool RainstormHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool RainstormHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1025,13 +1065,13 @@ static bool RainstormHandler(std::shared_ptr Console, const std:: INFO_MESSAGE("[SOH] Rainstorm " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " Rainstorm."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + " Rainstorm."); return 1; } } -static bool ReverseControlsHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool ReverseControlsHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1050,17 +1090,17 @@ static bool ReverseControlsHandler(std::shared_ptr Console, const state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { - INFO_MESSAGE("[SOH] Reverse controls " + - std::string(state ? "enabled" : "disabled")); + INFO_MESSAGE("[SOH] Reverse controls " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " Reverse controls."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + + " Reverse controls."); return 1; } } -static bool UpdateRupeesHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool UpdateRupeesHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1084,7 +1124,8 @@ static bool UpdateRupeesHandler(std::shared_ptr Console, const st } } -static bool SpeedModifierHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool SpeedModifierHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1108,13 +1149,14 @@ static bool SpeedModifierHandler(std::shared_ptr Console, const s } } -const static std::map boots { +const static std::map boots{ { "kokiri", EQUIP_VALUE_BOOTS_KOKIRI }, { "iron", EQUIP_VALUE_BOOTS_IRON }, { "hover", EQUIP_VALUE_BOOTS_HOVER }, }; -static bool BootsHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool BootsHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1139,13 +1181,14 @@ static bool BootsHandler(std::shared_ptr Console, const std::vect } } -const static std::map shields { +const static std::map shields{ { "deku", ITEM_SHIELD_DEKU }, { "hylian", ITEM_SHIELD_HYLIAN }, { "mirror", ITEM_SHIELD_MIRROR }, }; -static bool GiveShieldHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool GiveShieldHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1170,7 +1213,8 @@ static bool GiveShieldHandler(std::shared_ptr Console, const std: } } -static bool TakeShieldHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool TakeShieldHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1195,7 +1239,8 @@ static bool TakeShieldHandler(std::shared_ptr Console, const std: } } -static bool KnockbackHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool KnockbackHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1225,7 +1270,8 @@ static bool KnockbackHandler(std::shared_ptr Console, const std:: } } -static bool ElectrocuteHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool ElectrocuteHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::ElectrocutePlayer(); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -1238,7 +1284,8 @@ static bool ElectrocuteHandler(std::shared_ptr Console, const std } } -static bool BurnHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool BurnHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::BurnPlayer(); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -1251,7 +1298,8 @@ static bool BurnHandler(std::shared_ptr Console, const std::vecto } } -static bool CuccoStormHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool CuccoStormHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectQueryResult result = GameInteractor::RawAction::SpawnActor(ACTOR_EN_NIW, 0); if (result == GameInteractionEffectQueryResult::Possible) { @@ -1263,7 +1311,8 @@ static bool CuccoStormHandler(std::shared_ptr Console, const std: } } -static bool GenerateRandoHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool GenerateRandoHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() == 1) { if (GenerateRandomizer()) { return 0; @@ -1278,7 +1327,7 @@ static bool GenerateRandoHandler(std::shared_ptr Console, const s seed = "seed_testing_count"; } - if (GenerateRandomizer(seed + std::to_string(value))){ + if (GenerateRandomizer(seed + std::to_string(value))) { return 0; } } catch (std::invalid_argument const& ex) { @@ -1286,36 +1335,36 @@ static bool GenerateRandoHandler(std::shared_ptr Console, const s return 1; } - ERROR_MESSAGE("[SOH] Rando generation already in progress"); return 1; } -static constexpr std::array, COSMETICS_GROUP_MAX> cosmetic_groups = {{ - {"link", COSMETICS_GROUP_LINK}, - {"mirror_shield", COSMETICS_GROUP_MIRRORSHIELD}, - {"swords", COSMETICS_GROUP_SWORDS}, - {"gloves", COSMETICS_GROUP_GLOVES}, - {"equipment", COSMETICS_GROUP_EQUIPMENT}, - {"keyring", COSMETICS_GROUP_KEYRING}, - {"small_keys", COSMETICS_GROUP_SMALL_KEYS }, - {"boss_keys", COSMETICS_GROUP_BOSS_KEYS }, - {"consumable", COSMETICS_GROUP_CONSUMABLE}, - {"hud", COSMETICS_GROUP_HUD}, - {"kaleido", COSMETICS_GROUP_KALEIDO}, - {"title", COSMETICS_GROUP_TITLE}, - {"npc", COSMETICS_GROUP_NPC}, - {"world", COSMETICS_GROUP_WORLD}, - {"magic", COSMETICS_GROUP_MAGIC}, - {"arrows", COSMETICS_GROUP_ARROWS}, - {"spin_attack", COSMETICS_GROUP_SPIN_ATTACK}, - {"trials", COSMETICS_GROUP_TRAILS}, - {"navi", COSMETICS_GROUP_NAVI}, - {"ivan", COSMETICS_GROUP_IVAN}, - {"message", COSMETICS_GROUP_MESSAGE}, -}}; +static constexpr std::array, COSMETICS_GROUP_MAX> cosmetic_groups = { { + { "link", COSMETICS_GROUP_LINK }, + { "mirror_shield", COSMETICS_GROUP_MIRRORSHIELD }, + { "swords", COSMETICS_GROUP_SWORDS }, + { "gloves", COSMETICS_GROUP_GLOVES }, + { "equipment", COSMETICS_GROUP_EQUIPMENT }, + { "keyring", COSMETICS_GROUP_KEYRING }, + { "small_keys", COSMETICS_GROUP_SMALL_KEYS }, + { "boss_keys", COSMETICS_GROUP_BOSS_KEYS }, + { "consumable", COSMETICS_GROUP_CONSUMABLE }, + { "hud", COSMETICS_GROUP_HUD }, + { "kaleido", COSMETICS_GROUP_KALEIDO }, + { "title", COSMETICS_GROUP_TITLE }, + { "npc", COSMETICS_GROUP_NPC }, + { "world", COSMETICS_GROUP_WORLD }, + { "magic", COSMETICS_GROUP_MAGIC }, + { "arrows", COSMETICS_GROUP_ARROWS }, + { "spin_attack", COSMETICS_GROUP_SPIN_ATTACK }, + { "trials", COSMETICS_GROUP_TRAILS }, + { "navi", COSMETICS_GROUP_NAVI }, + { "ivan", COSMETICS_GROUP_IVAN }, + { "message", COSMETICS_GROUP_MESSAGE }, +} }; -static bool CosmeticsHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool CosmeticsHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1356,18 +1405,13 @@ static bool CosmeticsHandler(std::shared_ptr Console, const std:: } static std::map sfx_groups = { - {"bgm", SEQ_BGM_WORLD}, - {"fanfares", SEQ_FANFARE}, - {"events", SEQ_BGM_EVENT}, - {"battle", SEQ_BGM_BATTLE}, - {"ocarina", SEQ_OCARINA}, - {"instruments", SEQ_INSTRUMENT}, - {"sfx", SEQ_SFX}, - {"voices", SEQ_VOICE}, - {"custom", SEQ_BGM_CUSTOM}, + { "bgm", SEQ_BGM_WORLD }, { "fanfares", SEQ_FANFARE }, { "events", SEQ_BGM_EVENT }, + { "battle", SEQ_BGM_BATTLE }, { "ocarina", SEQ_OCARINA }, { "instruments", SEQ_INSTRUMENT }, + { "sfx", SEQ_SFX }, { "voices", SEQ_VOICE }, { "custom", SEQ_BGM_CUSTOM }, }; -static bool SfxHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool SfxHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1407,194 +1451,322 @@ static bool SfxHandler(std::shared_ptr Console, const std::vector return 0; } +static bool AvailableChecksProcessUndiscoveredExitsHandler(std::shared_ptr Console, + const std::vector& args, std::string* output) { + const auto& logic = Rando::Context::GetInstance()->GetLogic(); + bool enabled = false; + + if (args.size() == 1) { + enabled = !logic->ACProcessUndiscoveredExits; + } else { + try { + enabled = std::stoi(args[1]); + } catch (std::invalid_argument const& ex) { + ERROR_MESSAGE("[SOH] Enable should be 0 or 1"); + return 1; + } + } + + logic->ACProcessUndiscoveredExits = enabled; + INFO_MESSAGE("[SOH] Available Checks - Process Undiscovered Exits %s", + logic->ACProcessUndiscoveredExits ? "enabled" : "disabled"); + + if (GameInteractor::IsSaveLoaded(true)) { + CheckTracker::RecalculateAvailableChecks(); + } + + return 0; +} + +static bool AvailableChecksRecalculateHandler(std::shared_ptr Console, + const std::vector& args, std::string* output) { + RandomizerRegion startingRegion = RR_ROOT; + + if (args.size() > 1) { + try { + startingRegion = static_cast(std::stoi(args[1])); + } catch (std::invalid_argument const& ex) { + ERROR_MESSAGE("[SOH] Region should be a number"); + return 1; + } + + if (startingRegion <= RR_NONE || startingRegion >= RR_MAX) { + ERROR_MESSAGE("[SOH] Region should be between 1 and %d", RR_MAX - 1); + return 1; + } + } + + CheckTracker::RecalculateAvailableChecks(startingRegion); + return 0; +} + void DebugConsole_Init(void) { // Console - CMD_REGISTER("file_select", {FileSelectHandler, "Returns to the file select."}); - CMD_REGISTER("reset", {ResetHandler, "Resets the game."}); - CMD_REGISTER("quit", {QuitHandler, "Quits the game."}); + CMD_REGISTER("file_select", { FileSelectHandler, "Returns to the file select." }); + CMD_REGISTER("reset", { ResetHandler, "Resets the game." }); + CMD_REGISTER("quit", { QuitHandler, "Quits the game." }); // Save States - CMD_REGISTER("save_state", {SaveStateHandler, "Save a state."}); - CMD_REGISTER("load_state", {LoadStateHandler, "Load a state."}); - CMD_REGISTER("set_slot", {StateSlotSelectHandler, "Selects a SaveState slot", { - {"Slot number", Ship::ArgumentType::NUMBER,} - }}); + CMD_REGISTER("save_state", { SaveStateHandler, "Save a state." }); + CMD_REGISTER("load_state", { LoadStateHandler, "Load a state." }); + CMD_REGISTER("set_slot", { StateSlotSelectHandler, + "Selects a SaveState slot", + { + { "Slot number", Ship::ArgumentType::NUMBER }, + } }); // Map & Location - CMD_REGISTER("void", {VoidHandler, "Voids out of the current map."}); - CMD_REGISTER("reload", {ReloadHandler, "Reloads the current map."}); - CMD_REGISTER("fw", {FWHandler, "Spawns the player where Farore's Wind is set.", { - {"clear|warp|backup", Ship::ArgumentType::TEXT} - }}); - CMD_REGISTER("entrance", {EntranceHandler, "Sends player to the entered entrance (hex)", { - {"entrance", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("void", { VoidHandler, "Voids out of the current map." }); + CMD_REGISTER("reload", { ReloadHandler, "Reloads the current map." }); + CMD_REGISTER("fw", { FWHandler, + "Spawns the player where Farore's Wind is set.", + { + { "clear|warp|backup", Ship::ArgumentType::TEXT }, + } }); + CMD_REGISTER("entrance", { EntranceHandler, + "Sends player to the entered entrance (hex)", + { + { "entrance", Ship::ArgumentType::NUMBER }, + } }); // Gameplay - CMD_REGISTER("kill", {KillPlayerHandler, "Commit suicide."}); + CMD_REGISTER("kill", { KillPlayerHandler, "Commit suicide." }); - CMD_REGISTER("map", {LoadSceneHandler, "Load up kak?"}); + CMD_REGISTER("map", { LoadSceneHandler, "Load up kak?" }); - CMD_REGISTER("rupee", {RupeeHandler, "Set your rupee counter.", { - {"amount", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("rupee", { RupeeHandler, + "Set your rupee counter.", + { + { "amount", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("bItem", {BHandler, "Set an item to the B button.", { - {"Item ID", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("bItem", { BHandler, + "Set an item to the B button.", + { + { "Item ID", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("spawn", { ActorSpawnHandler, "Spawn an actor.", { { "actor name/id", Ship::ArgumentType::NUMBER }, // TODO there should be an actor_id arg type - {"data", Ship::ArgumentType::NUMBER}, - {"x", Ship::ArgumentType::NUMBER, true}, - {"y", Ship::ArgumentType::NUMBER, true}, - {"z", Ship::ArgumentType::NUMBER, true}, - {"rx", Ship::ArgumentType::NUMBER, true}, - {"ry", Ship::ArgumentType::NUMBER, true}, - {"rz", Ship::ArgumentType::NUMBER, true} - }}); + CMD_REGISTER("spawn", + { ActorSpawnHandler, + "Spawn an actor.", + { + { "actor name/id", Ship::ArgumentType::NUMBER }, // TODO there should be an actor_id arg type + { "data", Ship::ArgumentType::NUMBER }, + { "x", Ship::ArgumentType::NUMBER, true }, + { "y", Ship::ArgumentType::NUMBER, true }, + { "z", Ship::ArgumentType::NUMBER, true }, + { "rx", Ship::ArgumentType::NUMBER, true }, + { "ry", Ship::ArgumentType::NUMBER, true }, + { "rz", Ship::ArgumentType::NUMBER, true }, + } }); - CMD_REGISTER("pos", {SetPosHandler, "Sets the position of the player.", { - {"x", Ship::ArgumentType::NUMBER, true}, - {"y", Ship::ArgumentType::NUMBER, true}, - {"z", Ship::ArgumentType::NUMBER, true} - }}); + CMD_REGISTER("pos", { SetPosHandler, + "Sets the position of the player.", + { + { "x", Ship::ArgumentType::NUMBER, true }, + { "y", Ship::ArgumentType::NUMBER, true }, + { "z", Ship::ArgumentType::NUMBER, true }, + } }); - CMD_REGISTER("addammo", {AddAmmoHandler, "Adds ammo of an item.", { - {"sticks|nuts|bombs|seeds|arrows|bombchus|beans", Ship::ArgumentType::TEXT}, - {"count", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("addammo", { AddAmmoHandler, + "Adds ammo of an item.", + { + { "sticks|nuts|bombs|seeds|arrows|bombchus|beans", Ship::ArgumentType::TEXT }, + { "count", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("takeammo", {TakeAmmoHandler, "Removes ammo of an item.", { - {"sticks|nuts|bombs|seeds|arrows|bombchus|beans", Ship::ArgumentType::TEXT}, - {"count", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("takeammo", { TakeAmmoHandler, + "Removes ammo of an item.", + { + { "sticks|nuts|bombs|seeds|arrows|bombchus|beans", Ship::ArgumentType::TEXT }, + { "count", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("bottle", {BottleHandler, "Changes item in a bottle slot.", { - {"item", Ship::ArgumentType::TEXT}, - {"slot", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("bottle", { BottleHandler, + "Changes item in a bottle slot.", + { + { "item", Ship::ArgumentType::TEXT }, + { "slot", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("give_item", {GiveItemHandler, "Gives an item to the player as if it was given from an actor", { - {"vanilla|randomizer", Ship::ArgumentType::TEXT}, - {"giveItemID", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("give_item", { GiveItemHandler, + "Gives an item to the player as if it was given from an actor", + { + { "vanilla|randomizer", Ship::ArgumentType::TEXT }, + { "giveItemID", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("item", {ItemHandler, "Sets item ID in arg 1 into slot arg 2. No boundary checks. Use with caution.", { - {"slot", Ship::ArgumentType::NUMBER}, - {"item id", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("item", { ItemHandler, + "Sets item ID in arg 1 into slot arg 2. No boundary checks. Use with caution.", + { + { "slot", Ship::ArgumentType::NUMBER }, + { "item id", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("invisible", {InvisibleHandler, "Activate Link's Elvish cloak, making him appear invisible.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("invisible", { InvisibleHandler, + "Activate Link's Elvish cloak, making him appear invisible.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("giant_link", {GiantLinkHandler, "Turn Link into a giant Lonky boi.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("giant_link", { GiantLinkHandler, + "Turn Link into a giant Lonky boi.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("minish_link", {MinishLinkHandler, "Turn Link into a minish boi.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("minish_link", { MinishLinkHandler, + "Turn Link into a minish boi.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); CMD_REGISTER("add_heart_container", - {AddHeartContainerHandler, "Give Link a heart! The maximum amount of hearts is 20!"}); + { AddHeartContainerHandler, "Give Link a heart! The maximum amount of hearts is 20!" }); CMD_REGISTER("remove_heart_container", - {RemoveHeartContainerHandler, "Remove a heart from Link. The minimal amount of hearts is 3."}); + { RemoveHeartContainerHandler, "Remove a heart from Link. The minimal amount of hearts is 3." }); - CMD_REGISTER("gravity", {GravityHandler, "Set gravity level.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("gravity", { GravityHandler, + "Set gravity level.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("no_ui", {NoUIHandler, "Disables the UI.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("no_ui", { NoUIHandler, + "Disables the UI.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("freeze", {FreezeHandler, "Freezes Link in place"}); + CMD_REGISTER("freeze", { FreezeHandler, "Freezes Link in place" }); - CMD_REGISTER("defense_modifier", {DefenseModifierHandler, "Sets the defense modifier.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("defense_modifier", { DefenseModifierHandler, + "Sets the defense modifier.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("damage", {DamageHandler, "Deal damage to Link.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("damage", { DamageHandler, + "Deal damage to Link.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("heal", {HealHandler, "Heals Link.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("heal", { HealHandler, + "Heals Link.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("fill_magic", {FillMagicHandler, "Fills magic."}); + CMD_REGISTER("fill_magic", { FillMagicHandler, "Fills magic." }); - CMD_REGISTER("empty_magic", {EmptyMagicHandler, "Empties magic."}); + CMD_REGISTER("empty_magic", { EmptyMagicHandler, "Empties magic." }); - CMD_REGISTER("no_z", {NoZHandler, "Disables Z-button presses.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("no_z", { NoZHandler, + "Disables Z-button presses.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("ohko", {OneHitKOHandler, - "Activates one hit KO. Any damage kills Link and he cannot gain health in this mode.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("ohko", { OneHitKOHandler, + "Activates one hit KO. Any damage kills Link and he cannot gain health in this mode.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("pacifist", {PacifistHandler, "Activates pacifist mode. Prevents Link from using his weapon.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("pacifist", { PacifistHandler, + "Activates pacifist mode. Prevents Link from using his weapon.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("paper_link", {PaperLinkHandler, "Link but made out of paper.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("paper_link", { PaperLinkHandler, + "Link but made out of paper.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("rainstorm", {RainstormHandler, "Activates rainstorm."}); + CMD_REGISTER("rainstorm", { RainstormHandler, "Activates rainstorm." }); - CMD_REGISTER("reverse_controls", {ReverseControlsHandler, "Reverses the controls.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("reverse_controls", { ReverseControlsHandler, + "Reverses the controls.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("update_rupees", {UpdateRupeesHandler, "Adds rupees.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("update_rupees", { UpdateRupeesHandler, + "Adds rupees.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("speed_modifier", {SpeedModifierHandler, "Sets the speed modifier.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("speed_modifier", { SpeedModifierHandler, + "Sets the speed modifier.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("boots", {BootsHandler, "Activates boots.", { - {"kokiri|iron|hover", Ship::ArgumentType::TEXT}, - }}); + CMD_REGISTER("boots", { BootsHandler, + "Activates boots.", + { + { "kokiri|iron|hover", Ship::ArgumentType::TEXT }, + } }); - CMD_REGISTER("giveshield", {GiveShieldHandler, "Gives a shield and equips it when Link is the right age for it.", { - {"deku|hylian|mirror", Ship::ArgumentType::TEXT}, - }}); + CMD_REGISTER("giveshield", { GiveShieldHandler, + "Gives a shield and equips it when Link is the right age for it.", + { + { "deku|hylian|mirror", Ship::ArgumentType::TEXT }, + } }); - CMD_REGISTER("takeshield", {TakeShieldHandler, "Takes a shield and unequips it if Link is wearing it.", { - {"deku|hylian|mirror", Ship::ArgumentType::TEXT}, - }}); + CMD_REGISTER("takeshield", { TakeShieldHandler, + "Takes a shield and unequips it if Link is wearing it.", + { + { "deku|hylian|mirror", Ship::ArgumentType::TEXT }, + } }); - CMD_REGISTER("knockback", {KnockbackHandler, "Knocks Link back.", { - {"value", Ship::ArgumentType::NUMBER} - }}); + CMD_REGISTER("knockback", { KnockbackHandler, + "Knocks Link back.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("electrocute", {ElectrocuteHandler, "Electrocutes Link."}); + CMD_REGISTER("electrocute", { ElectrocuteHandler, "Electrocutes Link." }); - CMD_REGISTER("burn", {BurnHandler, "Burns Link."}); + CMD_REGISTER("burn", { BurnHandler, "Burns Link." }); - CMD_REGISTER("cucco_storm", {CuccoStormHandler, "Cucco Storm"}); + CMD_REGISTER("cucco_storm", { CuccoStormHandler, "Cucco Storm" }); - CMD_REGISTER("gen_rando", {GenerateRandoHandler, "Generate a randomizer seed", { - {"seed|count", Ship::ArgumentType::NUMBER, true}, - {"testing", Ship::ArgumentType::NUMBER, true}, - }}); + CMD_REGISTER("gen_rando", { GenerateRandoHandler, + "Generate a randomizer seed", + { + { "seed|count", Ship::ArgumentType::NUMBER, true }, + { "testing", Ship::ArgumentType::NUMBER, true }, + } }); - CMD_REGISTER("cosmetics", {CosmeticsHandler, "Change cosmetics.", { - {"reset|randomize", Ship::ArgumentType::TEXT}, - {"group name", Ship::ArgumentType::TEXT, true}, - }}); + CMD_REGISTER("cosmetics", { CosmeticsHandler, + "Change cosmetics.", + { + { "reset|randomize", Ship::ArgumentType::TEXT }, + { "group name", Ship::ArgumentType::TEXT, true }, + } }); - CMD_REGISTER("sfx", {SfxHandler, "Change SFX.", { - {"reset|randomize", Ship::ArgumentType::TEXT}, - {"group_name", Ship::ArgumentType::TEXT, true}, - }}); + CMD_REGISTER("sfx", { SfxHandler, + "Change SFX.", + { + { "reset|randomize", Ship::ArgumentType::TEXT }, + { "group_name", Ship::ArgumentType::TEXT, true }, + } }); + + CMD_REGISTER("acpue", { AvailableChecksProcessUndiscoveredExitsHandler, + "Available Checks - Process Undiscovered Exits", + { { "enable", Ship::ArgumentType::NUMBER, true } } }); + + CMD_REGISTER("acr", { AvailableChecksRecalculateHandler, + "Available Checks - Recalculate", + { + { "starting_region", Ship::ArgumentType::NUMBER, true }, + } }); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index 589dbaf4a3..c018b00170 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.cpp +++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp @@ -1,6 +1,10 @@ #include "MessageViewer.h" -#include +#include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" +#include "soh/SohGui/SohMenu.h" +#include "soh/OTRGlobals.h" + #include #include "../custom-message/CustomMessageManager.h" @@ -13,6 +17,8 @@ extern "C" u8 sMessageHasSetSfx; +using namespace UIWidgets; + void MessageViewer::InitElement() { CustomMessageManager::Instance->AddCustomMessageTable(TABLE_ID); mTableIdBuf = static_cast(calloc(MAX_STRING_SIZE, sizeof(char))); @@ -21,9 +27,12 @@ void MessageViewer::InitElement() { } void MessageViewer::DrawElement() { + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); ImGui::Text("Table ID"); ImGui::SameLine(); - ImGui::InputText("##TableID", mTableIdBuf, MAX_STRING_SIZE, ImGuiInputTextFlags_CallbackCharFilter, UIWidgets::TextFilters::FilterAlphaNum); + PushStyleInput(THEME_COLOR); + ImGui::InputText("##TableID", mTableIdBuf, MAX_STRING_SIZE, ImGuiInputTextFlags_CallbackCharFilter, + UIWidgets::TextFilters::FilterAlphaNum); UIWidgets::InsertHelpHoverText("Leave blank for vanilla table"); ImGui::Text("Text ID"); ImGui::SameLine(); @@ -35,9 +44,12 @@ void MessageViewer::DrawElement() { case HEXADECIMAL: default: ImGui::InputText("##TextID", mTextIdBuf, MAX_STRING_SIZE, ImGuiInputTextFlags_CharsHexadecimal); - UIWidgets::InsertHelpHoverText("Hexadecimal Text ID of the message to load. Hexadecimal digits only (0-9/A-F)."); + UIWidgets::InsertHelpHoverText( + "Hexadecimal Text ID of the message to load. Hexadecimal digits only (0-9/A-F)."); break; } + PopStyleInput(); + PushStyleCheckbox(THEME_COLOR); if (ImGui::RadioButton("Hexadecimal", &mTextIdBase, HEXADECIMAL)) { memset(mTextIdBuf, 0, sizeof(char) * MAX_STRING_SIZE); } @@ -45,20 +57,14 @@ void MessageViewer::DrawElement() { if (ImGui::RadioButton("Decimal", &mTextIdBase, DECIMAL)) { memset(mTextIdBuf, 0, sizeof(char) * MAX_STRING_SIZE); } - ImGui::Text("Language"); - ImGui::SameLine(); - if (ImGui::BeginCombo("##Language", mLanguages[mLanguage])) { - // ReSharper disable CppDFAUnreachableCode - for (size_t i = 0; i < mLanguages.size(); i++) { - if (strlen(mLanguages[i]) > 0) { - if (ImGui::Selectable(mLanguages[i], i == mLanguage)) { - mLanguage = i; - } - } - } - ImGui::EndCombo(); - } - UIWidgets::InsertHelpHoverText("Which language to load from the selected text ID"); + PopStyleCheckbox(); + SohGui::SohMenu::UpdateLanguageMap(SohGui::languages); + UIWidgets::Combobox("Language", &mLanguage, SohGui::languages, + UIWidgets::ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(0) + .Tooltip("Which language to load from the selected text ID")); + PushStyleButton(THEME_COLOR); if (ImGui::Button("Display Message##ExistingMessage")) { mDisplayExistingMessageClicked = true; } @@ -66,11 +72,14 @@ void MessageViewer::DrawElement() { UIWidgets::InsertHelpHoverText("Enter a string using Custom Message Syntax to preview it in-game. " "Any newline (\\n) characters inserted by the Enter key will be stripped " "from the output."); + PushStyleInput(THEME_COLOR); ImGui::InputTextMultiline("##CustomMessage", mCustomMessageBuf, MAX_STRING_SIZE); + PopStyleInput(); if (ImGui::Button("Display Message##CustomMessage")) { mDisplayCustomMessageClicked = true; } - // ReSharper restore CppDFAUnreachableCode + PopStyleButton(); + ImGui::EndDisabled(); } void MessageViewer::UpdateElement() { @@ -107,6 +116,7 @@ void MessageViewer::DisplayCustomMessage() const { extern "C" MessageTableEntry* sNesMessageEntryTablePtr; extern "C" MessageTableEntry* sGerMessageEntryTablePtr; extern "C" MessageTableEntry* sFraMessageEntryTablePtr; +extern "C" MessageTableEntry* sJpnMessageEntryTablePtr; extern "C" MessageTableEntry* sStaffMessageEntryTablePtr; void FindMessage(PlayState* play, const uint16_t textId, const uint8_t language) { @@ -114,18 +124,13 @@ void FindMessage(PlayState* play, const uint16_t textId, const uint8_t language) const char* nextSeg; MessageTableEntry* messageTableEntry = sNesMessageEntryTablePtr; Font* font; - u16 bufferId = textId; - // Use the better owl message if better owl is enabled - if (CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0) != 0 && (bufferId == 0x2066 || bufferId == 0x607B || - bufferId == 0x10C2 || bufferId == 0x10C6 || bufferId == 0x206A)) - { - bufferId = 0x71B3; - } if (language == LANGUAGE_GER) messageTableEntry = sGerMessageEntryTablePtr; else if (language == LANGUAGE_FRA) messageTableEntry = sFraMessageEntryTablePtr; + else if (language == LANGUAGE_JPN) + messageTableEntry = sJpnMessageEntryTablePtr; // If PAL languages are not present in the OTR file, default to English if (messageTableEntry == nullptr) @@ -136,7 +141,7 @@ void FindMessage(PlayState* play, const uint16_t textId, const uint8_t language) while (messageTableEntry->textId != 0xFFFF) { font = &play->msgCtx.font; - if (messageTableEntry->textId == bufferId) { + if (messageTableEntry->textId == textId) { foundSeg = messageTableEntry->segment; font->charTexBuf[0] = messageTableEntry->typePos; @@ -159,15 +164,14 @@ void FindMessage(PlayState* play, const uint16_t textId, const uint8_t language) font->msgLength = nextSeg - foundSeg; } -static const char* msgStaticTbl[] = -{ +static const char* msgStaticTbl[] = { gDefaultMessageBackgroundTex, gSignMessageBackgroundTex, gNoteStaffMessageBackgroundTex, gFadingMessageBackgroundTex, gMessageContinueTriangleTex, gMessageEndSquareTex, - gMessageArrowTex + gMessageArrowTex, }; void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t language) { @@ -185,20 +189,24 @@ void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t lan R_TEXT_CHAR_SCALE = 75; R_TEXT_LINE_SPACING = 12; R_TEXT_INIT_XPOS = 65; + if (language == LANGUAGE_JPN) { + R_TEXT_CHAR_SCALE = 88; + R_TEXT_LINE_SPACING = 18; + R_TEXT_INIT_XPOS = 65; + } char* buffer = font->msgBuf; msgCtx->textId = textId; if (strlen(tableId) == 0) { FindMessage(play, textId, language); msgCtx->msgLength = static_cast(font->msgLength); const uintptr_t src = font->msgOffset; - memcpy(font->msgBuf, reinterpret_cast(src), font->msgLength); + memcpy(font->msgBuf, reinterpret_cast(src), font->msgLength); } else { constexpr int maxBufferSize = sizeof(font->msgBuf); const CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(tableId, textId); font->charTexBuf[0] = (messageEntry.GetTextBoxType() << 4) | messageEntry.GetTextBoxPosition(); - switch (language) { - font->msgLength = SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetForLanguage(language), maxBufferSize); - } + font->msgLength = + SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetForLanguage(language), maxBufferSize); msgCtx->msgLength = static_cast(font->msgLength); } msgCtx->textBoxProperties = font->charTexBuf[0]; @@ -248,8 +256,6 @@ void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t lan void MessageDebug_DisplayCustomMessage(const char* customMessage) { CustomMessageManager::Instance->ClearMessageTable(MessageViewer::TABLE_ID); CustomMessageManager::Instance->CreateMessage(MessageViewer::TABLE_ID, 0, - CustomMessage(customMessage, customMessage, customMessage)); + CustomMessage(customMessage, customMessage, customMessage)); MessageDebug_StartTextBox(MessageViewer::TABLE_ID, 0, 0); } - - diff --git a/soh/soh/Enhancements/debugger/MessageViewer.h b/soh/soh/Enhancements/debugger/MessageViewer.h index 43ae55aa76..9ce8eab05b 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.h +++ b/soh/soh/Enhancements/debugger/MessageViewer.h @@ -4,7 +4,7 @@ #ifdef __cplusplus #include "GuiWindow.h" -#include +#include extern "C" { #endif /** @@ -25,9 +25,8 @@ void MessageDebug_DisplayCustomMessage(const char* customMessage); #ifdef __cplusplus } - -class MessageViewer : public Ship::GuiWindow { -public: +class MessageViewer final : public Ship::GuiWindow { + public: static inline const char* TABLE_ID = "MessageViewer"; using GuiWindow::GuiWindow; @@ -37,12 +36,11 @@ public: virtual ~MessageViewer() = default; -private: + private: void DisplayExistingMessage() const; void DisplayCustomMessage() const; static constexpr uint16_t MAX_STRING_SIZE = 1024; - static constexpr std::array mLanguages = {"English", "German", "French"}; static constexpr int HEXADECIMAL = 0; static constexpr int DECIMAL = 1; char* mTableIdBuf; @@ -50,13 +48,12 @@ private: char* mTextIdBuf; uint16_t mTextId; int mTextIdBase = HEXADECIMAL; - size_t mLanguage = LANGUAGE_ENG; + int32_t mLanguage = LANGUAGE_ENG; char* mCustomMessageBuf; std::string mCustomMessageString; bool mDisplayExistingMessageClicked = false; bool mDisplayCustomMessageClicked = false; }; - #endif //__cplusplus -#endif //CUSTOMMESSAGEDEBUGGER_H +#endif // CUSTOMMESSAGEDEBUGGER_H diff --git a/soh/soh/Enhancements/debugger/SohConsoleWindow.cpp b/soh/soh/Enhancements/debugger/SohConsoleWindow.cpp new file mode 100644 index 0000000000..19be376ed7 --- /dev/null +++ b/soh/soh/Enhancements/debugger/SohConsoleWindow.cpp @@ -0,0 +1,32 @@ +#include "SohConsoleWindow.h" +#include "soh/OTRGlobals.h" +#include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" + +void SohConsoleWindow::InitElement() { + ConsoleWindow::InitElement(); +} + +void SohConsoleWindow::UpdateElement() { + ConsoleWindow::UpdateElement(); +} + +void SohConsoleWindow::DrawElement() { + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + UIWidgets::PushStyleInput(THEME_COLOR); + // Small font (13) to match hardcoded width values in the LUS window.. set large font after below TODO addressed + ImGui::PushFont(OTRGlobals::Instance->fontMonoSmall); + + // TODO: This can be removed after the LUS console window is designed better without hardcoding widths + ImGui::BeginChild("##Console Wrapper", ImVec2(0, 0), ImGuiChildFlags_None, + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | + ImGuiWindowFlags_NoScrollWithMouse); + + ConsoleWindow::DrawElement(); + + ImGui::EndChild(); + + ImGui::PopFont(); + UIWidgets::PopStyleInput(); + ImGui::EndDisabled(); +} diff --git a/soh/soh/Enhancements/debugger/SohConsoleWindow.h b/soh/soh/Enhancements/debugger/SohConsoleWindow.h new file mode 100644 index 0000000000..db039625b7 --- /dev/null +++ b/soh/soh/Enhancements/debugger/SohConsoleWindow.h @@ -0,0 +1,17 @@ +#ifndef SOH_CONSOLE_H +#define SOH_CONSOLE_H + +#include "window/gui/GuiWindow.h" +#include "window/gui/ConsoleWindow.h" + +class SohConsoleWindow : public Ship::ConsoleWindow { + public: + using ConsoleWindow::ConsoleWindow; + + protected: + void InitElement() override; + void UpdateElement() override; + void DrawElement() override; +}; + +#endif // SOH_CONSOLE_H diff --git a/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp new file mode 100644 index 0000000000..def23caccb --- /dev/null +++ b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp @@ -0,0 +1,18 @@ +#include "SohGfxDebuggerWindow.h" +#include "soh/OTRGlobals.h" + +void SohGfxDebuggerWindow::InitElement() { + GfxDebuggerWindow::InitElement(); +} + +void SohGfxDebuggerWindow::UpdateElement() { + GfxDebuggerWindow::UpdateElement(); +} + +void SohGfxDebuggerWindow::DrawElement() { + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + GfxDebuggerWindow::DrawElement(); + ImGui::PopFont(); + ImGui::EndDisabled(); +} diff --git a/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.h b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.h new file mode 100644 index 0000000000..789173b88c --- /dev/null +++ b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.h @@ -0,0 +1,17 @@ +#ifndef SOH_GFX_DEBUGGER_H +#define SOH_GFX_DEBUGGER_H + +#include "window/gui/GuiWindow.h" +#include "window/gui/GfxDebuggerWindow.h" + +class SohGfxDebuggerWindow : public LUS::GfxDebuggerWindow { + public: + using GfxDebuggerWindow::GfxDebuggerWindow; + + protected: + void InitElement() override; + void UpdateElement() override; + void DrawElement() override; +}; + +#endif // SOH_GFX_DEBUGGER_H diff --git a/soh/soh/Enhancements/debugger/SohStatsWindow.cpp b/soh/soh/Enhancements/debugger/SohStatsWindow.cpp new file mode 100644 index 0000000000..56f81bee4c --- /dev/null +++ b/soh/soh/Enhancements/debugger/SohStatsWindow.cpp @@ -0,0 +1,24 @@ +#include "SohStatsWindow.h" +#include "soh/OTRGlobals.h" + +void SohStatsWindow::DrawElement() { + const float framerate = ImGui::GetIO().Framerate; + const float deltatime = ImGui::GetIO().DeltaTime; + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); + +#if defined(_WIN32) + ImGui::Text("Platform: Windows"); +#elif defined(__IOS__) + ImGui::Text("Platform: iOS"); +#elif defined(__APPLE__) + ImGui::Text("Platform: macOS"); +#elif defined(__linux__) + ImGui::Text("Platform: Linux"); +#else + ImGui::Text("Platform: Unknown"); +#endif + ImGui::Text("Status: %.3f ms/frame (%.1f FPS)", deltatime * 1000.0f, framerate); + ImGui::PopStyleColor(); + ImGui::PopFont(); +} diff --git a/soh/soh/Enhancements/debugger/SohStatsWindow.h b/soh/soh/Enhancements/debugger/SohStatsWindow.h new file mode 100644 index 0000000000..09b495cdb6 --- /dev/null +++ b/soh/soh/Enhancements/debugger/SohStatsWindow.h @@ -0,0 +1,17 @@ +#ifndef SOH_STATS_H +#define SOH_STATS_H + +#include + +class SohStatsWindow final : public Ship::GuiWindow { + public: + using GuiWindow::GuiWindow; + ~SohStatsWindow(){}; + + protected: + void InitElement() override{}; + void DrawElement() override; + void UpdateElement() override{}; +}; + +#endif // SOH_STATS_H diff --git a/soh/soh/Enhancements/debugger/actorViewer.cpp b/soh/soh/Enhancements/debugger/actorViewer.cpp index 8aac609549..d21d9449e6 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.cpp +++ b/soh/soh/Enhancements/debugger/actorViewer.cpp @@ -1,10 +1,13 @@ #include "actorViewer.h" #include "../../util.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "soh/ActorDB.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/nametag.h" +#include "soh/ShipInit.hpp" +#include #include #include #include @@ -12,8 +15,10 @@ #include #include #include +#include #include "soh/OTRGlobals.h" #include "soh/cvar_prefixes.h" +#include "soh/ObjectExtension/ActorListIndex.h" extern "C" { #include @@ -30,6 +35,10 @@ extern PlayState* gPlayState; #define DEKUNUTS_FLOWER 10 #define DEBUG_ACTOR_NAMETAG_TAG "debug_actor_viewer" +#define CVAR_ACTOR_NAME_TAGS(val) CVAR_DEVELOPER_TOOLS("ActorViewer.NameTags." val) +#define CVAR_ACTOR_NAME_TAGS_ENABLED_NAME CVAR_ACTOR_NAME_TAGS("Enabled") +#define CVAR_ACTOR_NAME_TAGS_ENABLED CVarGetInteger(CVAR_ACTOR_NAME_TAGS("Enabled"), 0) + typedef struct { u16 id; u16 params; @@ -37,28 +46,17 @@ typedef struct { Vec3s rot; } ActorInfo; -typedef enum { - LIST, - TARGET, - HELD, - INTERACT -} RetrievalMethod; - -std::array acMapping = { - "Switch", - "Background (Prop type 1)", - "Player", - "Bomb", - "NPC", - "Enemy", - "Prop type 2", - "Item/Action", - "Misc.", - "Boss", - "Door", - "Chest" +std::array acMapping = { + "Switch", "Background (Prop type 1)", + "Player", "Bomb", + "NPC", "Enemy", + "Prop type 2", "Item/Action", + "Misc.", "Boss", + "Door", "Chest", }; +using namespace UIWidgets; + typedef enum { ACTORVIEWER_NAMETAGS_NONE, ACTORVIEWER_NAMETAGS_DESC, @@ -70,29 +68,23 @@ const std::string GetActorDescription(u16 id) { return ActorDB::Instance->RetrieveEntry(id).entry.valid ? ActorDB::Instance->RetrieveEntry(id).entry.desc : "???"; } -template void DrawGroupWithBorder(T&& drawFunc) { - // First group encapsulates the inner portion and border - ImGui::BeginGroup(); +const std::string GetActorDebugName(u16 id) { + return ActorDB::Instance->RetrieveEntry(id).entry.valid ? ActorDB::Instance->RetrieveEntry(id).entry.name : "???"; +} - ImVec2 padding = ImGui::GetStyle().FramePadding; - ImVec2 p0 = ImGui::GetCursorScreenPos(); - ImGui::SetCursorScreenPos(ImVec2(p0.x + padding.x, p0.y + padding.y)); +template void DrawGroupWithBorder(T&& drawFunc, std::string section) { + // First group encapsulates the inner portion and border + ImGui::BeginChild(std::string("##" + section).c_str(), ImVec2(0, 0), + ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_Borders | ImGuiChildFlags_AutoResizeX | + ImGuiChildFlags_AutoResizeY); // Second group encapsulates just the inner portion ImGui::BeginGroup(); - + ImGui::AlignTextToFramePadding(); drawFunc(); - - ImGui::Dummy(padding); ImGui::EndGroup(); - ImVec2 p1 = ImGui::GetItemRectMax(); - p1.x += padding.x; - ImVec4 borderCol = ImGui::GetStyle().Colors[ImGuiCol_Border]; - ImGui::GetWindowDrawList()->AddRect( - p0, p1, IM_COL32(borderCol.x * 255, borderCol.y * 255, borderCol.z * 255, borderCol.w * 255)); - - ImGui::EndGroup(); + ImGui::EndChild(); } void PopulateActorDropdown(int i, std::vector& data) { @@ -111,7 +103,7 @@ void PopulateActorDropdown(int i, std::vector& data) { } } -//actors that don't use params at all +// actors that don't use params at all static std::vector noParamsActors = { ACTOR_ARMS_HOOK, ACTOR_ARROW_FIRE, @@ -238,7 +230,7 @@ static std::vector noParamsActors = { ACTOR_UNSET_15D, ACTOR_UNSET_161, ACTOR_UNSET_180, - ACTOR_UNSET_1AA + ACTOR_UNSET_1AA, }; static std::unordered_map> actorSpecificData; @@ -258,7 +250,7 @@ void CreateActorSpecificData() { if (!isFlower) { ImGui::InputScalar("Shots Per Round", ImGuiDataType_S16, &shotsPerRound); } - + return isFlower ? DEKUNUTS_FLOWER : (shotsPerRound << 8); }; @@ -267,12 +259,12 @@ void CreateActorSpecificData() { if (params == 0) { params = -2; } - //the + 2 is because the params are -2 & -1 instead of 0 & 1 + // the + 2 is because the params are -2 & -1 instead of 0 & 1 int selectedItem = params + 2; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem - 2; } - + return params; }; @@ -282,7 +274,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -292,7 +284,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -302,7 +294,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -312,7 +304,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -322,7 +314,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -332,7 +324,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -341,12 +333,12 @@ void CreateActorSpecificData() { if (params == 0) { params = 0x40; } - //the - 0x40 is because the params are 0x40 & 0x41 instead of 0 & 1 + // the - 0x40 is because the params are 0x40 & 0x41 instead of 0 & 1 int selectedItem = params - 0x40; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem + 0x40; } - + return params; }; @@ -356,21 +348,21 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; actorSpecificData[ACTOR_EN_REEBA] = [](s16 params) -> s16 { bool isBig = params != 0; ImGui::Checkbox("Big", &isBig); - + return isBig; }; actorSpecificData[ACTOR_EN_TK] = [](s16 params) -> s16 { bool canTurn = params >= 0; ImGui::Checkbox("Can Turn", &canTurn); - + return canTurn ? 0 : -1; }; @@ -382,35 +374,13 @@ void CreateActorSpecificData() { if (collectibleFlag > 0x3F) { collectibleFlag = 0x3F; } - + static const char* items[] = { - "Green Rupee", - "Blue Rupee", - "Red Rupee", - "Recovery Heart", - "Bombs (A)", - "Arrow", - "Heart Piece", - "Heart Container", - "Arrows (5)", - "Arrows (10)", - "Arrows (30)", - "Bombs (B)", - "Deku Nuts (5)", - "Deku Stick", - "Magic (Large)", - "Magic (Small)", - "Deku Seeds (5)", - "Small Key", - "Flexible", - "Gold Rupee", - "Purple Rupee", - "Deku Shield", - "Hylian Shield", - "Zora Tunic", - "Goron Tunic", - "Bombs (Special)", - "Bombchus" + "Green Rupee", "Blue Rupee", "Red Rupee", "Recovery Heart", "Bombs (A)", "Arrow", + "Heart Piece", "Heart Container", "Arrows (5)", "Arrows (10)", "Arrows (30)", "Bombs (B)", + "Deku Nuts (5)", "Deku Stick", "Magic (Large)", "Magic (Small)", "Deku Seeds (5)", "Small Key", + "Flexible", "Gold Rupee", "Purple Rupee", "Deku Shield", "Hylian Shield", "Zora Tunic", + "Goron Tunic", "Bombs (Special)", "Bombchus", }; int selectedItem = params & 0xFF; @@ -421,33 +391,11 @@ void CreateActorSpecificData() { actorSpecificData[ACTOR_OBJ_COMB] = [](s16 params) -> s16 { static const char* items[] = { - "Green Rupee", - "Blue Rupee", - "Red Rupee", - "Recovery Heart", - "Bombs (A)", - "Arrow", - "Heart Piece", - "Heart Container", - "Arrows (5)", - "Arrows (10)", - "Arrows (30)", - "Bombs (B)", - "Deku Nuts (5)", - "Deku Stick", - "Magic (Large)", - "Magic (Small)", - "Deku Seeds (5)", - "Small Key", - "Flexible", - "Gold Rupee", - "Purple Rupee", - "Deku Shield", - "Hylian Shield", - "Zora Tunic", - "Goron Tunic", - "Bombs (Special)", - "Bombchus" + "Green Rupee", "Blue Rupee", "Red Rupee", "Recovery Heart", "Bombs (A)", "Arrow", + "Heart Piece", "Heart Container", "Arrows (5)", "Arrows (10)", "Arrows (30)", "Bombs (B)", + "Deku Nuts (5)", "Deku Stick", "Magic (Large)", "Magic (Small)", "Deku Seeds (5)", "Small Key", + "Flexible", "Gold Rupee", "Purple Rupee", "Deku Shield", "Hylian Shield", "Zora Tunic", + "Goron Tunic", "Bombs (Special)", "Bombchus", }; int selectedItem = params & 0xFF; @@ -460,18 +408,18 @@ void CreateActorSpecificData() { collectibleFlag = 0x3F; } } - + return (collectibleFlag << 8) + selectedItem; }; actorSpecificData[ACTOR_EN_GM] = [](s16 params) -> s16 { u8 switchFlag = (params & 0x3F00) >> 8; - + ImGui::InputScalar("Switch Flag", ImGuiDataType_U8, &switchFlag); if (switchFlag > 0x3F) { switchFlag = 0x3F; } - + return switchFlag << 8; }; @@ -527,13 +475,13 @@ void CreateActorSpecificData() { "Bombs (5) (35 Rupees)", "Red Potion (40 Rupees)", "Red Potion (50 Rupees)", - "Randomizer Item" + "Randomizer Item", }; int selectedItem = params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -545,13 +493,13 @@ void CreateActorSpecificData() { "Spawned Falling (2)", //"INVALID", "Ceiling Spot Spawner", - "On Floor" + "On Floor", }; int selectedItem = params > 3 ? params - 1 : params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem > 3 ? selectedItem + 1 : selectedItem; } - + return params; }; @@ -576,119 +524,108 @@ void CreateActorSpecificData() { "Magic Fire", "Magic Wind", "Magic Dark", - "Bullet Bag" + "Bullet Bag", }; int selectedItem = params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; actorSpecificData[ACTOR_EN_ELF] = [](s16 params) -> s16 { static const char* items[] = { - "Navi", - "Revive Bottle", - "Heal Timed", - "Kokiri", - "Spawner", - "Revive Death", - "Heal", - "Heal Big" + "Navi", "Revive Bottle", "Heal Timed", "Kokiri", "Spawner", "Revive Death", "Heal", "Heal Big", }; int selectedItem = params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; actorSpecificData[ACTOR_EN_CLEAR_TAG] = [](s16 params) -> s16 { static const char* items[] = { - "Cutscene", //0 - "Normal", //1 - "Laser" //100 + "Cutscene", // 0 + "Normal", // 1 + "Laser", // 100 }; int selectedItem = params == 100 ? 2 : params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem == 2 ? 100 : selectedItem; } - + return params; }; actorSpecificData[ACTOR_EN_BOMBF] = [](s16 params) -> s16 { static const char* items[] = { "Flower", "Body", "Explosion" }; - //the + 1 is because the params are -1, 0 & 1 instead of 0, 1 & 2 + // the + 1 is because the params are -1, 0 & 1 instead of 0, 1 & 2 int selectedItem = params + 1; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem - 1; } - + return params; }; actorSpecificData[ACTOR_EN_BOM] = [](s16 params) -> s16 { static const char* items[] = { "Body", "Explosion" }; - + int selectedItem = params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; actorSpecificData[ACTOR_DOOR_WARP1] = [](s16 params) -> s16 { static const char* items[] = { - "Blue Crystal", // -2 - "Dungeon Adult", - "Dungeon Child", - "Clear Flag", // Activate on temp clear flag - "Sages", // Used by sages warping into chamber of sages during their cutscene + "Blue Crystal", // -2 + "Dungeon Adult", "Dungeon Child", + "Clear Flag", // Activate on temp clear flag + "Sages", // Used by sages warping into chamber of sages during their cutscene "Purple Crystal", - "Yellow", // The colored variants don't warp, they are cutscene setpieces + "Yellow", // The colored variants don't warp, they are cutscene setpieces "Blue Ruto", - "Destination", // Spawning in after having taken a warp - "UNK 7", - "Orange", - "Green", - "Red" + "Destination", // Spawning in after having taken a warp + "UNK 7", "Orange", "Green", "Red", }; int selectedItem = params + 2; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem - 2; } - + return params; }; actorSpecificData[ACTOR_EN_DY_EXTRA] = [](s16 params) -> s16 { static const char* items[] = { "Orange", "Green" }; - + int selectedItem = params; if (ImGui::Combo("Color", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; actorSpecificData[ACTOR_EN_SKB] = [](s16 params) -> s16 { u8 size = params; ImGui::InputScalar("Size", ImGuiDataType_U8, &size); - + return size; }; actorSpecificData[ACTOR_EN_WF] = [](s16 params) -> s16 { static const char* items[] = { "Normal", "White" }; - + int selectedItem = params; ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items)); - + u8 switchFlag = (params & 0x3F00) >> 8; ImGui::InputScalar("Switch Flag", ImGuiDataType_U8, &switchFlag); return (switchFlag << 8) + selectedItem; @@ -711,7 +648,7 @@ void CreateActorSpecificData() { if (itemId > 0x7F) { itemId = 0x7F; } - + static const char* items[] = { "Big (Default)", "Room Clear Big", @@ -724,7 +661,7 @@ void CreateActorSpecificData() { "Switch Flag Fall Small", "9", "10", - "Switch Flag Big" + "Switch Flag Big", }; int type = (params >> 12) & 0xF; @@ -759,7 +696,7 @@ void CreateActorSpecificData() { if (transitionIndex > 0x3F) { transitionIndex = 0x3F; } - + static const char* items[] = { "Room Load", // loads rooms "Locked", // small key locked door @@ -800,9 +737,9 @@ void CreateActorSpecificData() { actorSpecificData[ACTOR_EN_PO_DESERT] = [](s16 params) -> s16 { u8 switchFlag = params >> 8; - + ImGui::InputScalar("Path", ImGuiDataType_U8, &switchFlag); - + return switchFlag << 8; }; @@ -815,30 +752,26 @@ void CreateActorSpecificData() { if (ImGui::Checkbox("Fishing Sign", &fishingSign)) { piece = false; } - + u8 textId = params; if (!piece && !fishingSign) { if (ImGui::InputScalar("Text ID", ImGuiDataType_U8, &textId)) { textId |= 0x300; } } - + return piece ? (s16)0xFFDD : (fishingSign ? 0x300 : textId); }; actorSpecificData[ACTOR_EN_KUSA] = [](s16 params) -> s16 { - static const char* items[] = { - "0", - "1", - "2" - }; + static const char* items[] = { "0", "1", "2" }; int type = params & 3; ImGui::Combo("Type", &type, items, IM_ARRAYSIZE(items)); bool bugs = ((params >> 4) & 1) != 0; ImGui::Checkbox("Bugs", &bugs); - + u8 drop = (params >> 8) & 0xF; if (type == 2) { ImGui::InputScalar("Random Drop Params", ImGuiDataType_U8, &drop); @@ -853,17 +786,12 @@ void CreateActorSpecificData() { }; actorSpecificData[ActorDB::Instance->RetrieveId("En_Partner")] = [](s16 params) -> s16 { - static const char* items[] = { - "Port 1", - "Port 2", - "Port 3", - "Port 4" - }; + static const char* items[] = { "Port 1", "Port 2", "Port 3", "Port 4" }; int selectedItem = params; if (ImGui::Combo("Controller Port", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; } @@ -889,25 +817,37 @@ std::vector GetActorsWithDescriptionContainingString(std::string s) { } void ActorViewer_AddTagForActor(Actor* actor) { - int val = CVarGetInteger(CVAR_DEVELOPER_TOOLS("ActorViewer.NameTags"), ACTORVIEWER_NAMETAGS_NONE); - auto entry = ActorDB::Instance->RetrieveEntry(actor->id); - std::string tag; - - if (val > 0 && entry.entry.valid) { - switch (val) { - case ACTORVIEWER_NAMETAGS_DESC: - tag = entry.desc; - break; - case ACTORVIEWER_NAMETAGS_NAME: - tag = entry.name; - break; - case ACTORVIEWER_NAMETAGS_BOTH: - tag = entry.name + '\n' + entry.desc; - break; - } - - NameTag_RegisterForActorWithOptions(actor, tag.c_str(), { .tag = DEBUG_ACTOR_NAMETAG_TAG }); + if (!CVarGetInteger(CVAR_ACTOR_NAME_TAGS("Enabled"), 0)) { + return; } + + std::vector parts; + + if (CVarGetInteger(CVAR_ACTOR_NAME_TAGS("DisplayID"), 0)) { + parts.push_back(GetActorDebugName(actor->id)); + } + if (CVarGetInteger(CVAR_ACTOR_NAME_TAGS("DisplayDescription"), 0)) { + parts.push_back(GetActorDescription(actor->id)); + } + if (CVarGetInteger(CVAR_ACTOR_NAME_TAGS("DisplayCategory"), 0)) { + parts.push_back(acMapping[actor->category]); + } + if (CVarGetInteger(CVAR_ACTOR_NAME_TAGS("DisplayParams"), 0)) { + parts.push_back(fmt::format("0x{:04X} ({})", (u16)actor->params, actor->params)); + } + + std::string tag = ""; + for (size_t i = 0; i < parts.size(); i++) { + if (i != 0) { + tag += "\n"; + } + tag += parts.at(i); + } + + bool withZBuffer = CVarGetInteger(CVAR_ACTOR_NAME_TAGS("WithZBuffer"), 0); + + NameTag_RegisterForActorWithOptions(actor, tag.c_str(), + { .tag = DEBUG_ACTOR_NAMETAG_TAG, .noZBuffer = !withZBuffer }); } void ActorViewer_AddTagForAllActors() { @@ -926,38 +866,67 @@ void ActorViewer_AddTagForAllActors() { } void ActorViewerWindow::DrawElement() { - static Actor* display; - static Actor empty{}; - static Actor* fetch = NULL; - static ActorInfo newActor = {0,0, {0, 0, 0}, {0, 0, 0}}; - static bool needs_reset = false; + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + static ActorInfo newActor = { 0, 0, { 0, 0, 0 }, { 0, 0, 0 } }; static ImU16 one = 1; - static int actor; - static int category = 0; - static RetrievalMethod rm; static std::string filler = "Please select"; - static std::vector list; - static u16 lastSceneId = 0; - static char searchString[64] = ""; - static s16 currentSelectedInDropdown; - static std::vector actors; + static std::string searchString = ""; + static s16 currentSelectedInDropdown = -1; + static std::vector actorSearchResults; if (gPlayState != nullptr) { - needs_reset = lastSceneId != gPlayState->sceneNum; - if (needs_reset) { - display = ∅ - fetch = nullptr; - actor = category = 0; - filler = "Please Select"; - list.clear(); - needs_reset = false; - for (size_t i = 0; i < ARRAY_COUNT(searchString); i += 1) { - searchString[i] = 0; + if (ImGui::BeginChild("options", ImVec2(0, 0), ImGuiChildFlags_Border | ImGuiChildFlags_AutoResizeY)) { + bool toggled = false; + bool optionChange = false; + + ImGui::SeparatorText("Options"); + + toggled = UIWidgets::CVarCheckbox("Actor Name Tags", CVAR_ACTOR_NAME_TAGS("Enabled"), + { { .tooltip = "Adds \"name tags\" above actors for identification" } }); + + ImGui::SameLine(); + + UIWidgets::Button("Display Items", { { .tooltip = "Click to add display items on the name tags" } }); + + if (ImGui::BeginPopupContextItem(nullptr, ImGuiPopupFlags_MouseButtonLeft | ImGuiPopupFlags_NoReopen)) { + optionChange |= UIWidgets::CVarCheckbox("ID", CVAR_ACTOR_NAME_TAGS("DisplayID")); + optionChange |= UIWidgets::CVarCheckbox("Description", CVAR_ACTOR_NAME_TAGS("DisplayDescription")); + optionChange |= UIWidgets::CVarCheckbox("Category", CVAR_ACTOR_NAME_TAGS("DisplayCategory")); + optionChange |= UIWidgets::CVarCheckbox("Params", CVAR_ACTOR_NAME_TAGS("DisplayParams")); + + ImGui::EndPopup(); + } + + optionChange |= UIWidgets::CVarCheckbox( + "Name tags with Z-Buffer", CVAR_ACTOR_NAME_TAGS("WithZBuffer"), + { { .tooltip = "Allow name tags to be obstructed when behind geometry and actors" } }); + + if (toggled || optionChange) { + bool tagsEnabled = CVarGetInteger(CVAR_ACTOR_NAME_TAGS("Enabled"), 0); + bool noOptionsEnabled = !CVarGetInteger(CVAR_ACTOR_NAME_TAGS("DisplayID"), 0) && + !CVarGetInteger(CVAR_ACTOR_NAME_TAGS("DisplayDescription"), 0) && + !CVarGetInteger(CVAR_ACTOR_NAME_TAGS("DisplayCategory"), 0) && + !CVarGetInteger(CVAR_ACTOR_NAME_TAGS("DisplayParams"), 0); + + // Save the user an extra click and prevent adding "empty" tags by enabling, + // disabling, or setting an option based on what changed + if (tagsEnabled && noOptionsEnabled) { + if (toggled) { + CVarSetInteger(CVAR_ACTOR_NAME_TAGS("DisplayID"), 1); + } else { + CVarSetInteger(CVAR_ACTOR_NAME_TAGS("Enabled"), 0); + } + } else if (optionChange && !tagsEnabled && !noOptionsEnabled) { + CVarSetInteger(CVAR_ACTOR_NAME_TAGS("Enabled"), 1); + } + + NameTag_RemoveAllByTag(DEBUG_ACTOR_NAMETAG_TAG); + ActorViewer_AddTagForAllActors(); } - currentSelectedInDropdown = -1; - actors.clear(); } - lastSceneId = gPlayState->sceneNum; + ImGui::EndChild(); + + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("Actor Type", acMapping[category])) { for (int i = 0; i < acMapping.size(); i++) { if (ImGui::Selectable(acMapping[i])) { @@ -969,155 +938,159 @@ void ActorViewerWindow::DrawElement() { ImGui::EndCombo(); } + if (display == nullptr) { + filler = "Please select"; + } + if (ImGui::BeginCombo("Actor", filler.c_str())) { - if (gPlayState != nullptr && lastSceneId != gPlayState->sceneNum) { - PopulateActorDropdown(category, list); - lastSceneId = gPlayState->sceneNum; - } for (int i = 0; i < list.size(); i++) { std::string label = std::to_string(i) + ": " + ActorDB::Instance->RetrieveEntry(list[i]->id).name; std::string description = GetActorDescription(list[i]->id); if (description != "") label += " (" + description + ")"; - if (ImGui::Selectable(label.c_str())) { - rm = LIST; + if (ImGui::Selectable(label.c_str(), list[i] == display)) { display = list[i]; - actor = i; filler = label; break; } } ImGui::EndCombo(); } + PopStyleCombobox(); + PushStyleHeader(THEME_COLOR); if (ImGui::TreeNode("Selected Actor")) { - DrawGroupWithBorder([&]() { - ImGui::Text("Name: %s", ActorDB::Instance->RetrieveEntry(display->id).name.c_str()); - ImGui::Text("Description: %s", GetActorDescription(display->id).c_str()); - ImGui::Text("Category: %s", acMapping[display->category]); - ImGui::Text("ID: %d", display->id); - ImGui::Text("Parameters: %d", display->params); - }); - - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - - DrawGroupWithBorder([&]() { - ImGui::Text("Actor Position"); - ImGui::InputScalar("x pos", ImGuiDataType_Float, &display->world.pos.x); + if (display != nullptr) { + DrawGroupWithBorder( + [&]() { + ImGui::Text("Name: %s", ActorDB::Instance->RetrieveEntry(display->id).name.c_str()); + ImGui::Text("Description: %s", GetActorDescription(display->id).c_str()); + ImGui::Text("Category: %s", acMapping[display->category]); + ImGui::Text("ID: %d", display->id); + ImGui::Text("Parameters: %d", display->params); + ImGui::Text("Actor List Index: %d", GetActorListIndex(display)); + }, + "Selected Actor"); ImGui::SameLine(); - ImGui::InputScalar("y pos", ImGuiDataType_Float, &display->world.pos.y); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + + DrawGroupWithBorder( + [&]() { + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + PushStyleInput(THEME_COLOR); + ImGui::Text("Actor Position"); + ImGui::InputScalar("X##CurPos", ImGuiDataType_Float, &display->world.pos.x); + ImGui::InputScalar("Y##CurPos", ImGuiDataType_Float, &display->world.pos.y); + ImGui::InputScalar("Z##CurPos", ImGuiDataType_Float, &display->world.pos.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, + "Actor Position"); ImGui::SameLine(); - ImGui::InputScalar("z pos", ImGuiDataType_Float, &display->world.pos.z); - }); + DrawGroupWithBorder( + [&]() { + PushStyleInput(THEME_COLOR); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + ImGui::Text("Actor Rotation"); + ImGui::InputScalar("X##CurRot", ImGuiDataType_S16, &display->world.rot.x); + ImGui::InputScalar("Y##CurRot", ImGuiDataType_S16, &display->world.rot.y); + ImGui::InputScalar("Z##CurRot", ImGuiDataType_S16, &display->world.rot.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, + "Actor Rotation"); - DrawGroupWithBorder([&]() { - ImGui::Text("Actor Rotation"); - ImGui::InputScalar("x rot", ImGuiDataType_S16, &display->world.rot.x); - ImGui::SameLine(); - ImGui::InputScalar("y rot", ImGuiDataType_S16, &display->world.rot.y); - ImGui::SameLine(); - ImGui::InputScalar("z rot", ImGuiDataType_S16, &display->world.rot.z); - }); - - if (display->category == ACTORCAT_BOSS || display->category == ACTORCAT_ENEMY) { - ImGui::InputScalar("Enemy Health", ImGuiDataType_U8, &display->colChkInfo.health); - UIWidgets::InsertHelpHoverText("Some actors might not use this!"); - } - - DrawGroupWithBorder([&]() { - ImGui::Text("flags"); - UIWidgets::DrawFlagArray32("flags", display->flags); - }); - - ImGui::SameLine(); - - DrawGroupWithBorder([&]() { - ImGui::Text("bgCheckFlags"); - UIWidgets::DrawFlagArray16("bgCheckFlags", display->bgCheckFlags); - }); - - if (ImGui::Button("Refresh")) { - PopulateActorDropdown(category, list); - switch (rm) { - case INTERACT: - case HELD: - case TARGET: - display = fetch; - break; - case LIST: - display = list[actor]; - break; - default: - break; + if (display->category == ACTORCAT_BOSS || display->category == ACTORCAT_ENEMY) { + PushStyleInput(THEME_COLOR); + ImGui::InputScalar("Enemy Health", ImGuiDataType_U8, &display->colChkInfo.health); + PopStyleInput(); + UIWidgets::InsertHelpHoverText("Some actors might not use this!"); } + + DrawGroupWithBorder( + [&]() { + ImGui::Text("flags"); + UIWidgets::DrawFlagArray32("flags", display->flags); + }, + "flags"); + + ImGui::SameLine(); + + DrawGroupWithBorder( + [&]() { + ImGui::Text("bgCheckFlags"); + UIWidgets::DrawFlagArray16("bgCheckFlags", display->bgCheckFlags); + }, + "bgCheckFlags"); + + if (Button("Go to Actor", ButtonOptions().Color(THEME_COLOR))) { + Player* player = GET_PLAYER(gPlayState); + Math_Vec3f_Copy(&player->actor.world.pos, &display->world.pos); + Math_Vec3f_Copy(&player->actor.home.pos, &player->actor.world.pos); + } + } else { + ImGui::Text("Select an actor to display information."); } - if (ImGui::Button("Go to Actor")) { + if (Button("Fetch from Target", + ButtonOptions() + .Color(THEME_COLOR) + .Tooltip("Grabs actor with target arrow above it. You might need C-Up for enemies"))) { Player* player = GET_PLAYER(gPlayState); - Math_Vec3f_Copy(&player->actor.world.pos, &display->world.pos); - Math_Vec3f_Copy(&player->actor.home.pos, &player->actor.world.pos); - } - - if (ImGui::Button("Fetch from Target")) { - Player* player = GET_PLAYER(gPlayState); - fetch = player->talkActor; - if (fetch != NULL) { - display = fetch; - category = fetch->category; + if (player->talkActor != NULL) { + display = player->talkActor; + category = display->category; PopulateActorDropdown(category, list); - rm = TARGET; } } - UIWidgets::InsertHelpHoverText("Grabs actor with target arrow above it. You might need C-Up for enemies"); - if (ImGui::Button("Fetch from Held")) { + if (Button("Fetch from Held", + ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor that Link is holding"))) { Player* player = GET_PLAYER(gPlayState); - fetch = player->heldActor; - if (fetch != NULL) { - display = fetch; - category = fetch->category; + if (player->heldActor != NULL) { + display = player->heldActor; + category = display->category; PopulateActorDropdown(category, list); - rm = HELD; } } - UIWidgets::InsertHelpHoverText("Grabs actor that Link is holding"); - if (ImGui::Button("Fetch from Interaction")) { + if (Button("Fetch from Interaction", + ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor from \"interaction range\""))) { Player* player = GET_PLAYER(gPlayState); - fetch = player->interactRangeActor; - if (fetch != NULL) { - display = fetch; - category = fetch->category; + if (player->interactRangeActor != NULL) { + display = player->interactRangeActor; + category = display->category; PopulateActorDropdown(category, list); - rm = INTERACT; } } - UIWidgets::InsertHelpHoverText("Grabs actor from \"interaction range\""); ImGui::TreePop(); } if (ImGui::TreeNode("New...")) { - ImGui::PushItemWidth(ImGui::GetFontSize() * 10); + // ImGui::PushItemWidth(ImGui::GetFontSize() * 10); - if (ImGui::InputText("Search Actor", searchString, ARRAY_COUNT(searchString))) { - actors = GetActorsWithDescriptionContainingString(std::string(searchString)); + if (InputString("Search Actor", &searchString, InputOptions().Color(THEME_COLOR))) { + actorSearchResults = GetActorsWithDescriptionContainingString(searchString); currentSelectedInDropdown = -1; } - if (searchString[0] != 0 && !actors.empty()) { - std::string preview = currentSelectedInDropdown == -1 ? "Please Select" : ActorDB::Instance->RetrieveEntry(actors[currentSelectedInDropdown]).desc; + if (!SohUtils::IsStringEmpty(searchString) && !actorSearchResults.empty()) { + std::string preview = + currentSelectedInDropdown == -1 + ? "Please Select" + : ActorDB::Instance->RetrieveEntry(actorSearchResults[currentSelectedInDropdown]).desc; + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("Results", preview.c_str())) { - for (u8 i = 0; i < actors.size(); i++) { - if (ImGui::Selectable( - ActorDB::Instance->RetrieveEntry(actors[i]).desc.c_str(), - i == currentSelectedInDropdown - )) { + for (u8 i = 0; i < actorSearchResults.size(); i++) { + if (ImGui::Selectable(ActorDB::Instance->RetrieveEntry(actorSearchResults[i]).desc.c_str(), + i == currentSelectedInDropdown)) { currentSelectedInDropdown = i; - newActor.id = actors[i]; + newActor.id = actorSearchResults[i]; } } ImGui::EndCombo(); } + PopStyleCombobox(); } ImGui::Text("%s", GetActorDescription(newActor.id).c_str()); @@ -1125,44 +1098,58 @@ void ActorViewerWindow::DrawElement() { newActor.params = 0; } - UIWidgets::EnhancementCheckbox("Advanced mode", CVAR_DEVELOPER_TOOLS("ActorViewer.AdvancedParams")); - UIWidgets::InsertHelpHoverText("Changes the actor specific param menus with a direct input"); + CVarCheckbox("Advanced mode", CVAR_DEVELOPER_TOOLS("ActorViewer.AdvancedParams"), + CheckboxOptions().Tooltip("Changes the actor specific param menus with a direct input")); if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("ActorViewer.AdvancedParams"), 0)) { + PushStyleInput(THEME_COLOR); ImGui::InputScalar("params", ImGuiDataType_S16, &newActor.params, &one); + PopStyleInput(); } else if (std::find(noParamsActors.begin(), noParamsActors.end(), newActor.id) == noParamsActors.end()) { CreateActorSpecificData(); if (actorSpecificData.find(newActor.id) == actorSpecificData.end()) { + PushStyleInput(THEME_COLOR); ImGui::InputScalar("params", ImGuiDataType_S16, &newActor.params, &one); + PopStyleInput(); } else { - DrawGroupWithBorder([&]() { - ImGui::Text("Actor Specific Data"); - newActor.params = actorSpecificData[newActor.id](newActor.params); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Actor Specific Data"); + newActor.params = actorSpecificData[newActor.id](newActor.params); + }, + "Actor Specific Data"); } } ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - DrawGroupWithBorder([&]() { - ImGui::Text("New Actor Position"); - ImGui::InputScalar("posX", ImGuiDataType_Float, &newActor.pos.x); - ImGui::SameLine(); - ImGui::InputScalar("posY", ImGuiDataType_Float, &newActor.pos.y); - ImGui::SameLine(); - ImGui::InputScalar("posZ", ImGuiDataType_Float, &newActor.pos.z); - }); + DrawGroupWithBorder( + [&]() { + PushStyleInput(THEME_COLOR); + ImGui::Text("New Actor Position"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + ImGui::InputScalar("X##NewPos", ImGuiDataType_Float, &newActor.pos.x); + ImGui::InputScalar("Y##NewPos", ImGuiDataType_Float, &newActor.pos.y); + ImGui::InputScalar("Z##NewPos", ImGuiDataType_Float, &newActor.pos.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, + "New Actor Position"); + ImGui::SameLine(); + DrawGroupWithBorder( + [&]() { + PushStyleInput(THEME_COLOR); + ImGui::Text("New Actor Rotation"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + ImGui::InputScalar("X##NewRot", ImGuiDataType_S16, &newActor.rot.x); + ImGui::InputScalar("Y##NewRot", ImGuiDataType_S16, &newActor.rot.y); + ImGui::InputScalar("Z##NewRot", ImGuiDataType_S16, &newActor.rot.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, + "New Actor Rotation"); - DrawGroupWithBorder([&]() { - ImGui::Text("New Actor Rotation"); - ImGui::InputScalar("rotX", ImGuiDataType_S16, &newActor.rot.x); - ImGui::SameLine(); - ImGui::InputScalar("rotY", ImGuiDataType_S16, &newActor.rot.y); - ImGui::SameLine(); - ImGui::InputScalar("rotZ", ImGuiDataType_S16, &newActor.rot.z); - }); - - if (ImGui::Button("Fetch from Link")) { + if (Button("Fetch from Link", ButtonOptions().Color(THEME_COLOR))) { Player* player = GET_PLAYER(gPlayState); Vec3f newPos = player->actor.world.pos; Vec3s newRot = player->actor.world.rot; @@ -1170,7 +1157,7 @@ void ActorViewerWindow::DrawElement() { newActor.rot = newRot; } - if (ImGui::Button("Spawn")) { + if (Button("Spawn", ButtonOptions().Color(THEME_COLOR))) { if (ActorDB::Instance->RetrieveEntry(newActor.id).entry.valid) { Actor_Spawn(&gPlayState->actorCtx, gPlayState, newActor.id, newActor.pos.x, newActor.pos.y, newActor.pos.z, newActor.rot.x, newActor.rot.y, newActor.rot.z, newActor.params, 0); @@ -1179,7 +1166,7 @@ void ActorViewerWindow::DrawElement() { } } - if (ImGui::Button("Spawn as Child")) { + if (Button("Spawn as Child", ButtonOptions().Color(THEME_COLOR))) { Actor* parent = display; if (parent != NULL) { if (newActor.id >= 0 && newActor.id < ACTOR_ID_MAX && @@ -1193,48 +1180,52 @@ void ActorViewerWindow::DrawElement() { } } - if (ImGui::Button("Reset")) { + if (Button("Reset", ButtonOptions().Color(THEME_COLOR))) { newActor = { 0, 0, { 0, 0, 0 }, { 0, 0, 0 } }; } ImGui::TreePop(); } - - static const char* nameTagOptions[] = { - "None", - "Short Description", - "Actor ID", - "Both" - }; - - UIWidgets::Spacer(0); - - ImGui::Text("Actor Name Tags"); - if (UIWidgets::EnhancementCombobox(CVAR_DEVELOPER_TOOLS("ActorViewer.NameTags"), nameTagOptions, ACTORVIEWER_NAMETAGS_NONE)) { - NameTag_RemoveAllByTag(DEBUG_ACTOR_NAMETAG_TAG); - ActorViewer_AddTagForAllActors(); - } - UIWidgets::Tooltip("Adds \"name tags\" above actors for identification"); + PopStyleHeader(); } else { ImGui::Text("Global Context needed for actor info!"); - if (needs_reset) { - fetch = nullptr; - actor = category = 0; - filler = "Please Select"; - list.clear(); - needs_reset = false; - for (size_t i = 0; i < ARRAY_COUNT(searchString); i += 1) { - searchString[i] = 0; - } - currentSelectedInDropdown = -1; - actors.clear(); - } } + ImGui::EndDisabled(); } void ActorViewerWindow::InitElement() { - GameInteractor::Instance->RegisterGameHook([](void* refActor) { + GameInteractor::Instance->RegisterGameHook([this](void* refActor) { Actor* actor = static_cast(refActor); - ActorViewer_AddTagForActor(actor); + + // Reload actor list if the new actor belongs to the selected category + if (category == actor->category) { + PopulateActorDropdown(actor->category, list); + } + }); + + GameInteractor::Instance->RegisterGameHook([this](void* refActor) { + Actor* actor = static_cast(refActor); + + // If the actor belongs to the selected category, we need to manually remove it, as it has not been removed from + // the global actor array yet + if (category == actor->category) { + list.erase(std::remove(list.begin(), list.end(), actor), list.end()); + } + if (display == actor) { + display = nullptr; + } + }); + + GameInteractor::Instance->RegisterGameHook([this](int16_t sceneNum) { + display = nullptr; + category = ACTORCAT_SWITCH; + list.clear(); }); } + +void ActorViewer_RegisterNameTagHooks() { + COND_HOOK(OnActorInit, CVAR_ACTOR_NAME_TAGS_ENABLED, + [](void* actor) { ActorViewer_AddTagForActor(static_cast(actor)); }); +} + +RegisterShipInitFunc nametagInit(ActorViewer_RegisterNameTagHooks, { CVAR_ACTOR_NAME_TAGS_ENABLED_NAME }); diff --git a/soh/soh/Enhancements/debugger/actorViewer.h b/soh/soh/Enhancements/debugger/actorViewer.h index 2f4ca680a1..07c7e5e24d 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.h +++ b/soh/soh/Enhancements/debugger/actorViewer.h @@ -2,11 +2,20 @@ #include -class ActorViewerWindow : public Ship::GuiWindow { +#include "z64actor.h" + +#include + +class ActorViewerWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void DrawElement() override; void InitElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; + + private: + Actor* display = nullptr; + int category = ACTORCAT_SWITCH; + std::vector list; }; diff --git a/soh/soh/Enhancements/debugger/colViewer.cpp b/soh/soh/Enhancements/debugger/colViewer.cpp index 493ffdfdca..88e943f87e 100644 --- a/soh/soh/Enhancements/debugger/colViewer.cpp +++ b/soh/soh/Enhancements/debugger/colViewer.cpp @@ -1,6 +1,7 @@ #include "colViewer.h" #include "../../frame_interpolation.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include #include @@ -19,12 +20,12 @@ extern "C" { extern PlayState* gPlayState; } -enum class ColRenderSetting { Disabled, Solid, Transparent }; +enum ColRenderSetting { ColRenderDisabled, ColRenderSolid, ColRenderTransparent }; -static const char* ColRenderSettingNames[] = { - "Disabled", - "Solid", - "Transparent", +static std::unordered_map ColRenderSettingNames = { + { ColRenderDisabled, "Disabled" }, + { ColRenderSolid, "Solid" }, + { ColRenderTransparent, "Transparent" }, }; ImVec4 scene_col; @@ -53,45 +54,93 @@ static std::vector cylinderVtx; static std::vector sphereGfx; static std::vector sphereVtx; +using namespace UIWidgets; + // Draws the ImGui window for the collision viewer void ColViewerWindow::DrawElement() { - UIWidgets::EnhancementCheckbox("Enabled", CVAR_DEVELOPER_TOOLS("ColViewer.Enabled")); + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + CheckboxOptions checkOpt = CheckboxOptions().Color(THEME_COLOR); + ComboboxOptions comboOpt = ComboboxOptions().Color(THEME_COLOR); + CVarCheckbox("Enabled", CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), checkOpt); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Scene", CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), ColRenderSettingNames, COLVIEW_DISABLED); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Bg Actors", CVAR_DEVELOPER_TOOLS("ColViewer.BGActors"), ColRenderSettingNames, COLVIEW_DISABLED); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Col Check", CVAR_DEVELOPER_TOOLS("ColViewer.ColCheck"), ColRenderSettingNames, COLVIEW_DISABLED); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Waterbox", CVAR_DEVELOPER_TOOLS("ColViewer.Waterbox"), ColRenderSettingNames, COLVIEW_DISABLED); + CVarCombobox("Scene", CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), ColRenderSettingNames, comboOpt); + CVarCombobox("Bg Actors", CVAR_DEVELOPER_TOOLS("ColViewer.BGActors"), ColRenderSettingNames, comboOpt); + CVarCombobox("Col Check", CVAR_DEVELOPER_TOOLS("ColViewer.ColCheck"), ColRenderSettingNames, comboOpt); + CVarCombobox("Waterbox", CVAR_DEVELOPER_TOOLS("ColViewer.Waterbox"), ColRenderSettingNames, comboOpt); - UIWidgets::EnhancementCheckbox("Apply as decal", CVAR_DEVELOPER_TOOLS("ColViewer.Decal"), false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::InsertHelpHoverText("Applies the collision as a decal display. This can be useful if there is z-fighting occuring " - "with the scene geometry, but can cause other artifacts."); - UIWidgets::EnhancementCheckbox("Shaded", CVAR_DEVELOPER_TOOLS("ColViewer.Shaded")); - UIWidgets::InsertHelpHoverText("Applies the scene's shading to the collision display."); + CVarCheckbox("Apply as decal", CVAR_DEVELOPER_TOOLS("ColViewer.Decal"), + checkOpt.DefaultValue(true).Tooltip( + "Applies the collision as a decal display. This can be useful if there is z-fighting occuring " + "with the scene geometry, but can cause other artifacts.")); + CVarCheckbox("Shaded", CVAR_DEVELOPER_TOOLS("ColViewer.Shaded"), + checkOpt.DefaultValue(false).Tooltip("Applies the scene's shading to the collision display.")); // This has to be duplicated in both code paths due to the nature of ImGui::IsItemHovered() const std::string colorHelpText = "View and change the colors used for collision display."; + PushStyleHeader(THEME_COLOR); if (ImGui::TreeNode("Colors")) { - UIWidgets::InsertHelpHoverText(colorHelpText); + UIWidgets::Tooltip(colorHelpText.c_str()); - UIWidgets::EnhancementColor("Normal", CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), scene_col, ImVec4(255, 255, 255, 255), false); - UIWidgets::EnhancementColor("Hookshot", CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), hookshot_col, ImVec4(128, 128, 255, 255), - false); - UIWidgets::EnhancementColor("Entrance", CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), entrance_col, ImVec4(0, 255, 0, 255), false); - UIWidgets::EnhancementColor("Special Surface (Grass/Sand/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), - specialSurface_col, ImVec4(192, 255, 192, 255), false); - UIWidgets::EnhancementColor("Interactable (Vines/Crawlspace/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), - interactable_col, ImVec4(192, 0, 192, 255), false); - UIWidgets::EnhancementColor("Slope", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), slope_col, ImVec4(255, 255, 128, 255), false); - UIWidgets::EnhancementColor("Void", CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid"), void_col, ImVec4(255, 0, 0, 255), false); - UIWidgets::EnhancementColor("OC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC"), oc_col, ImVec4(255, 255, 255, 255), false); - UIWidgets::EnhancementColor("AC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC"), ac_col, ImVec4(0, 0, 255, 255), false); - UIWidgets::EnhancementColor("AT", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT"), at_col, ImVec4(255, 0, 0, 255), false); - UIWidgets::EnhancementColor("Waterbox", CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), waterbox_col, ImVec4(0, 0, 255, 255), false); + if (CVarColorPicker("Normal", CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), { 255, 255, 255, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + scene_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), { 255, 255, 255, 255 })); + } + if (CVarColorPicker("Hookshot", CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), { 128, 128, 255, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + hookshot_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), { 128, 128, 255, 255 })); + } + if (CVarColorPicker("Entrance", CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), { 0, 255, 0, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + entrance_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), { 0, 255, 0, 255 })); + } + if (CVarColorPicker("Special Surface (Grass/Sand/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), + { 192, 255, 192, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, + THEME_COLOR)) { + specialSurface_col = VecFromRGBA8( + CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), { 192, 255, 192, 255 })); + } + if (CVarColorPicker("Interactable (Vines/Crawlspace/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), + { 192, 0, 192, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, + THEME_COLOR)) { + interactable_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), { 192, 0, 192, 255 })); + } + if (CVarColorPicker("Slope", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), { 255, 255, 128, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + slope_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), { 255, 255, 128, 255 })); + } + if (CVarColorPicker("Void", CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid"), { 255, 0, 0, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + void_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid"), { 255, 0, 0, 255 })); + } + if (CVarColorPicker("OC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC"), { 255, 255, 255, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + oc_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC"), { 255, 255, 255, 255 })); + } + if (CVarColorPicker("AC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC"), { 0, 0, 255, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + ac_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC"), { 0, 0, 255, 255 })); + } + if (CVarColorPicker("AT", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT"), { 255, 0, 0, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + at_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT"), { 255, 0, 0, 255 })); + } + if (CVarColorPicker("Waterbox", CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), { 0, 0, 255, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + waterbox_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), { 0, 0, 255, 255 })); + } ImGui::TreePop(); } else { - UIWidgets::InsertHelpHoverText(colorHelpText); + UIWidgets::Tooltip(colorHelpText.c_str()); } + PopStyleHeader(); + ImGui::EndDisabled(); } // Calculates the normal for a triangle at the 3 specified points @@ -185,9 +234,9 @@ void CreateSphereFace(std::vector>& faces, in // Create 3 new verticies at the midpoints Vec3f vs[3] = { - Vec3f{(v0.n.ob[0] + v1.n.ob[0]) / 2.0f, (v0.n.ob[1] + v1.n.ob[1]) / 2.0f, (v0.n.ob[2] + v1.n.ob[2]) / 2.0f}, - Vec3f{(v1.n.ob[0] + v2.n.ob[0]) / 2.0f, (v1.n.ob[1] + v2.n.ob[1]) / 2.0f, (v1.n.ob[2] + v2.n.ob[2]) / 2.0f}, - Vec3f{(v2.n.ob[0] + v0.n.ob[0]) / 2.0f, (v2.n.ob[1] + v0.n.ob[1]) / 2.0f, (v2.n.ob[2] + v0.n.ob[2]) / 2.0f} + Vec3f{ (v0.n.ob[0] + v1.n.ob[0]) / 2.0f, (v0.n.ob[1] + v1.n.ob[1]) / 2.0f, (v0.n.ob[2] + v1.n.ob[2]) / 2.0f }, + Vec3f{ (v1.n.ob[0] + v2.n.ob[0]) / 2.0f, (v1.n.ob[1] + v2.n.ob[1]) / 2.0f, (v1.n.ob[2] + v2.n.ob[2]) / 2.0f }, + Vec3f{ (v2.n.ob[0] + v0.n.ob[0]) / 2.0f, (v2.n.ob[1] + v0.n.ob[1]) / 2.0f, (v2.n.ob[2] + v0.n.ob[2]) / 2.0f } }; // Normalize vertex positions so they are on the sphere @@ -212,20 +261,20 @@ void CreateSphereData() { float d = (1.0f + sqrtf(5.0f)) / 2.0f; // Create the 12 starting verticies, 4 on each rectangle - base.emplace_back(Vec3f({-1, d, 0})); - base.emplace_back(Vec3f({1, d, 0})); - base.emplace_back(Vec3f({-1, -d, 0})); - base.emplace_back(Vec3f({1, -d, 0})); + base.emplace_back(Vec3f({ -1, d, 0 })); + base.emplace_back(Vec3f({ 1, d, 0 })); + base.emplace_back(Vec3f({ -1, -d, 0 })); + base.emplace_back(Vec3f({ 1, -d, 0 })); - base.emplace_back(Vec3f({0, -1, d})); - base.emplace_back(Vec3f({0, 1, d})); - base.emplace_back(Vec3f({0, -1, -d})); - base.emplace_back(Vec3f({0, 1, -d})); + base.emplace_back(Vec3f({ 0, -1, d })); + base.emplace_back(Vec3f({ 0, 1, d })); + base.emplace_back(Vec3f({ 0, -1, -d })); + base.emplace_back(Vec3f({ 0, 1, -d })); - base.emplace_back(Vec3f({d, 0, -1})); - base.emplace_back(Vec3f({d, 0, 1})); - base.emplace_back(Vec3f({-d, 0, -1})); - base.emplace_back(Vec3f({-d, 0, 1})); + base.emplace_back(Vec3f({ d, 0, -1 })); + base.emplace_back(Vec3f({ d, 0, 1 })); + base.emplace_back(Vec3f({ -d, 0, -1 })); + base.emplace_back(Vec3f({ -d, 0, 1 })); // Normalize verticies so they are on the unit sphere for (Vec3f& v : base) { @@ -287,7 +336,7 @@ void InitGfx(std::vector& gfx, ColRenderSetting setting) { uint64_t cm; uint32_t gm; - if (setting == ColRenderSetting::Transparent) { + if (setting == ColRenderTransparent) { rm = Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL; blc1 = GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA); blc2 = GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA); @@ -301,7 +350,7 @@ void InitGfx(std::vector& gfx, ColRenderSetting setting) { if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Decal"), 1) != 0) { rm |= ZMODE_DEC; - } else if (setting == ColRenderSetting::Transparent) { + } else if (setting == ColRenderTransparent) { rm |= ZMODE_XLU; } else { rm |= ZMODE_OPA; @@ -324,7 +373,7 @@ void InitGfx(std::vector& gfx, ColRenderSetting setting) { // Draws a dynapoly structure (scenes or Bg Actors) void DrawDynapoly(std::vector& dl, CollisionHeader* col, int32_t bgId) { - Color_RGBA8 color = {255, 255, 255, 255}; + Color_RGBA8 color = { 255, 255, 255, 255 }; uint32_t lastColorR = color.r; uint32_t lastColorG = color.g; @@ -340,21 +389,21 @@ void DrawDynapoly(std::vector& dl, CollisionHeader* col, int32_t bgId) { CollisionPoly* poly = &col->polyList[i]; if (SurfaceType_IsHookshotSurface(&gPlayState->colCtx, poly, bgId)) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), { 128, 128, 255, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot.Value"), { 128, 128, 255, 255 }); } else if (func_80041D94(&gPlayState->colCtx, poly, bgId) > 0x01) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), {192, 0, 192, 255}); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable.Value"), { 192, 0, 192, 255 }); } else if (func_80041E80(&gPlayState->colCtx, poly, bgId) == 0x0C) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid"), { 255, 0, 0, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid.Value"), { 255, 0, 0, 255 }); } else if (SurfaceType_GetSceneExitIndex(&gPlayState->colCtx, poly, bgId) || func_80041E80(&gPlayState->colCtx, poly, bgId) == 0x05) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), { 0, 255, 0, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance.Value"), { 0, 255, 0, 255 }); } else if (func_80041D4C(&gPlayState->colCtx, poly, bgId) != 0 || SurfaceType_IsWallDamage(&gPlayState->colCtx, poly, bgId)) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), { 192, 255, 192, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface.Value"), { 192, 255, 192, 255 }); } else if (SurfaceType_GetSlope(&gPlayState->colCtx, poly, bgId) == 0x01) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), { 255, 255, 128, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope.Value"), { 255, 255, 128, 255 }); } else { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), { 255, 255, 255, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal.Value"), { 255, 255, 255, 255 }); } if (color.r != lastColorR || color.g != lastColorG || color.b != lastColorB) { @@ -402,13 +451,14 @@ void DrawDynapoly(std::vector& dl, CollisionHeader* col, int32_t bgId) { // Draws the scene void DrawSceneCollision() { - ColRenderSetting showSceneColSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), COLVIEW_DISABLED); + ColRenderSetting showSceneColSetting = + (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), COLVIEW_DISABLED); - if (showSceneColSetting == ColRenderSetting::Disabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { + if (showSceneColSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; } - std::vector& dl = (showSceneColSetting == ColRenderSetting::Transparent) ? xluDl : opaDl; + std::vector& dl = (showSceneColSetting == ColRenderTransparent) ? xluDl : opaDl; InitGfx(dl, showSceneColSetting); dl.push_back(gsSPMatrix(&gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH)); @@ -417,12 +467,13 @@ void DrawSceneCollision() { // Draws all Bg Actors void DrawBgActorCollision() { - ColRenderSetting showBgActorSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.BGActors"), COLVIEW_DISABLED); - if (showBgActorSetting == ColRenderSetting::Disabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { + ColRenderSetting showBgActorSetting = + (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.BGActors"), COLVIEW_DISABLED); + if (showBgActorSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; } - std::vector& dl = (showBgActorSetting == ColRenderSetting::Transparent) ? xluDl : opaDl; + std::vector& dl = (showBgActorSetting == ColRenderTransparent) ? xluDl : opaDl; InitGfx(dl, showBgActorSetting); dl.push_back(gsSPMatrix(&gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH)); @@ -542,23 +593,24 @@ void DrawColCheckList(std::vector& dl, Collider** objects, int32_t count) { // Draws all Col Check objects void DrawColCheckCollision() { - ColRenderSetting showColCheckSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.ColCheck"), COLVIEW_DISABLED); - if (showColCheckSetting == ColRenderSetting::Disabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { + ColRenderSetting showColCheckSetting = + (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.ColCheck"), COLVIEW_DISABLED); + if (showColCheckSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; } - std::vector& dl = (showColCheckSetting == ColRenderSetting::Transparent) ? xluDl : opaDl; + std::vector& dl = (showColCheckSetting == ColRenderTransparent) ? xluDl : opaDl; InitGfx(dl, showColCheckSetting); dl.push_back(gsSPMatrix(&gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH)); CollisionCheckContext& col = gPlayState->colChkCtx; - Color_RGBA8 color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC"), { 255, 255, 255, 255 }); + Color_RGBA8 color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC.Value"), { 255, 255, 255, 255 }); dl.push_back(gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); DrawColCheckList(dl, col.colOC, col.colOCCount); - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC"), { 0, 0, 255, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC.Value"), { 0, 0, 255, 255 }); dl.push_back(gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); DrawColCheckList(dl, col.colAC, col.colACCount); - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT"), { 0, 0, 255, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT.Value"), { 0, 0, 255, 255 }); dl.push_back(gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); DrawColCheckList(dl, col.colAT, col.colATCount); @@ -594,16 +646,17 @@ extern "C" f32 zdWaterBoxMinY; // Draws all waterboxes void DrawWaterboxList() { - ColRenderSetting showWaterboxSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Waterbox"), COLVIEW_DISABLED); - if (showWaterboxSetting == ColRenderSetting::Disabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { + ColRenderSetting showWaterboxSetting = + (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Waterbox"), COLVIEW_DISABLED); + if (showWaterboxSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; } - std::vector& dl = (showWaterboxSetting == ColRenderSetting::Transparent) ? xluDl : opaDl; + std::vector& dl = (showWaterboxSetting == ColRenderTransparent) ? xluDl : opaDl; InitGfx(dl, showWaterboxSetting); dl.push_back(gsSPMatrix(&gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH)); - Color_RGBA8 color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), { 0, 0, 255, 255 }); + Color_RGBA8 color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox.Value"), { 0, 0, 255, 255 }); dl.push_back(gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); diff --git a/soh/soh/Enhancements/debugger/colViewer.h b/soh/soh/Enhancements/debugger/colViewer.h index b4807e873a..04f457aa00 100644 --- a/soh/soh/Enhancements/debugger/colViewer.h +++ b/soh/soh/Enhancements/debugger/colViewer.h @@ -2,20 +2,16 @@ #include -typedef enum { - COLVIEW_DISABLED, - COLVIEW_SOLID, - COLVIEW_TRANSPARENT -} ColViewerRenderSetting; +typedef enum { COLVIEW_DISABLED, COLVIEW_SOLID, COLVIEW_TRANSPARENT } ColViewerRenderSetting; #ifdef __cplusplus -class ColViewerWindow : public Ship::GuiWindow { +class ColViewerWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; #endif diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index b9858aff4e..547d1907a9 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -3,6 +3,7 @@ #include "soh/SohGui/ImGuiUtils.h" #include "soh/OTRGlobals.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include #include @@ -27,7 +28,7 @@ extern PlayState* gPlayState; } // Maps entries in the GS flag array to the area name it represents -std::vector gsMapping = { +std::vector gsMapping = { "Deku Tree", "Dodongo's Cavern", "Inside Jabu-Jabu's Belly", @@ -56,6 +57,15 @@ extern "C" u8 gAreaGsFlags[]; extern "C" u8 gAmmoItems[]; +#define IMAGE_SIZE 48.0f + +using namespace UIWidgets; + +IntSliderOptions intSliderOptionsBase; +ButtonOptions buttonOptionsBase; +CheckboxOptions checkboxOptionsBase; +ComboboxOptions comboboxOptionsBase; + // Modification of gAmmoItems that replaces ITEM_NONE with the item in inventory slot it represents u8 gAllAmmoItems[] = { ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_ARROW_FIRE, ITEM_DINS_FIRE, @@ -64,40 +74,29 @@ u8 gAllAmmoItems[] = { }; // Encapsulates what is drawn by the passed-in function within a border -template -void DrawGroupWithBorder(T&& drawFunc) { +template void DrawGroupWithBorder(T&& drawFunc, std::string section) { // First group encapsulates the inner portion and border + ImGui::BeginChild(std::string("##" + section).c_str(), ImVec2(0, 0), + ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_Borders | ImGuiChildFlags_AutoResizeX | + ImGuiChildFlags_AutoResizeY); + ImGui::BeginGroup(); - - ImVec2 padding = ImGui::GetStyle().FramePadding; - ImVec2 p0 = ImGui::GetCursorScreenPos(); - ImGui::SetCursorScreenPos(ImVec2(p0.x + padding.x, p0.y + padding.y)); - - // Second group encapsulates just the inner portion - ImGui::BeginGroup(); - + ImGui::AlignTextToFramePadding(); drawFunc(); - - ImGui::Dummy(padding); ImGui::EndGroup(); - ImVec2 p1 = ImGui::GetItemRectMax(); - p1.x += padding.x; - ImVec4 borderCol = ImGui::GetStyle().Colors[ImGuiCol_Border]; - ImGui::GetWindowDrawList()->AddRect(p0, p1, IM_COL32(borderCol.x * 255, borderCol.y * 255, borderCol.z * 255, borderCol.w * 255)); - - ImGui::EndGroup(); + ImGui::EndChild(); } char z2ASCII(int code) { int ret; - if (code < 10) { //Digits + if (code < 10) { // Digits ret = code + 0x30; - } else if (code >= 10 && code < 36) { //Uppercase letters + } else if (code >= 10 && code < 36) { // Uppercase letters ret = code + 0x37; - } else if (code >= 36 && code < 62) { //Lowercase letters + } else if (code >= 36 && code < 62) { // Lowercase letters ret = code + 0x3D; - } else if (code == 62) { //Space + } else if (code == 62) { // Space ret = code - 0x1E; } else if (code == 63 || code == 64) { // _ and . ret = code - 0x12; @@ -105,9 +104,40 @@ char z2ASCII(int code) { ret = code; } return char(ret); - } +enum MagicLevel { MAGIC_LEVEL_NONE, MAGIC_LEVEL_SINGLE, MAGIC_LEVEL_DOUBLE }; + +std::unordered_map magicLevelMap = { + { MAGIC_LEVEL_NONE, "None" }, + { MAGIC_LEVEL_SINGLE, "Single" }, + { MAGIC_LEVEL_DOUBLE, "Double" }, +}; + +enum AudioOutput { + AUDIO_STEREO, + AUDIO_MONO, + AUDIO_HEADSET, + AUDIO_SURROUND, +}; + +std::unordered_map audioMap = { + { AUDIO_STEREO, "Stereo" }, + { AUDIO_MONO, "Mono" }, + { AUDIO_HEADSET, "Headset" }, + { AUDIO_SURROUND, "Surround" }, +}; + +enum ZTarget { + Z_TARGET_SWITCH, + Z_TARGET_HOLD, +}; + +std::unordered_map zTargetMap = { + { Z_TARGET_SWITCH, "Switch" }, + { Z_TARGET_HOLD, "Hold" }, +}; + void DrawInfoTab() { // TODO Needs a better method for name changing but for now this will work. std::string name; @@ -121,305 +151,273 @@ void DrawInfoTab() { ImGui::PushItemWidth(ImGui::GetFontSize() * 6); ImGui::Text("Name: %s", name.c_str()); - UIWidgets::InsertHelpHoverText("Player Name"); + Tooltip("Player Name"); std::string nameID; for (int i = 0; i < 8; i++) { nameID = z2ASCII(i); if (i % 4 != 0) { ImGui::SameLine(); } + PushStyleInput(THEME_COLOR); ImGui::InputScalar(nameID.c_str(), ImGuiDataType_U8, &gSaveContext.playerName[i], &one, NULL); + PopStyleInput(); } // Use an intermediary to keep the health from updating (and potentially killing the player) // until it is done being edited int16_t healthIntermediary = gSaveContext.healthCapacity; + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Max Health", ImGuiDataType_S16, &healthIntermediary); + PopStyleInput(); if (ImGui::IsItemDeactivated()) { gSaveContext.healthCapacity = healthIntermediary; } - UIWidgets::InsertHelpHoverText("Maximum health. 16 units per full heart"); + Tooltip("Maximum health. 16 units per full heart"); if (gSaveContext.health > gSaveContext.healthCapacity) { gSaveContext.health = gSaveContext.healthCapacity; // Clamp health to new max } - - const uint16_t healthMin = 0; - const uint16_t healthMax = gSaveContext.healthCapacity; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); - ImGui::SliderScalar("Health", ImGuiDataType_S16, &gSaveContext.health, &healthMin, &healthMax); - UIWidgets::InsertHelpHoverText("Current health. 16 units per full heart"); + int32_t health = (int32_t)gSaveContext.health; + if (SliderInt("Health", &health, + intSliderOptionsBase.Tooltip("Current health. 16 units per full heart") + .Min(0) + .Max(gSaveContext.healthCapacity))) { + gSaveContext.health = (int16_t)health; + } bool isDoubleDefenseAcquired = gSaveContext.isDoubleDefenseAcquired != 0; - if (ImGui::Checkbox("Double Defense", &isDoubleDefenseAcquired)) { + if (Checkbox("Double Defense", &isDoubleDefenseAcquired, + checkboxOptionsBase.Tooltip("Is double defense unlocked?"))) { gSaveContext.isDoubleDefenseAcquired = isDoubleDefenseAcquired; gSaveContext.inventory.defenseHearts = gSaveContext.isDoubleDefenseAcquired ? 20 : 0; // Set to get the border drawn in the UI } - UIWidgets::InsertHelpHoverText("Is double defense unlocked?"); - - std::string magicName; - if (gSaveContext.magicLevel == 2) { - magicName = "Double"; - } else if (gSaveContext.magicLevel == 1) { - magicName = "Single"; - } else { - magicName = "None"; + if (Combobox("Magic Level", &gSaveContext.magicLevel, magicLevelMap, + comboboxOptionsBase.Tooltip("Current magic level"))) { + gSaveContext.isMagicAcquired = gSaveContext.magicLevel > 0; + gSaveContext.isDoubleMagicAcquired = gSaveContext.magicLevel == 2; } - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 6); - if (ImGui::BeginCombo("Magic Level", magicName.c_str())) { - if (ImGui::Selectable("Double")) { - gSaveContext.magicLevel = 2; - gSaveContext.isMagicAcquired = true; - gSaveContext.isDoubleMagicAcquired = true; - } - if (ImGui::Selectable("Single")) { - gSaveContext.magicLevel = 1; - gSaveContext.isMagicAcquired = true; - gSaveContext.isDoubleMagicAcquired = false; - } - if (ImGui::Selectable("None")) { - gSaveContext.magicLevel = 0; - gSaveContext.isMagicAcquired = false; - gSaveContext.isDoubleMagicAcquired = false; - } - - ImGui::EndCombo(); - } - UIWidgets::InsertHelpHoverText("Current magic level"); gSaveContext.magicCapacity = gSaveContext.magicLevel * 0x30; // Set to get the bar drawn in the UI if (gSaveContext.magic > gSaveContext.magicCapacity) { gSaveContext.magic = gSaveContext.magicCapacity; // Clamp magic to new max } - const uint8_t magicMin = 0; - const uint8_t magicMax = gSaveContext.magicCapacity; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); - ImGui::SliderScalar("Magic", ImGuiDataType_S8, &gSaveContext.magic, &magicMin, &magicMax); - UIWidgets::InsertHelpHoverText("Current magic. 48 units per magic level"); + int32_t magic = (int32_t)gSaveContext.magic; + if (SliderInt("Magic", &magic, + intSliderOptionsBase.Min(0) + .Max(gSaveContext.magicCapacity) + .Tooltip("Current magic. 48 units per magic level"))) { + gSaveContext.magic = (int8_t)magic; + } + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Rupees", ImGuiDataType_S16, &gSaveContext.rupees); - UIWidgets::InsertHelpHoverText("Current rupees"); + Tooltip("Current rupees"); + PopStyleInput(); - const uint16_t dayTimeMin = 0; - const uint16_t dayTimeMax = 0xFFFF; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); - ImGui::SliderScalar("Time", ImGuiDataType_U16, &gSaveContext.dayTime, &dayTimeMin, &dayTimeMax); - UIWidgets::InsertHelpHoverText("Time of day"); - if (ImGui::Button("Dawn")) { + SliderInt("Time", (int32_t*)&gSaveContext.dayTime, intSliderOptionsBase.Min(0).Max(0xFFFF).Tooltip("Time of day")); + if (Button("Dawn", buttonOptionsBase)) { gSaveContext.dayTime = 0x4000; } ImGui::SameLine(); - if (ImGui::Button("Noon")) { + if (Button("Noon", buttonOptionsBase)) { gSaveContext.dayTime = 0x8000; } ImGui::SameLine(); - if (ImGui::Button("Sunset")) { + if (Button("Sunset", buttonOptionsBase)) { gSaveContext.dayTime = 0xC001; } ImGui::SameLine(); - if (ImGui::Button("Midnight")) { + if (Button("Midnight", buttonOptionsBase)) { gSaveContext.dayTime = 0; } + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Total Days", ImGuiDataType_S32, &gSaveContext.totalDays); - UIWidgets::InsertHelpHoverText("Total number of days elapsed since the start of the game"); + Tooltip("Total number of days elapsed since the start of the game"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Deaths", ImGuiDataType_U16, &gSaveContext.deaths); - UIWidgets::InsertHelpHoverText("Total number of deaths"); + Tooltip("Total number of deaths"); + PopStyleInput(); - bool bgsFlag = gSaveContext.bgsFlag != 0; - if (ImGui::Checkbox("Has BGS", &bgsFlag)) { - gSaveContext.bgsFlag = bgsFlag; - } - UIWidgets::InsertHelpHoverText("Is Biggoron sword unlocked? Replaces Giant's knife"); + Checkbox("Has BGS", (bool*)&gSaveContext.bgsFlag, + checkboxOptionsBase.Tooltip("Is Biggoron sword unlocked? Replaces Giant's knife")); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Sword Health", ImGuiDataType_U16, &gSaveContext.swordHealth); - UIWidgets::InsertHelpHoverText("Giant's knife health. Default is 8. Must be >0 for Biggoron sword to work"); + Tooltip("Giant's knife health. Default is 8. Must be >0 for Biggoron sword to work"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Bgs Day Count", ImGuiDataType_S32, &gSaveContext.bgsDayCount); - UIWidgets::InsertHelpHoverText("Total number of days elapsed since giving Biggoron the claim check"); + Tooltip("Total number of days elapsed since giving Biggoron the claim check"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Entrance Index", ImGuiDataType_S32, &gSaveContext.entranceIndex); - UIWidgets::InsertHelpHoverText("From which entrance did Link arrive?"); + Tooltip("From which entrance did Link arrive?"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Cutscene Index", ImGuiDataType_S32, &gSaveContext.cutsceneIndex); - UIWidgets::InsertHelpHoverText("Which cutscene is this?"); + Tooltip("Which cutscene is this?"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Navi Timer", ImGuiDataType_U16, &gSaveContext.naviTimer); - UIWidgets::InsertHelpHoverText("Navi wants to talk at 600 units, decides not to at 3000."); + Tooltip("Navi wants to talk at 600 units, decides not to at 3000."); + PopStyleInput(); - ImGui::InputScalar("Timer 1 State", ImGuiDataType_S16, &gSaveContext.timer1State); - UIWidgets::InsertHelpHoverText("Heat timer, race timer, etc. Has white font"); + PushStyleInput(THEME_COLOR); + ImGui::InputScalar("Timer State", ImGuiDataType_S16, &gSaveContext.timerState); + Tooltip("Heat timer, race timer, etc. Has white font"); + PopStyleInput(); - ImGui::InputScalar("Timer 1 Value", ImGuiDataType_S16, &gSaveContext.timer1Value, &one, NULL); - UIWidgets::InsertHelpHoverText("Time, in seconds"); + PushStyleInput(THEME_COLOR); + ImGui::InputScalar("Timer Seconds", ImGuiDataType_S16, &gSaveContext.timerSeconds, &one, NULL); + Tooltip("Time, in seconds"); + PopStyleInput(); - ImGui::InputScalar("Timer 2 State", ImGuiDataType_S16, &gSaveContext.timer2State); - UIWidgets::InsertHelpHoverText("Trade timer, Ganon collapse timer, etc. Has yellow font"); + PushStyleInput(THEME_COLOR); + ImGui::InputScalar("Sub-Timer State", ImGuiDataType_S16, &gSaveContext.subTimerState); + Tooltip("Trade timer, Ganon collapse timer, etc. Has yellow font"); + PopStyleInput(); - ImGui::InputScalar("Timer 2 Value", ImGuiDataType_S16, &gSaveContext.timer2Value, &one, NULL); - UIWidgets::InsertHelpHoverText("Time, in seconds"); - - const char* audioName; - switch (gSaveContext.audioSetting) { - case 0: - audioName = "Stereo"; - break; - case 1: - audioName = "Mono"; - break; - case 2: - audioName = "Headset"; - break; - case 3: - audioName = "Surround"; - break; - default: - audioName = "?"; - } - if (ImGui::BeginCombo("Audio", audioName)) { - if (ImGui::Selectable("Stereo")) { - gSaveContext.audioSetting = 0; - } - if (ImGui::Selectable("Mono")) { - gSaveContext.audioSetting = 1; - } - if (ImGui::Selectable("Headset")) { - gSaveContext.audioSetting = 2; - } - if (ImGui::Selectable("Surround")) { - gSaveContext.audioSetting = 3; - } + PushStyleInput(THEME_COLOR); + ImGui::InputScalar("Sub-Timer Seconds", ImGuiDataType_S16, &gSaveContext.subTimerSeconds, &one, NULL); + Tooltip("Time, in seconds"); + PopStyleInput(); - ImGui::EndCombo(); - } - UIWidgets::InsertHelpHoverText("Sound setting"); - - bool n64DDFlag = gSaveContext.n64ddFlag != 0; - if (ImGui::Checkbox("64 DD file?", &n64DDFlag)) { - gSaveContext.n64ddFlag = n64DDFlag; - } - UIWidgets::InsertHelpHoverText("WARNING! If you save, your file may be locked! Use caution!"); - - if (ImGui::BeginCombo("Z Target Mode", gSaveContext.zTargetSetting ? "Hold" : "Switch")) { - if (ImGui::Selectable("Switch")) { - gSaveContext.zTargetSetting = 0; - } - if (ImGui::Selectable("Hold")) { - gSaveContext.zTargetSetting = 1; - } - ImGui::EndCombo(); - } - UIWidgets::InsertHelpHoverText("Z-Targeting behavior"); + Combobox("Audio", &gSaveContext.audioSetting, audioMap, comboboxOptionsBase.Tooltip("Sound setting")); + + Checkbox("64 DD file?", (bool*)&gSaveContext.n64ddFlag, + checkboxOptionsBase.Tooltip("WARNING! If you save, your file may be locked! Use caution!")); + + Combobox("Z Target Mode", &gSaveContext.zTargetSetting, zTargetMap, + comboboxOptionsBase.Tooltip("Z-Targeting behavior")); if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT)) { - ImGui::InputScalar("Triforce Pieces", ImGuiDataType_U8, &gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); - UIWidgets::InsertHelpHoverText("Currently obtained Triforce Pieces. For Triforce Hunt."); + PushStyleInput(THEME_COLOR); + ImGui::InputScalar("Triforce Pieces", ImGuiDataType_U8, + &gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); + Tooltip("Currently obtained Triforce Pieces. For Triforce Hunt."); + PopStyleInput(); } ImGui::PushItemWidth(ImGui::GetFontSize() * 10); - static std::array minigameHS = { "Horseback Archery", - "Big Poe Points", - "Fishing", - "Malon's Obstacle Course", - "Running Man Race", - "?", - "Dampe's Race" }; - + static std::array minigameHS = { "Horseback Archery", "Big Poe Points", + "Fishing", "Malon's Obstacle Course", + "Running Man Race", "?", + "Dampe's Race" }; + if (ImGui::TreeNode("Minigames")) { for (int i = 0; i < 7; i++) { - if(i == 2 && ImGui::TreeNode("Fishing") ){ //fishing has a few more flags to it + if (i == 2 && ImGui::TreeNode("Fishing")) { // fishing has a few more flags to it u8 fishSize = gSaveContext.highScores[i] & 0x7F; - if(ImGui::InputScalar("Child Size Record",ImGuiDataType_U8,&fishSize)){ - gSaveContext.highScores[i]&=~0x7F; - gSaveContext.highScores[i]|=fishSize & 0x7F; + PushStyleInput(THEME_COLOR); + if (ImGui::InputScalar("Child Size Record", ImGuiDataType_U8, &fishSize)) { + gSaveContext.highScores[i] &= ~0x7F; + gSaveContext.highScores[i] |= fishSize & 0x7F; } char fishMsg[64]; - std::sprintf(fishMsg,"Weight: %2.0f lbs",((SQ(fishSize)*.0036)+.5)); - UIWidgets::InsertHelpHoverText(fishMsg); - bool FishBool = gSaveContext.highScores[i]&0x80; - if (ImGui::Checkbox("Cheated as Child", &FishBool)) { - gSaveContext.highScores[i] &= ~0x80; - gSaveContext.highScores[i] |= (0x80 * FishBool); + std::sprintf(fishMsg, "Weight: %2.0f lbs", ((SQ(fishSize) * .0036) + .5)); + Tooltip(fishMsg); + PopStyleInput(); + bool FishBool = gSaveContext.highScores[i] & 0x80; + if (Checkbox("Cheated as Child", &FishBool, + checkboxOptionsBase.Tooltip("Used the Sinking lure to catch it."))) { + gSaveContext.highScores[i] &= ~0x80; + gSaveContext.highScores[i] |= (0x80 * FishBool); } - UIWidgets::InsertHelpHoverText("Used the Sinking lure to catch it."); - fishSize=(gSaveContext.highScores[i] & 0x7F000000)>>0x18; - if(ImGui::InputScalar("Adult Size Record",ImGuiDataType_U8,&fishSize)){ - gSaveContext.highScores[i]&=~0x7F000000; - gSaveContext.highScores[i]|=(fishSize & 0x7F) << 0x18; + fishSize = (gSaveContext.highScores[i] & 0x7F000000) >> 0x18; + PushStyleInput(THEME_COLOR); + if (ImGui::InputScalar("Adult Size Record", ImGuiDataType_U8, &fishSize)) { + gSaveContext.highScores[i] &= ~0x7F000000; + gSaveContext.highScores[i] |= (fishSize & 0x7F) << 0x18; } - std::sprintf(fishMsg,"Weight: %2.0f lbs",((SQ(fishSize)*.0036)+.5)); - UIWidgets::InsertHelpHoverText(fishMsg); + std::sprintf(fishMsg, "Weight: %2.0f lbs", ((SQ(fishSize) * .0036) + .5)); + Tooltip(fishMsg); + PopStyleInput(); FishBool = gSaveContext.highScores[i] & 0x80000000; - if (ImGui::Checkbox("Cheated as Adult", &FishBool)) { - gSaveContext.highScores[i] &= ~0x80000000; - gSaveContext.highScores[i] |= (0x80000000 * FishBool); + if (Checkbox("Cheated as Adult", &FishBool, + checkboxOptionsBase.Tooltip("Used the Sinking lure to catch it."))) { + gSaveContext.highScores[i] &= ~0x80000000; + gSaveContext.highScores[i] |= (0x80000000 * FishBool); } - UIWidgets::InsertHelpHoverText("Used the Sinking lure to catch it."); - FishBool = gSaveContext.highScores[i]&0x100; - if (ImGui::Checkbox("Played as Child", &FishBool)) { - gSaveContext.highScores[i] &= ~0x100; - gSaveContext.highScores[i] |= (0x100 * FishBool); + FishBool = gSaveContext.highScores[i] & 0x100; + if (Checkbox("Played as Child", &FishBool, + checkboxOptionsBase.Tooltip("Played at least one game as a child"))) { + gSaveContext.highScores[i] &= ~0x100; + gSaveContext.highScores[i] |= (0x100 * FishBool); } - UIWidgets::InsertHelpHoverText("Played at least one game as a child"); - FishBool = gSaveContext.highScores[i]&0x200; - if (ImGui::Checkbox("Played as Adult", &FishBool)) { - gSaveContext.highScores[i] &= ~0x200; - gSaveContext.highScores[i] |= (0x200 * FishBool); + FishBool = gSaveContext.highScores[i] & 0x200; + if (Checkbox("Played as Adult", &FishBool, + checkboxOptionsBase.Tooltip("Played at least one game as an adult"))) { + gSaveContext.highScores[i] &= ~0x200; + gSaveContext.highScores[i] |= (0x200 * FishBool); } - UIWidgets::InsertHelpHoverText("Played at least one game as an adult"); - FishBool = gSaveContext.highScores[i]&0x400; - if (ImGui::Checkbox("Got Prize as Child", &FishBool)) { - gSaveContext.highScores[i] &= ~0x400; - gSaveContext.highScores[i] |= (0x400 * FishBool); + FishBool = gSaveContext.highScores[i] & 0x400; + if (Checkbox( + "Got Prize as Child", &FishBool, + checkboxOptionsBase.Tooltip( + "Got the prize item (Heart Piece, unless rando.)\nunlocks Sinking Lure for Child Link."))) { + gSaveContext.highScores[i] &= ~0x400; + gSaveContext.highScores[i] |= (0x400 * FishBool); } - UIWidgets::InsertHelpHoverText("Got the prize item (Heart Piece, unless rando.)\nunlocks Sinking Lure for Child Link."); - FishBool = gSaveContext.highScores[i]&0x800; - if (ImGui::Checkbox("Got Prize as Adult", &FishBool)) { - gSaveContext.highScores[i] &= ~0x800; - gSaveContext.highScores[i] |= (0x800 * FishBool); + FishBool = gSaveContext.highScores[i] & 0x800; + if (Checkbox("Got Prize as Adult", &FishBool, + checkboxOptionsBase.Tooltip("Got the prize item (Golden Scale, unless rando.)\nUnlocks " + "Sinking Lure for Adult Link."))) { + gSaveContext.highScores[i] &= ~0x800; + gSaveContext.highScores[i] |= (0x800 * FishBool); } - UIWidgets::InsertHelpHoverText("Got the prize item (Golden Scale, unless rando.)\nUnlocks Sinking Lure for Adult Link."); FishBool = gSaveContext.highScores[i] & 0x1000; - if (ImGui::Checkbox("Stole Owner's Hat", &FishBool)) { - gSaveContext.highScores[i] &= ~0x1000; - gSaveContext.highScores[i] |= (0x1000 * FishBool); + if (Checkbox("Stole Owner's Hat", &FishBool, + checkboxOptionsBase.Tooltip("The owner's now visibly bald when Adult Link."))) { + gSaveContext.highScores[i] &= ~0x1000; + gSaveContext.highScores[i] |= (0x1000 * FishBool); } - UIWidgets::InsertHelpHoverText("The owner's now visibly bald when Adult Link."); - fishSize=(gSaveContext.highScores[i] & 0xFF0000)>>16; - if(ImGui::InputScalar("Times Played",ImGuiDataType_U8,&fishSize)){ - gSaveContext.highScores[i]&=~0xFF0000; - gSaveContext.highScores[i]|=(fishSize) << 16; + fishSize = (gSaveContext.highScores[i] & 0xFF0000) >> 16; + PushStyleInput(THEME_COLOR); + if (ImGui::InputScalar("Times Played", ImGuiDataType_U8, &fishSize)) { + gSaveContext.highScores[i] &= ~0xFF0000; + gSaveContext.highScores[i] |= (fishSize) << 16; } - UIWidgets::InsertHelpHoverText("Determines weather and school size during dawn/dusk."); - + Tooltip("Determines weather and school size during dawn/dusk."); + PopStyleInput(); + ImGui::TreePop(); continue; } - - if (i == 5) { //HS_UNK_05 is unused + + if (i == 5 || i == 2) { // HS_UNK_05 is unused continue; } std::string minigameLbl = minigameHS[i]; + PushStyleInput(THEME_COLOR); ImGui::InputScalar(minigameLbl.c_str(), ImGuiDataType_S32, &gSaveContext.highScores[i], &one, NULL); + PopStyleInput(); } - + ImGui::TreePop(); } - + ImGui::PopItemWidth(); } void DrawBGSItemFlag(uint8_t itemID) { const ItemMapEntry& slotEntry = itemMapping[itemID]; - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), + ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); } void DrawInventoryTab() { static bool restrictToValid = true; - ImGui::Checkbox("Restrict to valid items", &restrictToValid); - UIWidgets::InsertHelpHoverText("Restricts items and ammo to only what is possible to legally acquire in-game"); + Checkbox( + "Restrict to valid items", &restrictToValid, + checkboxOptionsBase.Tooltip("Restricts items and ammo to only what is possible to legally acquire in-game")); for (int32_t y = 0; y < 4; y++) { for (int32_t x = 0; x < 6; x++) { @@ -433,35 +431,36 @@ void DrawInventoryTab() { ImGui::SameLine(); } - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1, 1, 1, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); uint8_t item = gSaveContext.inventory.items[index]; + PushStyleButton(Colors::DarkGray); if (item != ITEM_NONE) { const ItemMapEntry& slotEntry = itemMapping.find(item)->second; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - auto ret = ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + auto ret = ImGui::ImageButton( + slotEntry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), + ImVec2(48.0f, 48.0f), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { selectedIndex = index; ImGui::OpenPopup(itemPopupPicker); } } else { - if (ImGui::Button("##itemNone", ImVec2(32.0f, 32.0f))) { + if (ImGui::Button("##itemNone", ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { selectedIndex = index; ImGui::OpenPopup(itemPopupPicker); } } - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); + PopStyleButton(); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); if (ImGui::BeginPopup(itemPopupPicker)) { - if (ImGui::Button("##itemNonePicker", ImVec2(32.0f, 32.0f))) { + PushStyleButton(Colors::DarkGray); + if (ImGui::Button("##itemNonePicker", + ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { gSaveContext.inventory.items[selectedIndex] = ITEM_NONE; ImGui::CloseCurrentPopup(); } - UIWidgets::SetLastItemHoverText("None"); + PopStyleButton(); + UIWidgets::Tooltip("None"); std::vector possibleItems; if (restrictToValid) { @@ -486,15 +485,17 @@ void DrawInventoryTab() { ImGui::SameLine(); } const ItemMapEntry& slotEntry = possibleItems[pickerIndex]; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - auto ret = ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + PushStyleButton(Colors::DarkGray); + auto ret = ImGui::ImageButton( + slotEntry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); + PopStyleButton(); if (ret) { gSaveContext.inventory.items[selectedIndex] = slotEntry.id; ImGui::CloseCurrentPopup(); } - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(slotEntry.id)); + UIWidgets::Tooltip(SohUtils::GetItemName(slotEntry.id).c_str()); } ImGui::EndPopup(); @@ -517,22 +518,25 @@ void DrawInventoryTab() { drawnAmmoItems++; ImGui::PushID(ammoIndex); - ImGui::PushItemWidth(32.0f); + ImGui::PushItemWidth(IMAGE_SIZE); ImGui::BeginGroup(); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[item].name), ImVec2(32.0f, 32.0f)); + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[item].name), + ImVec2(IMAGE_SIZE, IMAGE_SIZE)); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("##ammoInput", ImGuiDataType_S8, &AMMO(item)); + PopStyleInput(); ImGui::EndGroup(); ImGui::PopItemWidth(); ImGui::PopID(); } } - + // Trade quest flags are only used when shuffling the trade sequence, so // don't show this if it isn't needed. - if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ADULT_TRADE) - && ImGui::TreeNode("Adult trade quest items")) { + if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ADULT_TRADE) && + ImGui::TreeNode("Adult trade quest items")) { for (int i = ITEM_POCKET_EGG; i <= ITEM_CLAIM_CHECK; i++) { DrawBGSItemFlag(i); } @@ -548,7 +552,14 @@ void DrawFlagTableArray16(const FlagTable& flagTable, uint16_t row, uint16_t& fl ImGui::PushID(flagIndex); bool hasDescription = !!flagTable.flagDescriptions.contains(row * 16 + flagIndex); uint32_t bitMask = 1 << flagIndex; - ImGui::PushStyleColor(ImGuiCol_FrameBg, hasDescription ? ImVec4(0.16f, 0.29f, 0.48f, 0.54f) : ImVec4(0.16f, 0.29f, 0.48f, 0.24f)); + ImVec4 themeColor = ColorValues.at(THEME_COLOR); + ImVec4 colorDark = { themeColor.x * 0.4f, themeColor.y * 0.4f, themeColor.z * 0.4f, themeColor.z }; + ImVec4& color = themeColor; + if (!hasDescription) { + color = colorDark; + } + PushStyleCheckbox(hasDescription ? themeColor : colorDark); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); bool flag = (flags & bitMask) != 0; if (ImGui::Checkbox("##check", &flag)) { if (flag) { @@ -557,7 +568,8 @@ void DrawFlagTableArray16(const FlagTable& flagTable, uint16_t row, uint16_t& fl flags &= ~bitMask; } } - ImGui::PopStyleColor(); + ImGui::PopStyleVar(); + PopStyleCheckbox(); if (ImGui::IsItemHovered() && hasDescription) { ImGui::BeginTooltip(); ImGui::Text("%s", UIWidgets::WrappedText(flagTable.flagDescriptions.at(row * 16 + flagIndex), 60).c_str()); @@ -573,168 +585,181 @@ void DrawFlagsTab() { if (gPlayState != nullptr) { Player* player = GET_PLAYER(gPlayState); - DrawGroupWithBorder([&]() { - ImGui::Text("stateFlags1"); - UIWidgets::DrawFlagArray32("stateFlags1", player->stateFlags1); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("stateFlags1"); + DrawFlagArray32("stateFlags1", player->stateFlags1, THEME_COLOR); + }, + "stateFlags1"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("stateFlags2"); - UIWidgets::DrawFlagArray32("stateFlags2", player->stateFlags2); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("stateFlags2"); + DrawFlagArray32("stateFlags2", player->stateFlags2, THEME_COLOR); + }, + "stateFlags2"); + + DrawGroupWithBorder( + [&]() { + ImGui::Text("stateFlags3"); + DrawFlagArray8("stateFlags3", player->stateFlags3, THEME_COLOR); + }, + "stateFlags3"); - DrawGroupWithBorder([&]() { - ImGui::Text("stateFlags3"); - UIWidgets::DrawFlagArray8("stateFlags3", player->stateFlags3); - }); - ImGui::SameLine(); - - DrawGroupWithBorder([&]() { - ImGui::Text("unk_6AE_rotFlags"); - UIWidgets::DrawFlagArray16("unk_6AE_rotFlags", player->unk_6AE_rotFlags); - }); + + DrawGroupWithBorder( + [&]() { + ImGui::Text("unk_6AE_rotFlags"); + DrawFlagArray16("unk_6AE_rotFlags", player->unk_6AE_rotFlags, THEME_COLOR); + }, + "unk_6AE_rotFlags"); } ImGui::TreePop(); } if (ImGui::TreeNode("Current Scene")) { if (gPlayState != nullptr) { ActorContext* act = &gPlayState->actorCtx; - - DrawGroupWithBorder([&]() { - ImGui::Text("Switch"); - UIWidgets::InsertHelpHoverText("Permanently-saved switch flags"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Switch")) { - act->flags.swch = UINT32_MAX; - } - ImGui::SameLine(); - if (ImGui::Button("Clear All##Switch")) { - act->flags.swch = 0; - } - UIWidgets::DrawFlagArray32("Switch", act->flags.swch); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Switch"); + InsertHelpHoverText("Permanently-saved switch flags"); + if (Button("Set All##Switch", buttonOptionsBase.Tooltip(""))) { + act->flags.swch = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Switch", buttonOptionsBase.Tooltip(""))) { + act->flags.swch = 0; + } + DrawFlagArray32("Switch", act->flags.swch, THEME_COLOR); + }, + "Switch"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Temp Switch"); - UIWidgets::InsertHelpHoverText("Temporary switch flags. Unset on scene transitions"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Temp Switch")) { - act->flags.tempSwch = UINT32_MAX; - } - ImGui::SameLine(); - if (ImGui::Button("Clear All##Temp Switch")) { - act->flags.tempSwch = 0; - } - UIWidgets::DrawFlagArray32("Temp Switch", act->flags.tempSwch); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Temp Switch"); + InsertHelpHoverText("Temporary switch flags. Unset on scene transitions"); + if (Button("Set All##Temp Switch", buttonOptionsBase.Tooltip(""))) { + act->flags.tempSwch = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Temp Switch", buttonOptionsBase.Tooltip(""))) { + act->flags.tempSwch = 0; + } + DrawFlagArray32("Temp Switch", act->flags.tempSwch, THEME_COLOR); + }, + "Temp Switch"); - DrawGroupWithBorder([&]() { - ImGui::Text("Clear"); - UIWidgets::InsertHelpHoverText("Permanently-saved room-clear flags"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Clear")) { - act->flags.clear = UINT32_MAX; - } - ImGui::SameLine(); - if (ImGui::Button("Clear All##Clear")) { - act->flags.clear = 0; - } - UIWidgets::DrawFlagArray32("Clear", act->flags.clear); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Clear"); + InsertHelpHoverText("Permanently-saved room-clear flags"); + if (Button("Set All##Clear", buttonOptionsBase.Tooltip(""))) { + act->flags.clear = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Clear", buttonOptionsBase.Tooltip(""))) { + act->flags.clear = 0; + } + DrawFlagArray32("Clear", act->flags.clear, THEME_COLOR); + }, + "Clear"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Temp Clear"); - UIWidgets::InsertHelpHoverText("Temporary room-clear flags. Unset on scene transitions"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Temp Clear")) { - act->flags.tempClear = UINT32_MAX; - } - ImGui::SameLine(); - if (ImGui::Button("Clear All##Temp Clear")) { - act->flags.tempClear = 0; - } - UIWidgets::DrawFlagArray32("Temp Clear", act->flags.tempClear); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Temp Clear"); + InsertHelpHoverText("Temporary room-clear flags. Unset on scene transitions"); + if (Button("Set All##Temp Clear", buttonOptionsBase.Tooltip(""))) { + act->flags.tempClear = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Temp Clear", buttonOptionsBase.Tooltip(""))) { + act->flags.tempClear = 0; + } + DrawFlagArray32("Temp Clear", act->flags.tempClear, THEME_COLOR); + }, + "Temp Clear"); - DrawGroupWithBorder([&]() { - ImGui::Text("Collect"); - UIWidgets::InsertHelpHoverText("Permanently-saved collect flags"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Collect")) { - act->flags.collect = UINT32_MAX; - } - ImGui::SameLine(); - if (ImGui::Button("Clear All##Collect")) { - act->flags.collect = 0; - } - UIWidgets::DrawFlagArray32("Collect", act->flags.collect); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Collect"); + InsertHelpHoverText("Permanently-saved collect flags"); + if (Button("Set All##Collect", buttonOptionsBase.Tooltip(""))) { + act->flags.collect = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Collect", buttonOptionsBase.Tooltip(""))) { + act->flags.collect = 0; + } + DrawFlagArray32("Collect", act->flags.collect, THEME_COLOR); + }, + "Collect"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Temp Collect"); - UIWidgets::InsertHelpHoverText("Temporary collect flags. Unset on scene transitions"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Temp Collect")) { - act->flags.tempCollect = UINT32_MAX; - } - ImGui::SameLine(); - if (ImGui::Button("Clear All##Temp Collect")) { - act->flags.tempCollect = 0; - } - UIWidgets::DrawFlagArray32("Temp Collect", act->flags.tempCollect); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Temp Collect"); + InsertHelpHoverText("Temporary collect flags. Unset on scene transitions"); + if (Button("Set All##Temp Collect", buttonOptionsBase.Tooltip(""))) { + act->flags.tempCollect = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Temp Collect", buttonOptionsBase.Tooltip(""))) { + act->flags.tempCollect = 0; + } + DrawFlagArray32("Temp Collect", act->flags.tempCollect, THEME_COLOR); + }, + "Temp Collect"); - DrawGroupWithBorder([&]() { - ImGui::Text("Chest"); - UIWidgets::InsertHelpHoverText("Permanently-saved chest flags"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Chest")) { - act->flags.chest = UINT32_MAX; - } - ImGui::SameLine(); - if (ImGui::Button("Clear All##Chest")) { - act->flags.chest = 0; - } - UIWidgets::DrawFlagArray32("Chest", act->flags.chest); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Chest"); + InsertHelpHoverText("Permanently-saved chest flags"); + if (Button("Set All##Chest", buttonOptionsBase.Tooltip(""))) { + act->flags.chest = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Chest", buttonOptionsBase.Tooltip(""))) { + act->flags.chest = 0; + } + DrawFlagArray32("Chest", act->flags.chest, THEME_COLOR); + }, + "Chest"); ImGui::SameLine(); ImGui::BeginGroup(); - if (ImGui::Button("Reload Flags")) { + if (Button("Reload Flags", buttonOptionsBase.Tooltip( + "Load flags from saved scene flags. Normally happens on scene load"))) { act->flags.swch = gSaveContext.sceneFlags[gPlayState->sceneNum].swch; act->flags.clear = gSaveContext.sceneFlags[gPlayState->sceneNum].clear; act->flags.collect = gSaveContext.sceneFlags[gPlayState->sceneNum].collect; act->flags.chest = gSaveContext.sceneFlags[gPlayState->sceneNum].chest; } - UIWidgets::SetLastItemHoverText("Load flags from saved scene flags. Normally happens on scene load"); - if (ImGui::Button("Save Flags")) { + if (Button("Save Flags", + buttonOptionsBase.Tooltip("Save current scene flags. Normally happens on scene exit"))) { gSaveContext.sceneFlags[gPlayState->sceneNum].swch = act->flags.swch; gSaveContext.sceneFlags[gPlayState->sceneNum].clear = act->flags.clear; gSaveContext.sceneFlags[gPlayState->sceneNum].collect = act->flags.collect; gSaveContext.sceneFlags[gPlayState->sceneNum].chest = act->flags.chest; } - UIWidgets::SetLastItemHoverText("Save current scene flags. Normally happens on scene exit"); - - if (ImGui::Button("Clear Flags")) { + + if (Button("Clear Flags", + buttonOptionsBase.Tooltip("Clear current scene flags. Reload scene to see changes"))) { act->flags.swch = 0; act->flags.clear = 0; act->flags.collect = 0; act->flags.chest = 0; } - UIWidgets::SetLastItemHoverText("Clear current scene flags. Reload scene to see changes"); - ImGui::EndGroup(); } else { @@ -746,8 +771,10 @@ void DrawFlagsTab() { if (ImGui::TreeNode("Saved Scene Flags")) { static uint32_t selectedSceneFlagMap = 0; + ImGui::AlignTextToFramePadding(); ImGui::Text("Map"); ImGui::SameLine(); + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("##Map", SohUtils::GetSceneName(selectedSceneFlagMap).c_str())) { for (int32_t sceneIndex = 0; sceneIndex < SCENE_ID_MAX; sceneIndex++) { if (ImGui::Selectable(SohUtils::GetSceneName(sceneIndex).c_str())) { @@ -757,120 +784,141 @@ void DrawFlagsTab() { ImGui::EndCombo(); } + PopStyleCombobox(); // Don't show current scene button if there is no current scene if (gPlayState != nullptr) { ImGui::SameLine(); - if (ImGui::Button("Current")) { + if (Button("Current", buttonOptionsBase.Tooltip("Open flags for current scene"))) { selectedSceneFlagMap = gPlayState->sceneNum; } - UIWidgets::SetLastItemHoverText("Open flags for current scene"); } - DrawGroupWithBorder([&]() { - ImGui::Text("Switch"); - UIWidgets::InsertHelpHoverText("Switch flags"); - UIWidgets::DrawFlagArray32("Switch", gSaveContext.sceneFlags[selectedSceneFlagMap].swch); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Switch"); + InsertHelpHoverText("Switch flags"); + DrawFlagArray32("Switch", gSaveContext.sceneFlags[selectedSceneFlagMap].swch, THEME_COLOR); + }, + "Saved Switch"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Clear"); - UIWidgets::InsertHelpHoverText("Room-clear flags"); - UIWidgets::DrawFlagArray32("Clear", gSaveContext.sceneFlags[selectedSceneFlagMap].clear); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Clear"); + InsertHelpHoverText("Room-clear flags"); + DrawFlagArray32("Clear", gSaveContext.sceneFlags[selectedSceneFlagMap].clear, THEME_COLOR); + }, + "Saved Clear"); - DrawGroupWithBorder([&]() { - ImGui::Text("Collect"); - UIWidgets::InsertHelpHoverText("Collect flags"); - UIWidgets::DrawFlagArray32("Collect", gSaveContext.sceneFlags[selectedSceneFlagMap].collect); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Collect"); + InsertHelpHoverText("Collect flags"); + DrawFlagArray32("Collect", gSaveContext.sceneFlags[selectedSceneFlagMap].collect, THEME_COLOR); + }, + "Saved Collect"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Chest"); - UIWidgets::InsertHelpHoverText("Chest flags"); - UIWidgets::DrawFlagArray32("Chest", gSaveContext.sceneFlags[selectedSceneFlagMap].chest); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Chest"); + InsertHelpHoverText("Chest flags"); + DrawFlagArray32("Chest", gSaveContext.sceneFlags[selectedSceneFlagMap].chest, THEME_COLOR); + }, + "Saved Chest"); - DrawGroupWithBorder([&]() { - ImGui::Text("Rooms"); - UIWidgets::InsertHelpHoverText("Flags for visted rooms"); - UIWidgets::DrawFlagArray32("Rooms", gSaveContext.sceneFlags[selectedSceneFlagMap].rooms); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Rooms"); + InsertHelpHoverText("Flags for visted rooms"); + DrawFlagArray32("Rooms", gSaveContext.sceneFlags[selectedSceneFlagMap].rooms, THEME_COLOR); + }, + "Saved Rooms"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Floors"); - UIWidgets::InsertHelpHoverText("Flags for visted floors"); - UIWidgets::DrawFlagArray32("Floors", gSaveContext.sceneFlags[selectedSceneFlagMap].floors); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Floors"); + InsertHelpHoverText("Flags for visted floors"); + DrawFlagArray32("Floors", gSaveContext.sceneFlags[selectedSceneFlagMap].floors, THEME_COLOR); + }, + "Saved Floors"); ImGui::TreePop(); } - DrawGroupWithBorder([&]() { - static uint32_t selectedGsMap = 0; - ImGui::Text("Gold Skulltulas"); - ImGui::Text("Map"); - ImGui::SameLine(); - if (ImGui::BeginCombo("##Gold Skulltula Map", gsMapping[selectedGsMap].c_str())) { - for (int32_t gsIndex = 0; gsIndex < gsMapping.size(); gsIndex++) { - if (ImGui::Selectable(gsMapping[gsIndex].c_str())) { - selectedGsMap = gsIndex; + DrawGroupWithBorder( + [&]() { + PushStyleCombobox(THEME_COLOR); + static size_t selectedGsMap = 0; + ImGui::Text("Gold Skulltulas"); + if (ImGui::BeginCombo("##GSMap", gsMapping[selectedGsMap])) { + for (size_t index = 0; index < gsMapping.size(); index++) { + if (ImGui::Selectable(gsMapping[index])) { + selectedGsMap = index; + } } + + ImGui::EndCombo(); + } + PopStyleCombobox(); + + // TODO We should write out descriptions for each one... ugh + ImGui::AlignTextToFramePadding(); + ImGui::Text("Flags"); + uint32_t currentFlags = GET_GS_FLAGS(selectedGsMap); + uint32_t allFlags = gAreaGsFlags[selectedGsMap]; + uint32_t setMask = 1; + // Iterate over bitfield and create a checkbox for each skulltula + while (allFlags != 0) { + bool isThisSet = (currentFlags & 0x1) == 0x1; + + ImGui::SameLine(); + ImGui::PushID(allFlags); + PushStyleCheckbox(THEME_COLOR); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); + if (ImGui::Checkbox("##gs", &isThisSet)) { + if (isThisSet) { + SET_GS_FLAGS(selectedGsMap, setMask); + } else { + // Have to do this roundabout method as the macro does not support clearing flags + uint32_t currentFlagsBase = GET_GS_FLAGS(selectedGsMap); + gSaveContext.gsFlags[selectedGsMap >> 2] &= ~gGsFlagsMasks[selectedGsMap & 3]; + SET_GS_FLAGS(selectedGsMap, currentFlagsBase & ~setMask); + } + } + ImGui::PopStyleVar(); + PopStyleCheckbox(); + + ImGui::PopID(); + + allFlags >>= 1; + currentFlags >>= 1; + setMask <<= 1; } - ImGui::EndCombo(); - } - - // TODO We should write out descriptions for each one... ugh - ImGui::Text("Flags"); - uint32_t currentFlags = GET_GS_FLAGS(selectedGsMap); - uint32_t allFlags = gAreaGsFlags[selectedGsMap]; - uint32_t setMask = 1; - // Iterate over bitfield and create a checkbox for each skulltula - while (allFlags != 0) { - bool isThisSet = (currentFlags & 0x1) == 0x1; - - ImGui::SameLine(); - ImGui::PushID(allFlags); - if (ImGui::Checkbox("##gs", &isThisSet)) { - if (isThisSet) { - SET_GS_FLAGS(selectedGsMap, setMask); - } else { - // Have to do this roundabout method as the macro does not support clearing flags - uint32_t currentFlagsBase = GET_GS_FLAGS(selectedGsMap); - gSaveContext.gsFlags[selectedGsMap >> 2] &= ~gGsFlagsMasks[selectedGsMap & 3]; - SET_GS_FLAGS(selectedGsMap, currentFlagsBase & ~setMask); + // If playing a Randomizer Save with Shuffle Skull Tokens on anything other than "Off" we don't want to keep + // GS Token Count updated, since Gold Skulltulas killed will not correlate to GS Tokens Collected. + if (!(IS_RANDO && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TOKENS) != RO_TOKENSANITY_OFF)) { + static bool keepGsCountUpdated = true; + Checkbox("Keep GS Count Updated", &keepGsCountUpdated, + checkboxOptionsBase.Tooltip( + "Automatically adjust the number of gold skulltula tokens acquired based on set flags.")); + int32_t gsCount = 0; + if (keepGsCountUpdated) { + for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) { + gsCount += std::popcount(static_cast(gSaveContext.gsFlags[gsFlagIndex])); + } + gSaveContext.inventory.gsTokens = gsCount; } } - - ImGui::PopID(); - - allFlags >>= 1; - currentFlags >>= 1; - setMask <<= 1; - } - - // If playing a Randomizer Save with Shuffle Skull Tokens on anything other than "Off" we don't want to keep - // GS Token Count updated, since Gold Skulltulas killed will not correlate to GS Tokens Collected. - if (!(IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TOKENS) != RO_TOKENSANITY_OFF)) { - static bool keepGsCountUpdated = true; - ImGui::Checkbox("Keep GS Count Updated", &keepGsCountUpdated); - UIWidgets::InsertHelpHoverText("Automatically adjust the number of gold skulltula tokens acquired based on set flags."); - int32_t gsCount = 0; - if (keepGsCountUpdated) { - for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) { - gsCount += std::popcount(static_cast(gSaveContext.gsFlags[gsFlagIndex])); - } - gSaveContext.inventory.gsTokens = gsCount; - } - } - }); + }, + "Gold Skulltulas"); for (int i = 0; i < flagTables.size(); i++) { const FlagTable& flagTable = flagTables[i]; @@ -880,32 +928,34 @@ void DrawFlagsTab() { if (ImGui::TreeNode(flagTable.name)) { for (int j = 0; j < flagTable.size + 1; j++) { - DrawGroupWithBorder([&]() { - ImGui::Text("%s", fmt::format("{:<2x}", j).c_str()); - switch (flagTable.flagTableType) { - case EVENT_CHECK_INF: - DrawFlagTableArray16(flagTable, j, gSaveContext.eventChkInf[j]); - break; - case ITEM_GET_INF: - DrawFlagTableArray16(flagTable, j, gSaveContext.itemGetInf[j]); - break; - case INF_TABLE: - DrawFlagTableArray16(flagTable, j, gSaveContext.infTable[j]); - break; - case EVENT_INF: - DrawFlagTableArray16(flagTable, j, gSaveContext.eventInf[j]); - break; - case RANDOMIZER_INF: - DrawFlagTableArray16(flagTable, j, gSaveContext.ship.randomizerInf[j]); - break; - } - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("%s", fmt::format("{:<2x}", j).c_str()); + switch (flagTable.flagTableType) { + case EVENT_CHECK_INF: + DrawFlagTableArray16(flagTable, j, gSaveContext.eventChkInf[j]); + break; + case ITEM_GET_INF: + DrawFlagTableArray16(flagTable, j, gSaveContext.itemGetInf[j]); + break; + case INF_TABLE: + DrawFlagTableArray16(flagTable, j, gSaveContext.infTable[j]); + break; + case EVENT_INF: + DrawFlagTableArray16(flagTable, j, gSaveContext.eventInf[j]); + break; + case RANDOMIZER_INF: + DrawFlagTableArray16(flagTable, j, gSaveContext.ship.randomizerInf[j]); + break; + } + }, + flagTable.name); } // make some buttons to help with fishsanity debugging uint8_t fsMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); - if (flagTable.flagTableType == RANDOMIZER_INF && - fsMode != RO_FISHSANITY_OFF && fsMode != RO_FISHSANITY_OVERWORLD) { + if (flagTable.flagTableType == RANDOMIZER_INF && fsMode != RO_FISHSANITY_OFF && + fsMode != RO_FISHSANITY_OVERWORLD) { if (ImGui::Button("Catch All (Child)")) { for (int k = RAND_INF_CHILD_FISH_1; k <= RAND_INF_CHILD_LOACH_2; k++) { Flags_SetRandomizerInf((RandomizerInf)k); @@ -941,6 +991,8 @@ void DrawUpgrade(const std::string& categoryName, int32_t categoryId, const std: ImGui::Text("%s", categoryName.c_str()); ImGui::SameLine(); ImGui::PushID(categoryName.c_str()); + PushStyleCombobox(THEME_COLOR); + ImGui::AlignTextToFramePadding(); if (ImGui::BeginCombo("##upgrade", names[CUR_UPG_VALUE(categoryId)].c_str())) { for (int32_t i = 0; i < names.size(); i++) { if (ImGui::Selectable(names[i].c_str())) { @@ -950,8 +1002,9 @@ void DrawUpgrade(const std::string& categoryName, int32_t categoryId, const std: ImGui::EndCombo(); } + PopStyleCombobox(); ImGui::PopID(); - UIWidgets::SetLastItemHoverText(categoryName.c_str()); + UIWidgets::Tooltip(categoryName.c_str()); } // Draws a combo that lets you choose and upgrade value from a popup grid of icons @@ -960,58 +1013,53 @@ void DrawUpgradeIcon(const std::string& categoryName, int32_t categoryId, const ImGui::PushID(categoryName.c_str()); - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1, 1, 1, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); + PushStyleButton(Colors::DarkGray); uint8_t item = items[CUR_UPG_VALUE(categoryId)]; if (item != ITEM_NONE) { const ItemMapEntry& slotEntry = itemMapping[item]; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - auto ret = ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); - if (ret) { + if (ImGui::ImageButton(slotEntry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1))) { ImGui::OpenPopup(upgradePopupPicker); } } else { - if (ImGui::Button("##itemNone", ImVec2(32.0f, 32.0f))) { + if (ImGui::Button("##itemNone", ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { ImGui::OpenPopup(upgradePopupPicker); } } - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - UIWidgets::SetLastItemHoverText(categoryName.c_str()); + PopStyleButton(); + Tooltip(categoryName.c_str()); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); if (ImGui::BeginPopup(upgradePopupPicker)) { for (int32_t pickerIndex = 0; pickerIndex < items.size(); pickerIndex++) { if ((pickerIndex % 8) != 0) { ImGui::SameLine(); } + PushStyleButton(Colors::DarkGray); if (items[pickerIndex] == ITEM_NONE) { - if (ImGui::Button("##upgradePopupPicker", ImVec2(32.0f, 32.0f))) { + if (ImGui::Button("##upgradePopupPicker", + ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { Inventory_ChangeUpgrade(categoryId, pickerIndex); ImGui::CloseCurrentPopup(); } - UIWidgets::SetLastItemHoverText("None"); + Tooltip("None"); } else { const ItemMapEntry& slotEntry = itemMapping[items[pickerIndex]]; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - auto ret = ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + auto ret = ImGui::ImageButton( + slotEntry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { Inventory_ChangeUpgrade(categoryId, pickerIndex); ImGui::CloseCurrentPopup(); } - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(slotEntry.id)); + Tooltip(SohUtils::GetItemName(slotEntry.id).c_str()); } + PopStyleButton(); } - ImGui::EndPopup(); } - ImGui::PopStyleVar(); - ImGui::PopID(); } @@ -1035,11 +1083,11 @@ void DrawEquipmentTab() { uint32_t bitMask = 1 << i; bool hasEquip = (bitMask & gSaveContext.inventory.equipment) != 0; const ItemMapEntry& entry = itemMapping[equipmentValues[i]]; - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasEquip ? entry.name : entry.nameFaded), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + PushStyleButton(Colors::DarkGray); + auto ret = ImGui::ImageButton(entry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasEquip ? entry.name : entry.nameFaded), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasEquip) { gSaveContext.inventory.equipment &= ~bitMask; @@ -1047,9 +1095,9 @@ void DrawEquipmentTab() { gSaveContext.inventory.equipment |= bitMask; } } - ImGui::PopStyleColor(); + PopStyleButton(); + Tooltip(SohUtils::GetItemName(entry.id).c_str()); ImGui::PopID(); - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(entry.id)); } const std::vector bulletBagValues = { @@ -1137,11 +1185,11 @@ void DrawQuestItemButton(uint32_t item) { const QuestMapEntry& entry = questMapping[item]; uint32_t bitMask = 1 << entry.id; bool hasQuestItem = (bitMask & gSaveContext.inventory.questItems) != 0; - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasQuestItem ? entry.name : entry.nameFaded), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + PushStyleButton(Colors::DarkGray); + auto ret = ImGui::ImageButton(entry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasQuestItem ? entry.name : entry.nameFaded), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasQuestItem) { gSaveContext.inventory.questItems &= ~bitMask; @@ -1149,8 +1197,8 @@ void DrawQuestItemButton(uint32_t item) { gSaveContext.inventory.questItems |= bitMask; } } - ImGui::PopStyleColor(); - UIWidgets::SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id)); + PopStyleButton(); + Tooltip(SohUtils::GetQuestItemName(entry.id).c_str()); } // Draws a toggleable icon for a dungeon item that is faded when disabled @@ -1158,11 +1206,11 @@ void DrawDungeonItemButton(uint32_t item, uint32_t scene) { const ItemMapEntry& entry = itemMapping[item]; uint32_t bitMask = 1 << (entry.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[scene]) != 0; - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem ? entry.name : entry.nameFaded), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + PushStyleButton(Colors::DarkGray); + auto ret = ImGui::ImageButton( + entry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem ? entry.name : entry.nameFaded), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasItem) { gSaveContext.inventory.dungeonItems[scene] &= ~bitMask; @@ -1170,12 +1218,11 @@ void DrawDungeonItemButton(uint32_t item, uint32_t scene) { gSaveContext.inventory.dungeonItems[scene] |= bitMask; } } - ImGui::PopStyleColor(); - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(entry.id)); + PopStyleButton(); + Tooltip(SohUtils::GetItemName(entry.id).c_str()); } void DrawQuestStatusTab() { - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); for (int32_t i = QUEST_MEDALLION_FOREST; i < QUEST_MEDALLION_LIGHT + 1; i++) { if (i != QUEST_MEDALLION_FOREST) { @@ -1193,14 +1240,13 @@ void DrawQuestStatusTab() { // Put Stone of Agony and Gerudo Card on the same line with a little space between them ImGui::SameLine(); - ImGui::Dummy(ImVec2(20, 0)); + ImGui::Dummy(ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2); ImGui::SameLine(); DrawQuestItemButton(QUEST_STONE_OF_AGONY); ImGui::SameLine(); DrawQuestItemButton(QUEST_GERUDO_CARD); - for (const auto& [quest, entry] : songMapping) { if ((entry.id != QUEST_SONG_MINUET) && (entry.id != QUEST_SONG_LULLABY)) { ImGui::SameLine(); @@ -1208,11 +1254,11 @@ void DrawQuestStatusTab() { uint32_t bitMask = 1 << entry.id; bool hasQuestItem = (bitMask & gSaveContext.inventory.questItems) != 0; - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasQuestItem ? entry.name : entry.nameFaded), - ImVec2(16.0f, 24.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + PushStyleButton(Colors::DarkGray); + auto ret = ImGui::ImageButton(entry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasQuestItem ? entry.name : entry.nameFaded), + ImVec2(32.0f, 48.0f), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasQuestItem) { gSaveContext.inventory.questItems &= ~bitMask; @@ -1220,25 +1266,28 @@ void DrawQuestStatusTab() { gSaveContext.inventory.questItems |= bitMask; } } - ImGui::PopStyleColor(); - UIWidgets::SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id)); + PopStyleButton(); + Tooltip(SohUtils::GetQuestItemName(entry.id).c_str()); } + PushStyleInput(THEME_COLOR); ImGui::InputScalar("GS Count", ImGuiDataType_S16, &gSaveContext.inventory.gsTokens); - UIWidgets::InsertHelpHoverText("Number of gold skulltula tokens aquired"); + PopStyleInput(); + InsertHelpHoverText("Number of gold skulltula tokens aquired"); uint32_t bitMask = 1 << QUEST_SKULL_TOKEN; bool gsUnlocked = (bitMask & gSaveContext.inventory.questItems) != 0; - if (ImGui::Checkbox("GS unlocked", &gsUnlocked)) { + if (Checkbox("GS unlocked", &gsUnlocked, CheckboxOptions().Color(THEME_COLOR))) { if (gsUnlocked) { gSaveContext.inventory.questItems |= bitMask; } else { gSaveContext.inventory.questItems &= ~bitMask; } } - UIWidgets::InsertHelpHoverText("If unlocked, enables showing the gold skulltula count in the quest status menu"); + InsertHelpHoverText("If unlocked, enables showing the gold skulltula count in the quest status menu"); int32_t pohCount = (gSaveContext.inventory.questItems & 0xF0000000) >> 28; + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("PoH count", std::to_string(pohCount).c_str())) { for (int32_t i = 0; i < 4; i++) { if (ImGui::Selectable(std::to_string(i).c_str(), pohCount == i)) { @@ -1248,45 +1297,53 @@ void DrawQuestStatusTab() { } ImGui::EndCombo(); } - UIWidgets::InsertHelpHoverText("The number of pieces of heart acquired towards the next heart container"); + InsertHelpHoverText("The number of pieces of heart acquired towards the next heart container"); + PopStyleCombobox(); - DrawGroupWithBorder([&]() { - ImGui::Text("Dungeon Items"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Dungeon Items"); - static int32_t dungeonItemsScene = SCENE_DEKU_TREE; - ImGui::PushItemWidth(-ImGui::GetWindowWidth() * 0.35f); - if (ImGui::BeginCombo("##DungeonSelect", SohUtils::GetSceneName(dungeonItemsScene).c_str())) { - for (int32_t dungeonIndex = SCENE_DEKU_TREE; dungeonIndex < SCENE_JABU_JABU_BOSS + 1; dungeonIndex++) { - if (ImGui::Selectable(SohUtils::GetSceneName(dungeonIndex).c_str(), - dungeonIndex == dungeonItemsScene)) { - dungeonItemsScene = dungeonIndex; + static int32_t dungeonItemsScene = SCENE_DEKU_TREE; + PushStyleCombobox(THEME_COLOR); + if (ImGui::BeginCombo("##DungeonSelect", SohUtils::GetSceneName(dungeonItemsScene).c_str())) { + for (int32_t dungeonIndex = SCENE_DEKU_TREE; dungeonIndex < SCENE_JABU_JABU_BOSS + 1; dungeonIndex++) { + if (ImGui::Selectable(SohUtils::GetSceneName(dungeonIndex).c_str(), + dungeonIndex == dungeonItemsScene)) { + dungeonItemsScene = dungeonIndex; + } } + + ImGui::EndCombo(); } + PopStyleCombobox(); - ImGui::EndCombo(); - } - ImGui::PopItemWidth(); - - DrawDungeonItemButton(ITEM_KEY_BOSS, dungeonItemsScene); - ImGui::SameLine(); - DrawDungeonItemButton(ITEM_COMPASS, dungeonItemsScene); - ImGui::SameLine(); - DrawDungeonItemButton(ITEM_DUNGEON_MAP, dungeonItemsScene); - - if (dungeonItemsScene != SCENE_JABU_JABU_BOSS) { - float lineHeight = ImGui::GetTextLineHeightWithSpacing(); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[ITEM_KEY_SMALL].name), ImVec2(lineHeight, lineHeight)); + DrawDungeonItemButton(ITEM_KEY_BOSS, dungeonItemsScene); ImGui::SameLine(); - if (ImGui::InputScalar("##Keys", ImGuiDataType_S8, gSaveContext.inventory.dungeonKeys + dungeonItemsScene)) { - gSaveContext.ship.stats.dungeonKeys[dungeonItemsScene] = gSaveContext.inventory.dungeonKeys[dungeonItemsScene]; - }; - } else { - // dungeonItems is size 20 but dungeonKeys is size 19, so there are no keys for the last scene (Barinade's Lair) - ImGui::Text("Barinade's Lair does not have small keys"); - } - }); + DrawDungeonItemButton(ITEM_COMPASS, dungeonItemsScene); + ImGui::SameLine(); + DrawDungeonItemButton(ITEM_DUNGEON_MAP, dungeonItemsScene); - ImGui::PopItemWidth(); + if (dungeonItemsScene != SCENE_JABU_JABU_BOSS) { + float lineHeight = ImGui::GetTextLineHeightWithSpacing(); + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + itemMapping[ITEM_KEY_SMALL].name), + ImVec2(lineHeight, lineHeight)); + ImGui::SameLine(); + PushStyleInput(THEME_COLOR); + if (ImGui::InputScalar("##Keys", ImGuiDataType_S8, + gSaveContext.inventory.dungeonKeys + dungeonItemsScene)) { + gSaveContext.ship.stats.dungeonKeys[dungeonItemsScene] = + gSaveContext.inventory.dungeonKeys[dungeonItemsScene]; + }; + PopStyleInput(); + } else { + // dungeonItems is size 20 but dungeonKeys is size 19, so there are no keys for the last scene + // (Barinade's Lair) + ImGui::Text("Barinade's Lair does not have small keys"); + } + }, + "Dungeon Items"); } void DrawPlayerTab() { @@ -1299,7 +1356,7 @@ void DrawPlayerTab() { switch (player->currentSwordItemId) { case ITEM_SWORD_KOKIRI: - curSword = "Kokiri Sword"; + curSword = "Kokiri Sword"; break; case ITEM_SWORD_MASTER: curSword = "Master Sword"; @@ -1364,50 +1421,59 @@ void DrawPlayerTab() { } ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - DrawGroupWithBorder([&]() { - ImGui::Text("Link's Position"); - ImGui::InputScalar("X Pos", ImGuiDataType_Float, &player->actor.world.pos.x); - ImGui::SameLine(); - ImGui::InputScalar("Y Pos", ImGuiDataType_Float, &player->actor.world.pos.y); - ImGui::SameLine(); - ImGui::InputScalar("Z Pos", ImGuiDataType_Float, &player->actor.world.pos.z); - }); - - DrawGroupWithBorder([&]() { - ImGui::Text("Link's Rotation"); - UIWidgets::InsertHelpHoverText("For Link's rotation in relation to the world"); - ImGui::InputScalar("X Rot", ImGuiDataType_S16, &player->actor.world.rot.x); - ImGui::SameLine(); - ImGui::InputScalar("Y Rot", ImGuiDataType_S16, &player->actor.world.rot.y); - ImGui::SameLine(); - ImGui::InputScalar("Z Rot", ImGuiDataType_S16, &player->actor.world.rot.z); - }); - - DrawGroupWithBorder([&]() { - ImGui::Text("Link's Model Rotation"); - UIWidgets::InsertHelpHoverText("For Link's actual model"); - ImGui::InputScalar("X ModRot", ImGuiDataType_S16, &player->actor.shape.rot.x); - ImGui::SameLine(); - ImGui::InputScalar("Y ModRot", ImGuiDataType_S16, &player->actor.shape.rot.y); - ImGui::SameLine(); - ImGui::InputScalar("Z ModRot", ImGuiDataType_S16, &player->actor.shape.rot.z); - }); + PushStyleInput(THEME_COLOR); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Link's Position"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + ImGui::InputScalar("X##Pos", ImGuiDataType_Float, &player->actor.world.pos.x); + ImGui::InputScalar("Y##Pos", ImGuiDataType_Float, &player->actor.world.pos.y); + ImGui::InputScalar("Z##Pos", ImGuiDataType_Float, &player->actor.world.pos.z); + ImGui::PopItemWidth(); + }, + "Link's Position"); + ImGui::SameLine(); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Link's Rotation"); + InsertHelpHoverText("For Link's rotation in relation to the world"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + ImGui::InputScalar("X##Rot", ImGuiDataType_S16, &player->actor.world.rot.x); + ImGui::InputScalar("Y##Rot", ImGuiDataType_S16, &player->actor.world.rot.y); + ImGui::InputScalar("Z##Rot", ImGuiDataType_S16, &player->actor.world.rot.z); + ImGui::PopItemWidth(); + }, + "Link's Rotation"); + ImGui::SameLine(); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Link's Model Rotation"); + InsertHelpHoverText("For Link's actual model"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + ImGui::InputScalar("X##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.x); + ImGui::InputScalar("Y##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.y); + ImGui::InputScalar("Z##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.z); + ImGui::PopItemWidth(); + }, + "Link's Model Rotation"); ImGui::InputScalar("Linear Velocity", ImGuiDataType_Float, &player->linearVelocity); - UIWidgets::InsertHelpHoverText("Link's speed along the XZ plane"); + InsertHelpHoverText("Link's speed along the XZ plane"); ImGui::InputScalar("Y Velocity", ImGuiDataType_Float, &player->actor.velocity.y); - UIWidgets::InsertHelpHoverText("Link's speed along the Y plane. Caps at -20"); + InsertHelpHoverText("Link's speed along the Y plane. Caps at -20"); ImGui::InputScalar("Wall Height", ImGuiDataType_Float, &player->yDistToLedge); - UIWidgets::InsertHelpHoverText("Height used to determine whether Link can climb or grab a ledge at the top"); + InsertHelpHoverText("Height used to determine whether Link can climb or grab a ledge at the top"); ImGui::InputScalar("Invincibility Timer", ImGuiDataType_S8, &player->invincibilityTimer); - UIWidgets::InsertHelpHoverText("Can't take damage while this is nonzero"); + InsertHelpHoverText("Can't take damage while this is nonzero"); ImGui::InputScalar("Gravity", ImGuiDataType_Float, &player->actor.gravity); - UIWidgets::InsertHelpHoverText("Rate at which Link falls. Default -4.0f"); + InsertHelpHoverText("Rate at which Link falls. Default -4.0f"); + PopStyleInput(); + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("Link Age on Load", gPlayState->linkAgeOnLoad == 0 ? "Adult" : "Child")) { if (ImGui::Selectable("Adult")) { gPlayState->linkAgeOnLoad = 0; @@ -1417,132 +1483,145 @@ void DrawPlayerTab() { } ImGui::EndCombo(); } - - UIWidgets::InsertHelpHoverText("This will change Link's age when you load a map"); - + InsertHelpHoverText("This will change Link's age when you load a map"); + PopStyleCombobox(); ImGui::Separator(); - - ImGui::Text("Link's Current Equipment"); - ImGui::PushItemWidth(ImGui::GetFontSize() * 15); - if (ImGui::BeginCombo("Sword", curSword)) { - if (ImGui::Selectable("None")) { - player->currentSwordItemId = ITEM_NONE; - gSaveContext.equips.buttonItems[0] = ITEM_NONE; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_NONE); - } - if (ImGui::Selectable("Kokiri Sword")) { - player->currentSwordItemId = ITEM_SWORD_KOKIRI; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI); - } - if (ImGui::Selectable("Master Sword")) { - player->currentSwordItemId = ITEM_SWORD_MASTER; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); - } - if (ImGui::Selectable("Biggoron's Sword")) { - if (gSaveContext.bgsFlag) { - if (gSaveContext.swordHealth < 8) { - gSaveContext.swordHealth = 8; + + DrawGroupWithBorder( + [&]() { + PushStyleCombobox(THEME_COLOR); + ImGui::Text("Link's Current Equipment"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + if (ImGui::BeginCombo("Sword", curSword)) { + if (ImGui::Selectable("None")) { + player->currentSwordItemId = ITEM_NONE; + gSaveContext.equips.buttonItems[0] = ITEM_NONE; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_NONE); } - player->currentSwordItemId = ITEM_SWORD_BGS; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; - } else { - if (gSaveContext.swordHealth < 8) { - gSaveContext.swordHealth = 8; + if (ImGui::Selectable("Kokiri Sword")) { + player->currentSwordItemId = ITEM_SWORD_KOKIRI; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI); } - player->currentSwordItemId = ITEM_SWORD_BGS; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE; + if (ImGui::Selectable("Master Sword")) { + player->currentSwordItemId = ITEM_SWORD_MASTER; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); + } + if (ImGui::Selectable("Biggoron's Sword")) { + if (gSaveContext.bgsFlag) { + if (gSaveContext.swordHealth < 8) { + gSaveContext.swordHealth = 8; + } + player->currentSwordItemId = ITEM_SWORD_BGS; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; + } else { + if (gSaveContext.swordHealth < 8) { + gSaveContext.swordHealth = 8; + } + player->currentSwordItemId = ITEM_SWORD_BGS; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE; + } + + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_BIGGORON); + } + if (ImGui::Selectable("Fishing Pole")) { + player->currentSwordItemId = ITEM_FISHING_POLE; + gSaveContext.equips.buttonItems[0] = ITEM_FISHING_POLE; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); + } + ImGui::EndCombo(); + } + if (ImGui::BeginCombo("Shield", curShield)) { + if (ImGui::Selectable("None")) { + player->currentShield = PLAYER_SHIELD_NONE; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_NONE); + } + if (ImGui::Selectable("Deku Shield")) { + player->currentShield = PLAYER_SHIELD_DEKU; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU); + } + if (ImGui::Selectable("Hylian Shield")) { + player->currentShield = PLAYER_SHIELD_HYLIAN; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_HYLIAN); + } + if (ImGui::Selectable("Mirror Shield")) { + player->currentShield = PLAYER_SHIELD_MIRROR; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_MIRROR); + } + ImGui::EndCombo(); } - - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_BIGGORON); - } - if (ImGui::Selectable("Fishing Pole")) { - player->currentSwordItemId = ITEM_FISHING_POLE; - gSaveContext.equips.buttonItems[0] = ITEM_FISHING_POLE; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); - } - ImGui::EndCombo(); - } - if (ImGui::BeginCombo("Shield", curShield)) { - if (ImGui::Selectable("None")) { - player->currentShield = PLAYER_SHIELD_NONE; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_NONE); - } - if (ImGui::Selectable("Deku Shield")) { - player->currentShield = PLAYER_SHIELD_DEKU; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU); - } - if (ImGui::Selectable("Hylian Shield")) { - player->currentShield = PLAYER_SHIELD_HYLIAN; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_HYLIAN); - } - if (ImGui::Selectable("Mirror Shield")) { - player->currentShield = PLAYER_SHIELD_MIRROR; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_MIRROR); - } - ImGui::EndCombo(); - } + if (ImGui::BeginCombo("Tunic", curTunic)) { + if (ImGui::Selectable("Kokiri Tunic")) { + player->currentTunic = PLAYER_TUNIC_KOKIRI; + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI); + } + if (ImGui::Selectable("Goron Tunic")) { + player->currentTunic = PLAYER_TUNIC_GORON; + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_GORON); + } + if (ImGui::Selectable("Zora Tunic")) { + player->currentTunic = PLAYER_TUNIC_ZORA; + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_ZORA); + } + ImGui::EndCombo(); + } - if (ImGui::BeginCombo("Tunic", curTunic)) { - if (ImGui::Selectable("Kokiri Tunic")) { - player->currentTunic = PLAYER_TUNIC_KOKIRI; - Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI); - } - if (ImGui::Selectable("Goron Tunic")) { - player->currentTunic = PLAYER_TUNIC_GORON; - Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_GORON); - } - if (ImGui::Selectable("Zora Tunic")) { - player->currentTunic = PLAYER_TUNIC_ZORA; - Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_ZORA); - } - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Boots", curBoots)) { - if (ImGui::Selectable("Kokiri Boots")) { - player->currentBoots = PLAYER_BOOTS_KOKIRI; - Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI); - } - if (ImGui::Selectable("Iron Boots")) { - player->currentBoots = PLAYER_BOOTS_IRON; - Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_IRON); - } - if (ImGui::Selectable("Hover Boots")) { - player->currentBoots = PLAYER_BOOTS_HOVER; - Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_HOVER); - } - ImGui::EndCombo(); - } + if (ImGui::BeginCombo("Boots", curBoots)) { + if (ImGui::Selectable("Kokiri Boots")) { + player->currentBoots = PLAYER_BOOTS_KOKIRI; + Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI); + } + if (ImGui::Selectable("Iron Boots")) { + player->currentBoots = PLAYER_BOOTS_IRON; + Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_IRON); + } + if (ImGui::Selectable("Hover Boots")) { + player->currentBoots = PLAYER_BOOTS_HOVER; + Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_HOVER); + } + ImGui::EndCombo(); + } + ImGui::PopItemWidth(); + PopStyleCombobox(); + }, + "Current Equipment"); + ImGui::SameLine(); ImU16 one = 1; - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - DrawGroupWithBorder([&]() { - ImGui::Text("Current B Item"); - ImGui::InputScalar("B Button", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[0], &one, NULL); - ImGui::NewLine(); + DrawGroupWithBorder( + [&]() { + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + PushStyleInput(THEME_COLOR); + ImGui::Text("Current Items"); + ImGui::InputScalar("B Button", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[0], &one, NULL); + ImGui::InputScalar("C Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[1], &one, NULL); + ImGui::InputScalar("C Down", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[2], &one, NULL); + ImGui::InputScalar("C Right", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[3], &one, NULL); + PopStyleInput(); + ImGui::PopItemWidth(); + }, + "Current Items"); - ImGui::Text("Current C Equips"); - ImGui::InputScalar("C Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[1], &one, NULL); + if (CVarGetInteger(CVAR_ENHANCEMENT("DpadEquips"), 0)) { ImGui::SameLine(); - ImGui::InputScalar("C Down", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[2], &one, NULL); - ImGui::SameLine(); - ImGui::InputScalar("C Right", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[3], &one, NULL); - - if (CVarGetInteger(CVAR_ENHANCEMENT("DpadEquips"), 0)) { - ImGui::NewLine(); - ImGui::Text("Current D-pad Equips"); - ImGui::InputScalar("D-pad Up ", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[4], &one, NULL); // Two spaces at the end for aligning, not elegant but it's working - ImGui::SameLine(); - ImGui::InputScalar("D-pad Down", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[5], &one, NULL); - // Intentionnal to not put everything on the same line, else it's taking too much for lower resolution. - ImGui::InputScalar("D-pad Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[6], &one, NULL); - ImGui::SameLine(); - ImGui::InputScalar("D-pad Right", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[7], &one, NULL); - } - }); + DrawGroupWithBorder( + [&]() { + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + PushStyleInput(THEME_COLOR); + ImGui::Text("Current D-pad Items"); + // Two spaces at the end for aligning, not elegant but it's working + ImGui::InputScalar("D-pad Up ", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[4], &one, NULL); + ImGui::InputScalar("D-pad Down", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[5], &one, NULL); + ImGui::InputScalar("D-pad Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[6], &one, NULL); + ImGui::InputScalar("D-pad Right", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[7], &one, + NULL); + PopStyleInput(); + ImGui::PopItemWidth(); + }, + "Current D-pad Items"); + } ImGui::Text("Player State"); uint8_t bit[32] = {}; @@ -1550,55 +1629,80 @@ void DrawPlayerTab() { std::vector> flag_strs = { state1, state2, state3 }; for (int j = 0; j <= 2; j++) { - DrawGroupWithBorder([&]() { - ImGui::Text("State Flags %d", j + 1); - std::vector state = flag_strs[j]; - for (int i = 0; i <= 31; i++) { - bit[i] = ((flags[j] >> i) & 1); - if (bit[i] != 0) { - ImGui::Text("%s", state[i].c_str()); + std::string label = fmt::format("State Flags {}", j + 1); + DrawGroupWithBorder( + [&]() { + ImGui::Text("%s", label.c_str()); + std::vector state = flag_strs[j]; + for (int i = 0; i <= 31; i++) { + bit[i] = ((flags[j] >> i) & 1); + if (bit[i] != 0) { + ImGui::Text("%s", state[i].c_str()); + } } - } - }); + }, + label.c_str()); ImGui::SameLine(); } - DrawGroupWithBorder([&]() { - ImGui::Text("Sword"); - ImGui::Text(" %d", player->meleeWeaponState); - }); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Sword"); + ImGui::Text(" %d", player->meleeWeaponState); + }, + "Sword"); } else { ImGui::Text("Global Context needed for player info!"); } } +void ResetBaseOptions() { + intSliderOptionsBase.Color(THEME_COLOR).Size({ 320.0f, 0.0f }).Tooltip(""); + buttonOptionsBase.Color(THEME_COLOR).Size(Sizes::Inline).Tooltip(""); + checkboxOptionsBase.Color(THEME_COLOR).Tooltip(""); + comboboxOptionsBase.Color(THEME_COLOR) + .ComponentAlignment(ComponentAlignments::Left) + .LabelPosition(LabelPositions::Near) + .Tooltip(""); +} + void SaveEditorWindow::DrawElement() { + PushStyleTabs(THEME_COLOR); + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + if (ImGui::BeginTabBar("SaveContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { + ResetBaseOptions(); if (ImGui::BeginTabItem("Info")) { DrawInfoTab(); ImGui::EndTabItem(); } + ResetBaseOptions(); if (ImGui::BeginTabItem("Inventory")) { DrawInventoryTab(); ImGui::EndTabItem(); } + ResetBaseOptions(); if (ImGui::BeginTabItem("Flags")) { DrawFlagsTab(); ImGui::EndTabItem(); } + ResetBaseOptions(); if (ImGui::BeginTabItem("Equipment")) { DrawEquipmentTab(); ImGui::EndTabItem(); } + ResetBaseOptions(); if (ImGui::BeginTabItem("Quest Status")) { DrawQuestStatusTab(); ImGui::EndTabItem(); } + ResetBaseOptions(); if (ImGui::BeginTabItem("Player")) { DrawPlayerTab(); ImGui::EndTabItem(); @@ -1606,6 +1710,11 @@ void SaveEditorWindow::DrawElement() { ImGui::EndTabBar(); } + + ImGui::EndDisabled(); + ImGui::PopFont(); + PopStyleTabs(); } -void SaveEditorWindow::InitElement() {} +void SaveEditorWindow::InitElement() { +} diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index 554a90b2ab..e8bdeb00a3 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -5,7 +5,7 @@ #include #include #include -#include +#include "soh/Enhancements/randomizer/randomizerTypes.h" #include typedef enum { @@ -23,1610 +23,355 @@ typedef struct { std::map flagDescriptions; } FlagTable; +#define DEFINE_RAND_INF(rand_inf) { rand_inf, #rand_inf }, + // Reference https://tcrf.net/Proto:The_Legend_of_Zelda:_Ocarina_of_Time_Master_Quest/Event_Editor // The source was last referenced on 2022-09-03 and had a last updated value of 2020-05-02 const std::vector flagTables = { - { "Event Check Inf Flags", EVENT_CHECK_INF, 0x0D, { - { 0x02, "First Spoke to Mido" }, - { 0x03, "Complained About Mido to Saria" }, - { 0x04, "Showed Mido Sword & Shield" }, - { 0x05, "Deku Tree Opened Mouth" }, - { 0x06, "Spoke to Saria After Deku Tree's Death" }, - { 0x07, "Obtained Kokiri Emerald & Deku Tree Dead" }, - { 0x09, "Used Deku Tree Blue Warp" }, - { 0x0A, "Played Saria's Song for Mido as Adult" }, - { 0x0C, "Met Deku Tree" }, - { 0x0F, "Spoke to Mido about Saria's whereabouts" }, - { 0x10, "Spoke to Child Malon at Castle or Market" }, - { 0x11, "Spoke to Ingo at Ranch before Talon returns" }, - { 0x12, "Obtained Pocket Egg" }, - { 0x13, "Woke Talon" }, - { 0x14, "Talon Fled Hyrule Castle" }, - { 0x15, "Spoke to Child Malon at Ranch" }, - { 0x16, "Invited to Sing With Child Malon" }, - { 0x17, "Great Deku Tree is Dead" }, - { 0x18, "Obtained Epona" }, - { 0x19, "Obtained Kokiri's Emerald" }, - { 0x1B, "Rented Horse From Ingo" }, - { 0x1C, "Spoke to Mido After Deku Tree's Death" }, - { 0x1D, "Destroyed the Royal Family's Tomb" }, - { 0x1E, "Won the Cow in Malon's Race" }, - { 0x23, "Bombed Dodongo's Cavern Entrance" }, - { 0x25, "Used Dodongo's Cavern Blue Warp" }, - { 0x2F, "Death Mountain Erupted" }, - { 0x30, "Spoke to a Zora" }, - { 0x31, "Obtained Ruto's Letter" }, - { 0x33, "King Zora Moved Aside" }, - { 0x37, "Used Jabu-Jabu Blue Warp" }, - { 0x38, "Obtained Silver Scale" }, - { 0x39, "Opened Entrance to Zora's Domain" }, - { 0x3A, "Offered Fish to Jabu-Jabu" }, - { 0x3B, "Began Nabooru Battle" }, - { 0x3C, "Finished Nabooru Battle" }, - { 0x40, "Obtained Zelda's Letter" }, - { 0x43, "Obtained Ocarina of Time" }, - { 0x45, "Pulled Master Sword from Pedestal" }, - { 0x48, "Used Forest Temple Blue Warp" }, - { 0x49, "Used Fire Temple Blue Warp" }, - { 0x4A, "Used Water Temple Blue Warp" }, - { 0x4B, "Opened the Door of Time" }, - { 0x4D, "Rainbow Bridge Built by Sages" }, - { 0x4E, "Caught by Hyrule Castle Guards" }, - { 0x4F, "Entered the Master Sword Chamber" }, - { 0x50, "Learned Minuet of Forest" }, - { 0x51, "Learned Bolero of Fire" }, - { 0x52, "Learned Serenade of Water" }, - { 0x54, "Learned Nocturne of Shadow" }, - { 0x55, "Sheik Moved From Sword Pedestal" }, - { 0x57, "Learned Saria's Song" }, - { 0x59, "Learned Zelda's Lullaby" }, - { 0x5A, "Learned Sun's Song" }, - { 0x5B, "Learned Song of Storms" }, - { 0x65, "Played Song of Storms in Windmill" }, - { 0x67, "Drained Well in Kakariko Village" }, - { 0x68, "Played Gerudo Archery Minigame" }, - { 0x69, "Restored Lake Hylia's Water" }, - { 0x6A, "Woke Talon in Kakariko" }, - { 0x6B, "Spoke to Talon After Saving Ranch" }, - { 0x6F, "Spoke to Kaepora Gaebora by Lost Woods" }, - { 0x70, "Began Gohma Battle" }, - { 0x71, "Began King Dodongo Battle" }, - { 0x72, "Began Phantom Ganon Battle" }, - { 0x73, "Began Volvagia Battle" }, - { 0x74, "Began Morpha Battle" }, - { 0x75, "Began Twinrova Battle" }, - { 0x76, "Began Barinade Battle" }, - { 0x77, "Began Bongo Bongo Battle" }, - { 0x78, "Began Ganondorf Battle" }, - { 0x80, "Zelda Fled Hyrule Castle" }, - { 0x82, "Bridge Unlocked (After Zelda Escape Cutscene)" }, - { 0x8C, "Paid Back Keaton Mask Fee" }, - { 0x8D, "Paid Back Skull Mask Fee" }, - { 0x8E, "Paid Back Spooky Mask Fee" }, - { 0x8F, "Paid Back Bunny Hood Fee" }, - { 0x90, "Rescued Red Carpenter" }, - { 0x91, "Rescued Yellow Carpenter" }, - { 0x92, "Rescued Blue Carpenter" }, - { 0x93, "Rescued Green Carpenter" }, - { 0x94, "Spoke to Nabooru in Spirit Temple" }, - { 0x95, "Nabooru Captured by Twinrova" }, - { 0x96, "Spoke to Cursed Man in Skulltula House" }, - { 0x9C, "Played Song for Scarecrow as Adult" }, - { 0xA0, "Entered Hyrule Field" }, - { 0xA1, "Entered Death Mountain Trail" }, - { 0xA3, "Entered Kakariko Village" }, - { 0xA4, "Entered Zora's Domain" }, - { 0xA5, "Entered Hyrule Castle" }, - { 0xA6, "Entered Goron City" }, - { 0xA7, "Entered Temple of Time" }, - { 0xA8, "Entered Deku Tree" }, - { 0xA9, "Learned Song of Time" }, - { 0xAA, "Bongo Bongo Escaped Well" }, - { 0xAC, "Learned Requiem of Spirit" }, - { 0xAD, "Completed Spirit Trial" }, - { 0xB0, "Entered Dodongo's Cavern" }, - { 0xB1, "Entered Lake Hylia" }, - { 0xB2, "Entered Gerudo Valley" }, - { 0xB3, "Entered Gerudo's Fortress" }, - { 0xB4, "Entered Lon Lon Ranch" }, - { 0xB5, "Entered Jabu-Jabu's Belly" }, - { 0xB6, "Entered Graveyard" }, - { 0xB7, "Entered Zora's Fountain" }, - { 0xB8, "Entered Desert Colossus" }, - { 0xB9, "Entered Death Mountain Crater" }, - { 0xBA, "Entered Ganon's Castle (Exterior)" }, - { 0xBB, "Completed Forest Trial" }, - { 0xBC, "Completed Water Trial" }, - { 0xBD, "Completed Shadow Trial" }, - { 0xBE, "Completed Fire Trial" }, - { 0xBF, "Completed Light Trial" }, - { 0xC0, "Nabooru Ordered to Fight by Twinrova" }, - { 0xC1, "Spoke to Saria on Lost Woods Bridge" }, - { 0xC3, "Dispelled Ganon's Tower Barrier" }, - { 0xC4, "Returned to Temple of Time With All Medallions" }, - { 0xC5, "Sheik, Spawned at Master Sword Pedestal as Adult" }, - { 0xC6, "Spoke to Deku Tree Sprout" }, - { 0xC7, "Watched Ganon's Tower Collapse / Caught by Gerudo" }, - { 0xC8, "Obtained Spirit Medallion" }, - { 0xC9, "Demo_Effect, Temple of Time Warp in blue aura + sfx the first time you spawn as Adult" }, - { 0xD0, "Obtained Frogs' Piece of Heart" }, - { 0xD1, "Played Zelda's Lullaby for Frogs" }, - { 0xD2, "Played Epona's Song for Frogs" }, - { 0xD3, "Played Sun's Song for Frogs" }, - { 0xD4, "Played Saria's Song for Frogs" }, - { 0xD5, "Played Song of Time for Frogs" }, - { 0xD6, "Played Song of Storms for Frogs" }, - { 0xDA, "Obtained Adult's Wallet" }, - { 0xDB, "Obtained Stone of Agony" }, - { 0xDC, "Obtained Giant's Wallet" }, - { 0xDD, "Obtained Skulltula House's Bombchu" }, - { 0xDE, "Obtained Skulltula House's Piece of Heart" }, - } }, - { "Item Get Inf Flags", ITEM_GET_INF, 0x03, { - { 0x02, "Obtained Super Cucco Bottle" }, - { 0x03, "Bought Bombchu (Shelf 2: Top Right)" }, - { 0x04, "Bought Bombchu (Shelf 1: Bot. Right)" }, - { 0x05, "Bought Bombchu (Shelf 1: Top Left)" }, - { 0x06, "Bought Bombchu (Shelf 2: Bot. Left)" }, - { 0x07, "Bought Bombchu (Shelf 2: Bot. Right)" }, - { 0x08, "Bought Bombchu (Shelf 1: Top Right)" }, - { 0x09, "Bought Bombchu (Shelf 1: Bot. Left)" }, - { 0x0A, "Bought Bombchu (Shelf 2: Top Left)" }, - { 0x0B, "Obtained Scrub's Heart Piece" }, - { 0x0C, "Obtained Cucco Lady's Bottle" }, - { 0x0D, "Obtained Bullet Bag Upgrade (Market)" }, - { 0x0E, "Obtained Big Quiver" }, - { 0x0F, "Obtained Biggest Quiver" }, - { 0x10, "Obtained Scientist's Heart Piece" }, - { 0x11, "Obtained Bowling Bomb Bag Upgrade" }, - { 0x12, "Obtained Bowling Heart Piece" }, - { 0x13, "Obtained Deku Seeds" }, - { 0x15, "Obtained Roof Guy's Heart Piece" }, - { 0x16, "Obtained Skullkid's Heart Piece" }, - { 0x17, "Obtained Skullkids' Heart Piece" }, - { 0x18, "Obtained Farore's Wind" }, - { 0x19, "Obtained Din's Fire" }, - { 0x1A, "Obtained Nayru's Love" }, - { 0x1B, "Obtained Treasure Chest Game Reward" }, - { 0x1C, "Obtained Grave-Dig Heart Piece" }, - { 0x1D, "Obtained Bullet Bag Upgrade (Woods)" }, - { 0x1E, "Obtained Deku Stick Upgrade (Stage)" }, - { 0x1F, "Obtained Deku Nut Upgrade (Stage)" }, - { 0x23, "Obtained Keaton Mask" }, - { 0x24, "Obtained Skull Mask" }, - { 0x25, "Obtained Spooky Mask" }, - { 0x26, "Obtained Bunny Hood" }, - { 0x2A, "Obtained Mask of Truth" }, - { 0x2C, "Obtained Pocket Egg" }, - { 0x2E, "Obtained Cojiro" }, - { 0x30, "Obtained Odd Potion" }, - { 0x31, "Obtained Poacher's Saw" }, - { 0x38, "Sold Keaton Mask" }, - { 0x39, "Sold Skull Mask" }, - { 0x3A, "Sold Spooky Mask" }, - { 0x3B, "Sold Bunny Hood" }, - { 0x3F, "Obtained Mask of Truth" }, - } }, - { "Inf Flags", INF_TABLE, 0x1D, { - { 0x00, "Greeted by Saria" }, - { 0x01, "Spoke to Saria About Obtaining Fairy" }, - { 0x03, "Complained About Mido to Saria" }, - { 0x05, "Spoke to Saria in Saria's House" }, - { 0x0C, "Mido Asked to See Sword & Shield" }, - { 0x15, "Spoke to Mido in Lost Woods as Adult" }, - { 0x19, "Told Mido Saria Won't Return" }, - { 0x1E, "Spoke to Kokiri Girl by Jumping Stones" }, - { 0x22, "Spoke to Kokiri Boy Guarding Forest Exit" }, - { 0x24, "Spoke to Kokiri Boy Cutting Grass" }, - { 0x26, "Spoke to Kokiri Girl on Shop Awning" }, - { 0x28, "Spoke to Kokiri Girl About Training Center" }, - { 0x41, "Spoke to Kokiri Boy on Bed in Mido's House" }, - { 0x51, "Spoke to Kokiri Girl in Saria's House" }, - { 0x59, "Spoke to Know-It-All Bro. About Temple" }, - { 0x61, "Spoke to Know-It-All Bro. About Saria" }, - { 0x66, "Spoke to Deku Tree Sprout After Cutscene" }, - { 0x6C, "Spoke to Dying Knight" }, - { 0x76, "Showed Zelda's Letter to Gate Guard" }, - { 0x77, "Gate Guard Put On Keaton Mask" }, - { 0x7E, "Spoke to Talon in Lon Lon Ranch House" }, - { 0x84, "Spoke to Child Malon at Castle or Market" }, - { 0x85, "Child Malon Said Epona Was Afraid of You" }, - { 0x8B, "Entered Hyrule Castle" }, - { 0x94, "Spoke to Ingo at Ranch Before Talon's Return" }, - { 0x97, "Spoke to Ingo at Ranch" }, - { 0x9A, "Spoke to Ingo as Adult" }, - { 0xA2, "Refused Ingo's 50 Rupee Rental Request" }, - { 0xAB, "Rode a Horse at Ingo's Ranch" }, - { 0xB0, "Spoke to Medigoron as Child" }, - { 0xB1, "Spoke to Medigoron as Adult" }, - { 0xB6, "Spoke to Poe Collector in Ruined Market" }, - { 0xB7, "Spoke to Fado in Kokiri Forest as Child" }, - { 0xB8, "Spoke to Malon After Saving Ranch" }, - { 0xB9, "Spoke to Malon on Horseback" }, - { 0xBC, "Fado requested Odd Potion" }, - { 0xC0, "Spoke to Fat Woman by Market Potion Shop" }, - { 0xC1, "Spoke to Fat Woman After Zelda's Escape" }, - { 0xC2, "Spoke to Burly Man About Talon Search" }, - { 0xC3, "Spoke to Burly Man After Zelda's Escape" }, - { 0xC4, "Spoke to Thief After Zelda's Escape" }, - { 0xC5, "Spoke to Thin Man by Market Target Shop" }, - { 0xC6, "Spoke to Old Woman by Market Fountain" }, - { 0xC7, "Spoke to Old Man by Bombchu Bowling" }, - { 0xC8, "Spoke to Thin Lady by Bombchu Bowling" }, - { 0xC9, "Spoke to Thin Lady After Zelda's Escape (1.0)" }, - { 0xCA, "Spoke to Red Joker in Market" }, - { 0xCB, "Spoke to Blue Joker in Market (1.0) / Dog Lady as Adult (DBG)" }, - { 0xCC, "Spoke to Itchy Lady After Malon Left Town" }, - { 0xCD, "Spoke to Blue Jokester in Market (DBG)" }, - { 0xCE, "Spoke to Thin Lady After Zelda's Escape (DBG)" }, - { 0xD9, "Spoke to Dampé as Child" }, - { 0xE0, "Spoke to Goron by Cavern" }, - { 0xE3, "Spoke to Goron Hiding Stick" }, - { 0xE6, "Spoke to Goron by Woods Exit" }, - { 0xEB, "Spoke to Goron by Bomb Flowers" }, - { 0xF0, "Spoke to Goron at City? Entrance" }, - { 0xF4, "Spoke to Ruby-Crazed Goron" }, - { 0xFC, "Spoke to Goron Shop Owner" }, - { 0x109, "Goron City Doors Unlocked" }, - { 0x10B, "Spoke to Goron Link About Volvagia" }, - { 0x10C, "Stopped Goron Link's Rolling" }, - { 0x10E, "Spoke to Goron Link" }, - { 0x113, "Spoke to Darunia in Goron City" }, - { 0x11A, "Spoke to Darunia in Fire Temple" }, - { 0x11E, "Obtained Bomb Bag Upgrade (Goron City)" }, - { 0x124, "Spoke to Zora Near Zora Shop?" }, - { 0x128, "Spoke to Zora Beside Zora Shop?" }, - { 0x129, "Spoke to Zora Swimming Behind Zora Shop" }, - { 0x138, "Thawed King Zora" }, - { 0x139, "Obtained Zora Tunic" }, - { 0x140, "Ruto in JJ (M7) on Blue Switch" }, - { 0x141, "Ruto in JJ (M2) Meet Ruto" }, - { 0x142, "Ruto in JJ (M3) Talk First Time" }, - { 0x143, "Ruto in JJ (M10) Can Be Escorted" }, - { 0x144, "Ruto in JJ (?) Wants to be Tossed to Sapphire" }, - { 0x145, "Ruto in JJ (M6) on Sapphire platform" }, - { 0x146, "Ruto in JJ (M6) Kidnapped" }, - { 0x147, "Ruto in JJ, Spawns on F1 Instead of B1" }, - { 0x160, "Spoke to Man in Impa's House During Day" }, - { 0x161, "Spoke to Man in Impa's House at Night" }, - { 0x162, "Spoke to Man in Impa's House as Adult" }, - { 0x163, "Spoke to Carpenter Boss's Wife as Child" }, - { 0x164, "Spoke to Carpenter Boss's Wife as Adult" }, - { 0x16C, "Refused Nabooru's Request" }, - { 0x170, "Spoke to Carpenter Boss in Valley" }, - { 0x172, "Spoke to Carpenter Boss in Kakariko" }, - { 0x176, "Spoke to Blue Carpenter in Tent" }, - { 0x178, "Spoke to Green Carpenter in Tent" }, - { 0x17F, "Running Man Suggested a Race" }, - { 0x190, "Obtained Gerudo Archery Piece of Heart" }, - { 0x191, "Obtained Dog Lady's Piece of Heart" }, - { 0x192, "Obtained Deku Stick Upgrade (Lost Woods)" }, - { 0x193, "Obtained Deku Nut Upgrade (Grotto)" }, - { 0x195, "Spoke to Kaepora in Lake Hylia" }, - { 0x196, "Spoke to Cursed Man With <10 Tokens" }, - { 0x197, "Spoke to Cursed Man With 10 Tokens" }, - { 0x198, "Obtained Small Magic Jar" }, - { 0x199, "Caught Cucco by Field Entrance" }, - { 0x19A, "Caught Cucco by Bazaar" }, - { 0x19B, "Caught Cucco by Cucco Pen" }, - { 0x19C, "Caught Cucco Behind Windmill" }, - { 0x19D, "Caught Cucco in Crate" }, - { 0x19E, "Caught Cucco by Skulltula House" }, - { 0x19F, "Caught Cucco Behind Potion Shop" }, - { 0x1A0, "Entered Deku Tree" }, - { 0x1A1, "Entered Dodongo's Cavern" }, - { 0x1A2, "Entered Jabu-Jabu's Belly" }, - { 0x1A3, "Entered Forest Temple" }, - { 0x1A4, "Entered Fire Temple" }, - { 0x1A5, "Entered Water Temple" }, - { 0x1A6, "Entered Spirit Temple" }, - { 0x1A7, "Entered Shadow Temple" }, - { 0x1A8, "Entered Bottom of the Well" }, - { 0x1A9, "Entered Ice Cavern" }, - { 0x1AA, "Entered Ganon's Tower" }, - { 0x1AB, "Entered Gerudo Training Ground" }, - { 0x1AC, "Entered Thieves' Hideout" }, - { 0x1AD, "Entered Ganon's Castle" }, - { 0x1AE, "Entered Ganon's Tower (Collapsing)" }, - { 0x1AF, "Entered Ganon's Castle (Collapsing)" }, - { 0x1D0, "No Sword on B" }, - } }, - { "Event Inf Flags", EVENT_INF, 0x03, { - { 0x00, "Rented Horse From Ingo" }, - { 0x01, "Racing Ingo" }, - { 0x02, "Won First Race With Ingo?" }, - { 0x05, "Lost Race With Ingo?" }, - { 0x06, "Racing Ingo For the Second Time" }, - { 0x08, "Finished Special Cucco Minigame / Began Gerudo Archery" }, - { 0x0A, "Won Special Cucco Minigame?" }, - { 0x0F, "Rented Horse From Ingo" }, - { 0x10, "Racing Running Man" }, - { 0x20, "Market Crowd Text Randomizer" }, - { 0x21, "Market Crowd Text Randomizer" }, - { 0x22, "Market Crowd Text Randomizer" }, - { 0x23, "Market Crowd Text Randomizer" }, - { 0x24, "Market Crowd Text Randomizer" }, - { 0x30, "Entered the Market" }, - } }, - { "Randomizer Inf Flags", RANDOMIZER_INF, (RAND_INF_MAX + 15) / 16, { - { RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE, "DUNGEONS_DONE_SPIRIT_TEMPLE" }, - { RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE, "DUNGEONS_DONE_SHADOW_TEMPLE" }, - - { RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW, "COWS_MILKED_KF_LINKS_HOUSE_COW" }, - { RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW, "COWS_MILKED_HF_COW_GROTTO_COW" }, - { RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW, "COWS_MILKED_LLR_STABLES_LEFT_COW" }, - { RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW, "COWS_MILKED_LLR_STABLES_RIGHT_COW" }, - { RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW, "COWS_MILKED_LLR_TOWER_LEFT_COW" }, - { RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW, "COWS_MILKED_LLR_TOWER_RIGHT_COW" }, - { RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW, "COWS_MILKED_KAK_IMPAS_HOUSE_COW" }, - { RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW, "COWS_MILKED_DMT_COW_GROTTO_COW" }, - { RAND_INF_COWS_MILKED_GV_COW, "COWS_MILKED_GV_COW" }, - { RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW, "COWS_MILKED_JABU_JABUS_BELLY_MQ_COW" }, - - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY" }, - { RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB, "SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT, "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT, "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO, "SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO" }, - { RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB" }, - { RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB, "SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT" }, - - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1, "SHOP_ITEMS_KF_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2, "SHOP_ITEMS_KF_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3, "SHOP_ITEMS_KF_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4, "SHOP_ITEMS_KF_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5, "SHOP_ITEMS_KF_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6, "SHOP_ITEMS_KF_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7, "SHOP_ITEMS_KF_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8, "SHOP_ITEMS_KF_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1, "SHOP_ITEMS_GC_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2, "SHOP_ITEMS_GC_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3, "SHOP_ITEMS_GC_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4, "SHOP_ITEMS_GC_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5, "SHOP_ITEMS_GC_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6, "SHOP_ITEMS_GC_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7, "SHOP_ITEMS_GC_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8, "SHOP_ITEMS_GC_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1, "SHOP_ITEMS_ZD_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2, "SHOP_ITEMS_ZD_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3, "SHOP_ITEMS_ZD_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4, "SHOP_ITEMS_ZD_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5, "SHOP_ITEMS_ZD_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6, "SHOP_ITEMS_ZD_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7, "SHOP_ITEMS_ZD_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8, "SHOP_ITEMS_ZD_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1, "SHOP_ITEMS_KAK_BAZAAR_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2, "SHOP_ITEMS_KAK_BAZAAR_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3, "SHOP_ITEMS_KAK_BAZAAR_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4, "SHOP_ITEMS_KAK_BAZAAR_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5, "SHOP_ITEMS_KAK_BAZAAR_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6, "SHOP_ITEMS_KAK_BAZAAR_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7, "SHOP_ITEMS_KAK_BAZAAR_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8, "SHOP_ITEMS_KAK_BAZAAR_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8" }, - - { RAND_INF_MERCHANTS_CARPET_SALESMAN, "RAND_INF_MERCHANTS_CARPET_SALESMAN" }, - { RAND_INF_MERCHANTS_MEDIGORON, "RAND_INF_MERCHANTS_MEDIGORON" }, - { RAND_INF_MERCHANTS_GRANNYS_SHOP, "RAND_INF_MERCHANTS_GRANNY_SHOP"}, - { RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN, "RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN"}, - - { RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO, "ADULT_TRADES_LW_TRADE_COJIRO" }, - { RAND_INF_ADULT_TRADES_GV_TRADE_SAW, "ADULT_TRADES_GV_TRADE_SAW" }, - { RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD, "ADULT_TRADES_DMT_TRADE_BROKEN_SWORD" }, - { RAND_INF_ADULT_TRADES_LH_TRADE_FROG, "ADULT_TRADES_LH_TRADE_FROG" }, - { RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS, "ADULT_TRADES_DMT_TRADE_EYEDROPS" }, - - { RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD, "KAK_100_GOLD_SKULLTULA_REWARD" }, - { RAND_INF_GREG_FOUND, "RAND_INF_GREG_FOUND" }, - - { RAND_INF_TOT_MASTER_SWORD, "RAND_INF_TOT_MASTER_SWORD"}, - { RAND_INF_CHILD_FISHING, "RAND_INF_CHILD_FISHING" }, - { RAND_INF_ADULT_FISHING, "RAND_INF_ADULT_FISHING" }, - { RAND_INF_10_BIG_POES, "RAND_INF_10_BIG_POES" }, - { RAND_INF_GRANT_GANONS_BOSSKEY, "RAND_INF_GRANT_GANONS_BOSSKEY" }, - - { RAND_INF_GOHMA_SOUL, "RAND_INF_GOHMA_SOUL" }, - { RAND_INF_KING_DODONGO_SOUL, "RAND_INF_KING_DODONGO_SOUL" }, - { RAND_INF_BARINADE_SOUL, "RAND_INF_BARINADE_SOUL" }, - { RAND_INF_PHANTOM_GANON_SOUL, "RAND_INF_PHANTOM_GANON_SOUL" }, - { RAND_INF_VOLVAGIA_SOUL, "RAND_INF_VOLVAGIA_SOUL" }, - { RAND_INF_MORPHA_SOUL, "RAND_INF_MORPHA_SOUL" }, - { RAND_INF_BONGO_BONGO_SOUL, "RAND_INF_BONGO_BONGO_SOUL" }, - { RAND_INF_TWINROVA_SOUL, "RAND_INF_TWINROVA_SOUL" }, - { RAND_INF_GANON_SOUL, "RAND_INF_GANON_SOUL" }, - - { RAND_INF_HAS_OCARINA_A, "RAND_INF_HAS_OCARINA_A"}, - { RAND_INF_HAS_OCARINA_C_UP, "RAND_INF_HAS_OCARINA_C_UP" }, - { RAND_INF_HAS_OCARINA_C_DOWN, "RAND_INF_HAS_OCARINA_C_DOWN" }, - { RAND_INF_HAS_OCARINA_C_LEFT, "RAND_INF_HAS_OCARINA_C_LEFT"}, - { RAND_INF_HAS_OCARINA_C_RIGHT, "RAND_INF_HAS_OCARINA_C_RIGHT"}, - - { RAND_INF_KF_LINKS_HOUSE_POT, "RAND_INF_KF_LINKS_HOUSE_POT" }, - { RAND_INF_KF_TWINS_HOUSE_POT_1, "RAND_INF_KF_TWINS_HOUSE_POT_1" }, - { RAND_INF_KF_TWINS_HOUSE_POT_2, "RAND_INF_KF_TWINS_HOUSE_POT_2" }, - { RAND_INF_KF_BROTHERS_HOUSE_POT_1, "RAND_INF_KF_BROTHERS_HOUSE_POT_1" }, - { RAND_INF_KF_BROTHERS_HOUSE_POT_2, "RAND_INF_KF_BROTHERS_HOUSE_POT_2" }, - { RAND_INF_GF_BREAK_ROOM_POT_1, "RAND_INF_GF_BREAK_ROOM_POT_1" }, - { RAND_INF_GF_BREAK_ROOM_POT_2, "RAND_INF_GF_BREAK_ROOM_POT_2" }, - { RAND_INF_GF_KITCHEN_POT_1, "RAND_INF_GF_KITCHEN_POT_1" }, - { RAND_INF_GF_KITCHEN_POT_2, "RAND_INF_GF_KITCHEN_POT_2" }, - { RAND_INF_GF_NORTH_F1_CARPENTER_POT_1, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_1" }, - { RAND_INF_GF_NORTH_F1_CARPENTER_POT_2, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_2" }, - { RAND_INF_GF_NORTH_F1_CARPENTER_POT_3, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_3" }, - { RAND_INF_GF_NORTH_F2_CARPENTER_POT_1, "RAND_INF_GF_NORTH_F2_CARPENTER_POT_1" }, - { RAND_INF_GF_NORTH_F2_CARPENTER_POT_2, "RAND_INF_GF_NORTH_F2_CARPENTER_POT_2" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_1, "RAND_INF_WASTELAND_NEAR_GS_POT_1" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_2, "RAND_INF_WASTELAND_NEAR_GS_POT_2" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_3, "RAND_INF_WASTELAND_NEAR_GS_POT_3" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_4, "RAND_INF_WASTELAND_NEAR_GS_POT_4" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11" }, - { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1" }, - { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2" }, - { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3" }, - { RAND_INF_KAK_NEAR_POTION_SHOP_POT_1, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_1" }, - { RAND_INF_KAK_NEAR_POTION_SHOP_POT_2, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_2" }, - { RAND_INF_KAK_NEAR_POTION_SHOP_POT_3, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_3" }, - { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1" }, - { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2" }, - { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3" }, - { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1" }, - { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2" }, - { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3" }, - { RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1, "RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1" }, - { RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2, "RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_1, "RAND_INF_GY_DAMPES_GRAVE_POT_1" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_2, "RAND_INF_GY_DAMPES_GRAVE_POT_2" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_3, "RAND_INF_GY_DAMPES_GRAVE_POT_3" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_4, "RAND_INF_GY_DAMPES_GRAVE_POT_4" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_5, "RAND_INF_GY_DAMPES_GRAVE_POT_5" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_6, "RAND_INF_GY_DAMPES_GRAVE_POT_6" }, - { RAND_INF_GC_LOWER_STAIRCASE_POT_1, "RAND_INF_GC_LOWER_STAIRCASE_POT_1" }, - { RAND_INF_GC_LOWER_STAIRCASE_POT_2, "RAND_INF_GC_LOWER_STAIRCASE_POT_2" }, - { RAND_INF_GC_UPPER_STAIRCASE_POT_1, "RAND_INF_GC_UPPER_STAIRCASE_POT_1" }, - { RAND_INF_GC_UPPER_STAIRCASE_POT_2, "RAND_INF_GC_UPPER_STAIRCASE_POT_2" }, - { RAND_INF_GC_UPPER_STAIRCASE_POT_3, "RAND_INF_GC_UPPER_STAIRCASE_POT_3" }, - { RAND_INF_GC_MEDIGORON_POT_1, "RAND_INF_GC_MEDIGORON_POT_1" }, - { RAND_INF_GC_DARUNIA_POT_1, "RAND_INF_GC_DARUNIA_POT_1" }, - { RAND_INF_GC_DARUNIA_POT_2, "RAND_INF_GC_DARUNIA_POT_2" }, - { RAND_INF_GC_DARUNIA_POT_3, "RAND_INF_GC_DARUNIA_POT_3" }, - { RAND_INF_DMC_NEAR_GC_POT_1, "RAND_INF_DMC_NEAR_GC_POT_1" }, - { RAND_INF_DMC_NEAR_GC_POT_2, "RAND_INF_DMC_NEAR_GC_POT_2" }, - { RAND_INF_DMC_NEAR_GC_POT_3, "RAND_INF_DMC_NEAR_GC_POT_3" }, - { RAND_INF_DMC_NEAR_GC_POT_4, "RAND_INF_DMC_NEAR_GC_POT_4" }, - { RAND_INF_ZD_NEAR_SHOP_POT_1, "RAND_INF_ZD_NEAR_SHOP_POT_1" }, - { RAND_INF_ZD_NEAR_SHOP_POT_2, "RAND_INF_ZD_NEAR_SHOP_POT_2" }, - { RAND_INF_ZD_NEAR_SHOP_POT_3, "RAND_INF_ZD_NEAR_SHOP_POT_3" }, - { RAND_INF_ZD_NEAR_SHOP_POT_4, "RAND_INF_ZD_NEAR_SHOP_POT_4" }, - { RAND_INF_ZD_NEAR_SHOP_POT_5, "RAND_INF_ZD_NEAR_SHOP_POT_5" }, - { RAND_INF_ZF_HIDDEN_CAVE_POT_1, "RAND_INF_ZF_HIDDEN_CAVE_POT_1" }, - { RAND_INF_ZF_HIDDEN_CAVE_POT_2, "RAND_INF_ZF_HIDDEN_CAVE_POT_2" }, - { RAND_INF_ZF_HIDDEN_CAVE_POT_3, "RAND_INF_ZF_HIDDEN_CAVE_POT_3" }, - { RAND_INF_ZF_NEAR_JABU_POT_1, "RAND_INF_ZF_NEAR_JABU_POT_1" }, - { RAND_INF_ZF_NEAR_JABU_POT_2, "RAND_INF_ZF_NEAR_JABU_POT_2" }, - { RAND_INF_ZF_NEAR_JABU_POT_3, "RAND_INF_ZF_NEAR_JABU_POT_3" }, - { RAND_INF_ZF_NEAR_JABU_POT_4, "RAND_INF_ZF_NEAR_JABU_POT_4" }, - { RAND_INF_LLR_FRONT_POT_1, "RAND_INF_LLR_FRONT_POT_1" }, - { RAND_INF_LLR_FRONT_POT_2, "RAND_INF_LLR_FRONT_POT_2" }, - { RAND_INF_LLR_FRONT_POT_3, "RAND_INF_LLR_FRONT_POT_3" }, - { RAND_INF_LLR_FRONT_POT_4, "RAND_INF_LLR_FRONT_POT_4" }, - { RAND_INF_LLR_RAIN_SHED_POT_1, "RAND_INF_LLR_RAIN_SHED_POT_1" }, - { RAND_INF_LLR_RAIN_SHED_POT_2, "RAND_INF_LLR_RAIN_SHED_POT_2" }, - { RAND_INF_LLR_RAIN_SHED_POT_3, "RAND_INF_LLR_RAIN_SHED_POT_3" }, - { RAND_INF_LLR_TALONS_HOUSE_POT_1, "RAND_INF_LLR_TALONS_HOUSE_POT_1" }, - { RAND_INF_LLR_TALONS_HOUSE_POT_2, "RAND_INF_LLR_TALONS_HOUSE_POT_2" }, - { RAND_INF_LLR_TALONS_HOUSE_POT_3, "RAND_INF_LLR_TALONS_HOUSE_POT_3" }, - { RAND_INF_HF_COW_GROTTO_POT_1, "RAND_INF_HF_COW_GROTTO_POT_1" }, - { RAND_INF_HF_COW_GROTTO_POT_2, "RAND_INF_HF_COW_GROTTO_POT_2" }, - { RAND_INF_HC_STORMS_GROTTO_POT_1, "RAND_INF_HC_STORMS_GROTTO_POT_1" }, - { RAND_INF_HC_STORMS_GROTTO_POT_2, "RAND_INF_HC_STORMS_GROTTO_POT_2" }, - { RAND_INF_HC_STORMS_GROTTO_POT_3, "RAND_INF_HC_STORMS_GROTTO_POT_3" }, - { RAND_INF_HC_STORMS_GROTTO_POT_4, "RAND_INF_HC_STORMS_GROTTO_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1, "RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2, "RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_BLADE_POT_1, "RAND_INF_DODONGOS_CAVERN_BLADE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_BLADE_POT_2, "RAND_INF_DODONGOS_CAVERN_BLADE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, "RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, "RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4" }, - { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6" }, - { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_1, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_1" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_2, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_2" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_3, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_3" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_4, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_4" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_5, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_5" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_6, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_6" }, - { RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1, "RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2, "RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4" }, - { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3" }, - { RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1, "RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2, "RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4" }, - { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1" }, - { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2" }, - { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2" }, - { RAND_INF_WATER_TEMPLE_TORCH_POT_1, "RAND_INF_WATER_TEMPLE_TORCH_POT_1" }, - { RAND_INF_WATER_TEMPLE_TORCH_POT_2, "RAND_INF_WATER_TEMPLE_TORCH_POT_2" }, - { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1" }, - { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2" }, - { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3" }, - { RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1, "RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1" }, - { RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2, "RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4" }, - { RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, "RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1" }, - { RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, "RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2" }, - { RAND_INF_WATER_TEMPLE_RIVER_POT_1, "RAND_INF_WATER_TEMPLE_RIVER_POT_1" }, - { RAND_INF_WATER_TEMPLE_RIVER_POT_2, "RAND_INF_WATER_TEMPLE_RIVER_POT_2" }, - { RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1, "RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1" }, - { RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2, "RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2" }, - { RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1, "RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1" }, - { RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2, "RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, "RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5" }, - { RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1, "RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2, "RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1, "RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2, "RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1, "RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2, "RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1, "RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2, "RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, "RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, "RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, "RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6" }, - { RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, "RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1" }, - { RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1" }, - { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12" }, - { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT, "RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT" }, - { RAND_INF_ICE_CAVERN_HALL_POT_1, "RAND_INF_ICE_CAVERN_HALL_POT_1" }, - { RAND_INF_ICE_CAVERN_HALL_POT_2, "RAND_INF_ICE_CAVERN_HALL_POT_2" }, - { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1" }, - { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2" }, - { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3" }, - { RAND_INF_ICE_CAVERN_NEAR_END_POT_1, "RAND_INF_ICE_CAVERN_NEAR_END_POT_1" }, - { RAND_INF_ICE_CAVERN_NEAR_END_POT_2, "RAND_INF_ICE_CAVERN_NEAR_END_POT_2" }, - { RAND_INF_ICE_CAVERN_FROZEN_POT_1, "RAND_INF_ICE_CAVERN_FROZEN_POT_1" }, - - { RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4" }, - { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, "RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT" }, - { RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8" }, - { RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT, "RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT" }, - { RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, "RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, "RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4" }, - { RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, "RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, "RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2" }, - { RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1, "RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2, "RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5" }, - { RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, "RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, "RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1, "RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2, "RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, "RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, "RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, "RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, "RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4" }, - { RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT, "RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2" }, - - { RAND_INF_CAUGHT_LOACH, "RAND_INF_CAUGHT_LOACH" }, - - { RAND_INF_CAN_SWIM, "RAND_INF_CAN_SWIM" }, - - { RAND_INF_HAS_WALLET, "RAND_INF_HAS_WALLET" }, - - { RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT, "RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT, "RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO, "RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO" }, - { RAND_INF_BEEHIVE_SFM_STORMS_GROTTO, "RAND_INF_BEEHIVE_SFM_STORMS_GROTTO" }, - { RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO, "RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO" }, - { RAND_INF_BEEHIVE_LLR_GROTTO, "RAND_INF_BEEHIVE_LLR_GROTTO" }, - { RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_DMT_COW_GROTTO, "RAND_INF_BEEHIVE_DMT_COW_GROTTO" }, - { RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT, "RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_GC_GROTTO, "RAND_INF_BEEHIVE_GC_GROTTO" }, - { RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT, "RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT, "RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO, "RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO" }, - { RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_ZR_STORMS_GROTTO, "RAND_INF_BEEHIVE_ZR_STORMS_GROTTO" }, - { RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT, "RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT" }, - { RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT, "RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT" }, - { RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA, "RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA" }, - { RAND_INF_BEEHIVE_LH_GROTTO, "RAND_INF_BEEHIVE_LH_GROTTO" }, - { RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO, "RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO" }, - { RAND_INF_BEEHIVE_COLOSSUS_GROTTO, "RAND_INF_BEEHIVE_COLOSSUS_GROTTO" }, - - { RAND_INF_CHILD_FISH_1, "RAND_INF_CHILD_FISH_1" }, - { RAND_INF_CHILD_FISH_2, "RAND_INF_CHILD_FISH_2" }, - { RAND_INF_CHILD_FISH_3, "RAND_INF_CHILD_FISH_3" }, - { RAND_INF_CHILD_FISH_4, "RAND_INF_CHILD_FISH_4" }, - { RAND_INF_CHILD_FISH_5, "RAND_INF_CHILD_FISH_5" }, - { RAND_INF_CHILD_FISH_6, "RAND_INF_CHILD_FISH_6" }, - { RAND_INF_CHILD_FISH_7, "RAND_INF_CHILD_FISH_7" }, - { RAND_INF_CHILD_FISH_8, "RAND_INF_CHILD_FISH_8" }, - { RAND_INF_CHILD_FISH_9, "RAND_INF_CHILD_FISH_9" }, - { RAND_INF_CHILD_FISH_10, "RAND_INF_CHILD_FISH_10" }, - { RAND_INF_CHILD_FISH_11, "RAND_INF_CHILD_FISH_11" }, - { RAND_INF_CHILD_FISH_12, "RAND_INF_CHILD_FISH_12" }, - { RAND_INF_CHILD_FISH_13, "RAND_INF_CHILD_FISH_13" }, - { RAND_INF_CHILD_FISH_14, "RAND_INF_CHILD_FISH_14" }, - { RAND_INF_CHILD_FISH_15, "RAND_INF_CHILD_FISH_15" }, - { RAND_INF_CHILD_LOACH_1, "RAND_INF_CHILD_LOACH_1" }, - { RAND_INF_CHILD_LOACH_2, "RAND_INF_CHILD_LOACH_2" }, - { RAND_INF_ADULT_FISH_1, "RAND_INF_ADULT_FISH_1" }, - { RAND_INF_ADULT_FISH_2, "RAND_INF_ADULT_FISH_2" }, - { RAND_INF_ADULT_FISH_3, "RAND_INF_ADULT_FISH_3" }, - { RAND_INF_ADULT_FISH_4, "RAND_INF_ADULT_FISH_4" }, - { RAND_INF_ADULT_FISH_5, "RAND_INF_ADULT_FISH_5" }, - { RAND_INF_ADULT_FISH_6, "RAND_INF_ADULT_FISH_6" }, - { RAND_INF_ADULT_FISH_7, "RAND_INF_ADULT_FISH_7" }, - { RAND_INF_ADULT_FISH_8, "RAND_INF_ADULT_FISH_8" }, - { RAND_INF_ADULT_FISH_9, "RAND_INF_ADULT_FISH_9" }, - { RAND_INF_ADULT_FISH_10, "RAND_INF_ADULT_FISH_10" }, - { RAND_INF_ADULT_FISH_11, "RAND_INF_ADULT_FISH_11" }, - { RAND_INF_ADULT_FISH_12, "RAND_INF_ADULT_FISH_12" }, - { RAND_INF_ADULT_FISH_13, "RAND_INF_ADULT_FISH_13" }, - { RAND_INF_ADULT_FISH_14, "RAND_INF_ADULT_FISH_14" }, - { RAND_INF_ADULT_FISH_15, "RAND_INF_ADULT_FISH_15" }, - { RAND_INF_ADULT_LOACH, "RAND_INF_ADULT_LOACH" }, - { RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO" }, - { RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO, "RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO" }, - { RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO, "RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO" }, - { RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO" }, - { RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO, "RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO" }, - { RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO" }, - { RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO, "RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO" }, - { RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO, "RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO" }, - { RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO, "RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO" }, - { RAND_INF_FISHING_POLE_FOUND, "RAND_INF_FISHING_POLE_FOUND" }, - { RAND_INF_ZD_FISH_1, "RAND_INF_ZD_FISH_1" }, - { RAND_INF_ZD_FISH_2, "RAND_INF_ZD_FISH_2" }, - { RAND_INF_ZD_FISH_3, "RAND_INF_ZD_FISH_3" }, - { RAND_INF_ZD_FISH_4, "RAND_INF_ZD_FISH_4" }, - { RAND_INF_ZD_FISH_5, "RAND_INF_ZD_FISH_5" }, - - { RAND_INF_HAS_INFINITE_QUIVER, "RAND_INF_HAS_INFINITE_QUIVER" }, - { RAND_INF_HAS_INFINITE_BOMB_BAG, "RAND_INF_HAS_INFINITE_BOMB_BAG" }, - { RAND_INF_HAS_INFINITE_BULLET_BAG, "RAND_INF_HAS_INFINITE_BULLET_BAG" }, - { RAND_INF_HAS_INFINITE_STICK_UPGRADE, "RAND_INF_HAS_INFINITE_STICK_UPGRADE" }, - { RAND_INF_HAS_INFINITE_NUT_UPGRADE, "RAND_INF_HAS_INFINITE_NUT_UPGRADE" }, - { RAND_INF_HAS_INFINITE_MAGIC_METER, "RAND_INF_HAS_INFINITE_MAGIC_METER" }, - { RAND_INF_HAS_INFINITE_BOMBCHUS, "RAND_INF_HAS_INFINITE_BOMBCHUS" }, - { RAND_INF_HAS_INFINITE_MONEY, "RAND_INF_HAS_INFINITE_MONEY" }, - - { RAND_INF_HAS_SKELETON_KEY, "RAND_INF_HAS_SKELETON_KEY" }, - - { RAND_INF_LINKS_POCKET, "RAND_INF_LINKS_POCKET" }, - { RAND_INF_LEARNED_EPONA_SONG, "RAND_INF_LEARNED_EPONA_SONG" }, - { RAND_INF_DARUNIAS_JOY, "RAND_INF_DARUNIAS_JOY" }, - { RAND_INF_KING_ZORA_THAWED, "RAND_INF_KING_ZORA_THAWED" }, - - { RAND_INF_HC_GREAT_FAIRY_REWARD, "RAND_INF_HC_GREAT_FAIRY_REWARD" }, - { RAND_INF_DMT_GREAT_FAIRY_REWARD, "RAND_INF_DMT_GREAT_FAIRY_REWARD" }, - { RAND_INF_DMC_GREAT_FAIRY_REWARD, "RAND_INF_DMC_GREAT_FAIRY_REWARD" }, - { RAND_INF_ZF_GREAT_FAIRY_REWARD, "RAND_INF_ZF_GREAT_FAIRY_REWARD" }, - { RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD, "RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD" }, - { RAND_INF_OGC_GREAT_FAIRY_REWARD, "RAND_INF_OGC_GREAT_FAIRY_REWARD" }, - - { RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE, "RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE" }, - { RAND_INF_KF_NORTH_GRASS_WEST_RUPEE, "RAND_INF_KF_NORTH_GRASS_WEST_RUPEE" }, - { RAND_INF_KF_NORTH_GRASS_EAST_RUPEE, "RAND_INF_KF_NORTH_GRASS_EAST_RUPEE" }, - { RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE, "RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE" }, - { RAND_INF_KF_SARIAS_TOP_LEFT_HEART, "RAND_INF_KF_SARIAS_TOP_LEFT_HEART" }, - { RAND_INF_KF_SARIAS_TOP_RIGHT_HEART, "RAND_INF_KF_SARIAS_TOP_RIGHT_HEART" }, - { RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART, "RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART" }, - { RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART, "RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART" }, - { RAND_INF_KF_BEAN_RUPEE_1, "RAND_INF_KF_BEAN_RUPEE_1" }, - { RAND_INF_KF_BEAN_RUPEE_2, "RAND_INF_KF_BEAN_RUPEE_2" }, - { RAND_INF_KF_BEAN_RUPEE_3, "RAND_INF_KF_BEAN_RUPEE_3" }, - { RAND_INF_KF_BEAN_RUPEE_4, "RAND_INF_KF_BEAN_RUPEE_4" }, - { RAND_INF_KF_BEAN_RUPEE_5, "RAND_INF_KF_BEAN_RUPEE_5" }, - { RAND_INF_KF_BEAN_RUPEE_6, "RAND_INF_KF_BEAN_RUPEE_6" }, - { RAND_INF_KF_BEAN_RED_RUPEE, "RAND_INF_KF_BEAN_RED_RUPEE" }, - { RAND_INF_LW_SHORTCUT_RUPEE_1, "RAND_INF_LW_SHORTCUT_RUPEE_1" }, - { RAND_INF_LW_SHORTCUT_RUPEE_2, "RAND_INF_LW_SHORTCUT_RUPEE_2" }, - { RAND_INF_LW_SHORTCUT_RUPEE_3, "RAND_INF_LW_SHORTCUT_RUPEE_3" }, - { RAND_INF_LW_SHORTCUT_RUPEE_4, "RAND_INF_LW_SHORTCUT_RUPEE_4" }, - { RAND_INF_LW_SHORTCUT_RUPEE_5, "RAND_INF_LW_SHORTCUT_RUPEE_5" }, - { RAND_INF_LW_SHORTCUT_RUPEE_6, "RAND_INF_LW_SHORTCUT_RUPEE_6" }, - { RAND_INF_LW_SHORTCUT_RUPEE_7, "RAND_INF_LW_SHORTCUT_RUPEE_7" }, - { RAND_INF_LW_SHORTCUT_RUPEE_8, "RAND_INF_LW_SHORTCUT_RUPEE_8" }, - { RAND_INF_LH_FRONT_RUPEE, "RAND_INF_LH_FRONT_RUPEE" }, - { RAND_INF_LH_MIDDLE_RUPEE, "RAND_INF_LH_MIDDLE_RUPEE" }, - { RAND_INF_LH_BACK_RUPEE, "RAND_INF_LH_BACK_RUPEE" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE" }, - { RAND_INF_DMT_BLUE_RUPEE, "RAND_INF_DMT_BLUE_RUPEE" }, - { RAND_INF_DMT_COW_GROTTO_LEFT_HEART, "RAND_INF_DMT_COW_GROTTO_LEFT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, "RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, "RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_RIGHT_HEART, "RAND_INF_DMT_COW_GROTTO_RIGHT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_1, "RAND_INF_DMT_COW_GROTTO_RUPEE_1" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_2, "RAND_INF_DMT_COW_GROTTO_RUPEE_2" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_3, "RAND_INF_DMT_COW_GROTTO_RUPEE_3" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_4, "RAND_INF_DMT_COW_GROTTO_RUPEE_4" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_5, "RAND_INF_DMT_COW_GROTTO_RUPEE_5" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_6, "RAND_INF_DMT_COW_GROTTO_RUPEE_6" }, - { RAND_INF_DMT_COW_GROTTO_RED_RUPEE, "RAND_INF_DMT_COW_GROTTO_RED_RUPEE" }, - { RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE, "RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE, "RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE, "RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE" }, - { RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART, "RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART" }, - { RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART, "RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART" }, - { RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART" }, - { RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART" }, - { RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART" }, - { RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART, "RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART" }, - { RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, "RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART" }, - { RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, "RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART" }, - { RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, "RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART" }, - { RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART, "RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART" }, - { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART" }, - { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART" }, - { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_1, "RAND_INF_WATER_TEMPLE_RIVER_HEART_1" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_2, "RAND_INF_WATER_TEMPLE_RIVER_HEART_2" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_3, "RAND_INF_WATER_TEMPLE_RIVER_HEART_3" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_4, "RAND_INF_WATER_TEMPLE_RIVER_HEART_4" }, - { RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, "RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, "RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART" }, - { RAND_INF_ICE_CAVERN_LOBBY_RUPEE, "RAND_INF_ICE_CAVERN_LOBBY_RUPEE" }, - { RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART" }, - { RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART" }, - { RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART" }, - { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1" }, - { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2" }, - { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART" }, - { RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, "RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART" }, - { RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, "RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3" }, - { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART" }, - { RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, "RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART" }, - { RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, "RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART" }, - { RAND_INF_DEKU_TREE_MQ_LOBBY_HEART, "RAND_INF_DEKU_TREE_MQ_LOBBY_HEART" }, - { RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, "RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART" }, - { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART" }, - { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART" }, - { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART" }, - { RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, "RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, "RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, "RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART" }, - { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART" }, - { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART" }, - { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART" }, - - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_1, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_2, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_3, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_4, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_5, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_6, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_7, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_8, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_1, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_2, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_3, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_4, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_5, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_6, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_1, "RAND_INF_COLOSSUS_OASIS_FAIRY_1" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_2, "RAND_INF_COLOSSUS_OASIS_FAIRY_2" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_3, "RAND_INF_COLOSSUS_OASIS_FAIRY_3" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_4, "RAND_INF_COLOSSUS_OASIS_FAIRY_4" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_5, "RAND_INF_COLOSSUS_OASIS_FAIRY_5" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_6, "RAND_INF_COLOSSUS_OASIS_FAIRY_6" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_7, "RAND_INF_COLOSSUS_OASIS_FAIRY_7" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_8, "RAND_INF_COLOSSUS_OASIS_FAIRY_8" }, - - { RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_KF_BEAN_SPROUT_FAIRY_1, "RAND_INF_KF_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_KF_BEAN_SPROUT_FAIRY_2, "RAND_INF_KF_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_KF_BEAN_SPROUT_FAIRY_3, "RAND_INF_KF_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3" }, - { RAND_INF_LH_BEAN_SPROUT_FAIRY_1, "RAND_INF_LH_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_LH_BEAN_SPROUT_FAIRY_2, "RAND_INF_LH_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_LH_BEAN_SPROUT_FAIRY_3, "RAND_INF_LH_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_GV_BEAN_SPROUT_FAIRY_1, "RAND_INF_GV_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_GV_BEAN_SPROUT_FAIRY_2, "RAND_INF_GV_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_GV_BEAN_SPROUT_FAIRY_3, "RAND_INF_GV_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_DMC_BEAN_SPROUT_FAIRY_1, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_DMC_BEAN_SPROUT_FAIRY_2, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_DMC_BEAN_SPROUT_FAIRY_3, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_3" }, - - { RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMC_GOSSIP_STONE_FAIRY, "RAND_INF_DMC_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMT_GOSSIP_STONE_FAIRY, "RAND_INF_DMT_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY, "RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY" }, - { RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, "RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, "RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GV_GOSSIP_STONE_FAIRY, "RAND_INF_GV_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY, "RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY, "RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY, "RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY, "RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, "RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, "RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, "RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_GOSSIP_STONE_FAIRY, "RAND_INF_KF_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY, "RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, "RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, "RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LW_GOSSIP_STONE_FAIRY, "RAND_INF_LW_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY" }, - { RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZD_GOSSIP_STONE_FAIRY, "RAND_INF_ZD_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY, "RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY, "RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - - { RAND_INF_LH_ISLAND_SUN_FAIRY, "RAND_INF_LH_ISLAND_SUN_FAIRY" }, - { RAND_INF_HF_POND_STORMS_FAIRY, "RAND_INF_HF_POND_STORMS_FAIRY" }, - { RAND_INF_DMT_FLAG_SUN_FAIRY, "RAND_INF_DMT_FLAG_SUN_FAIRY" }, - { RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "RAND_INF_LW_SHORTCUT_STORMS_FAIRY" }, - { RAND_INF_GF_KITCHEN_SUN_FAIRY, "RAND_INF_GF_KITCHEN_SUN_FAIRY" }, - { RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY" }, - { RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, "RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY" }, - { RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY" }, - { RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, "RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY" }, - { RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, "RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY" }, - { RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, "RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY" }, - { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY" }, - { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY" }, - { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY" }, - - { RAND_INF_GUARD_HOUSE_UNLOCKED, "RAND_INF_GUARD_HOUSE_UNLOCKED" }, - { RAND_INF_GUARD_HOUSE_KEY_OBTAINED, "RAND_INF_GUARD_HOUSE_KEY_OBTAINED" }, - { RAND_INF_MARKET_BAZAAR_UNLOCKED, "RAND_INF_MARKET_BAZAAR_UNLOCKED" }, - { RAND_INF_MARKET_BAZAAR_KEY_OBTAINED, "RAND_INF_MARKET_BAZAAR_KEY_OBTAINED" }, - { RAND_INF_MARKET_POTION_SHOP_UNLOCKED, "RAND_INF_MARKET_POTION_SHOP_UNLOCKED" }, - { RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED, "RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED" }, - { RAND_INF_MASK_SHOP_UNLOCKED, "RAND_INF_MASK_SHOP_UNLOCKED" }, - { RAND_INF_MASK_SHOP_KEY_OBTAINED, "RAND_INF_MASK_SHOP_KEY_OBTAINED" }, - { RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED, "RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED" }, - { RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED, "RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED" }, - { RAND_INF_BOMBCHU_BOWLING_UNLOCKED, "RAND_INF_BOMBCHU_BOWLING_UNLOCKED" }, - { RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED, "RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED" }, - { RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED, "RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED" }, - { RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED, "RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED" }, - { RAND_INF_BOMBCHU_SHOP_UNLOCKED, "RAND_INF_BOMBCHU_SHOP_UNLOCKED" }, - { RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED, "RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED" }, - { RAND_INF_RICHARDS_HOUSE_UNLOCKED, "RAND_INF_RICHARDS_HOUSE_UNLOCKED" }, - { RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED, "RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED" }, - { RAND_INF_ALLEY_HOUSE_UNLOCKED, "RAND_INF_ALLEY_HOUSE_UNLOCKED" }, - { RAND_INF_ALLEY_HOUSE_KEY_OBTAINED, "RAND_INF_ALLEY_HOUSE_KEY_OBTAINED" }, - { RAND_INF_KAK_BAZAAR_UNLOCKED, "RAND_INF_KAK_BAZAAR_UNLOCKED" }, - { RAND_INF_KAK_BAZAAR_KEY_OBTAINED, "RAND_INF_KAK_BAZAAR_KEY_OBTAINED" }, - { RAND_INF_KAK_POTION_SHOP_UNLOCKED, "RAND_INF_KAK_POTION_SHOP_UNLOCKED" }, - { RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED, "RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED" }, - { RAND_INF_BOSS_HOUSE_UNLOCKED, "RAND_INF_BOSS_HOUSE_UNLOCKED" }, - { RAND_INF_BOSS_HOUSE_KEY_OBTAINED, "RAND_INF_BOSS_HOUSE_KEY_OBTAINED" }, - { RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED, "RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED" }, - { RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED, "RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED" }, - { RAND_INF_SKULLTULA_HOUSE_UNLOCKED, "RAND_INF_SKULLTULA_HOUSE_UNLOCKED" }, - { RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED, "RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED" }, - { RAND_INF_IMPAS_HOUSE_UNLOCKED, "RAND_INF_IMPAS_HOUSE_UNLOCKED" }, - { RAND_INF_IMPAS_HOUSE_KEY_OBTAINED, "RAND_INF_IMPAS_HOUSE_KEY_OBTAINED" }, - { RAND_INF_WINDMILL_UNLOCKED, "RAND_INF_WINDMILL_UNLOCKED" }, - { RAND_INF_WINDMILL_KEY_OBTAINED, "RAND_INF_WINDMILL_KEY_OBTAINED" }, - { RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED, "RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED" }, - { RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED, "RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED" }, - { RAND_INF_DAMPES_HUT_UNLOCKED, "RAND_INF_DAMPES_HUT_UNLOCKED" }, - { RAND_INF_DAMPES_HUT_KEY_OBTAINED, "RAND_INF_DAMPES_HUT_KEY_OBTAINED" }, - { RAND_INF_TALONS_HOUSE_UNLOCKED, "RAND_INF_TALONS_HOUSE_UNLOCKED" }, - { RAND_INF_TALONS_HOUSE_KEY_OBTAINED, "RAND_INF_TALONS_HOUSE_KEY_OBTAINED" }, - { RAND_INF_STABLES_UNLOCKED, "RAND_INF_STABLES_UNLOCKED" }, - { RAND_INF_STABLES_KEY_OBTAINED, "RAND_INF_STABLES_KEY_OBTAINED" }, - { RAND_INF_BACK_TOWER_UNLOCKED, "RAND_INF_BACK_TOWER_UNLOCKED" }, - { RAND_INF_BACK_TOWER_KEY_OBTAINED, "RAND_INF_BACK_TOWER_KEY_OBTAINED" }, - { RAND_INF_HYLIA_LAB_UNLOCKED, "RAND_INF_HYLIA_LAB_UNLOCKED" }, - { RAND_INF_HYLIA_LAB_KEY_OBTAINED, "RAND_INF_HYLIA_LAB_KEY_OBTAINED" }, - { RAND_INF_FISHING_HOLE_UNLOCKED, "RAND_INF_FISHING_HOLE_UNLOCKED" }, - { RAND_INF_FISHING_HOLE_KEY_OBTAINED, "RAND_INF_FISHING_HOLE_KEY_OBTAINED" }, - - { RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG, "RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG" }, - { RAND_INF_CHILD_TRADES_HAS_CHICKEN, "RAND_INF_CHILD_TRADES_HAS_CHICKEN" }, - { RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA, "RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_KEATON, "RAND_INF_CHILD_TRADES_HAS_MASK_KEATON" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_SKULL, "RAND_INF_CHILD_TRADES_HAS_MASK_SKULL" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY, "RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY, "RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_GORON, "RAND_INF_CHILD_TRADES_HAS_MASK_GORON" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_ZORA, "RAND_INF_CHILD_TRADES_HAS_MASK_ZORA" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO, "RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH, "RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH" }, - - { RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, "RAND_INF_ADULT_TRADES_HAS_POCKET_EGG" }, - { RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO, "RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO" }, - { RAND_INF_ADULT_TRADES_HAS_COJIRO, "RAND_INF_ADULT_TRADES_HAS_COJIRO" }, - { RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM, "RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM" }, - { RAND_INF_ADULT_TRADES_HAS_ODD_POTION, "RAND_INF_ADULT_TRADES_HAS_ODD_POTION" }, - { RAND_INF_ADULT_TRADES_HAS_SAW, "RAND_INF_ADULT_TRADES_HAS_SAW" }, - { RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN, "RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN" }, - { RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION, "RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION" }, - { RAND_INF_ADULT_TRADES_HAS_FROG, "RAND_INF_ADULT_TRADES_HAS_FROG" }, - { RAND_INF_ADULT_TRADES_HAS_EYEDROPS, "RAND_INF_ADULT_TRADES_HAS_EYEDROPS" }, - { RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, "RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK" }, - } }, + { "Event Check Inf Flags", + EVENT_CHECK_INF, + 0x0D, + { + { 0x02, "First Spoke to Mido" }, + { 0x03, "Complained About Mido to Saria" }, + { 0x04, "Showed Mido Sword & Shield" }, + { 0x05, "Deku Tree Opened Mouth" }, + { 0x06, "Spoke to Saria After Deku Tree's Death" }, + { 0x07, "Obtained Kokiri Emerald & Deku Tree Dead" }, + { 0x09, "Used Deku Tree Blue Warp" }, + { 0x0A, "Played Saria's Song for Mido as Adult" }, + { 0x0C, "Met Deku Tree" }, + { 0x0F, "Spoke to Mido about Saria's whereabouts" }, + { 0x10, "Spoke to Child Malon at Castle or Market" }, + { 0x11, "Spoke to Ingo at Ranch before Talon returns" }, + { 0x12, "Obtained Pocket Egg" }, + { 0x13, "Woke Talon" }, + { 0x14, "Talon Fled Hyrule Castle" }, + { 0x15, "Spoke to Child Malon at Ranch" }, + { 0x16, "Invited to Sing With Child Malon" }, + { 0x17, "Great Deku Tree is Dead" }, + { 0x18, "Obtained Epona" }, + { 0x19, "Obtained Kokiri's Emerald" }, + { 0x1B, "Rented Horse From Ingo" }, + { 0x1C, "Spoke to Mido After Deku Tree's Death" }, + { 0x1D, "Destroyed the Royal Family's Tomb" }, + { 0x1E, "Won the Cow in Malon's Race" }, + { 0x23, "Bombed Dodongo's Cavern Entrance" }, + { 0x25, "Used Dodongo's Cavern Blue Warp" }, + { 0x2F, "Death Mountain Erupted" }, + { 0x30, "Spoke to a Zora" }, + { 0x31, "Obtained Ruto's Letter" }, + { 0x33, "King Zora Moved Aside" }, + { 0x37, "Used Jabu-Jabu Blue Warp" }, + { 0x38, "Obtained Silver Scale" }, + { 0x39, "Opened Entrance to Zora's Domain" }, + { 0x3A, "Offered Fish to Jabu-Jabu" }, + { 0x3B, "Began Nabooru Battle" }, + { 0x3C, "Finished Nabooru Battle" }, + { 0x40, "Obtained Zelda's Letter" }, + { 0x43, "Obtained Ocarina of Time" }, + { 0x45, "Pulled Master Sword from Pedestal" }, + { 0x48, "Used Forest Temple Blue Warp" }, + { 0x49, "Used Fire Temple Blue Warp" }, + { 0x4A, "Used Water Temple Blue Warp" }, + { 0x4B, "Opened the Door of Time" }, + { 0x4D, "Rainbow Bridge Built by Sages" }, + { 0x4E, "Caught by Hyrule Castle Guards" }, + { 0x4F, "Entered the Master Sword Chamber" }, + { 0x50, "Learned Minuet of Forest" }, + { 0x51, "Learned Bolero of Fire" }, + { 0x52, "Learned Serenade of Water" }, + { 0x54, "Learned Nocturne of Shadow" }, + { 0x55, "Sheik Moved From Sword Pedestal" }, + { 0x57, "Learned Saria's Song" }, + { 0x59, "Learned Zelda's Lullaby" }, + { 0x5A, "Learned Sun's Song" }, + { 0x5B, "Learned Song of Storms" }, + { 0x65, "Played Song of Storms in Windmill" }, + { 0x67, "Drained Well in Kakariko Village" }, + { 0x68, "Played Gerudo Archery Minigame" }, + { 0x69, "Restored Lake Hylia's Water" }, + { 0x6A, "Woke Talon in Kakariko" }, + { 0x6B, "Spoke to Talon After Saving Ranch" }, + { 0x6F, "Spoke to Kaepora Gaebora by Lost Woods" }, + { 0x70, "Began Gohma Battle" }, + { 0x71, "Began King Dodongo Battle" }, + { 0x72, "Began Phantom Ganon Battle" }, + { 0x73, "Began Volvagia Battle" }, + { 0x74, "Began Morpha Battle" }, + { 0x75, "Began Twinrova Battle" }, + { 0x76, "Began Barinade Battle" }, + { 0x77, "Began Bongo Bongo Battle" }, + { 0x78, "Began Ganondorf Battle" }, + { 0x80, "Zelda Fled Hyrule Castle" }, + { 0x82, "Bridge Unlocked (After Zelda Escape Cutscene)" }, + { 0x8C, "Paid Back Keaton Mask Fee" }, + { 0x8D, "Paid Back Skull Mask Fee" }, + { 0x8E, "Paid Back Spooky Mask Fee" }, + { 0x8F, "Paid Back Bunny Hood Fee" }, + { 0x90, "Rescued Red Carpenter" }, + { 0x91, "Rescued Yellow Carpenter" }, + { 0x92, "Rescued Blue Carpenter" }, + { 0x93, "Rescued Green Carpenter" }, + { 0x94, "Spoke to Nabooru in Spirit Temple" }, + { 0x95, "Nabooru Captured by Twinrova" }, + { 0x96, "Spoke to Cursed Man in Skulltula House" }, + { 0x9C, "Played Song for Scarecrow as Adult" }, + { 0xA0, "Entered Hyrule Field" }, + { 0xA1, "Entered Death Mountain Trail" }, + { 0xA3, "Entered Kakariko Village" }, + { 0xA4, "Entered Zora's Domain" }, + { 0xA5, "Entered Hyrule Castle" }, + { 0xA6, "Entered Goron City" }, + { 0xA7, "Entered Temple of Time" }, + { 0xA8, "Entered Deku Tree" }, + { 0xA9, "Learned Song of Time" }, + { 0xAA, "Bongo Bongo Escaped Well" }, + { 0xAC, "Learned Requiem of Spirit" }, + { 0xAD, "Completed Spirit Trial" }, + { 0xB0, "Entered Dodongo's Cavern" }, + { 0xB1, "Entered Lake Hylia" }, + { 0xB2, "Entered Gerudo Valley" }, + { 0xB3, "Entered Gerudo's Fortress" }, + { 0xB4, "Entered Lon Lon Ranch" }, + { 0xB5, "Entered Jabu-Jabu's Belly" }, + { 0xB6, "Entered Graveyard" }, + { 0xB7, "Entered Zora's Fountain" }, + { 0xB8, "Entered Desert Colossus" }, + { 0xB9, "Entered Death Mountain Crater" }, + { 0xBA, "Entered Ganon's Castle (Exterior)" }, + { 0xBB, "Completed Forest Trial" }, + { 0xBC, "Completed Water Trial" }, + { 0xBD, "Completed Shadow Trial" }, + { 0xBE, "Completed Fire Trial" }, + { 0xBF, "Completed Light Trial" }, + { 0xC0, "Nabooru Ordered to Fight by Twinrova" }, + { 0xC1, "Spoke to Saria on Lost Woods Bridge" }, + { 0xC3, "Dispelled Ganon's Tower Barrier" }, + { 0xC4, "Returned to Temple of Time With All Medallions" }, + { 0xC5, "Sheik, Spawned at Master Sword Pedestal as Adult" }, + { 0xC6, "Spoke to Deku Tree Sprout" }, + { 0xC7, "Watched Ganon's Tower Collapse / Caught by Gerudo" }, + { 0xC8, "Obtained Spirit Medallion" }, + { 0xC9, "Demo_Effect, Temple of Time Warp in blue aura + sfx the first time you spawn as Adult" }, + { 0xD0, "Obtained Frogs' Piece of Heart" }, + { 0xD1, "Played Zelda's Lullaby for Frogs" }, + { 0xD2, "Played Epona's Song for Frogs" }, + { 0xD3, "Played Sun's Song for Frogs" }, + { 0xD4, "Played Saria's Song for Frogs" }, + { 0xD5, "Played Song of Time for Frogs" }, + { 0xD6, "Played Song of Storms for Frogs" }, + { 0xDA, "Obtained Adult's Wallet" }, + { 0xDB, "Obtained Stone of Agony" }, + { 0xDC, "Obtained Giant's Wallet" }, + { 0xDD, "Obtained Skulltula House's Bombchu" }, + { 0xDE, "Obtained Skulltula House's Piece of Heart" }, + } }, + { "Item Get Inf Flags", + ITEM_GET_INF, + 0x03, + { + { 0x02, "Obtained Super Cucco Bottle" }, + { 0x03, "Bought Bombchu (Shelf 2: Top Right)" }, + { 0x04, "Bought Bombchu (Shelf 1: Bot. Right)" }, + { 0x05, "Bought Bombchu (Shelf 1: Top Left)" }, + { 0x06, "Bought Bombchu (Shelf 2: Bot. Left)" }, + { 0x07, "Bought Bombchu (Shelf 2: Bot. Right)" }, + { 0x08, "Bought Bombchu (Shelf 1: Top Right)" }, + { 0x09, "Bought Bombchu (Shelf 1: Bot. Left)" }, + { 0x0A, "Bought Bombchu (Shelf 2: Top Left)" }, + { 0x0B, "Obtained Scrub's Heart Piece" }, + { 0x0C, "Obtained Cucco Lady's Bottle" }, + { 0x0D, "Obtained Bullet Bag Upgrade (Market)" }, + { 0x0E, "Obtained Big Quiver" }, + { 0x0F, "Obtained Biggest Quiver" }, + { 0x10, "Obtained Scientist's Heart Piece" }, + { 0x11, "Obtained Bowling Bomb Bag Upgrade" }, + { 0x12, "Obtained Bowling Heart Piece" }, + { 0x13, "Obtained Deku Seeds" }, + { 0x15, "Obtained Roof Guy's Heart Piece" }, + { 0x16, "Obtained Skullkid's Heart Piece" }, + { 0x17, "Obtained Skullkids' Heart Piece" }, + { 0x18, "Obtained Farore's Wind" }, + { 0x19, "Obtained Din's Fire" }, + { 0x1A, "Obtained Nayru's Love" }, + { 0x1B, "Obtained Treasure Chest Game Reward" }, + { 0x1C, "Obtained Grave-Dig Heart Piece" }, + { 0x1D, "Obtained Bullet Bag Upgrade (Woods)" }, + { 0x1E, "Obtained Deku Stick Upgrade (Stage)" }, + { 0x1F, "Obtained Deku Nut Upgrade (Stage)" }, + { 0x23, "Obtained Keaton Mask" }, + { 0x24, "Obtained Skull Mask" }, + { 0x25, "Obtained Spooky Mask" }, + { 0x26, "Obtained Bunny Hood" }, + { 0x2A, "Obtained Mask of Truth" }, + { 0x2C, "Obtained Pocket Egg" }, + { 0x2E, "Obtained Cojiro" }, + { 0x30, "Obtained Odd Potion" }, + { 0x31, "Obtained Poacher's Saw" }, + { 0x38, "Sold Keaton Mask" }, + { 0x39, "Sold Skull Mask" }, + { 0x3A, "Sold Spooky Mask" }, + { 0x3B, "Sold Bunny Hood" }, + { 0x3F, "Obtained Mask of Truth" }, + } }, + { "Inf Flags", + INF_TABLE, + 0x1D, + { + { 0x00, "Greeted by Saria" }, + { 0x01, "Spoke to Saria About Obtaining Fairy" }, + { 0x03, "Complained About Mido to Saria" }, + { 0x05, "Spoke to Saria in Saria's House" }, + { 0x0C, "Mido Asked to See Sword & Shield" }, + { 0x15, "Spoke to Mido in Lost Woods as Adult" }, + { 0x19, "Told Mido Saria Won't Return" }, + { 0x1E, "Spoke to Kokiri Girl by Jumping Stones" }, + { 0x22, "Spoke to Kokiri Boy Guarding Forest Exit" }, + { 0x24, "Spoke to Kokiri Boy Cutting Grass" }, + { 0x26, "Spoke to Kokiri Girl on Shop Awning" }, + { 0x28, "Spoke to Kokiri Girl About Training Center" }, + { 0x41, "Spoke to Kokiri Boy on Bed in Mido's House" }, + { 0x51, "Spoke to Kokiri Girl in Saria's House" }, + { 0x59, "Spoke to Know-It-All Bro. About Temple" }, + { 0x61, "Spoke to Know-It-All Bro. About Saria" }, + { 0x66, "Spoke to Deku Tree Sprout After Cutscene" }, + { 0x6C, "Spoke to Dying Knight" }, + { 0x76, "Showed Zelda's Letter to Gate Guard" }, + { 0x77, "Gate Guard Put On Keaton Mask" }, + { 0x7E, "Spoke to Talon in Lon Lon Ranch House" }, + { 0x84, "Spoke to Child Malon at Castle or Market" }, + { 0x85, "Child Malon Said Epona Was Afraid of You" }, + { 0x8B, "Entered Hyrule Castle" }, + { 0x94, "Spoke to Ingo at Ranch Before Talon's Return" }, + { 0x97, "Spoke to Ingo at Ranch" }, + { 0x9A, "Spoke to Ingo as Adult" }, + { 0xA2, "Refused Ingo's 50 Rupee Rental Request" }, + { 0xAB, "Rode a Horse at Ingo's Ranch" }, + { 0xB0, "Spoke to Medigoron as Child" }, + { 0xB1, "Spoke to Medigoron as Adult" }, + { 0xB6, "Spoke to Poe Collector in Ruined Market" }, + { 0xB7, "Spoke to Fado in Kokiri Forest as Child" }, + { 0xB8, "Spoke to Malon After Saving Ranch" }, + { 0xB9, "Spoke to Malon on Horseback" }, + { 0xBC, "Fado requested Odd Potion" }, + { 0xC0, "Spoke to Fat Woman by Market Potion Shop" }, + { 0xC1, "Spoke to Fat Woman After Zelda's Escape" }, + { 0xC2, "Spoke to Burly Man About Talon Search" }, + { 0xC3, "Spoke to Burly Man After Zelda's Escape" }, + { 0xC4, "Spoke to Thief After Zelda's Escape" }, + { 0xC5, "Spoke to Thin Man by Market Target Shop" }, + { 0xC6, "Spoke to Old Woman by Market Fountain" }, + { 0xC7, "Spoke to Old Man by Bombchu Bowling" }, + { 0xC8, "Spoke to Thin Lady by Bombchu Bowling" }, + { 0xC9, "Spoke to Thin Lady After Zelda's Escape (1.0)" }, + { 0xCA, "Spoke to Red Joker in Market" }, + { 0xCB, "Spoke to Blue Joker in Market (1.0) / Dog Lady as Adult (DBG)" }, + { 0xCC, "Spoke to Itchy Lady After Malon Left Town" }, + { 0xCD, "Spoke to Blue Jokester in Market (DBG)" }, + { 0xCE, "Spoke to Thin Lady After Zelda's Escape (DBG)" }, + { 0xD9, "Spoke to Dampé as Child" }, + { 0xE0, "Spoke to Goron by Cavern" }, + { 0xE3, "Spoke to Goron Hiding Stick" }, + { 0xE6, "Spoke to Goron by Woods Exit" }, + { 0xEB, "Spoke to Goron by Bomb Flowers" }, + { 0xF0, "Spoke to Goron at City? Entrance" }, + { 0xF4, "Spoke to Ruby-Crazed Goron" }, + { 0xFC, "Spoke to Goron Shop Owner" }, + { 0x109, "Goron City Doors Unlocked" }, + { 0x10B, "Spoke to Goron Link About Volvagia" }, + { 0x10C, "Stopped Goron Link's Rolling" }, + { 0x10E, "Spoke to Goron Link" }, + { 0x113, "Spoke to Darunia in Goron City" }, + { 0x11A, "Spoke to Darunia in Fire Temple" }, + { 0x11E, "Obtained Bomb Bag Upgrade (Goron City)" }, + { 0x124, "Spoke to Zora Near Zora Shop?" }, + { 0x128, "Spoke to Zora Beside Zora Shop?" }, + { 0x129, "Spoke to Zora Swimming Behind Zora Shop" }, + { 0x138, "Thawed King Zora" }, + { 0x139, "Obtained Zora Tunic" }, + { 0x140, "Ruto in JJ (M7) on Blue Switch" }, + { 0x141, "Ruto in JJ (M2) Meet Ruto" }, + { 0x142, "Ruto in JJ (M3) Talk First Time" }, + { 0x143, "Ruto in JJ (M10) Can Be Escorted" }, + { 0x144, "Ruto in JJ (?) Wants to be Tossed to Sapphire" }, + { 0x145, "Ruto in JJ (M6) on Sapphire platform" }, + { 0x146, "Ruto in JJ (M6) Kidnapped" }, + { 0x147, "Ruto in JJ, Spawns on F1 Instead of B1" }, + { 0x160, "Spoke to Man in Impa's House During Day" }, + { 0x161, "Spoke to Man in Impa's House at Night" }, + { 0x162, "Spoke to Man in Impa's House as Adult" }, + { 0x163, "Spoke to Carpenter Boss's Wife as Child" }, + { 0x164, "Spoke to Carpenter Boss's Wife as Adult" }, + { 0x16C, "Refused Nabooru's Request" }, + { 0x170, "Spoke to Carpenter Boss in Valley" }, + { 0x172, "Spoke to Carpenter Boss in Kakariko" }, + { 0x176, "Spoke to Blue Carpenter in Tent" }, + { 0x178, "Spoke to Green Carpenter in Tent" }, + { 0x17F, "Running Man Suggested a Race" }, + { 0x190, "Obtained Gerudo Archery Piece of Heart" }, + { 0x191, "Obtained Dog Lady's Piece of Heart" }, + { 0x192, "Obtained Deku Stick Upgrade (Lost Woods)" }, + { 0x193, "Obtained Deku Nut Upgrade (Grotto)" }, + { 0x195, "Spoke to Kaepora in Lake Hylia" }, + { 0x196, "Spoke to Cursed Man With <10 Tokens" }, + { 0x197, "Spoke to Cursed Man With 10 Tokens" }, + { 0x198, "Obtained Small Magic Jar" }, + { 0x199, "Caught Cucco by Field Entrance" }, + { 0x19A, "Caught Cucco by Bazaar" }, + { 0x19B, "Caught Cucco by Cucco Pen" }, + { 0x19C, "Caught Cucco Behind Windmill" }, + { 0x19D, "Caught Cucco in Crate" }, + { 0x19E, "Caught Cucco by Skulltula House" }, + { 0x19F, "Caught Cucco Behind Potion Shop" }, + { 0x1A0, "Entered Deku Tree" }, + { 0x1A1, "Entered Dodongo's Cavern" }, + { 0x1A2, "Entered Jabu-Jabu's Belly" }, + { 0x1A3, "Entered Forest Temple" }, + { 0x1A4, "Entered Fire Temple" }, + { 0x1A5, "Entered Water Temple" }, + { 0x1A6, "Entered Spirit Temple" }, + { 0x1A7, "Entered Shadow Temple" }, + { 0x1A8, "Entered Bottom of the Well" }, + { 0x1A9, "Entered Ice Cavern" }, + { 0x1AA, "Entered Ganon's Tower" }, + { 0x1AB, "Entered Gerudo Training Ground" }, + { 0x1AC, "Entered Thieves' Hideout" }, + { 0x1AD, "Entered Ganon's Castle" }, + { 0x1AE, "Entered Ganon's Tower (Collapsing)" }, + { 0x1AF, "Entered Ganon's Castle (Collapsing)" }, + { 0x1D0, "No Sword on B" }, + } }, + { "Event Inf Flags", + EVENT_INF, + 0x03, + { + { 0x00, "Rented Horse From Ingo" }, + { 0x01, "Racing Ingo" }, + { 0x02, "Won First Race With Ingo?" }, + { 0x05, "Lost Race With Ingo?" }, + { 0x06, "Racing Ingo For the Second Time" }, + { 0x08, "Finished Special Cucco Minigame / Began Gerudo Archery" }, + { 0x0A, "Won Special Cucco Minigame?" }, + { 0x0F, "Rented Horse From Ingo" }, + { 0x10, "Racing Running Man" }, + { 0x20, "Market Crowd Text Randomizer" }, + { 0x21, "Market Crowd Text Randomizer" }, + { 0x22, "Market Crowd Text Randomizer" }, + { 0x23, "Market Crowd Text Randomizer" }, + { 0x24, "Market Crowd Text Randomizer" }, + { 0x30, "Entered the Market" }, + } }, + { "Randomizer Inf Flags", + RANDOMIZER_INF, + (RAND_INF_MAX + 15) / 16, + { +#include "soh/Enhancements/randomizer/randomizer_inf.h" + } }, }; +#undef DEFINE_RAND_INF + const std::vector state1 = { "Loading", "Swinging Bottle", @@ -1658,8 +403,8 @@ const std::vector state1 = { "In Water", "In Item Cutscene", "In Cutscene", - "30", //Unknown - "Floor collision disabled" + "30", // Unknown + "Floor collision disabled", }; const std::vector state2 = { @@ -1694,7 +439,7 @@ const std::vector state2 = { "Idling", "Disabled draw func", "Sword Lunge", - "Void out" + "Void out", }; const std::vector state3 = { @@ -1705,14 +450,14 @@ const std::vector state3 = { "Check Floor Water Collision", "Force Pull Ocarina", "Restore Nayru's Love", - "Travelling to Hook Target" + "Travelling to Hook Target", }; -class SaveEditorWindow : public Ship::GuiWindow { +class SaveEditorWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; diff --git a/soh/soh/Enhancements/debugger/dlViewer.cpp b/soh/soh/Enhancements/debugger/dlViewer.cpp index 4f4d13bfff..a02aa7d95d 100644 --- a/soh/soh/Enhancements/debugger/dlViewer.cpp +++ b/soh/soh/Enhancements/debugger/dlViewer.cpp @@ -1,6 +1,7 @@ #include "actorViewer.h" #include "soh/util.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "ResourceManager.h" #include "DisplayList.h" #include "soh/OTRGlobals.h" @@ -65,7 +66,8 @@ std::map cmdMap = { }; void PerformDisplayListSearch() { - auto result = Ship::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->ListFiles("*" + std::string(searchString) + "*DL*"); + auto result = Ship::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->ListFiles( + "*" + std::string(searchString) + "*DL*"); displayListSearchResults.clear(); @@ -78,23 +80,25 @@ void PerformDisplayListSearch() { } // Sort the final list - std::sort(displayListSearchResults.begin(), displayListSearchResults.end(), [](const std::string& a, const std::string& b) { - return std::lexicographical_compare( - a.begin(), a.end(), - b.begin(), b.end(), - [](char c1, char c2) { - return std::tolower(c1) < std::tolower(c2); - } - ); - }); + std::sort(displayListSearchResults.begin(), displayListSearchResults.end(), + [](const std::string& a, const std::string& b) { + return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), [](char c1, char c2) { + return std::tolower(c1) < std::tolower(c2); + }); + }); } void DLViewerWindow::DrawElement() { + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); // Debounce the search field as listing otr files is expensive + UIWidgets::PushStyleInput(THEME_COLOR); + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + if (ImGui::InputText("Search Display Lists", searchString, ARRAY_COUNT(searchString))) { doSearch = true; searchDebounceFrames = 30; } + UIWidgets::PopStyleInput(); if (doSearch) { if (searchDebounceFrames == 0) { @@ -105,6 +109,7 @@ void DLViewerWindow::DrawElement() { searchDebounceFrames--; } + UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("Active Display List", activeDisplayList.c_str())) { for (size_t i = 0; i < displayListSearchResults.size(); i++) { if (ImGui::Selectable(displayListSearchResults[i].c_str())) { @@ -114,16 +119,22 @@ void DLViewerWindow::DrawElement() { } ImGui::EndCombo(); } + UIWidgets::PopStyleCombobox(); if (activeDisplayList == "") { + ImGui::PopFont(); + ImGui::EndDisabled(); return; } try { - auto res = std::static_pointer_cast(Ship::Context::GetInstance()->GetResourceManager()->LoadResource(activeDisplayList)); + auto res = std::static_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResource(activeDisplayList)); if (res->GetInitData()->Type != static_cast(Fast::ResourceType::DisplayList)) { ImGui::Text("Resource type is not a Display List. Please choose another."); + ImGui::PopFont(); + ImGui::EndDisabled(); return; } @@ -133,7 +144,8 @@ void DLViewerWindow::DrawElement() { std::string id = "##CMD" + std::to_string(i); Gfx* gfx = (Gfx*)&res->Instructions[i]; int cmd = gfx->words.w0 >> 24; - if (cmdMap.find(cmd) == cmdMap.end()) continue; + if (cmdMap.find(cmd) == cmdMap.end()) + continue; std::string cmdLabel = cmdMap.at(cmd); @@ -144,6 +156,7 @@ void DLViewerWindow::DrawElement() { ImGui::SameLine(); ImGui::PushItemWidth(175.0f); + UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo(("CMD" + id).c_str(), cmdLabel.c_str())) { if (ImGui::Selectable("gsDPSetPrimColor") && cmd != G_SETPRIMCOLOR) { *gfx = gsDPSetPrimColor(0, 0, 0, 0, 0, 255); @@ -162,6 +175,7 @@ void DLViewerWindow::DrawElement() { } ImGui::EndCombo(); } + UIWidgets::PopStyleCombobox(); ImGui::PopItemWidth(); @@ -189,14 +203,15 @@ void DLViewerWindow::DrawElement() { } ImGui::PopItemWidth(); } - if (cmd == G_RDPPIPESYNC) { - } + if (cmd == G_RDPPIPESYNC) {} if (cmd == G_SETGRAYSCALE) { bool* state = (bool*)&gfx->words.w1; ImGui::SameLine(); + UIWidgets::PushStyleCheckbox(THEME_COLOR); if (ImGui::Checkbox(("state" + id).c_str(), state)) { - // + // } + UIWidgets::PopStyleCheckbox(); } if (cmd == G_SETTILE) { ImGui::SameLine(); @@ -292,8 +307,7 @@ void DLViewerWindow::DrawElement() { ImGui::SameLine(); ImGui::Text("Vertex Name: %s", fileName); } - if (cmd == G_DL) { - } + if (cmd == G_DL) {} if (cmd == G_DL_OTR_HASH) { gfx++; uint64_t hash = ((uint64_t)gfx->words.w0 << 32) + (uint64_t)gfx->words.w1; @@ -308,17 +322,17 @@ void DLViewerWindow::DrawElement() { } // Skip second half of instructions that are over 128-bit wide - if (cmd == G_SETTIMG_OTR_HASH || cmd == G_DL_OTR_HASH || cmd == G_VTX_OTR_HASH || - cmd == G_BRANCH_Z_OTR || cmd == G_MARKER || cmd == G_MTX_OTR) { + if (cmd == G_SETTIMG_OTR_HASH || cmd == G_DL_OTR_HASH || cmd == G_VTX_OTR_HASH || cmd == G_BRANCH_Z_OTR || + cmd == G_MARKER || cmd == G_MTX_OTR) { i++; ImGui::Text("%lu - Reserved - Second half of %s", i, cmdLabel.c_str()); } ImGui::EndGroup(); } - } catch (const std::exception& e) { - ImGui::Text("Error displaying DL instructions."); - return; - } + } catch (const std::exception& e) { ImGui::Text("Error displaying DL instructions."); } + + ImGui::PopFont(); + ImGui::EndDisabled(); } void DLViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/dlViewer.h b/soh/soh/Enhancements/debugger/dlViewer.h index 9d27854566..a75fead971 100644 --- a/soh/soh/Enhancements/debugger/dlViewer.h +++ b/soh/soh/Enhancements/debugger/dlViewer.h @@ -2,11 +2,11 @@ #include -class DLViewerWindow : public Ship::GuiWindow { +class DLViewerWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; diff --git a/soh/soh/Enhancements/debugger/hookDebugger.cpp b/soh/soh/Enhancements/debugger/hookDebugger.cpp index 782cf4f7aa..146db2ddc9 100644 --- a/soh/soh/Enhancements/debugger/hookDebugger.cpp +++ b/soh/soh/Enhancements/debugger/hookDebugger.cpp @@ -1,31 +1,33 @@ #include "hookDebugger.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/OTRGlobals.h" #include #include -static std::unordered_map*> hookData; +static std::map*> hookData; const ImVec4 grey = ImVec4(0.75, 0.75, 0.75, 1); const ImVec4 yellow = ImVec4(1, 1, 0, 1); const ImVec4 red = ImVec4(1, 0, 0, 1); void DrawHookRegisteringInfos(const char* hookName) { - if ((*hookData[hookName]).size() == 0) { + size_t numHooks = (*hookData[hookName]).size(); + + if (numHooks == 0) { ImGui::TextColored(grey, "No hooks found"); return; } - if (ImGui::BeginTable( - ("Table##" + std::string(hookName)).c_str(), - 4, - ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit - )) { - ImGui::TableSetupColumn("Id"); - ImGui::TableSetupColumn("Type"); - ImGui::TableSetupColumn("Registration Info"); - //ImGui::TableSetupColumn("Stub"); - ImGui::TableSetupColumn("Number of Calls"); + ImGui::Text("Total Registered: %d", numHooks); + + if (ImGui::BeginTable(("Table##" + std::string(hookName)).c_str(), 4, + ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | + ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit)) { + ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("Registration Info", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("# Calls", ImGuiTableColumnFlags_WidthFixed); ImGui::TableHeadersRow(); for (auto& [id, hookInfo] : (*hookData[hookName])) { ImGui::TableNextRow(); @@ -39,7 +41,7 @@ void DrawHookRegisteringInfos(const char* hookName) { ImGui::Text("Normal"); break; case HOOK_TYPE_ID: - ImGui::Text("Id"); + ImGui::Text("ID"); break; case HOOK_TYPE_PTR: ImGui::Text("Ptr"); @@ -54,27 +56,19 @@ void DrawHookRegisteringInfos(const char* hookName) { ImGui::TableNextColumn(); if (hookInfo.registering.valid) { - ImGui::Text("%s(%d:%d) %s", hookInfo.registering.file, hookInfo.registering.line, hookInfo.registering.column, hookInfo.registering.function); + // Replace the space after the return type of the parent function with a non-breaking space + std::string parentFunction = std::string(hookInfo.registering.function); + size_t pos = parentFunction.find_first_of(" "); + if (pos != std::string::npos) { + parentFunction.replace(pos, 1, "\u00A0"); + } + // Non breaking space to keep the arrow with the parent function + ImGui::TextWrapped("%s(%d:%d) <-\u00A0%s", hookInfo.registering.file, hookInfo.registering.line, + hookInfo.registering.column, parentFunction.c_str()); } else { - ImGui::TextColored(yellow, "[Unavaliable]"); + ImGui::TextColored(yellow, "[Unavailable]"); } - //TODO: not currently possible - /* - ImGui::TableNextColumn(); - - ImGui::BeginDisabled(); - - bool stubButtonPressed = ImGui::Button(("Stub##" + std::to_string(id)).c_str()); - UIWidgets::SetLastItemHoverText("Stub this hook.\nThis is not possible to automatically undo."); - - if (stubButtonPressed) { - //stub - } - - ImGui::EndDisabled(); - */ - ImGui::TableNextColumn(); ImGui::Text("%d", hookInfo.calls); } @@ -83,27 +77,30 @@ void DrawHookRegisteringInfos(const char* hookName) { } void HookDebuggerWindow::DrawElement() { + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); #ifndef __cpp_lib_source_location - ImGui::TextColored( - yellow, - "Some features of the Hook Debugger are unavaliable because SoH was compiled " - "without \"\" support " - "(\"__cpp_lib_source_location\" not defined in \"\")." - ); + ImGui::TextColored(yellow, "Some features of the Hook Debugger are unavailable because SoH was compiled " + "without \"\" support " + "(\"__cpp_lib_source_location\" not defined in \"\")."); #endif + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + for (auto& [hookName, _] : hookData) { if (ImGui::TreeNode(hookName)) { DrawHookRegisteringInfos(hookName); ImGui::TreePop(); } } + + ImGui::PopFont(); + ImGui::EndDisabled(); } void HookDebuggerWindow::InitElement() { - #define DEFINE_HOOK(name, _) hookData.insert({#name, GameInteractor::Instance->GetHookData()}); +#define DEFINE_HOOK(name, _) hookData.insert({ #name, GameInteractor::Instance->GetHookData() }); - #include "../game-interactor/GameInteractor_HookTable.h" +#include "../game-interactor/GameInteractor_HookTable.h" - #undef DEFINE_HOOK +#undef DEFINE_HOOK } diff --git a/soh/soh/Enhancements/debugger/hookDebugger.h b/soh/soh/Enhancements/debugger/hookDebugger.h index ae6f5113f2..1a586a09cf 100644 --- a/soh/soh/Enhancements/debugger/hookDebugger.h +++ b/soh/soh/Enhancements/debugger/hookDebugger.h @@ -1,10 +1,10 @@ #include -class HookDebuggerWindow : public Ship::GuiWindow { +class HookDebuggerWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; diff --git a/soh/soh/Enhancements/debugger/performanceTimer.cpp b/soh/soh/Enhancements/debugger/performanceTimer.cpp index 69ffc69257..43999e7bc4 100644 --- a/soh/soh/Enhancements/debugger/performanceTimer.cpp +++ b/soh/soh/Enhancements/debugger/performanceTimer.cpp @@ -1,17 +1,21 @@ #include "performanceTimer.h" -void StartPerformanceTimer(TimerID timer){ +void StartPerformanceTimer(TimerID timer) { timeStarted[timer] = std::chrono::high_resolution_clock::now(); } -void StopPerformanceTimer(TimerID timer){ +void StopPerformanceTimer(TimerID timer) { totalTimes[timer] += (std::chrono::high_resolution_clock::now() - timeStarted[timer]); } -std::chrono::duration GetPerformanceTimer(TimerID timer){ +std::chrono::duration GetPerformanceTimer(TimerID timer) { return totalTimes[timer]; } -void ResetPerformanceTimers(){ +void ResetPerformanceTimer(TimerID timer) { + totalTimes[timer] = {}; +} + +void ResetPerformanceTimers() { totalTimes = {}; } \ No newline at end of file diff --git a/soh/soh/Enhancements/debugger/performanceTimer.h b/soh/soh/Enhancements/debugger/performanceTimer.h index f4bc8f017c..6bff229a39 100644 --- a/soh/soh/Enhancements/debugger/performanceTimer.h +++ b/soh/soh/Enhancements/debugger/performanceTimer.h @@ -5,33 +5,34 @@ #include typedef enum { - PT_WHOLE_SEED, - PT_LOGIC_RESET, - PT_REGION_RESET, - PT_SPOILER_LOG, - PT_ENTRANCE_SHUFFLE, - PT_SHOPSANITY, - PT_OWN_DUNGEON, - PT_LIMITED_CHECKS, - PT_ADVANCEMENT_ITEMS, - PT_REMAINING_ITEMS, - PT_PLAYTHROUGH_GENERATION, - PT_PARE_DOWN_PLAYTHROUGH, - PT_WOTH, - PT_FOOLISH, - PT_OVERRIDES, - PT_HINTS, - PT_EVENT_ACCESS, - PT_TOD_ACCESS, - PT_ENTRANCE_LOGIC, - PT_LOCATION_LOGIC, - PT_MAX + PT_WHOLE_SEED, + PT_LOGIC_RESET, + PT_REGION_RESET, + PT_SPOILER_LOG, + PT_ENTRANCE_SHUFFLE, + PT_SHOPSANITY, + PT_OWN_DUNGEON, + PT_LIMITED_CHECKS, + PT_ADVANCEMENT_ITEMS, + PT_REMAINING_ITEMS, + PT_PLAYTHROUGH_GENERATION, + PT_PARE_DOWN_PLAYTHROUGH, + PT_WOTH, + PT_FOOLISH, + PT_OVERRIDES, + PT_HINTS, + PT_EVENT_ACCESS, + PT_TOD_ACCESS, + PT_ENTRANCE_LOGIC, + PT_LOCATION_LOGIC, + PT_RECALCULATE_AVAILABLE_CHECKS, + PT_MAX } TimerID; void StartPerformanceTimer(TimerID timer); void StopPerformanceTimer(TimerID timer); std::chrono::duration GetPerformanceTimer(TimerID timer); +void ResetPerformanceTimer(TimerID timer); void ResetPerformanceTimers(); static std::array, PT_MAX> totalTimes = {}; static std::array timeStarted = {}; - diff --git a/soh/soh/Enhancements/debugger/valueViewer.cpp b/soh/soh/Enhancements/debugger/valueViewer.cpp index 7d09dfb632..4544979cb5 100644 --- a/soh/soh/Enhancements/debugger/valueViewer.cpp +++ b/soh/soh/Enhancements/debugger/valueViewer.cpp @@ -1,5 +1,6 @@ #include "valueViewer.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "soh/OTRGlobals.h" #include "soh/ShipInit.hpp" @@ -21,6 +22,7 @@ s32 GfxPrint_Printf(GfxPrint* printer, const char* fmt, ...); ImVec4 WHITE = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); +// clang-format off std::vector valueTable = { { "Time", "gSaveContext.dayTime", "TIME:", TYPE_U16, false, []() -> void* { return &gSaveContext.dayTime; }, WHITE }, { "Age", "gSaveContext.linkAge", "AGE:", TYPE_S32, false, []() -> void* { return &gSaveContext.linkAge; }, WHITE }, @@ -70,31 +72,40 @@ std::vector valueTable = { "Deku Tree Warp Timer" u16 0x801F83A2 */ }; +// clang-format on extern "C" void ValueViewer_Draw(GfxPrint* printer) { for (int i = 0; i < valueTable.size(); i++) { ValueTableElement& element = valueTable[i]; - if (!element.isActive || !element.isPrinted || (gPlayState == NULL && element.requiresPlayState)) continue; - GfxPrint_SetColor(printer, element.color.x * 255, element.color.y * 255, element.color.z * 255, element.color.w * 255); + if (!element.isActive || !element.isPrinted || (gPlayState == NULL && element.requiresPlayState)) + continue; + GfxPrint_SetColor(printer, element.color.x * 255, element.color.y * 255, element.color.z * 255, + element.color.w * 255); GfxPrint_SetPos(printer, element.x, element.y); switch (element.type) { case TYPE_S8: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), *(s8*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), + *(s8*)element.valueFn()); break; case TYPE_U8: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), *(u8*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), + *(u8*)element.valueFn()); break; case TYPE_S16: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), *(s16*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), + *(s16*)element.valueFn()); break; case TYPE_U16: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), *(u16*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), + *(u16*)element.valueFn()); break; case TYPE_S32: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), *(s32*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), + *(s32*)element.valueFn()); break; case TYPE_U32: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), *(u32*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), + *(u32*)element.valueFn()); break; case TYPE_CHAR: GfxPrint_Printf(printer, "%s%c", element.prefix.c_str(), *(char*)element.valueFn()); @@ -103,7 +114,8 @@ extern "C" void ValueViewer_Draw(GfxPrint* printer) { GfxPrint_Printf(printer, "%s%s", element.prefix.c_str(), (char*)element.valueFn()); break; case TYPE_FLOAT: - GfxPrint_Printf(printer, (element.typeFormat ? "%s%4.1f" : "%s%f"), element.prefix.c_str(), *(float*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s%4.1f" : "%s%f"), element.prefix.c_str(), + *(float*)element.valueFn()); break; } } @@ -142,20 +154,21 @@ void RegisterValueViewerHooks() { RegisterShipInitFunc initFunc(RegisterValueViewerHooks, { CVAR_NAME }); void ValueViewerWindow::DrawElement() { - UIWidgets::PaddedEnhancementCheckbox("Enable Printing", CVAR_NAME); + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + UIWidgets::CVarCheckbox("Enable Printing", CVAR_NAME, UIWidgets::CheckboxOptions().Color(THEME_COLOR)); ImGui::BeginGroup(); static int selectedElement = -1; - std::string selectedElementText = (selectedElement == -1) ? "Select a value" : ( - std::string(valueTable[selectedElement].name) + " (" + std::string(valueTable[selectedElement].path) + ")" - ); + std::string selectedElementText = (selectedElement == -1) ? "Select a value" + : (std::string(valueTable[selectedElement].name) + " (" + + std::string(valueTable[selectedElement].path) + ")"); + UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("##valueViewerElement", selectedElementText.c_str())) { for (int i = 0; i < valueTable.size(); i++) { - if (valueTable[i].isActive) continue; + if (valueTable[i].isActive) + continue; bool isSelected = (selectedElement == i); - std::string elementText = ( - std::string(valueTable[i].name) + " (" + std::string(valueTable[i].path) + ")" - ); + std::string elementText = (std::string(valueTable[i].name) + " (" + std::string(valueTable[i].path) + ")"); if (ImGui::Selectable(elementText.c_str(), isSelected)) { selectedElement = i; } @@ -165,20 +178,29 @@ void ValueViewerWindow::DrawElement() { } ImGui::EndCombo(); } + UIWidgets::PopStyleCombobox(); ImGui::SameLine(); + UIWidgets::PushStyleButton(THEME_COLOR); if (selectedElement != -1 && ImGui::Button("+")) { valueTable[selectedElement].isActive = true; selectedElement = -1; } + UIWidgets::PopStyleButton(); ImGui::EndGroup(); for (int i = 0; i < valueTable.size(); i++) { ValueTableElement& element = valueTable[i]; - if (!element.isActive || (gPlayState == NULL && element.requiresPlayState)) continue; - if (ImGui::Button(("x##" + std::string(element.name)).c_str())) { + if (!element.isActive || (gPlayState == NULL && element.requiresPlayState)) + continue; + UIWidgets::PushStyleButton(THEME_COLOR); + UIWidgets::PushStyleCheckbox(THEME_COLOR); + ImGui::AlignTextToFramePadding(); + if (ImGui::Button((ICON_FA_TIMES + std::string("##") + std::string(element.name)).c_str())) { element.isActive = false; element.isPrinted = false; } + UIWidgets::PopStyleCheckbox(); + UIWidgets::PopStyleButton(); ImGui::SameLine(); ImGui::Text("%s:", element.name); ImGui::SameLine(); @@ -212,7 +234,7 @@ void ValueViewerWindow::DrawElement() { break; } ImGui::SameLine(); - + UIWidgets::PushStyleCheckbox(THEME_COLOR); if (element.type <= TYPE_U32) { ImGui::Checkbox(("Hex##" + std::string(element.name)).c_str(), &element.typeFormat); ImGui::SameLine(); @@ -220,23 +242,31 @@ void ValueViewerWindow::DrawElement() { ImGui::Checkbox(("Trim##" + std::string(element.name)).c_str(), &element.typeFormat); ImGui::SameLine(); } + UIWidgets::PopStyleCheckbox(); ImGui::BeginGroup(); if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("ValueViewerEnablePrinting"), 0)) { + UIWidgets::PushStyleCheckbox(THEME_COLOR); ImGui::Checkbox(("Print##" + std::string(element.name)).c_str(), &element.isPrinted); + UIWidgets::PopStyleCheckbox(); if (element.isPrinted) { char* prefix = (char*)element.prefix.c_str(); ImGui::SameLine(); ImGui::SetNextItemWidth(80.0f); + UIWidgets::PushStyleInput(THEME_COLOR); if (ImGui::InputText(("Prefix##" + std::string(element.name)).c_str(), prefix, 10)) { element.prefix = prefix; } + UIWidgets::PopStyleInput(); ImGui::SameLine(); - ImGui::ColorEdit3(("##color" + std::string(element.name)).c_str(), (float*)&element.color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel); + ImGui::ColorEdit3(("##color" + std::string(element.name)).c_str(), (float*)&element.color, + ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel); ImGui::SameLine(); + UIWidgets::PushStyleCheckbox(THEME_COLOR); if (ImGui::Button(("Position##" + std::string(element.name)).c_str())) { ImGui::OpenPopup(("Position Picker##" + std::string(element.name)).c_str()); } + UIWidgets::PopStyleCheckbox(); if (ImGui::BeginPopup(("Position Picker##" + std::string(element.name)).c_str())) { ImGui::DragInt("X", (int*)&element.x, 1.0f, 0, 44); ImGui::DragInt("Y", (int*)&element.y, 1.0f, 0, 29); @@ -246,6 +276,7 @@ void ValueViewerWindow::DrawElement() { } ImGui::EndGroup(); } + ImGui::EndDisabled(); } void ValueViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/valueViewer.h b/soh/soh/Enhancements/debugger/valueViewer.h index e93491fa56..04d698d2c8 100644 --- a/soh/soh/Enhancements/debugger/valueViewer.h +++ b/soh/soh/Enhancements/debugger/valueViewer.h @@ -33,13 +33,13 @@ typedef struct { uint32_t y; } ValueTableElement; -class ValueViewerWindow : public Ship::GuiWindow { +class ValueViewerWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; #endif diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index a2b72ca071..2e15a9ed9c 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -11,17 +11,32 @@ extern "C" { #include +#include "src/overlays/actors/ovl_En_Rr/z_en_rr.h" } -const char* enemyCVarList[] = { - CVAR_ENHANCEMENT("RandomizedEnemyList.Armos"), CVAR_ENHANCEMENT("RandomizedEnemyList.Arwing"), - CVAR_ENHANCEMENT("RandomizedEnemyList.BabyDodongo"), CVAR_ENHANCEMENT("RandomizedEnemyList.Bari"), - CVAR_ENHANCEMENT("RandomizedEnemyList.Beamos"), CVAR_ENHANCEMENT("RandomizedEnemyList.BigSkulltula"), - CVAR_ENHANCEMENT("RandomizedEnemyList.BigStalchild"), CVAR_ENHANCEMENT("RandomizedEnemyList.Biri"), - CVAR_ENHANCEMENT("RandomizedEnemyList.BlackKnuckle"), CVAR_ENHANCEMENT("RandomizedEnemyList.BlueTektite"), - CVAR_ENHANCEMENT("RandomizedEnemyList.Bubble"), CVAR_ENHANCEMENT("RandomizedEnemyList.ClubMoblin"), - CVAR_ENHANCEMENT("RandomizedEnemyList.DarkLink"), CVAR_ENHANCEMENT("RandomizedEnemyList.Dinolfos"), - CVAR_ENHANCEMENT("RandomizedEnemyList.Dodongo"), CVAR_ENHANCEMENT("RandomizedEnemyList.FireKeese"), +#define CVAR_ENEMY_RANDOMIZER_NAME CVAR_ENHANCEMENT("RandomizedEnemies") +#define CVAR_ENEMY_RANDOMIZER_DEFAULT ENEMY_RANDOMIZER_OFF +#define CVAR_ENEMY_RANDOMIZER_VALUE CVarGetInteger(CVAR_ENEMY_RANDOMIZER_NAME, CVAR_ENEMY_RANDOMIZER_DEFAULT) + +typedef struct EnemyEntry { + int16_t id; + int16_t params; +} EnemyEntry; + +bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, int16_t params, float posX); +bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy); +EnemyEntry GetRandomizedEnemyEntry(uint32_t seed, PlayState* play); + +const char* enemyCVarList[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { + CVAR_ENHANCEMENT("RandomizedEnemyList.Anubis"), CVAR_ENHANCEMENT("RandomizedEnemyList.Armos"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Arwing"), CVAR_ENHANCEMENT("RandomizedEnemyList.BabyDodongo"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Bari"), CVAR_ENHANCEMENT("RandomizedEnemyList.Beamos"), + CVAR_ENHANCEMENT("RandomizedEnemyList.BigSkulltula"), CVAR_ENHANCEMENT("RandomizedEnemyList.BigStalchild"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Biri"), CVAR_ENHANCEMENT("RandomizedEnemyList.BlackKnuckle"), + CVAR_ENHANCEMENT("RandomizedEnemyList.BlueTektite"), CVAR_ENHANCEMENT("RandomizedEnemyList.Bubble"), + CVAR_ENHANCEMENT("RandomizedEnemyList.ClubMoblin"), CVAR_ENHANCEMENT("RandomizedEnemyList.DarkLink"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Dinolfos"), CVAR_ENHANCEMENT("RandomizedEnemyList.Dodongo"), + CVAR_ENHANCEMENT("RandomizedEnemyList.FireKeese"), /*CVAR_ENHANCEMENT("RandomizedEnemyList.FlareDancer"),*/ CVAR_ENHANCEMENT("RandomizedEnemyList.FloorTile"), CVAR_ENHANCEMENT("RandomizedEnemyList.Floormaster"), CVAR_ENHANCEMENT("RandomizedEnemyList.FlyingPeahat"), CVAR_ENHANCEMENT("RandomizedEnemyList.FlyingPot"), CVAR_ENHANCEMENT("RandomizedEnemyList.Freezard"), CVAR_ENHANCEMENT("RandomizedEnemyList.Gibdo"), @@ -30,109 +45,160 @@ const char* enemyCVarList[] = { CVAR_ENHANCEMENT("RandomizedEnemyList.Keese"), CVAR_ENHANCEMENT("RandomizedEnemyList.LargeBaba"), CVAR_ENHANCEMENT("RandomizedEnemyList.LikeLike"), CVAR_ENHANCEMENT("RandomizedEnemyList.Lizalfos"), CVAR_ENHANCEMENT("RandomizedEnemyList.MadScrub"), CVAR_ENHANCEMENT("RandomizedEnemyList.NormalWolfos"), - CVAR_ENHANCEMENT("RandomizedEnemyList.PeahatLarva"), CVAR_ENHANCEMENT("RandomizedEnemyList.Redead"), - CVAR_ENHANCEMENT("RandomizedEnemyList.RedTektite"), CVAR_ENHANCEMENT("RandomizedEnemyList.Shabom"), - CVAR_ENHANCEMENT("RandomizedEnemyList.ShellBlade"), CVAR_ENHANCEMENT("RandomizedEnemyList.Skulltula"), + CVAR_ENHANCEMENT("RandomizedEnemyList.PeahatLarva"), /*CVAR_ENHANCEMENT("RandomizedEnemyList.Poe"),*/ + CVAR_ENHANCEMENT("RandomizedEnemyList.Redead"), CVAR_ENHANCEMENT("RandomizedEnemyList.RedTektite"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Shabom"), CVAR_ENHANCEMENT("RandomizedEnemyList.ShellBlade"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Skulltula"), CVAR_ENHANCEMENT("RandomizedEnemyList.SkullKid"), CVAR_ENHANCEMENT("RandomizedEnemyList.SmallBaba"), CVAR_ENHANCEMENT("RandomizedEnemyList.SmallStalchild"), - CVAR_ENHANCEMENT("RandomizedEnemyList.Spike"), CVAR_ENHANCEMENT("RandomizedEnemyList.Stalfos"), - CVAR_ENHANCEMENT("RandomizedEnemyList.Stinger"), CVAR_ENHANCEMENT("RandomizedEnemyList.Tailparasan"), - CVAR_ENHANCEMENT("RandomizedEnemyList.TorchSlug"), CVAR_ENHANCEMENT("RandomizedEnemyList.Wallmaster"), - CVAR_ENHANCEMENT("RandomizedEnemyList.WhiteKnuckle"), CVAR_ENHANCEMENT("RandomizedEnemyList.WhiteWolfos"), - CVAR_ENHANCEMENT("RandomizedEnemyList.WitheredBaba"), + CVAR_ENHANCEMENT("RandomizedEnemyList.SpearMoblin"), CVAR_ENHANCEMENT("RandomizedEnemyList.Spike"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Stalfos"), CVAR_ENHANCEMENT("RandomizedEnemyList.Stinger"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Tailparasan"), CVAR_ENHANCEMENT("RandomizedEnemyList.TorchSlug"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Wallmaster"), CVAR_ENHANCEMENT("RandomizedEnemyList.WhiteKnuckle"), + CVAR_ENHANCEMENT("RandomizedEnemyList.WhiteWolfos"), CVAR_ENHANCEMENT("RandomizedEnemyList.WitheredBaba"), }; -const char* enemyNameList[] = { - "Armos", "Arwing", "Baby Dodongo", "Bari", - "Beamos", "Big Skulltula", "Stalchild (Big)", "Biri", - "Iron Knuckle (Black)", "Blue Tektite", "Bubble", "Club Moblin", - "Dark Link", "Dinolfos", "Dodongo", "Fire Keese", - "Floor Tile", "Floormaster", "Flying Peahat", "Flying Pot", - "Freezard", "Gibdo", "Gohma Larva", "Guay", - "Ice Keese", "Invisible Skulltula", "Keese", "Large Deku Baba", - "Like-Like", "Lizalfos", "Mad Scrub", "Wolfos (Normal)", - "Peahat Larva", "Redead", "Red Tektite", "Shabom", - "ShellBlade", "Skulltula", "Small Deku Baba", "Stalchild (Small)", - "Spike", "Stalfos", "Stinger", "Tailparasan", - "Torch Slug", "Wallmaster", "Iron Knuckle (White)", "Wolfos (White)", +const char* enemyNameList[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { + "Anubis", + "Armos", + "Arwing", + "Baby Dodongo", + "Bari", + "Beamos", + "Big Skulltula", + "Stalchild (Big)", + "Biri", + "Iron Knuckle (Black)", + "Blue Tektite", + "Bubble", + "Club Moblin", + "Dark Link", + "Dinolfos", + "Dodongo", + "Fire Keese", + //"Flare Dancer", + "Floor Tile", + "Floormaster", + "Flying Peahat", + "Flying Pot", + "Freezard", + "Gibdo", + "Gohma Larva", + "Guay", + "Ice Keese", + "Invisible Skulltula", + "Keese", + "Large Deku Baba", + "Like-Like", + "Lizalfos", + "Mad Scrub", + "Wolfos (Normal)", + "Peahat Larva", + //"Poe", + "Redead", + "Red Tektite", + "Shabom", + "Shell Blade", + "Skulltula", + "Skull Kid", + "Small Deku Baba", + "Stalchild (Small)", + "Spear Moblin", + "Spike", + "Stalfos", + "Stinger", + "Tailpasaran", + "Torch Slug", + "Wallmaster", + "Iron Knuckle (White)", + "Wolfos (White)", "Withered Deku Baba", }; static EnemyEntry randomizedEnemySpawnTable[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { - { ACTOR_EN_AM, -1 }, // Armos - { ACTOR_EN_CLEAR_TAG, 1 }, // Arwing - { ACTOR_EN_DODOJR, 0 }, // Baby Dodongo - { ACTOR_EN_VALI, -1 }, // Bari (big jellyfish) - { ACTOR_EN_VM, 1280 }, // Beamos - { ACTOR_EN_ST, 1 }, // Skulltula (big) - { ACTOR_EN_SKB, 20 }, // Stalchild (big) - { ACTOR_EN_BILI, 0 }, // Biri (jellyfish) - { ACTOR_EN_IK, 2 }, // Iron Knuckle (black, standing) - { ACTOR_EN_TITE, -2 }, // Tektite (blue) - { ACTOR_EN_BB, -1 }, // Bubble (flying skull enemy) (blue) - { ACTOR_EN_MB, 0 }, // Moblins (Club) - { ACTOR_EN_TORCH2, 0 }, // Dark Link - { ACTOR_EN_ZF, -2 }, // Dinolfos - { ACTOR_EN_DODONGO, -1 }, // Dodongo - { ACTOR_EN_FIREFLY, 1 }, // Fire Keese - { ACTOR_EN_YUKABYUN, 0 }, // Flying Floor Tile - { ACTOR_EN_FLOORMAS, 0 }, // Floormaster - { ACTOR_EN_PEEHAT, -1 }, // Flying Peahat (big grounded, doesn't spawn larva) - { ACTOR_EN_TUBO_TRAP, 0 }, // Flying pot - { ACTOR_EN_FZ, 0 }, // Freezard - { ACTOR_EN_RD, 32766 }, // Gibdo (standing) - { ACTOR_EN_GOMA, 7 }, // Gohma larva (non-gohma rooms) - { ACTOR_EN_CROW, 0 }, // Guay - { ACTOR_EN_FIREFLY, 4 }, // Ice Keese - { ACTOR_EN_ST, 2 }, // Skulltula (invisible) - { ACTOR_EN_IK, 3 }, // Iron Knuckle (white, standing) - { ACTOR_EN_FIREFLY, 2 }, // Regular Keese - { ACTOR_EN_DEKUBABA, 1 }, // Deku Baba (large) + { ACTOR_EN_ANUBICE_TAG, 1 }, // Anubis + { ACTOR_EN_AM, -1 }, // Armos + { ACTOR_EN_CLEAR_TAG, 1 }, // Arwing + { ACTOR_EN_DODOJR, 0 }, // Baby Dodongo + { ACTOR_EN_VALI, -1 }, // Bari (big jellyfish) + { ACTOR_EN_VM, 1280 }, // Beamos + { ACTOR_EN_ST, 1 }, // Skulltula (big) + { ACTOR_EN_SKB, 20 }, // Stalchild (big) + { ACTOR_EN_BILI, 0 }, // Biri (jellyfish) + { ACTOR_EN_IK, 2 }, // Iron Knuckle (black, standing) + { ACTOR_EN_TITE, -2 }, // Tektite (blue) + { ACTOR_EN_BB, -1 }, // Bubble (flying skull enemy) (blue) + { ACTOR_EN_MB, 0 }, // Club Moblin + { ACTOR_EN_TORCH2, 0 }, // Dark Link + { ACTOR_EN_ZF, -2 }, // Dinolfos + { ACTOR_EN_DODONGO, -1 }, // Dodongo + { ACTOR_EN_FIREFLY, 1 }, // Fire Keese + // { ACTOR_EN_FD, 0 }, // Flare Dancer (possible cause of crashes because of spawning flame actors on + // sloped ground) + { ACTOR_EN_YUKABYUN, 0 }, // Flying Floor Tile + { ACTOR_EN_FLOORMAS, 0 }, // Floormaster + { ACTOR_EN_PEEHAT, -1 }, // Flying Peahat (big grounded, doesn't spawn larva) + { ACTOR_EN_TUBO_TRAP, 0 }, // Flying pot + { ACTOR_EN_FZ, 0 }, // Freezard + { ACTOR_EN_RD, 32766 }, // Gibdo (standing) + { ACTOR_EN_GOMA, 7 }, // Gohma Larva (Non-Gohma rooms) + { ACTOR_EN_CROW, 0 }, // Guay + { ACTOR_EN_FIREFLY, 4 }, // Ice Keese + { ACTOR_EN_ST, 2 }, // Skulltula (invisible) + { ACTOR_EN_FIREFLY, 2 }, // Regular Keese + { ACTOR_EN_DEKUBABA, 1 }, // Deku Baba (large) + // Doesn't work (reliant on surface and also normally used in tandem with a leever spawner, kills itself too quickly + // otherwise) { ACTOR_EN_REEBA, 0 }, // Leever { ACTOR_EN_RR, 0 }, // Like-Like { ACTOR_EN_ZF, -1 }, // Lizalfos { ACTOR_EN_DEKUNUTS, 768 }, // Mad Scrub (triple attack) (projectiles don't work) { ACTOR_EN_WF, 0 }, // Wolfos (normal) - { ACTOR_EN_PEEHAT, 1 }, // Flying Peahat Larva - { ACTOR_EN_RD, 1 }, // Redead (standing) - { ACTOR_EN_TITE, -1 }, // Tektite (red) - { ACTOR_EN_BUBBLE, 0 }, // Shabom (bubble) - { ACTOR_EN_SB, 0 }, // Shell Blade - { ACTOR_EN_ST, 0 }, // Skulltula (normal) - { ACTOR_EN_DEKUBABA, 0 }, // Deku Baba (small) - { ACTOR_EN_SKB, 1 }, // Stalchild (small) - { ACTOR_EN_NY, 0 }, // Spike (rolling enemy) - { ACTOR_EN_TEST, 2 }, // Stalfos - { ACTOR_EN_EIYER, 10 }, // Stinger (land) (One in formation, sink under floor and do not activate) - { ACTOR_EN_TP, -1 }, // Electric Tailparasan - { ACTOR_EN_BW, 0 }, // Torch Slug - { ACTOR_EN_WALLMAS, 1 }, // Wallmaster - { ACTOR_EN_WF, 1 }, // Wolfos (white) - { ACTOR_EN_KAREBABA, 0 }, // Withered Deku Baba - - // Doesn't work {ACTOR_EN_POH, 0}, // Poe (Seems to rely on other objects?) - // Doesn't work {ACTOR_EN_POH, 2}, // Poe (composer Sharp) (Seems to rely on other objects?) - // Doesn't work {ACTOR_EN_POH, 3}, // Poe (composer Flat) (Seems to rely on other objects?) - // Doesn't work {ACTOR_EN_OKUTA, 0}, // Octorok (actor directly uses water box collision to handle hiding/popping up) - // Doesn't work {ACTOR_EN_REEBA, 0}, // Leever (reliant on surface and also normally used in tandem with a leever spawner, kills itself too quickly otherwise) - // Kinda doesn't work { ACTOR_EN_FD, 0 }, // Flare Dancer (jumps out of bounds a lot, and possible cause of crashes because of spawning a ton of flame actors) + // Doesn't work (actor directly uses water box collision to handle hiding/popping up) + // { ACTOR_EN_OKUTA, 0 }, // Octorok + { ACTOR_EN_PEEHAT, 1 }, // Flying Peahat Larva + // Doesn't work (Seems to rely on other objects?) + // { ACTOR_EN_POH, 0 }, // Poe + // Doesn't work (Seems to rely on other objects?) + // { ACTOR_EN_POH, 2 }, // Poe (composer Sharp) + // Doesn't work (Seems to rely on other objects?) + // { ACTOR_EN_POH, 3 }, // Poe (composer Flat) + { ACTOR_EN_RD, 1 }, // Redead (standing) + { ACTOR_EN_TITE, -1 }, // Tektite (red) + { ACTOR_EN_BUBBLE, 0 }, // Shabom (bubble) + { ACTOR_EN_SB, 0 }, // Shell Blade + { ACTOR_EN_ST, 0 }, // Skulltula (normal) + { ACTOR_EN_SKJ, 4159 }, // Skull Kid + { ACTOR_EN_DEKUBABA, 0 }, // Deku Baba (small) + { ACTOR_EN_SKB, 1 }, // Stalchild (small) + { ACTOR_EN_MB, -1 }, // Spear Moblin + { ACTOR_EN_NY, 0 }, // Spike (rolling enemy) + { ACTOR_EN_TEST, 2 }, // Stalfos + { ACTOR_EN_EIYER, 10 }, // Stinger (land) (One in formation, sink under floor and do not activate) + { ACTOR_EN_TP, -1 }, // Electric Tailpasaran + { ACTOR_EN_BW, 0 }, // Torch Slug + { ACTOR_EN_WALLMAS, 1 }, // Wallmaster + { ACTOR_EN_IK, 3 }, // Iron Knuckle (white, standing) + { ACTOR_EN_WF, 1 }, // Wolfos (white) + { ACTOR_EN_KAREBABA, 0 }, // Withered Deku Baba }; static int enemiesToRandomize[] = { - ACTOR_EN_FIREFLY, // Keese (including fire/ice) - ACTOR_EN_TEST, // Stalfos - ACTOR_EN_TITE, // Tektite - ACTOR_EN_POH, // Poe (normal, blue rupee, composers - ACTOR_EN_OKUTA, // Octorok - ACTOR_EN_WALLMAS, // Wallmaster - ACTOR_EN_DODONGO, // Dodongo - // ACTOR_EN_REEBA, // Leever (reliant on spawner (z_e_encount1.c) + ACTOR_EN_ANUBICE_TAG, // Anubis + ACTOR_EN_FIREFLY, // Keese (including fire/ice) + ACTOR_EN_TEST, // Stalfos + ACTOR_EN_TITE, // Tektite + ACTOR_EN_POH, // Poe (normal, blue rupee, composers) + ACTOR_EN_OKUTA, // Octorok + ACTOR_EN_WALLMAS, // Wallmaster + ACTOR_EN_DODONGO, // Dodongo + // ACTOR_EN_REEBA, // Leever (reliant on spawner (z_en_encount1.c)) ACTOR_EN_PEEHAT, // Flying Peahat, big one spawning larva, larva - ACTOR_EN_ZF, // Lizalfos, dinolfos - ACTOR_EN_GOMA, // Gohma larva (normal, eggs, gohma eggs) + ACTOR_EN_ZF, // Lizalfos, Dinolfos + ACTOR_EN_GOMA, // Gohma Larva (normal, eggs, gohma eggs) ACTOR_EN_BUBBLE, // Shabom (bubble) ACTOR_EN_DODOJR, // Baby Dodongo ACTOR_EN_TORCH2, // Dark Link ACTOR_EN_BILI, // Biri (small jellyfish) - ACTOR_EN_TP, // Electric Tailparasan + ACTOR_EN_TP, // Electric Tailpasaran ACTOR_EN_ST, // Skulltula (normal, big, invisible) ACTOR_EN_BW, // Torch Slug ACTOR_EN_EIYER, // Stinger (land) @@ -147,7 +213,7 @@ static int enemiesToRandomize[] = { ACTOR_EN_FLOORMAS, // Floormaster ACTOR_EN_RD, // Redead, Gibdo ACTOR_EN_SW, // Skullwalltula - // ACTOR_EN_FD, // Flare Dancer (can be randomized, but not randomized to, so keeping it in vanilla locations means it atleast shows up in the game + ACTOR_EN_FD, // Flare Dancer ACTOR_EN_SB, // Shell Blade ACTOR_EN_KAREBABA, // Withered Deku Baba ACTOR_EN_RR, // Like-Like @@ -156,22 +222,24 @@ static int enemiesToRandomize[] = { ACTOR_EN_TUBO_TRAP, // Flying pot ACTOR_EN_FZ, // Freezard ACTOR_EN_WEIYER, // Stinger (Water) - ACTOR_EN_HINTNUTS, // Hint deku scrubs + ACTOR_EN_HINTNUTS, // Hint Deku Scrubs ACTOR_EN_WF, // Wolfos ACTOR_EN_SKB, // Stalchild - ACTOR_EN_CROW // Guay + ACTOR_EN_CROW, // Guay + ACTOR_EN_SKJ, // Skull Kid }; -extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *posX, f32 *posY, f32 *posZ, int16_t *rotX, - int16_t *rotY, int16_t *rotZ, int16_t *params) { +extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t* actorId, f32* posX, f32* posY, f32* posZ, int16_t* rotX, + int16_t* rotY, int16_t* rotZ, int16_t* params) { uint32_t isMQ = ResourceMgr_IsSceneMasterQuest(play->sceneNum); // Hack to remove enemies that wrongfully spawn because of bypassing object dependency with enemy randomizer on. // This should probably be handled on OTR generation in the future when object dependency is fully removed. - // Remove bats and skulltulas from graveyard. - // Remove octorok in lost woods. - if (((*actorId == ACTOR_EN_FIREFLY || (*actorId == ACTOR_EN_SW && *params == 0)) && play->sceneNum == SCENE_GRAVEYARD) || + // Remove bats and Skulltulas from graveyard. + // Remove Octorok in Lost Woods. + if (((*actorId == ACTOR_EN_FIREFLY || (*actorId == ACTOR_EN_SW && *params == 0)) && + play->sceneNum == SCENE_GRAVEYARD) || (*actorId == ACTOR_EN_OKUTA && play->sceneNum == SCENE_LOST_WOODS)) { return 0; } @@ -186,7 +254,7 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po // Lengthen timer in non-MQ Jabu Jabu bubble room. if (!isMQ && *actorId == ACTOR_OBJ_ROOMTIMER && *params == 30760 && play->sceneNum == SCENE_JABU_JABU && play->roomCtx.curRoom.num == 12) { - *params = 92280; + *params = (*params & ~0x3FF) | 120; } if (IsEnemyFoundToRandomize(play->sceneNum, play->roomCtx.curRoom.num, *actorId, *params, *posX)) { @@ -229,16 +297,9 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po } // Get randomized enemy ID and parameter. - uint32_t seed = play->sceneNum + *actorId + (int)*posX + (int)*posY + (int)*posZ + *rotX + *rotY + *rotZ + *params; - EnemyEntry randomEnemy = GetRandomizedEnemyEntry(seed); - - int8_t timesRandomized = 1; - - // While randomized enemy isn't allowed in certain situations, randomize again. - while (!IsEnemyAllowedToSpawn(play->sceneNum, play->roomCtx.curRoom.num, randomEnemy)) { - randomEnemy = GetRandomizedEnemyEntry(seed + timesRandomized); - timesRandomized++; - } + uint32_t seed = + play->sceneNum + *actorId + (int)*posX + (int)*posY + (int)*posZ + *rotX + *rotY + *rotZ + *params; + EnemyEntry randomEnemy = GetRandomizedEnemyEntry(seed, play); *actorId = randomEnemy.id; *params = randomEnemy.params; @@ -251,13 +312,13 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po case ACTOR_EN_VALI: *posY = *posY + 300; break; - // Spawn peahat off the ground, otherwise it kills itself by colliding with the ground. + // Spawn Peahat off the ground, otherwise it kills itself by colliding with the ground. case ACTOR_EN_PEEHAT: if (*params == 1) { *posY = *posY + 100; } break; - // Spawn skulltulas off the ground. + // Spawn Skulltulas off the ground. case ACTOR_EN_ST: *posY = *posY + 200; break; @@ -278,40 +339,44 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po return 1; } -std::vector selectedEnemyList; +static std::vector selectedEnemyList; void GetSelectedEnemies() { selectedEnemyList.clear(); - if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), ENEMY_RANDOMIZER_OFF) == ENEMY_RANDOMIZER_RANDOM) { - for (int i = 0; i < 49; i++) { - if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemyList.All"), 0)) { - selectedEnemyList.push_back(randomizedEnemySpawnTable[i]); - } else if (CVarGetInteger(enemyCVarList[i], 0)) { - selectedEnemyList.push_back(randomizedEnemySpawnTable[i]); - } - } - if (selectedEnemyList.size() == 0) { - selectedEnemyList.push_back(randomizedEnemySpawnTable[0]); - } - } else { - for (int i = 0; i < 49; i++) { + for (int i = 0; i < RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE; i++) { + if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemyList.All"), 0)) { + selectedEnemyList.push_back(randomizedEnemySpawnTable[i]); + } else if (CVarGetInteger(enemyCVarList[i], 1)) { selectedEnemyList.push_back(randomizedEnemySpawnTable[i]); } } + if (selectedEnemyList.size() == 0) { + selectedEnemyList.push_back(randomizedEnemySpawnTable[0]); + } } -EnemyEntry GetRandomizedEnemyEntry(uint32_t seed) { +EnemyEntry GetRandomizedEnemyEntry(uint32_t seed, PlayState* play) { + std::vector filteredEnemyList = {}; if (selectedEnemyList.size() == 0) { GetSelectedEnemies(); } - if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), ENEMY_RANDOMIZER_OFF) == ENEMY_RANDOMIZER_RANDOM_SEEDED) { - uint32_t finalSeed = seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); + for (EnemyEntry enemy : selectedEnemyList) { + if (IsEnemyAllowedToSpawn(play->sceneNum, play->roomCtx.curRoom.num, enemy)) { + filteredEnemyList.push_back(enemy); + } + } + if (filteredEnemyList.size() == 0) { + filteredEnemyList = selectedEnemyList; + } + if (CVAR_ENEMY_RANDOMIZER_VALUE == ENEMY_RANDOMIZER_RANDOM_SEEDED) { + uint32_t finalSeed = + seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); Random_Init(finalSeed); - uint32_t randomNumber = Random(0, RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE); - return selectedEnemyList[randomNumber]; + uint32_t randomNumber = Random(0, filteredEnemyList.size()); + return filteredEnemyList[randomNumber]; } else { - uint32_t randomSelectedEnemy = Random(0, selectedEnemyList.size()); - return selectedEnemyList[randomSelectedEnemy]; + uint32_t randomSelectedEnemy = Random(0, filteredEnemyList.size()); + return filteredEnemyList[randomSelectedEnemy]; } } @@ -327,14 +392,14 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, // Only randomize the main component of Electric Tailparasans, not the tail segments they spawn. case ACTOR_EN_TP: return (params == -1); - // Only randomize the initial deku scrub actor (single and triple attack), not the flower they spawn. + // Only randomize the initial Deku Scrub actor (single and triple attack), not the flower they spawn. case ACTOR_EN_DEKUNUTS: return (params == -256 || params == 768); - // Don't randomize the OoB wallmaster in the silver rupee room because it's only there to + // Don't randomize the OoB wallmaster in the Silver Rupee room because it's only there to // not trigger unlocking the door after killing the other wallmaster in authentic gameplay. case ACTOR_EN_WALLMAS: return (!(!isMQ && sceneNum == SCENE_GERUDO_TRAINING_GROUND && roomNum == 2 && posX == -2345)); - // Only randomize initial floormaster actor (it can split and does some spawning on init). + // Only randomize initial Floormaster actor (it can split and does some spawning on init). case ACTOR_EN_FLOORMAS: return (params == 0 || params == -32768); // Only randomize the initial eggs, not the enemies that spawn from them. @@ -348,29 +413,33 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, // break the thrones in the room to access a button. case ACTOR_EN_IK: return (params != 1280 && !(isMQ && sceneNum == SCENE_INSIDE_GANONS_CASTLE && roomNum == 17)); - // Only randomize the intitial spawn of the huge jellyfish. It spawns another copy when hit with a sword. + // Only randomize the initial spawn of the huge jellyfish. It spawns another copy when hit with a sword. case ACTOR_EN_VALI: return (params == -1); - // Don't randomize lizalfos in Doodong's Cavern because the gates won't work correctly otherwise. + // Don't randomize Lizalfos in Dodongo's Cavern because the gates won't work correctly otherwise. case ACTOR_EN_ZF: return (params != 1280 && params != 1281 && params != 1536 && params != 1537); // Don't randomize the Wolfos in SFM because it's needed to open the gate. case ACTOR_EN_WF: return (params != 7936); - // Don't randomize the Stalfos in Forest Temple because other enemies fall through the hole and don't trigger the platform. - // Don't randomize the Stalfos spawning on the boat in Shadow Temple, as randomizing them places the new enemies - // down in the river. + // Don't randomize the Stalfos in Forest Temple because other enemies fall through the hole and don't + // trigger the platform. Don't randomize the Stalfos spawning on the boat in Shadow Temple, as + // randomizing them places the new enemies down in the river. case ACTOR_EN_TEST: return (params != 1 && !(sceneNum == SCENE_SHADOW_TEMPLE && roomNum == 21)); // Only randomize the enemy variant of Armos Statue. - // Leave one Armos unrandomized in the Spirit Temple room where an armos is needed to push down a button + // Leave one Armos unrandomized in the Spirit Temple room where an armos is needed to push down a + // button. case ACTOR_EN_AM: return ((params == -1 || params == 255) && !(sceneNum == SCENE_SPIRIT_TEMPLE && posX == 2141)); - // Don't randomize Shell Blades and Spikes in the underwater portion in Water Temple as it's impossible to kill - // most other enemies underwater with just hookshot and they're required to be killed for a grate to open. + // Don't randomize Shell Blades and Spikes in the underwater portion in Water Temple as it's impossible + // to kill most other enemies underwater with just hookshot and they're required to be killed for a + // grate to open. case ACTOR_EN_SB: case ACTOR_EN_NY: return (!(!isMQ && sceneNum == SCENE_WATER_TEMPLE && roomNum == 2)); + case ACTOR_EN_SKJ: + return !(sceneNum == SCENE_LOST_WOODS && LINK_IS_CHILD); default: return 1; } @@ -382,19 +451,19 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, } bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { - uint32_t isMQ = ResourceMgr_IsSceneMasterQuest(sceneNum); - // Freezard - Child Link can only kill this with jump slash deku sticks or other equipment like bombs. + // Freezard - Child Link can only kill this with jump slash Deku Sticks or other equipment like bombs. // Beamos - Needs bombs. - // Shell Blade & Spike - Child link can't kill these with sword or deku stick. - // Arwing & Dark Link - Both go out of bounds way too easily, softlocking the player. + // Anubis - Needs fire. + // Shell Blade & Spike - Child Link can't kill these with sword or Deku Stick. + // Flare dancer, Arwing & Dark Link - Both go out of bounds way too easily, softlocking the player. // Wallmaster - Not easily visible, often makes players think they're softlocked and that there's no enemies left. // Club Moblin - Many issues with them falling or placing out of bounds. Maybe fixable in the future? - bool enemiesToExcludeClearRooms = enemy.id == ACTOR_EN_FZ || enemy.id == ACTOR_EN_VM || enemy.id == ACTOR_EN_SB || - enemy.id == ACTOR_EN_NY || enemy.id == ACTOR_EN_CLEAR_TAG || - enemy.id == ACTOR_EN_WALLMAS || enemy.id == ACTOR_EN_TORCH2 || - enemy.id == ACTOR_EN_MB; + bool enemiesToExcludeClearRooms = + enemy.id == ACTOR_EN_FZ || enemy.id == ACTOR_EN_VM || enemy.id == ACTOR_EN_SB || enemy.id == ACTOR_EN_NY || + enemy.id == ACTOR_EN_CLEAR_TAG || enemy.id == ACTOR_EN_WALLMAS || enemy.id == ACTOR_EN_TORCH2 || + (enemy.id == ACTOR_EN_MB && enemy.params == 0) || enemy.id == ACTOR_EN_FD || enemy.id == ACTOR_EN_ANUBICE_TAG; // Bari - Spawns 3 more enemies, potentially extremely difficult in timed rooms. bool enemiesToExcludeTimedRooms = enemiesToExcludeClearRooms || enemy.id == ACTOR_EN_VALI; @@ -403,7 +472,8 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { // Deku Tree case SCENE_DEKU_TREE: return (!(!isMQ && enemiesToExcludeClearRooms && (roomNum == 1 || roomNum == 9)) && - !(isMQ && enemiesToExcludeClearRooms && (roomNum == 4 || roomNum == 6 || roomNum == 9 || roomNum == 10))); + !(isMQ && enemiesToExcludeClearRooms && + (roomNum == 4 || roomNum == 6 || roomNum == 9 || roomNum == 10))); // Dodongo's Cavern case SCENE_DODONGOS_CAVERN: return (!(!isMQ && enemiesToExcludeClearRooms && roomNum == 15) && @@ -415,8 +485,10 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { !(isMQ && enemiesToExcludeClearRooms && (roomNum == 11 || roomNum == 14))); // Forest Temple case SCENE_FOREST_TEMPLE: - return (!(!isMQ && enemiesToExcludeClearRooms && (roomNum == 6 || roomNum == 10 || roomNum == 18 || roomNum == 21)) && - !(isMQ && enemiesToExcludeClearRooms && (roomNum == 5 || roomNum == 6 || roomNum == 18 || roomNum == 21))); + return (!(!isMQ && enemiesToExcludeClearRooms && + (roomNum == 6 || roomNum == 10 || roomNum == 18 || roomNum == 21)) && + !(isMQ && enemiesToExcludeClearRooms && + (roomNum == 5 || roomNum == 6 || roomNum == 18 || roomNum == 21))); // Fire Temple case SCENE_FIRE_TEMPLE: return (!(!isMQ && enemiesToExcludeClearRooms && roomNum == 15) && @@ -427,23 +499,31 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { !(isMQ && enemiesToExcludeClearRooms && (roomNum == 13 || roomNum == 18))); // Spirit Temple case SCENE_SPIRIT_TEMPLE: - return (!(!isMQ && enemiesToExcludeClearRooms && (roomNum == 1 || roomNum == 10 || roomNum == 17 || roomNum == 20)) && - !(isMQ && enemiesToExcludeClearRooms && (roomNum == 1 || roomNum == 2 || roomNum == 4 || roomNum == 10 || roomNum == 15 || roomNum == 19 || roomNum == 20))); + return (!(!isMQ && enemiesToExcludeClearRooms && + (roomNum == 1 || roomNum == 10 || roomNum == 17 || roomNum == 20)) && + !(isMQ && enemiesToExcludeClearRooms && + (roomNum == 1 || roomNum == 2 || roomNum == 4 || roomNum == 10 || roomNum == 15 || + roomNum == 19 || roomNum == 20))); // Shadow Temple case SCENE_SHADOW_TEMPLE: - return (!(!isMQ && enemiesToExcludeClearRooms && - (roomNum == 1 || roomNum == 7 || roomNum == 11 || roomNum == 14 || roomNum == 16 || roomNum == 17 || roomNum == 19 || roomNum == 20)) && - !(isMQ && enemiesToExcludeClearRooms && (roomNum == 1 || roomNum == 6 || roomNum == 7 || roomNum == 11 || roomNum == 14 || roomNum == 20))); + return ( + !(!isMQ && enemiesToExcludeClearRooms && + (roomNum == 1 || roomNum == 7 || roomNum == 11 || roomNum == 14 || roomNum == 16 || roomNum == 17 || + roomNum == 19 || roomNum == 20)) && + !(isMQ && enemiesToExcludeClearRooms && + (roomNum == 1 || roomNum == 6 || roomNum == 7 || roomNum == 11 || roomNum == 14 || roomNum == 20))); // Ganon's Castle Trials case SCENE_INSIDE_GANONS_CASTLE: return (!(!isMQ && enemiesToExcludeClearRooms && (roomNum == 2 || roomNum == 5 || roomNum == 9)) && - !(isMQ && enemiesToExcludeClearRooms && (roomNum == 0 || roomNum == 2 || roomNum == 5 || roomNum == 9))); + !(isMQ && enemiesToExcludeClearRooms && + (roomNum == 0 || roomNum == 2 || roomNum == 5 || roomNum == 9))); // Ice Caverns case SCENE_ICE_CAVERN: return (!(!isMQ && enemiesToExcludeClearRooms && (roomNum == 1 || roomNum == 7)) && !(isMQ && enemiesToExcludeClearRooms && (roomNum == 3 || roomNum == 7))); // Bottom of the Well - // Exclude Dark Link from room with holes in the floor because it can pull you in a like-like making the player fall down. + // Exclude Dark Link from room with holes in the floor because it can pull you in a like-like making the player + // fall down. case SCENE_BOTTOM_OF_THE_WELL: return (!(!isMQ && enemy.id == ACTOR_EN_TORCH2 && roomNum == 3)); // Don't allow Dark Link in areas with lava void out zones as it voids out the player as well. @@ -452,18 +532,21 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { return (!(enemy.id == ACTOR_EN_TORCH2 && roomNum == 6) && !(!isMQ && enemiesToExcludeTimedRooms && (roomNum == 1 || roomNum == 7)) && !(!isMQ && enemiesToExcludeClearRooms && (roomNum == 3 || roomNum == 5 || roomNum == 10)) && - !(isMQ && enemiesToExcludeTimedRooms && (roomNum == 1 || roomNum == 3 || roomNum == 5 || roomNum == 7)) && + !(isMQ && enemiesToExcludeTimedRooms && + (roomNum == 1 || roomNum == 3 || roomNum == 5 || roomNum == 7)) && !(isMQ && enemiesToExcludeClearRooms && roomNum == 10)); - // Don't allow certain enemies in Ganon's Tower because they would spawn up on the ceilling, + // Don't allow certain enemies in Ganon's Tower because they would spawn up on the ceiling, // becoming impossible to kill. // Ganon's Tower. case SCENE_GANONS_TOWER: - return (!(enemiesToExcludeClearRooms || enemy.id == ACTOR_EN_VALI || (enemy.id == ACTOR_EN_ZF && enemy.params == -1))); + return (!(enemiesToExcludeClearRooms || enemy.id == ACTOR_EN_VALI || + (enemy.id == ACTOR_EN_ZF && enemy.params == -1))); // Ganon's Tower Escape. case SCENE_GANONS_TOWER_COLLAPSE_INTERIOR: return (!((enemiesToExcludeTimedRooms || (enemy.id == ACTOR_EN_ZF && enemy.params == -1)) && roomNum == 1)); - // Don't allow big stalchildren, big peahats and the large Bari (jellyfish) during the Gohma fight because they can clip into Gohma - // and it crashes the game. Likely because Gohma on the ceilling can't handle collision with other enemies. + // Don't allow big Stalchildren, big Peahats and the large Bari (jellyfish) during the Gohma fight because they + // can clip into Gohma and it crashes the game. Likely because Gohma on the ceiling can't handle collision with + // other enemies. case SCENE_DEKU_TREE_BOSS: return (!enemiesToExcludeTimedRooms && !(enemy.id == ACTOR_EN_SKB && enemy.params == 20) && !(enemy.id == ACTOR_EN_PEEHAT && enemy.params == -1)); @@ -481,3 +564,53 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { return 1; } } + +void FixClubMoblinScale(void* ptr) { + Actor* actor = (Actor*)ptr; + if (actor->params == -1) { + Actor_SetScale(actor, 0.014f); + } +} + +void RegisterEnemyRandomizer() { + COND_ID_HOOK(OnActorInit, ACTOR_EN_MB, CVAR_ENEMY_RANDOMIZER_VALUE, FixClubMoblinScale); + // prevent dark link from triggering a voidout + COND_VB_SHOULD(VB_TRIGGER_VOIDOUT, CVAR_ENEMY_RANDOMIZER_VALUE != CVAR_ENEMY_RANDOMIZER_DEFAULT, { + Actor* actor = va_arg(args, Actor*); + + if (actor->category != ACTORCAT_PLAYER) { + *should = false; + Actor_Kill(actor); + } + }); + + // prevent dark link dealing fall damage to the player + COND_VB_SHOULD(VB_RECIEVE_FALL_DAMAGE, CVAR_ENEMY_RANDOMIZER_VALUE != CVAR_ENEMY_RANDOMIZER_DEFAULT, { + Actor* actor = va_arg(args, Actor*); + + if (actor->category != ACTORCAT_PLAYER) { + *should = false; + } + }); + + // prevent dark link from interfering with HESS/recoil/etc when at more than 100 away from him + COND_VB_SHOULD(VB_TORCH2_HANDLE_CLANKING, CVAR_ENEMY_RANDOMIZER_VALUE != CVAR_ENEMY_RANDOMIZER_DEFAULT, { + Actor* darkLink = va_arg(args, Actor*); + + if (darkLink->xzDistToPlayer > 100.0f) { + *should = false; + } + }); + + // prevent dark link from being grabbed by like likes and therefore grabbing the player + COND_VB_SHOULD(VB_LIKE_LIKE_GRAB_PLAYER, CVAR_ENEMY_RANDOMIZER_VALUE != CVAR_ENEMY_RANDOMIZER_DEFAULT, { + EnRr* likeLike = va_arg(args, EnRr*); + + if (!(likeLike->collider1.base.oc != NULL && likeLike->collider1.base.oc->category == ACTORCAT_PLAYER) && + !(likeLike->collider2.base.oc != NULL && likeLike->collider2.base.oc->category == ACTORCAT_PLAYER)) { + *should = false; + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterEnemyRandomizer, { CVAR_ENEMY_RANDOMIZER_NAME }); \ No newline at end of file diff --git a/soh/soh/Enhancements/enemyrandomizer.h b/soh/soh/Enhancements/enemyrandomizer.h index f819de9bfa..9220f2db06 100644 --- a/soh/soh/Enhancements/enemyrandomizer.h +++ b/soh/soh/Enhancements/enemyrandomizer.h @@ -1,22 +1,17 @@ #pragma once -#include +#include +#include "item-tables/ItemTableTypes.h" -typedef struct EnemyEntry { - int16_t id; - int16_t params; -} EnemyEntry; - -#define RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE 49 - -bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, int16_t params, float posX); -bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy); -EnemyEntry GetRandomizedEnemyEntry(uint32_t seed); +#define RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE 52 extern const char* enemyCVarList[]; extern const char* enemyNameList[]; extern void GetSelectedEnemies(); #ifndef __cplusplus -uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *posX, f32 *posY, f32 *posZ, int16_t *rotX, int16_t *rotY, int16_t *rotZ, int16_t *params); +struct PlayState; + +uint8_t GetRandomizedEnemy(struct PlayState* play, int16_t* actorId, f32* posX, f32* posY, f32* posZ, int16_t* rotX, + int16_t* rotY, int16_t* rotZ, int16_t* params); #endif diff --git a/soh/soh/Enhancements/enhancementTypes.h b/soh/soh/Enhancements/enhancementTypes.h index db96a77000..c1b91cffad 100644 --- a/soh/soh/Enhancements/enhancementTypes.h +++ b/soh/soh/Enhancements/enhancementTypes.h @@ -11,14 +11,14 @@ typedef enum { CSMC_DISABLED, CSMC_BOTH, CSMC_TEXTURE, - CSMC_SIZE + CSMC_SIZE, } ChestStyleMatchesContentsType; typedef enum { SGIA_DISABLED, SGIA_JUNK, SGIA_ALL, - SGIA_SIZE + SGIA_SIZE, } SkipGetItemAnimationType; typedef enum { @@ -30,8 +30,8 @@ typedef enum { typedef enum { BUNNY_HOOD_VANILLA, + BUNNY_HOOD_FAST, BUNNY_HOOD_FAST_AND_JUMP, - BUNNY_HOOD_FAST } BunnyHoodMode; typedef enum { @@ -39,7 +39,7 @@ typedef enum { MIRRORED_WORLD_ALWAYS, MIRRORED_WORLD_RANDOM, MIRRORED_WORLD_RANDOM_SEEDED, - MIRRORED_WORLD_DUNGEONS_All, + MIRRORED_WORLD_DUNGEONS_ALL, MIRRORED_WORLD_DUNGEONS_VANILLA, MIRRORED_WORLD_DUNGEONS_MQ, MIRRORED_WORLD_DUNGEONS_RANDOM, @@ -55,7 +55,7 @@ typedef enum { typedef enum { BOOTSEQUENCE_DEFAULT, BOOTSEQUENCE_AUTHENTIC, - BOOTSEQUENCE_FILESELECT + BOOTSEQUENCE_FILESELECT, } BootSequenceType; typedef enum { @@ -75,6 +75,28 @@ typedef enum { BONK_DAMAGE_OHKO, } BonkDamage; +typedef enum { + DAMAGE_VANILLA, + DAMAGE_DOUBLE, + DAMAGE_QUADRUPLE, + DAMAGE_OCTUPLE, + DAMAGE_FOOLISH, + DAMAGE_RIDICULOUS, + DAMAGE_MERCILESS, + DAMAGE_TORTURE, + DAMAGE_OHKO +} DamageMultType; + +typedef enum { + DAMPE_NONE, + DAMPE_NORMAL, + DAMPE_JALAPENO, + DAMPE_CHIPOTLE, + DAMPE_SCOTCH_BONNET, + DAMPE_GHOST_PEPPER, + DAMPE_INFERNO, +} DampeDropRate; + typedef enum { DEKU_STICK_NORMAL, DEKU_STICK_UNBREAKABLE, @@ -87,4 +109,16 @@ typedef enum { SWORD_TOGGLE_BOTH_AGES, } SwordToggleMode; +typedef enum { + TIME_TRAVEL_DISABLED, + TIME_TRAVEL_OOT, + TIME_TRAVEL_ANY, +} TimeTravelType; + +typedef enum { + WATERFALL_ALWAYS, + WATERFALL_ONCE, + WATERFALL_NEVER, +} SleepingWaterfallType; + #endif diff --git a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp index 33ebb6cbbf..b3769836b9 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp @@ -48,613 +48,609 @@ GameInteractionEffectQueryResult RemovableGameInteractionEffect::Remove() { namespace GameInteractionEffect { - // MARK: - Flags - GameInteractionEffectQueryResult SetSceneFlag::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } +// MARK: - Flags +GameInteractionEffectQueryResult SetSceneFlag::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + return GameInteractionEffectQueryResult::Possible; +} + +void SetSceneFlag::_Apply() { + GameInteractor::RawAction::SetSceneFlag(parameters[0], parameters[1], parameters[2]); +} + +GameInteractionEffectQueryResult UnsetSceneFlag::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + + return GameInteractionEffectQueryResult::Possible; +} + +void UnsetSceneFlag::_Apply() { + GameInteractor::RawAction::UnsetSceneFlag(parameters[0], parameters[1], parameters[2]); +} + +GameInteractionEffectQueryResult SetFlag::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + + return GameInteractionEffectQueryResult::Possible; +} + +void SetFlag::_Apply() { + GameInteractor::RawAction::SetFlag(parameters[0], parameters[1]); +} + +GameInteractionEffectQueryResult UnsetFlag::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + + return GameInteractionEffectQueryResult::Possible; +} + +void UnsetFlag::_Apply() { + GameInteractor::RawAction::UnsetFlag(parameters[0], parameters[1]); +} + +// MARK: - ModifyHeartContainers +GameInteractionEffectQueryResult ModifyHeartContainers::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if ((parameters[0] > 0 && (gSaveContext.healthCapacity + (parameters[0] * 0x10) > 0x140)) || + (parameters[0] < 0 && (gSaveContext.healthCapacity + (parameters[0] * 0x10) < 0x10))) { + return GameInteractionEffectQueryResult::NotPossible; + } + + return GameInteractionEffectQueryResult::Possible; +} + +void ModifyHeartContainers::_Apply() { + GameInteractor::RawAction::AddOrRemoveHealthContainers(parameters[0]); +} + +// MARK: - FillMagic +GameInteractionEffectQueryResult FillMagic::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if (!gSaveContext.isMagicAcquired || gSaveContext.magic >= ((gSaveContext.isDoubleMagicAcquired + 1) * 48)) { + return GameInteractionEffectQueryResult::NotPossible; + } else { return GameInteractionEffectQueryResult::Possible; } +} +void FillMagic::_Apply() { + GameInteractor::RawAction::AddOrRemoveMagic(96); +} - void SetSceneFlag::_Apply() { - GameInteractor::RawAction::SetSceneFlag(parameters[0], parameters[1], parameters[2]); - } - - GameInteractionEffectQueryResult UnsetSceneFlag::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } - +// MARK: - EmptyMagic +GameInteractionEffectQueryResult EmptyMagic::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if (!gSaveContext.isMagicAcquired || gSaveContext.magic <= 0) { + return GameInteractionEffectQueryResult::NotPossible; + } else { return GameInteractionEffectQueryResult::Possible; } +} +void EmptyMagic::_Apply() { + GameInteractor::RawAction::AddOrRemoveMagic(-96); +} - void UnsetSceneFlag::_Apply() { - GameInteractor::RawAction::UnsetSceneFlag(parameters[0], parameters[1], parameters[2]); - } - - GameInteractionEffectQueryResult SetFlag::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } - +// MARK: - ModifyRupees +GameInteractionEffectQueryResult ModifyRupees::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if ((parameters[0] < 0 && gSaveContext.rupees <= 0) || + (parameters[0] > 0 && gSaveContext.rupees >= CUR_CAPACITY(UPG_WALLET))) { + return GameInteractionEffectQueryResult::NotPossible; + } else { return GameInteractionEffectQueryResult::Possible; } +} +void ModifyRupees::_Apply() { + Rupees_ChangeBy(parameters[0]); +} - void SetFlag::_Apply() { - GameInteractor::RawAction::SetFlag(parameters[0], parameters[1]); - } - - GameInteractionEffectQueryResult UnsetFlag::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } - +// MARK: - NoUI +GameInteractionEffectQueryResult NoUI::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { return GameInteractionEffectQueryResult::Possible; } +} +void NoUI::_Apply() { + GameInteractor::State::NoUIActive = 1; +} +void NoUI::_Remove() { + GameInteractor::State::NoUIActive = 0; +} - void UnsetFlag::_Apply() { - GameInteractor::RawAction::UnsetFlag(parameters[0], parameters[1]); - } - - // MARK: - ModifyHeartContainers - GameInteractionEffectQueryResult ModifyHeartContainers::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if ( - (parameters[0] > 0 && (gSaveContext.healthCapacity + (parameters[0] * 0x10) > 0x140)) || - (parameters[0] < 0 && (gSaveContext.healthCapacity + (parameters[0] * 0x10) < 0x10)) - ) { - return GameInteractionEffectQueryResult::NotPossible; - } - +// MARK: - ModifyGravity +GameInteractionEffectQueryResult ModifyGravity::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { return GameInteractionEffectQueryResult::Possible; } +} +void ModifyGravity::_Apply() { + GameInteractor::State::GravityLevel = (GIGravityLevel)parameters[0]; +} +void ModifyGravity::_Remove() { + GameInteractor::State::GravityLevel = GI_GRAVITY_LEVEL_NORMAL; +} - void ModifyHeartContainers::_Apply() { - GameInteractor::RawAction::AddOrRemoveHealthContainers(parameters[0]); +// MARK: - ModifyHealth +GameInteractionEffectQueryResult ModifyHealth::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if ((parameters[0] > 0 && gSaveContext.health == gSaveContext.healthCapacity) || + (parameters[0] < 0 && (gSaveContext.health + (16 * parameters[0]) <= 0))) { + return GameInteractionEffectQueryResult::NotPossible; } - // MARK: - FillMagic - GameInteractionEffectQueryResult FillMagic::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if (!gSaveContext.isMagicAcquired || gSaveContext.magic >= ((gSaveContext.isDoubleMagicAcquired + 1) * 48)) { - return GameInteractionEffectQueryResult::NotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void FillMagic::_Apply() { - GameInteractor::RawAction::AddOrRemoveMagic(96); - } - - // MARK: - EmptyMagic - GameInteractionEffectQueryResult EmptyMagic::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if (!gSaveContext.isMagicAcquired || gSaveContext.magic <= 0) { - return GameInteractionEffectQueryResult::NotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void EmptyMagic::_Apply() { - GameInteractor::RawAction::AddOrRemoveMagic(-96); - } - - // MARK: - ModifyRupees - GameInteractionEffectQueryResult ModifyRupees::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if ( - (parameters[0] < 0 && gSaveContext.rupees <= 0) || - (parameters[0] > 0 && gSaveContext.rupees >= CUR_CAPACITY(UPG_WALLET)) - ) { - return GameInteractionEffectQueryResult::NotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ModifyRupees::_Apply() { - Rupees_ChangeBy(parameters[0]); - } - - // MARK: - NoUI - GameInteractionEffectQueryResult NoUI::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void NoUI::_Apply() { - GameInteractor::State::NoUIActive = 1; - } - void NoUI::_Remove() { - GameInteractor::State::NoUIActive = 0; - } - - // MARK: - ModifyGravity - GameInteractionEffectQueryResult ModifyGravity::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ModifyGravity::_Apply() { - GameInteractor::State::GravityLevel = (GIGravityLevel)parameters[0]; - } - void ModifyGravity::_Remove() { - GameInteractor::State::GravityLevel = GI_GRAVITY_LEVEL_NORMAL; - } - - // MARK: - ModifyHealth - GameInteractionEffectQueryResult ModifyHealth::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if ( - (parameters[0] > 0 && gSaveContext.health == gSaveContext.healthCapacity) - || (parameters[0] < 0 && (gSaveContext.health + (16 * parameters[0]) <= 0)) - ) { - return GameInteractionEffectQueryResult::NotPossible; - } + return GameInteractionEffectQueryResult::Possible; +} +void ModifyHealth::_Apply() { + GameInteractor::RawAction::HealOrDamagePlayer(parameters[0]); +} +// MARK: - SetPlayerHealth +GameInteractionEffectQueryResult SetPlayerHealth::CanBeApplied() { + Player* player = GET_PLAYER(gPlayState); + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { return GameInteractionEffectQueryResult::Possible; } - void ModifyHealth::_Apply() { - GameInteractor::RawAction::HealOrDamagePlayer(parameters[0]); - } +} +void SetPlayerHealth::_Apply() { + GameInteractor::RawAction::SetPlayerHealth(parameters[0]); +} - // MARK: - SetPlayerHealth - GameInteractionEffectQueryResult SetPlayerHealth::CanBeApplied() { - Player* player = GET_PLAYER(gPlayState); - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void SetPlayerHealth::_Apply() { - GameInteractor::RawAction::SetPlayerHealth(parameters[0]); +// MARK: - FreezePlayer +GameInteractionEffectQueryResult FreezePlayer::CanBeApplied() { + Player* player = GET_PLAYER(gPlayState); + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } +} +void FreezePlayer::_Apply() { + GameInteractor::RawAction::FreezePlayer(); +} - // MARK: - FreezePlayer - GameInteractionEffectQueryResult FreezePlayer::CanBeApplied() { - Player* player = GET_PLAYER(gPlayState); - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void FreezePlayer::_Apply() { - GameInteractor::RawAction::FreezePlayer(); +// MARK: - BurnPlayer +GameInteractionEffectQueryResult BurnPlayer::CanBeApplied() { + Player* player = GET_PLAYER(gPlayState); + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } +} +void BurnPlayer::_Apply() { + GameInteractor::RawAction::BurnPlayer(); +} - // MARK: - BurnPlayer - GameInteractionEffectQueryResult BurnPlayer::CanBeApplied() { - Player* player = GET_PLAYER(gPlayState); - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void BurnPlayer::_Apply() { - GameInteractor::RawAction::BurnPlayer(); +// MARK: - ElectrocutePlayer +GameInteractionEffectQueryResult ElectrocutePlayer::CanBeApplied() { + Player* player = GET_PLAYER(gPlayState); + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } +} +void ElectrocutePlayer::_Apply() { + GameInteractor::RawAction::ElectrocutePlayer(); +} - // MARK: - ElectrocutePlayer - GameInteractionEffectQueryResult ElectrocutePlayer::CanBeApplied() { - Player* player = GET_PLAYER(gPlayState); - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ElectrocutePlayer::_Apply() { - GameInteractor::RawAction::ElectrocutePlayer(); +// MARK: - KnockbackPlayer +GameInteractionEffectQueryResult KnockbackPlayer::CanBeApplied() { + Player* player = GET_PLAYER(gPlayState); + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || + player->stateFlags2 & PLAYER_STATE2_CRAWLING) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } +} +void KnockbackPlayer::_Apply() { + GameInteractor::RawAction::KnockbackPlayer(parameters[0]); +} - // MARK: - KnockbackPlayer - GameInteractionEffectQueryResult KnockbackPlayer::CanBeApplied() { - Player* player = GET_PLAYER(gPlayState); - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || player->stateFlags2 & PLAYER_STATE2_CRAWLING) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void KnockbackPlayer::_Apply() { - GameInteractor::RawAction::KnockbackPlayer(parameters[0]); +// MARK: - ModifyLinkSize +GameInteractionEffectQueryResult ModifyLinkSize::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } +} +void ModifyLinkSize::_Apply() { + GameInteractor::State::LinkSize = (GILinkSize)parameters[0]; +} +void ModifyLinkSize::_Remove() { + GameInteractor::State::LinkSize = GI_LINK_SIZE_RESET; +} - // MARK: - ModifyLinkSize - GameInteractionEffectQueryResult ModifyLinkSize::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ModifyLinkSize::_Apply() { - GameInteractor::State::LinkSize = (GILinkSize)parameters[0]; - } - void ModifyLinkSize::_Remove() { - GameInteractor::State::LinkSize = GI_LINK_SIZE_RESET; +// MARK: - InvisibleLink +GameInteractionEffectQueryResult InvisibleLink::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } +} +void InvisibleLink::_Apply() { + GameInteractor::RawAction::SetLinkInvisibility(true); +} +void InvisibleLink::_Remove() { + GameInteractor::RawAction::SetLinkInvisibility(false); +} - // MARK: - InvisibleLink - GameInteractionEffectQueryResult InvisibleLink::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void InvisibleLink::_Apply() { - GameInteractor::RawAction::SetLinkInvisibility(true); - } - void InvisibleLink::_Remove() { - GameInteractor::RawAction::SetLinkInvisibility(false); +// MARK: - PacifistMode +GameInteractionEffectQueryResult PacifistMode::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } +} +void PacifistMode::_Apply() { + GameInteractor::State::SetPacifistMode(true); +} +void PacifistMode::_Remove() { + GameInteractor::State::SetPacifistMode(false); +} - // MARK: - PacifistMode - GameInteractionEffectQueryResult PacifistMode::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void PacifistMode::_Apply() { - GameInteractor::State::SetPacifistMode(true); - } - void PacifistMode::_Remove() { - GameInteractor::State::SetPacifistMode(false); +// MARK: - DisableZTargeting +GameInteractionEffectQueryResult DisableZTargeting::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } +} +void DisableZTargeting::_Apply() { + GameInteractor::State::DisableZTargetingActive = 1; +} +void DisableZTargeting::_Remove() { + GameInteractor::State::DisableZTargetingActive = 0; +} - // MARK: - DisableZTargeting - GameInteractionEffectQueryResult DisableZTargeting::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void DisableZTargeting::_Apply() { - GameInteractor::State::DisableZTargetingActive = 1; - } - void DisableZTargeting::_Remove() { - GameInteractor::State::DisableZTargetingActive = 0; +// MARK: - WeatherRainstorm +GameInteractionEffectQueryResult WeatherRainstorm::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } +} +void WeatherRainstorm::_Apply() { + GameInteractor::RawAction::SetWeatherStorm(true); +} +void WeatherRainstorm::_Remove() { + GameInteractor::RawAction::SetWeatherStorm(false); +} - // MARK: - WeatherRainstorm - GameInteractionEffectQueryResult WeatherRainstorm::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void WeatherRainstorm::_Apply() { - GameInteractor::RawAction::SetWeatherStorm(true); - } - void WeatherRainstorm::_Remove() { - GameInteractor::RawAction::SetWeatherStorm(false); +// MARK: - ReverseControls +GameInteractionEffectQueryResult ReverseControls::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } +} +void ReverseControls::_Apply() { + GameInteractor::State::ReverseControlsActive = 1; +} +void ReverseControls::_Remove() { + GameInteractor::State::ReverseControlsActive = 0; +} - // MARK: - ReverseControls - GameInteractionEffectQueryResult ReverseControls::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ReverseControls::_Apply() { - GameInteractor::State::ReverseControlsActive = 1; - } - void ReverseControls::_Remove() { - GameInteractor::State::ReverseControlsActive = 0; +// MARK: - ForceEquipBoots +GameInteractionEffectQueryResult ForceEquipBoots::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } +} +void ForceEquipBoots::_Apply() { + GameInteractor::RawAction::ForceEquipBoots(parameters[0]); +} +void ForceEquipBoots::_Remove() { + GameInteractor::RawAction::ForceEquipBoots(EQUIP_VALUE_BOOTS_KOKIRI); +} - // MARK: - ForceEquipBoots - GameInteractionEffectQueryResult ForceEquipBoots::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } +// MARK: - ModifyMovementSpeedMultiplier +GameInteractionEffectQueryResult ModifyMovementSpeedMultiplier::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } - void ForceEquipBoots::_Apply() { - GameInteractor::RawAction::ForceEquipBoots(parameters[0]); - } - void ForceEquipBoots::_Remove() { - GameInteractor::RawAction::ForceEquipBoots(EQUIP_VALUE_BOOTS_KOKIRI); - } - - // MARK: - ModifyMovementSpeedMultiplier - GameInteractionEffectQueryResult ModifyMovementSpeedMultiplier::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ModifyMovementSpeedMultiplier::_Apply() { - if (parameters[0] == -2) { +} +void ModifyMovementSpeedMultiplier::_Apply() { + if (parameters[0] == -2) { GameInteractor::State::MovementSpeedMultiplier = 0.5f; } else if (parameters[0] == 2) { GameInteractor::State::MovementSpeedMultiplier = 2.0f; } - } - void ModifyMovementSpeedMultiplier::_Remove() { - GameInteractor::State::MovementSpeedMultiplier = 1.0f; - } +} +void ModifyMovementSpeedMultiplier::_Remove() { + GameInteractor::State::MovementSpeedMultiplier = 1.0f; +} - // MARK: - OneHitKO - GameInteractionEffectQueryResult OneHitKO::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void OneHitKO::_Apply() { - GameInteractor::State::OneHitKOActive = 1; - } - void OneHitKO::_Remove() { - GameInteractor::State::OneHitKOActive = 0; - } - - // MARK: - ModifyDefenseModifier - GameInteractionEffectQueryResult ModifyDefenseModifier::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ModifyDefenseModifier::_Apply() { - GameInteractor::State::DefenseModifier = parameters[0]; - } - void ModifyDefenseModifier::_Remove() { - GameInteractor::State::DefenseModifier = 0; - } - - // MARK: - GiveOrTakeShield - GameInteractionEffectQueryResult GiveOrTakeShield::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if ((parameters[0] > 0 && ((gBitFlags[parameters[0] - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_TYPE_SHIELD]) & - gSaveContext.inventory.equipment)) || - (parameters[0] < 0 && !((gBitFlags[(parameters[0] * -1) - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_TYPE_SHIELD]) & - gSaveContext.inventory.equipment))) { - return GameInteractionEffectQueryResult::NotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void GiveOrTakeShield::_Apply() { - GameInteractor::RawAction::GiveOrTakeShield(parameters[0]); - } - - // MARK: - TeleportPlayer - GameInteractionEffectQueryResult TeleportPlayer::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void TeleportPlayer::_Apply() { - GameInteractor::RawAction::TeleportPlayer(parameters[0]); - } - - // MARK: - ClearAssignedButtons - GameInteractionEffectQueryResult ClearAssignedButtons::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ClearAssignedButtons::_Apply() { - GameInteractor::RawAction::ClearAssignedButtons(parameters[0]); - } - - // MARK: - SetTimeOfDay - GameInteractionEffectQueryResult SetTimeOfDay::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void SetTimeOfDay::_Apply() { - GameInteractor::RawAction::SetTimeOfDay(parameters[0]); - } - - // MARK: - SetCollisionViewer - GameInteractionEffectQueryResult SetCollisionViewer::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void SetCollisionViewer::_Apply() { - GameInteractor::RawAction::SetCollisionViewer(true); - } - void SetCollisionViewer::_Remove() { - GameInteractor::RawAction::SetCollisionViewer(false); - } - - // MARK: - RandomizeCosmetics - GameInteractionEffectQueryResult RandomizeCosmetics::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void RandomizeCosmetics::_Apply() { - CosmeticsEditor_RandomizeAll(); - } - - // MARK: - PressButton - GameInteractionEffectQueryResult PressButton::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void PressButton::_Apply() { - GameInteractor::RawAction::EmulateButtonPress(parameters[0]); - } - - // MARK: - PressRandomButton - GameInteractionEffectQueryResult PressRandomButton::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void PressRandomButton::_Apply() { - GameInteractor::RawAction::EmulateRandomButtonPress(parameters[0]); - } - - // MARK: - AddOrTakeAmmo - GameInteractionEffectQueryResult AddOrTakeAmmo::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if (!GameInteractor::CanAddOrTakeAmmo(parameters[0], parameters[1])) { - return GameInteractionEffectQueryResult::NotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void AddOrTakeAmmo::_Apply() { - GameInteractor::RawAction::AddOrTakeAmmo(parameters[0], parameters[1]); - } - - // MARK: - RandomBombFuseTimer - GameInteractionEffectQueryResult RandomBombFuseTimer::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void RandomBombFuseTimer::_Apply() { - GameInteractor::State::RandomBombFuseTimerActive = 1; - } - void RandomBombFuseTimer::_Remove() { - GameInteractor::State::RandomBombFuseTimerActive = 0; - } - - // MARK: - DisableLedgeGrabs - GameInteractionEffectQueryResult DisableLedgeGrabs::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void DisableLedgeGrabs::_Apply() { - GameInteractor::State::DisableLedgeGrabsActive = 1; - } - void DisableLedgeGrabs::_Remove() { - GameInteractor::State::DisableLedgeGrabsActive = 0; - } - - // MARK: - RandomWind - GameInteractionEffectQueryResult RandomWind::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void RandomWind::_Apply() { - GameInteractor::RawAction::SetRandomWind(true); - } - void RandomWind::_Remove() { - GameInteractor::RawAction::SetRandomWind(false); - } - - // MARK: - RandomBonks - GameInteractionEffectQueryResult RandomBonks::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void RandomBonks::_Apply() { - GameInteractor::State::RandomBonksActive = 1; - } - void RandomBonks::_Remove() { - GameInteractor::State::RandomBonksActive = 0; - } - - // MARK: - PlayerInvincibility - GameInteractionEffectQueryResult PlayerInvincibility::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void PlayerInvincibility::_Apply() { - GameInteractor::RawAction::SetPlayerInvincibility(true); - } - void PlayerInvincibility::_Remove() { - GameInteractor::RawAction::SetPlayerInvincibility(false); - } - - // MARK: - SlipperyFloor - GameInteractionEffectQueryResult SlipperyFloor::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void SlipperyFloor::_Apply() { - GameInteractor::State::SlipperyFloorActive = 1; - } - void SlipperyFloor::_Remove() { - GameInteractor::State::SlipperyFloorActive = 0; - } - - // MARK: - SpawnEnemyWithOffset - GameInteractionEffectQueryResult SpawnEnemyWithOffset::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } - return GameInteractor::RawAction::SpawnEnemyWithOffset(parameters[0], parameters[1]); - } - - void SpawnEnemyWithOffset::_Apply() { - GameInteractor::RawAction::SpawnEnemyWithOffset(parameters[0], parameters[1]); - } - - // MARK: - SpawnActor - GameInteractionEffectQueryResult SpawnActor::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } - return GameInteractor::RawAction::SpawnActor(parameters[0], parameters[1]); - } - - void SpawnActor::_Apply() { - GameInteractor::RawAction::SpawnActor(parameters[0], parameters[1]); +// MARK: - OneHitKO +GameInteractionEffectQueryResult OneHitKO::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; } } +void OneHitKO::_Apply() { + GameInteractor::State::OneHitKOActive = 1; +} +void OneHitKO::_Remove() { + GameInteractor::State::OneHitKOActive = 0; +} + +// MARK: - ModifyDefenseModifier +GameInteractionEffectQueryResult ModifyDefenseModifier::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void ModifyDefenseModifier::_Apply() { + GameInteractor::State::DefenseModifier = parameters[0]; +} +void ModifyDefenseModifier::_Remove() { + GameInteractor::State::DefenseModifier = 0; +} + +// MARK: - GiveOrTakeShield +GameInteractionEffectQueryResult GiveOrTakeShield::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if ((parameters[0] > 0 && ((gBitFlags[parameters[0] - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_TYPE_SHIELD]) & + gSaveContext.inventory.equipment)) || + (parameters[0] < 0 && + !((gBitFlags[(parameters[0] * -1) - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_TYPE_SHIELD]) & + gSaveContext.inventory.equipment))) { + return GameInteractionEffectQueryResult::NotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void GiveOrTakeShield::_Apply() { + GameInteractor::RawAction::GiveOrTakeShield(parameters[0]); +} + +// MARK: - TeleportPlayer +GameInteractionEffectQueryResult TeleportPlayer::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void TeleportPlayer::_Apply() { + GameInteractor::RawAction::TeleportPlayer(parameters[0]); +} + +// MARK: - ClearAssignedButtons +GameInteractionEffectQueryResult ClearAssignedButtons::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void ClearAssignedButtons::_Apply() { + GameInteractor::RawAction::ClearAssignedButtons(parameters[0]); +} + +// MARK: - SetTimeOfDay +GameInteractionEffectQueryResult SetTimeOfDay::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void SetTimeOfDay::_Apply() { + GameInteractor::RawAction::SetTimeOfDay(parameters[0]); +} + +// MARK: - SetCollisionViewer +GameInteractionEffectQueryResult SetCollisionViewer::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void SetCollisionViewer::_Apply() { + GameInteractor::RawAction::SetCollisionViewer(true); +} +void SetCollisionViewer::_Remove() { + GameInteractor::RawAction::SetCollisionViewer(false); +} + +// MARK: - RandomizeCosmetics +GameInteractionEffectQueryResult RandomizeCosmetics::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void RandomizeCosmetics::_Apply() { + CosmeticsEditor_RandomizeAll(); +} + +// MARK: - PressButton +GameInteractionEffectQueryResult PressButton::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void PressButton::_Apply() { + GameInteractor::RawAction::EmulateButtonPress(parameters[0]); +} + +// MARK: - PressRandomButton +GameInteractionEffectQueryResult PressRandomButton::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void PressRandomButton::_Apply() { + GameInteractor::RawAction::EmulateRandomButtonPress(parameters[0]); +} + +// MARK: - AddOrTakeAmmo +GameInteractionEffectQueryResult AddOrTakeAmmo::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if (!GameInteractor::CanAddOrTakeAmmo(parameters[0], parameters[1])) { + return GameInteractionEffectQueryResult::NotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void AddOrTakeAmmo::_Apply() { + GameInteractor::RawAction::AddOrTakeAmmo(parameters[0], parameters[1]); +} + +// MARK: - RandomBombFuseTimer +GameInteractionEffectQueryResult RandomBombFuseTimer::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void RandomBombFuseTimer::_Apply() { + GameInteractor::State::RandomBombFuseTimerActive = 1; +} +void RandomBombFuseTimer::_Remove() { + GameInteractor::State::RandomBombFuseTimerActive = 0; +} + +// MARK: - DisableLedgeGrabs +GameInteractionEffectQueryResult DisableLedgeGrabs::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void DisableLedgeGrabs::_Apply() { + GameInteractor::State::DisableLedgeGrabsActive = 1; +} +void DisableLedgeGrabs::_Remove() { + GameInteractor::State::DisableLedgeGrabsActive = 0; +} + +// MARK: - RandomWind +GameInteractionEffectQueryResult RandomWind::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void RandomWind::_Apply() { + GameInteractor::RawAction::SetRandomWind(true); +} +void RandomWind::_Remove() { + GameInteractor::RawAction::SetRandomWind(false); +} + +// MARK: - RandomBonks +GameInteractionEffectQueryResult RandomBonks::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void RandomBonks::_Apply() { + GameInteractor::State::RandomBonksActive = 1; +} +void RandomBonks::_Remove() { + GameInteractor::State::RandomBonksActive = 0; +} + +// MARK: - PlayerInvincibility +GameInteractionEffectQueryResult PlayerInvincibility::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void PlayerInvincibility::_Apply() { + GameInteractor::RawAction::SetPlayerInvincibility(true); +} +void PlayerInvincibility::_Remove() { + GameInteractor::RawAction::SetPlayerInvincibility(false); +} + +// MARK: - SlipperyFloor +GameInteractionEffectQueryResult SlipperyFloor::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void SlipperyFloor::_Apply() { + GameInteractor::State::SlipperyFloorActive = 1; +} +void SlipperyFloor::_Remove() { + GameInteractor::State::SlipperyFloorActive = 0; +} + +// MARK: - SpawnEnemyWithOffset +GameInteractionEffectQueryResult SpawnEnemyWithOffset::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + return GameInteractor::RawAction::SpawnEnemyWithOffset(parameters[0], parameters[1]); +} + +void SpawnEnemyWithOffset::_Apply() { + GameInteractor::RawAction::SpawnEnemyWithOffset(parameters[0], parameters[1]); +} + +// MARK: - SpawnActor +GameInteractionEffectQueryResult SpawnActor::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + return GameInteractor::RawAction::SpawnActor(parameters[0], parameters[1]); +} + +void SpawnActor::_Apply() { + GameInteractor::RawAction::SpawnActor(parameters[0], parameters[1]); +} +} // namespace GameInteractionEffect diff --git a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h index de6cb50bf6..47893d116a 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h @@ -6,266 +6,264 @@ #include #ifdef __cplusplus -enum GameInteractionEffectQueryResult { - Possible = 0x00, - TemporarilyNotPossible = 0x01, - NotPossible = 0xFF -}; +enum GameInteractionEffectQueryResult { Possible = 0x00, TemporarilyNotPossible = 0x01, NotPossible = 0xFF }; class GameInteractionEffectBase { -public: + public: virtual GameInteractionEffectQueryResult CanBeApplied() = 0; GameInteractionEffectQueryResult Apply(); -protected: + + protected: virtual void _Apply() = 0; }; -class RemovableGameInteractionEffect: public GameInteractionEffectBase { -public: +class RemovableGameInteractionEffect : public GameInteractionEffectBase { + public: virtual GameInteractionEffectQueryResult CanBeRemoved(); GameInteractionEffectQueryResult Remove(); -protected: - virtual void _Remove() {}; + + protected: + virtual void _Remove(){}; }; class ParameterizedGameInteractionEffect { -public: + public: int32_t parameters[3]; }; namespace GameInteractionEffect { - class SetSceneFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class SetSceneFlag : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class UnsetSceneFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class UnsetSceneFlag : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class SetFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class SetFlag : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class UnsetFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class UnsetFlag : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class ModifyHeartContainers: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class ModifyHeartContainers : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class FillMagic: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class FillMagic : public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class EmptyMagic: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class EmptyMagic : public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class ModifyRupees: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class ModifyRupees : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class NoUI: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class NoUI : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ModifyGravity: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ModifyGravity : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ModifyHealth: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class ModifyHealth : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class SetPlayerHealth: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class SetPlayerHealth : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class FreezePlayer: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class FreezePlayer : public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class BurnPlayer: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class BurnPlayer : public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class ElectrocutePlayer: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class ElectrocutePlayer : public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class KnockbackPlayer: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class KnockbackPlayer : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class ModifyLinkSize: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ModifyLinkSize : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class InvisibleLink : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class InvisibleLink : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class PacifistMode : public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class PacifistMode : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class DisableZTargeting: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class DisableZTargeting : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class WeatherRainstorm: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class WeatherRainstorm : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ReverseControls: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ReverseControls : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ForceEquipBoots: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ForceEquipBoots : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ModifyMovementSpeedMultiplier: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ModifyMovementSpeedMultiplier: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class OneHitKO : public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class OneHitKO : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ModifyDefenseModifier: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ModifyDefenseModifier : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class GiveOrTakeShield: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class GiveOrTakeShield : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class TeleportPlayer: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class TeleportPlayer : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class ClearAssignedButtons: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class ClearAssignedButtons : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class SetTimeOfDay: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class SetTimeOfDay : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class SetCollisionViewer: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class SetCollisionViewer : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class RandomizeCosmetics: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class RandomizeCosmetics: public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class PressButton: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class PressButton : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class PressRandomButton: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class PressRandomButton : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class AddOrTakeAmmo: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class AddOrTakeAmmo : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class RandomBombFuseTimer: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class RandomBombFuseTimer : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class DisableLedgeGrabs: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class DisableLedgeGrabs : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class RandomWind: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class RandomWind : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class RandomBonks: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class RandomBonks : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class PlayerInvincibility: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class PlayerInvincibility : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class SlipperyFloor: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; - class SpawnEnemyWithOffset: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; - class SpawnActor: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; -} +class SlipperyFloor : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; +class SpawnEnemyWithOffset : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; +class SpawnActor : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; +} // namespace GameInteractionEffect #endif /* __cplusplus */ #endif /* GameInteractionEffect_h */ diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor.cpp index dbb4782fd6..fb3db74df2 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.cpp @@ -1,4 +1,4 @@ -/* +/* GameInteractor is meant to be used for interacting with the game (yup...). It exposes functions that directly modify, add or remove game related elements. @@ -54,7 +54,10 @@ bool GameInteractor::IsSaveLoaded(bool allowDbgSave) { bool GameInteractor::IsGameplayPaused() { Player* player = GET_PLAYER(gPlayState); - return (Player_InBlockingCsMode(gPlayState, player) || gPlayState->pauseCtx.state != 0 || gPlayState->msgCtx.msgMode != 0) ? true : false; + return (Player_InBlockingCsMode(gPlayState, player) || gPlayState->pauseCtx.state != 0 || + gPlayState->msgCtx.msgMode != 0) + ? true + : false; } bool GameInteractor::CanSpawnActor() { diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 3fbfbe5b7f..8ac2d9dda3 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -4,8 +4,8 @@ #define GameInteractor_h #include "libultraship/libultraship.h" -#include "GameInteractionEffect.h" #include "vanilla-behavior/GIVanillaBehavior.h" +#include "GameInteractionEffect.h" #include "soh/Enhancements/item-tables/ItemTableTypes.h" #include @@ -92,19 +92,20 @@ void GameInteractor_SetTriforceHuntCreditsWarpActive(uint8_t state); } #endif - #ifdef __cplusplus #include #include +#include #include #include #include #include + #include #ifdef __cpp_lib_source_location #include #else -#pragma message("Compiling without support, the Hook Debugger will not be avaliable") +#pragma message("Compiling without support, the Hook Debugger will not be available") #endif typedef uint32_t HOOK_ID; @@ -124,24 +125,31 @@ struct HookRegisteringInfo { const char* function; HookType type; - HookRegisteringInfo() : valid(false), file("unknown file"), line(0), column(0), function("unknown function"), type(HOOK_TYPE_NORMAL) {} + HookRegisteringInfo() + : valid(false), file("unknown file"), line(0), column(0), function("unknown function"), type(HOOK_TYPE_NORMAL) { + } - HookRegisteringInfo(const char* _file, std::uint_least32_t _line, std::uint_least32_t _column, const char* _function, HookType _type) : - valid(true), file(_file), line(_line), column(_column), function(_function), type(_type) {} + HookRegisteringInfo(const char* _file, std::uint_least32_t _line, std::uint_least32_t _column, + const char* _function, HookType _type) + : valid(true), file(_file), line(_line), column(_column), function(_function), type(_type) { + // Trim off user parent directories + const char* trimmed = strstr(_file, "soh/soh/"); + if (trimmed != nullptr) { + file = trimmed; + } + } }; struct HookInfo { uint32_t calls; HookRegisteringInfo registering; - - HookInfo() : calls(0), registering(HookRegisteringInfo{}) {} - HookInfo(HookRegisteringInfo _registering) : calls(0), registering(_registering) {} }; #ifdef __cpp_lib_source_location -#define GET_CURRENT_REGISTERING_INFO(type) HookRegisteringInfo{location.file_name(), location.line(), location.column(), location.function_name(), type} +#define GET_CURRENT_REGISTERING_INFO(type) \ + (HookRegisteringInfo{ location.file_name(), location.line(), location.column(), location.function_name(), type }) #else -#define GET_CURRENT_REGISTERING_INFO(type) HookRegisteringInfo{} +#define GET_CURRENT_REGISTERING_INFO(type) (HookRegisteringInfo{}) #endif #define REGISTER_VB_SHOULD(flag, body) \ @@ -171,23 +179,23 @@ struct HookInfo { hookId = GameInteractor::Instance->RegisterGameHookForID(id, body); \ } \ } -#define COND_VB_SHOULD(id, condition, body) \ - { \ - static HOOK_ID hookId = 0; \ +#define COND_VB_SHOULD(id, condition, body) \ + { \ + static HOOK_ID hookId = 0; \ GameInteractor::Instance->UnregisterGameHookForID(hookId); \ - hookId = 0; \ - if (condition) { \ - hookId = REGISTER_VB_SHOULD(id, body); \ - } \ + hookId = 0; \ + if (condition) { \ + hookId = REGISTER_VB_SHOULD(id, body); \ + } \ } class GameInteractor { -public: + public: static GameInteractor* Instance; // Game State class State { - public: + public: static bool NoUIActive; static GILinkSize LinkSize; static bool InvisibleLinkActive; @@ -219,14 +227,15 @@ public: // Game Hooks HOOK_ID nextHookId = 1; + template struct RegisteredGameHooks { inline static std::unordered_map functions; inline static std::unordered_map> functionsForID; inline static std::unordered_map> functionsForPtr; inline static std::unordered_map> functionsForFilter; - //Used for the hook debugger - inline static std::unordered_map hookData; + // Used for the hook debugger + inline static std::map hookData; }; template struct HooksToUnregister { @@ -236,39 +245,43 @@ public: inline static std::vector hooksForFilter; }; - template std::unordered_map* GetHookData() { + template std::map* GetHookData() { return &RegisteredGameHooks::hookData; } // General Hooks - template HOOK_ID RegisterGameHook( - typename H::fn h + template #ifdef __cpp_lib_source_location - , const std::source_location location = std::source_location::current() + HOOK_ID RegisterGameHook(typename H::fn h, const std::source_location location = std::source_location::current()) { +#else + HOOK_ID RegisterGameHook(typename H::fn h) { #endif - ) { - // Ensure hook id is unique and not 0, which is reserved for invalid hooks - if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) this->nextHookId = 1; + if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) + this->nextHookId = 1; while (RegisteredGameHooks::functions.find(this->nextHookId) != RegisteredGameHooks::functions.end()) { this->nextHookId++; } RegisteredGameHooks::functions[this->nextHookId] = h; - RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_NORMAL)}; + RegisteredGameHooks::hookData[this->nextHookId] = + HookInfo{ 0, GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_NORMAL) }; return this->nextHookId++; } template void UnregisterGameHook(HOOK_ID hookId) { - if (hookId == 0) return; + if (hookId == 0) + return; HooksToUnregister::hooks.push_back(hookId); } template void ExecuteHooks(Args&&... args) { + // Remove pending hooks for this type for (auto& hookId : HooksToUnregister::hooks) { RegisteredGameHooks::functions.erase(hookId); RegisteredGameHooks::hookData.erase(hookId); } HooksToUnregister::hooks.clear(); + // Execute hooks for (auto& hook : RegisteredGameHooks::functions) { hook.second(std::forward(args)...); RegisteredGameHooks::hookData[hook.first].calls += 1; @@ -276,39 +289,60 @@ public: } // ID based Hooks - template HOOK_ID RegisterGameHookForID( - int32_t id, typename H::fn h + template #ifdef __cpp_lib_source_location - , const std::source_location location = std::source_location::current() + HOOK_ID RegisterGameHookForID(int32_t id, typename H::fn h, + std::source_location location = std::source_location::current()) { +#else + HOOK_ID RegisterGameHookForID(int32_t id, typename H::fn h) { #endif - ) { - if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) this->nextHookId = 1; - while (RegisteredGameHooks::functionsForID[id].find(this->nextHookId) != RegisteredGameHooks::functionsForID[id].end()) { + if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) + this->nextHookId = 1; + while (RegisteredGameHooks::functionsForID[id].find(this->nextHookId) != + RegisteredGameHooks::functionsForID[id].end()) { this->nextHookId++; } RegisteredGameHooks::functionsForID[id][this->nextHookId] = h; - RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_ID)}; + RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{ 0, GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_ID) }; return this->nextHookId++; } template void UnregisterGameHookForID(HOOK_ID hookId) { - if (hookId == 0) return; + if (hookId == 0) + return; HooksToUnregister::hooksForID.push_back(hookId); } template void ExecuteHooksForID(int32_t id, Args&&... args) { - for (auto& hookId : HooksToUnregister::hooksForID) { - for (auto it = RegisteredGameHooks::functionsForID[id].begin(); it != RegisteredGameHooks::functionsForID[id].end(); ) { - if (it->first == hookId) { + // Remove pending hooks for this type + for (auto hookIdIt = HooksToUnregister::hooksForID.begin(); + hookIdIt != HooksToUnregister::hooksForID.end();) { + bool remove = false; + + if (RegisteredGameHooks::functionsForID[id].size() == 0) { + break; + } + + for (auto it = RegisteredGameHooks::functionsForID[id].begin(); + it != RegisteredGameHooks::functionsForID[id].end();) { + if (it->first == *hookIdIt) { it = RegisteredGameHooks::functionsForID[id].erase(it); - HooksToUnregister::hooksForID.erase(std::remove(HooksToUnregister::hooksForID.begin(), HooksToUnregister::hooksForID.end(), hookId), HooksToUnregister::hooksForID.end()); - RegisteredGameHooks::hookData.erase(hookId); + RegisteredGameHooks::hookData.erase(*hookIdIt); + remove = true; + break; } else { ++it; } } + + if (remove) { + hookIdIt = HooksToUnregister::hooksForID.erase(hookIdIt); + } else { + ++hookIdIt; + } } + // Execute hooks for (auto& hook : RegisteredGameHooks::functionsForID[id]) { hook.second(std::forward(args)...); RegisteredGameHooks::hookData[hook.first].calls += 1; @@ -316,39 +350,60 @@ public: } // PTR based Hooks - template HOOK_ID RegisterGameHookForPtr( - uintptr_t ptr, typename H::fn h + template #ifdef __cpp_lib_source_location - , const std::source_location location = std::source_location::current() + HOOK_ID RegisterGameHookForPtr(uintptr_t ptr, typename H::fn h, + const std::source_location location = std::source_location::current()) { +#else + HOOK_ID RegisterGameHookForPtr(uintptr_t ptr, typename H::fn h) { #endif - ) { - if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) this->nextHookId = 1; - while (RegisteredGameHooks::functionsForPtr[ptr].find(this->nextHookId) != RegisteredGameHooks::functionsForPtr[ptr].end()) { + if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) + this->nextHookId = 1; + while (RegisteredGameHooks::functionsForPtr[ptr].find(this->nextHookId) != + RegisteredGameHooks::functionsForPtr[ptr].end()) { this->nextHookId++; } RegisteredGameHooks::functionsForPtr[ptr][this->nextHookId] = h; - RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_PTR)}; + RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{ 0, GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_PTR) }; return this->nextHookId++; } template void UnregisterGameHookForPtr(HOOK_ID hookId) { - if (hookId == 0) return; + if (hookId == 0) + return; HooksToUnregister::hooksForPtr.push_back(hookId); } template void ExecuteHooksForPtr(uintptr_t ptr, Args&&... args) { - for (auto& hookId : HooksToUnregister::hooksForPtr) { - for (auto it = RegisteredGameHooks::functionsForPtr[ptr].begin(); it != RegisteredGameHooks::functionsForPtr[ptr].end(); ) { - if (it->first == hookId) { + // Remove pending hooks for this type + for (auto hookIdIt = HooksToUnregister::hooksForPtr.begin(); + hookIdIt != HooksToUnregister::hooksForPtr.end();) { + bool remove = false; + + if (RegisteredGameHooks::functionsForPtr[ptr].size() == 0) { + break; + } + + for (auto it = RegisteredGameHooks::functionsForPtr[ptr].begin(); + it != RegisteredGameHooks::functionsForPtr[ptr].end();) { + if (it->first == *hookIdIt) { it = RegisteredGameHooks::functionsForPtr[ptr].erase(it); - HooksToUnregister::hooksForPtr.erase(std::remove(HooksToUnregister::hooksForPtr.begin(), HooksToUnregister::hooksForPtr.end(), hookId), HooksToUnregister::hooksForPtr.end()); - RegisteredGameHooks::hookData.erase(hookId); + RegisteredGameHooks::hookData.erase(*hookIdIt); + remove = true; + break; } else { ++it; } } + + if (remove) { + hookIdIt = HooksToUnregister::hooksForPtr.erase(hookIdIt); + } else { + ++hookIdIt; + } } + // Execute hooks for (auto& hook : RegisteredGameHooks::functionsForPtr[ptr]) { hook.second(std::forward(args)...); RegisteredGameHooks::hookData[hook.first].calls += 1; @@ -356,33 +411,40 @@ public: } // Filter based Hooks - template HOOK_ID RegisterGameHookForFilter( - typename H::filter f, typename H::fn h + template #ifdef __cpp_lib_source_location - , const std::source_location location = std::source_location::current() + HOOK_ID RegisterGameHookForFilter(typename H::filter f, typename H::fn h, + const std::source_location location = std::source_location::current()) { +#else + HOOK_ID RegisterGameHookForFilter(typename H::filter f, typename H::fn h) { #endif - ) { - if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) this->nextHookId = 1; - while (RegisteredGameHooks::functionsForFilter.find(this->nextHookId) != RegisteredGameHooks::functionsForFilter.end()) { + if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) + this->nextHookId = 1; + while (RegisteredGameHooks::functionsForFilter.find(this->nextHookId) != + RegisteredGameHooks::functionsForFilter.end()) { this->nextHookId++; } RegisteredGameHooks::functionsForFilter[this->nextHookId] = std::make_pair(f, h); - RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_FILTER)}; + RegisteredGameHooks::hookData[this->nextHookId] = + HookInfo{ 0, GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_FILTER) }; return this->nextHookId++; } template void UnregisterGameHookForFilter(HOOK_ID hookId) { - if (hookId == 0) return; + if (hookId == 0) + return; HooksToUnregister::hooksForFilter.push_back(hookId); } template void ExecuteHooksForFilter(Args&&... args) { + // Remove pending hooks for this type for (auto& hookId : HooksToUnregister::hooksForFilter) { RegisteredGameHooks::functionsForFilter.erase(hookId); RegisteredGameHooks::hookData.erase(hookId); } HooksToUnregister::hooksForFilter.clear(); + // Execute hooks for (auto& hook : RegisteredGameHooks::functionsForFilter) { if (hook.second.first(std::forward(args)...)) { hook.second.second(std::forward(args)...); @@ -391,8 +453,62 @@ public: } } + template void ProcessUnregisteredHooks() { + // Normal + for (auto& hookId : HooksToUnregister::hooks) { + RegisteredGameHooks::functions.erase(hookId); + RegisteredGameHooks::hookData.erase(hookId); + } + HooksToUnregister::hooks.clear(); + + // ID + for (auto& hookId : HooksToUnregister::hooksForID) { + for (auto& idGroup : RegisteredGameHooks::functionsForID) { + for (auto it = idGroup.second.begin(); it != idGroup.second.end();) { + if (it->first == hookId) { + it = idGroup.second.erase(it); + RegisteredGameHooks::hookData.erase(hookId); + } else { + ++it; + } + } + } + } + HooksToUnregister::hooksForID.clear(); + + // Ptr + for (auto& hookId : HooksToUnregister::hooksForPtr) { + for (auto& ptrGroup : RegisteredGameHooks::functionsForPtr) { + for (auto it = ptrGroup.second.begin(); it != ptrGroup.second.end();) { + if (it->first == hookId) { + it = ptrGroup.second.erase(it); + RegisteredGameHooks::hookData.erase(hookId); + } else { + ++it; + } + } + } + } + HooksToUnregister::hooksForPtr.clear(); + + // Filter + for (auto& hookId : HooksToUnregister::hooksForFilter) { + RegisteredGameHooks::functionsForFilter.erase(hookId); + RegisteredGameHooks::hookData.erase(hookId); + } + HooksToUnregister::hooksForFilter.clear(); + } + + void RemoveAllQueuedHooks() { +#define DEFINE_HOOK(name, _) ProcessUnregisteredHooks(); + +#include "GameInteractor_HookTable.h" + +#undef DEFINE_HOOK + } + class HookFilter { - public: + public: static auto ActorNotPlayer(Actor* actor) { return actor->id != ACTOR_PLAYER; } @@ -401,15 +517,11 @@ public: return actor->id != ACTOR_PLAYER; } static auto ActorMatchIdAndParams(int16_t id, int16_t params) { - return [id, params](Actor* actor) { - return actor->id == id && actor->params == params; - }; + return [id, params](Actor* actor) { return actor->id == id && actor->params == params; }; } // For use with Should hooks static auto SActorMatchIdAndParams(int16_t id, int16_t params) { - return [id, params](Actor* actor, bool* result) { - return actor->id == id && actor->params == params; - }; + return [id, params](Actor* actor, bool* result) { return actor->id == id && actor->params == params; }; } }; @@ -430,7 +542,7 @@ public: static bool CanAddOrTakeAmmo(int16_t amount, int16_t item); class RawAction { - public: + public: static void SetSceneFlag(int16_t sceneNum, int16_t flagType, int16_t flag); static void UnsetSceneFlag(int16_t sceneNum, int16_t flagType, int16_t flag); static bool CheckFlag(int16_t flagType, int16_t flag); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index 3bd2ef36eb..51a6ab5a85 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -15,24 +15,32 @@ DEFINE_HOOK(OnItemReceive, (GetItemEntry itemEntry)); DEFINE_HOOK(OnSaleEnd, (GetItemEntry itemEntry)); DEFINE_HOOK(OnTransitionEnd, (int16_t sceneNum)); DEFINE_HOOK(OnSceneInit, (int16_t sceneNum)); +DEFINE_HOOK(AfterSceneCommands, (int16_t sceneNum)); DEFINE_HOOK(OnSceneFlagSet, (int16_t sceneNum, int16_t flagType, int16_t flag)); DEFINE_HOOK(OnSceneFlagUnset, (int16_t sceneNum, int16_t flagType, int16_t flag)); DEFINE_HOOK(OnFlagSet, (int16_t flagType, int16_t flag)); DEFINE_HOOK(OnFlagUnset, (int16_t flagType, int16_t flag)); DEFINE_HOOK(OnSceneSpawnActors, ()); DEFINE_HOOK(OnPlayerUpdate, ()); +DEFINE_HOOK(OnSetDoAction, (uint16_t action)); DEFINE_HOOK(OnOcarinaSongAction, ()); DEFINE_HOOK(OnCuccoOrChickenHatch, ()); DEFINE_HOOK(OnShopSlotChange, (uint8_t cursorIndex, int16_t price)); DEFINE_HOOK(OnActorInit, (void* actor)); +DEFINE_HOOK(OnActorSpawn, (void* actor)); DEFINE_HOOK(OnActorUpdate, (void* actor)); DEFINE_HOOK(OnActorKill, (void* actor)); +DEFINE_HOOK(OnActorDestroy, (void* actor)); DEFINE_HOOK(OnEnemyDefeat, (void* actor)); DEFINE_HOOK(OnBossDefeat, (void* actor)); DEFINE_HOOK(OnTimestamp, (u8 item)); DEFINE_HOOK(OnPlayerBonk, ()); DEFINE_HOOK(OnPlayerHealthChange, (int16_t amount)); DEFINE_HOOK(OnPlayerBottleUpdate, (int16_t contents)); +DEFINE_HOOK(OnPlayerHoldUpShield, ()); +DEFINE_HOOK(OnPlayerFirstPersonControl, (Player * player)); +DEFINE_HOOK(OnPlayerProcessStick, ()); +DEFINE_HOOK(OnPlayerShieldControl, (float_t * sp50, float_t* sp54)); DEFINE_HOOK(OnPlayDestroy, ()); DEFINE_HOOK(OnPlayDrawEnd, ()); DEFINE_HOOK(OnVanillaBehavior, (GIVanillaBehavior flag, bool* result, va_list originalArgs)); @@ -57,7 +65,9 @@ DEFINE_HOOK(OnUpdateFileTargetSelection, (uint8_t optionIndex)); DEFINE_HOOK(OnUpdateFileLanguageSelection, (uint8_t optionIndex)); DEFINE_HOOK(OnUpdateFileQuestSelection, (uint8_t questIndex)); DEFINE_HOOK(OnUpdateFileBossRushOptionSelection, (uint8_t optionIndex, uint8_t optionValue)); +DEFINE_HOOK(OnUpdateFileRandomizerOptionSelection, (uint8_t optionIndex)); DEFINE_HOOK(OnUpdateFileNameSelection, (int16_t charCode)); +DEFINE_HOOK(OnFileChooseMain, (void* gameState)); DEFINE_HOOK(OnSetGameLanguage, ()); DEFINE_HOOK(OnFileDropped, (std::string filePath)); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index b41030cfa9..f69cc29af5 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -19,6 +19,9 @@ void GameInteractor_ExecuteOnExitGame(int32_t fileNum) { } void GameInteractor_ExecuteOnGameStateMainStart() { + // Cleanup all hooks at the start of each frame + GameInteractor::Instance->RemoveAllQueuedHooks(); + GameInteractor::Instance->ExecuteHooks(); } @@ -42,12 +45,18 @@ void GameInteractor_ExecuteOnTransitionEndHooks(int16_t sceneNum) { GameInteractor::Instance->ExecuteHooksForFilter(sceneNum); } -void GameInteractor_ExecuteOnSceneInitHooks(int16_t sceneNum) { +void GameInteractor_ExecuteOnSceneInit(int16_t sceneNum) { GameInteractor::Instance->ExecuteHooks(sceneNum); GameInteractor::Instance->ExecuteHooksForID(sceneNum, sceneNum); GameInteractor::Instance->ExecuteHooksForFilter(sceneNum); } +void GameInteractor_ExecuteAfterSceneCommands(int16_t sceneNum) { + GameInteractor::Instance->ExecuteHooks(sceneNum); + GameInteractor::Instance->ExecuteHooksForID(sceneNum, sceneNum); + GameInteractor::Instance->ExecuteHooksForFilter(sceneNum); +} + void GameInteractor_ExecuteOnSceneFlagSet(int16_t sceneNum, int16_t flagType, int16_t flag) { GameInteractor::Instance->ExecuteHooks(sceneNum, flagType, flag); GameInteractor::Instance->ExecuteHooksForFilter(sceneNum, flagType, flag); @@ -76,6 +85,10 @@ void GameInteractor_ExecuteOnPlayerUpdate() { GameInteractor::Instance->ExecuteHooks(); } +void GameInteractor_ExecuteOnSetDoAction(uint16_t action) { + GameInteractor::Instance->ExecuteHooks(action); +} + void GameInteractor_ExecuteOnOcarinaSongAction() { GameInteractor::Instance->ExecuteHooks(); } @@ -95,6 +108,13 @@ void GameInteractor_ExecuteOnActorInit(void* actor) { GameInteractor::Instance->ExecuteHooksForFilter(actor); } +void GameInteractor_ExecuteOnActorSpawn(void* actor) { + GameInteractor::Instance->ExecuteHooks(actor); + GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor); + GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor); + GameInteractor::Instance->ExecuteHooksForFilter(actor); +} + void GameInteractor_ExecuteOnActorUpdate(void* actor) { GameInteractor::Instance->ExecuteHooks(actor); GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor); @@ -109,6 +129,13 @@ void GameInteractor_ExecuteOnActorKill(void* actor) { GameInteractor::Instance->ExecuteHooksForFilter(actor); } +void GameInteractor_ExecuteOnActorDestroy(void* actor) { + GameInteractor::Instance->ExecuteHooks(actor); + GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor); + GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor); + GameInteractor::Instance->ExecuteHooksForFilter(actor); +} + void GameInteractor_ExecuteOnEnemyDefeat(void* actor) { GameInteractor::Instance->ExecuteHooks(actor); GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor); @@ -123,7 +150,7 @@ void GameInteractor_ExecuteOnBossDefeat(void* actor) { GameInteractor::Instance->ExecuteHooksForFilter(actor); } -void GameInteractor_ExecuteOnTimestamp (u8 item) { +void GameInteractor_ExecuteOnTimestamp(u8 item) { GameInteractor::Instance->ExecuteHooks(item); } @@ -139,6 +166,22 @@ void GameInteractor_ExecuteOnPlayerBottleUpdate(int16_t contents) { GameInteractor::Instance->ExecuteHooks(contents); } +void GameInteractor_ExecuteOnPlayerHoldUpShield() { + GameInteractor::Instance->ExecuteHooks(); +} + +void GameInteractor_ExecuteOnPlayerFirstPersonControl(Player* player) { + GameInteractor::Instance->ExecuteHooks(player); +} + +void GameInteractor_ExecuteOnPlayerShieldControl(float_t* sp50, float_t* sp54) { + GameInteractor::Instance->ExecuteHooks(sp50, sp54); +} + +void GameInteractor_ExecuteOnPlayerProcessStick() { + GameInteractor::Instance->ExecuteHooks(); +} + void GameInteractor_ExecuteOnPlayDestroy() { GameInteractor::Instance->ExecuteHooks(); } @@ -247,13 +290,22 @@ void GameInteractor_ExecuteOnUpdateFileQuestSelection(uint8_t questIndex) { } void GameInteractor_ExecuteOnUpdateFileBossRushOptionSelection(uint8_t optionIndex, uint8_t optionValue) { - GameInteractor::Instance->ExecuteHooks(optionIndex, optionValue); + GameInteractor::Instance->ExecuteHooks(optionIndex, + optionValue); +} + +void GameInteractor_ExecuteOnUpdateFileRandomizerOptionSelection(uint8_t optionIndex) { + GameInteractor::Instance->ExecuteHooks(optionIndex); } void GameInteractor_ExecuteOnUpdateFileNameSelection(int16_t charCode) { GameInteractor::Instance->ExecuteHooks(charCode); } +void GameInteractor_ExecuteOnFileChooseMain(void* gameState) { + GameInteractor::Instance->ExecuteHooks(gameState); +} + // MARK: - Game void GameInteractor_ExecuteOnSetGameLanguage() { @@ -266,7 +318,7 @@ void GameInteractor_RegisterOnAssetAltChange(void (*fn)(void)) { GameInteractor::Instance->RegisterGameHook(fn); } -//MARK: Pause Menu +// MARK: Pause Menu void GameInteractor_ExecuteOnKaleidoUpdate() { GameInteractor::Instance->ExecuteHooks(); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index f1b918cef2..a6f1563f23 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -1,5 +1,6 @@ #pragma once +#include "vanilla-behavior/GIVanillaBehavior.h" #include "GameInteractor.h" #include @@ -17,23 +18,31 @@ void GameInteractor_ExecuteOnItemReceiveHooks(GetItemEntry itemEntry); void GameInteractor_ExecuteOnSaleEndHooks(GetItemEntry itemEntry); void GameInteractor_ExecuteOnTransitionEndHooks(int16_t sceneNum); void GameInteractor_ExecuteOnSceneInit(int16_t sceneNum); +void GameInteractor_ExecuteAfterSceneCommands(int16_t sceneNum); void GameInteractor_ExecuteOnSceneFlagSet(int16_t sceneNum, int16_t flagType, int16_t flag); void GameInteractor_ExecuteOnSceneFlagUnset(int16_t sceneNum, int16_t flagType, int16_t flag); void GameInteractor_ExecuteOnFlagSet(int16_t flagType, int16_t flag); void GameInteractor_ExecuteOnFlagUnset(int16_t flagType, int16_t flag); void GameInteractor_ExecuteOnSceneSpawnActors(); void GameInteractor_ExecuteOnPlayerUpdate(); +void GameInteractor_ExecuteOnSetDoAction(uint16_t action); void GameInteractor_ExecuteOnOcarinaSongAction(); void GameInteractor_ExecuteOnCuccoOrChickenHatch(); void GameInteractor_ExecuteOnActorInit(void* actor); +void GameInteractor_ExecuteOnActorSpawn(void* actor); void GameInteractor_ExecuteOnActorUpdate(void* actor); void GameInteractor_ExecuteOnActorKill(void* actor); +void GameInteractor_ExecuteOnActorDestroy(void* actor); void GameInteractor_ExecuteOnEnemyDefeat(void* actor); void GameInteractor_ExecuteOnBossDefeat(void* actor); -void GameInteractor_ExecuteOnTimestamp (u8 item); +void GameInteractor_ExecuteOnTimestamp(u8 item); void GameInteractor_ExecuteOnPlayerBonk(); void GameInteractor_ExecuteOnPlayerHealthChange(int16_t amount); void GameInteractor_ExecuteOnPlayerBottleUpdate(int16_t contents); +void GameInteractor_ExecuteOnPlayerHoldUpShield(); +void GameInteractor_ExecuteOnPlayerFirstPersonControl(Player* player); +void GameInteractor_ExecuteOnPlayerShieldControl(float_t* sp50, float_t* sp54); +void GameInteractor_ExecuteOnPlayerProcessStick(); void GameInteractor_ExecuteOnShopSlotChangeHooks(uint8_t cursorIndex, int16_t price); void GameInteractor_ExecuteOnPlayDestroy(); void GameInteractor_ExecuteOnPlayDrawEnd(); @@ -63,7 +72,9 @@ void GameInteractor_ExecuteOnUpdateFileTargetSelection(uint8_t optionIndex); void GameInteractor_ExecuteOnUpdateFileLanguageSelection(uint8_t optionIndex); void GameInteractor_ExecuteOnUpdateFileQuestSelection(uint8_t questIndex); void GameInteractor_ExecuteOnUpdateFileBossRushOptionSelection(uint8_t optionIndex, uint8_t optionValue); +void GameInteractor_ExecuteOnUpdateFileRandomizerOptionSelection(uint8_t optionIndex); void GameInteractor_ExecuteOnUpdateFileNameSelection(int16_t charCode); +void GameInteractor_ExecuteOnFileChooseMain(void* gameState); // MARK: - Game void GameInteractor_ExecuteOnSetGameLanguage(); @@ -71,7 +82,7 @@ void GameInteractor_ExecuteOnSetGameLanguage(); // MARK: - System void GameInteractor_RegisterOnAssetAltChange(void (*fn)(void)); -//Mark: - Pause Menu +// Mark: - Pause Menu void GameInteractor_ExecuteOnKaleidoUpdate(); #ifdef __cplusplus diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp index c653e929f9..dea11cc8e5 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp @@ -112,7 +112,7 @@ void GameInteractor::RawAction::FreezePlayer() { void GameInteractor::RawAction::BurnPlayer() { Player* player = GET_PLAYER(gPlayState); for (int i = 0; i < 18; i++) { - player->bodyFlameTimers[i] = Rand_S16Offset(0, 200); + player->bodyFlameTimers[i] = static_cast(Rand_S16Offset(0, 200)); } player->bodyIsBurning = true; func_80837C0C(gPlayState, player, 0, 0, 0, 0, 0); @@ -143,11 +143,13 @@ void GameInteractor::RawAction::SetSceneFlag(int16_t sceneNum, int16_t flagType, } break; case FlagType::FLAG_SCENE_CLEAR: - if (sceneNum == gPlayState->sceneNum) gPlayState->actorCtx.flags.clear |= (1 << flag); + if (sceneNum == gPlayState->sceneNum) + gPlayState->actorCtx.flags.clear |= (1 << flag); gSaveContext.sceneFlags[sceneNum].clear |= (1 << flag); break; case FlagType::FLAG_SCENE_TREASURE: - if (sceneNum == gPlayState->sceneNum) gPlayState->actorCtx.flags.chest |= (1 << flag); + if (sceneNum == gPlayState->sceneNum) + gPlayState->actorCtx.flags.chest |= (1 << flag); gSaveContext.sceneFlags[sceneNum].chest |= (1 << flag); break; case FlagType::FLAG_SCENE_COLLECTIBLE: @@ -182,11 +184,13 @@ void GameInteractor::RawAction::UnsetSceneFlag(int16_t sceneNum, int16_t flagTyp } break; case FlagType::FLAG_SCENE_CLEAR: - if (sceneNum == gPlayState->sceneNum) gPlayState->actorCtx.flags.clear &= ~(1 << flag); + if (sceneNum == gPlayState->sceneNum) + gPlayState->actorCtx.flags.clear &= ~(1 << flag); gSaveContext.sceneFlags[sceneNum].clear &= ~(1 << flag); break; case FlagType::FLAG_SCENE_TREASURE: - if (sceneNum == gPlayState->sceneNum) gPlayState->actorCtx.flags.chest &= ~(1 << flag); + if (sceneNum == gPlayState->sceneNum) + gPlayState->actorCtx.flags.chest &= ~(1 << flag); gSaveContext.sceneFlags[sceneNum].chest &= ~(1 << flag); break; case FlagType::FLAG_SCENE_COLLECTIBLE: @@ -220,6 +224,9 @@ bool GameInteractor::RawAction::CheckFlag(int16_t flagType, int16_t flag) { return Flags_GetRandomizerInf(static_cast(flag)); case FlagType::FLAG_GS_TOKEN: return GET_GS_FLAGS((flag & 0x1F00) >> 8); + default: + assert(false); + return false; } } @@ -334,7 +341,7 @@ void GameInteractor::RawAction::UpdateActor(void* refActor) { // Update actor again outside of their normal update cycle. Actor* actor = static_cast(refActor); - + // Sometimes the actor is destroyed in the previous Update, so check if the update function still exists. if (actor->update != NULL) { // Fix for enemies sometimes taking a "fake" hit, where their invincibility timer is @@ -352,7 +359,8 @@ void GameInteractor::RawAction::UpdateActor(void* refActor) { } void GameInteractor::RawAction::TeleportPlayer(int32_t nextEntrance) { - Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); gPlayState->nextEntranceIndex = nextEntrance; gPlayState->transitionTrigger = TRANS_TRIGGER_START; gPlayState->transitionType = TRANS_TYPE_FADE_BLACK; @@ -383,7 +391,7 @@ void GameInteractor::RawAction::SetTimeOfDay(uint32_t time) { void GameInteractor::RawAction::SetCollisionViewer(bool active) { CVarSetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), active); CVarSetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Decal"), active); - + if (active) { CVarSetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), COLVIEW_TRANSPARENT); CVarSetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.BGActors"), COLVIEW_TRANSPARENT); @@ -405,7 +413,7 @@ void GameInteractor::RawAction::EmulateRandomButtonPress(uint32_t chancePercenta uint32_t emulatedButton; uint32_t randomNumber = rand(); uint32_t possibleButtons[14] = { BTN_CRIGHT, BTN_CLEFT, BTN_CDOWN, BTN_CUP, BTN_R, BTN_L, BTN_DRIGHT, - BTN_DLEFT, BTN_DDOWN, BTN_DUP, BTN_START, BTN_Z, BTN_B, BTN_A }; + BTN_DLEFT, BTN_DDOWN, BTN_DUP, BTN_START, BTN_Z, BTN_B, BTN_A }; emulatedButton = possibleButtons[randomNumber % 14]; @@ -432,14 +440,14 @@ void GameInteractor::RawAction::SetRandomWind(bool active) { GameInteractor::State::RandomWindActive = 0; GameInteractor::State::RandomWindSecondsSinceLastDirectionChange = 0; player->pushedSpeed = 0.0f; - player->pushedYaw = 0.0f; + player->pushedYaw = 0; } } void GameInteractor::RawAction::SetPlayerInvincibility(bool active) { Player* player = GET_PLAYER(gPlayState); if (active) { - player->invincibilityTimer = 1000; + player->invincibilityTimer = -20; } else { player->invincibilityTimer = 0; } @@ -447,8 +455,9 @@ void GameInteractor::RawAction::SetPlayerInvincibility(bool active) { /// Clears the cutscene pointer to a value safe for wrong warps. void GameInteractor::RawAction::ClearCutscenePointer() { - if (!gPlayState) return; - static uint32_t null_cs[] = {0, 0}; + if (!gPlayState) + return; + static uint32_t null_cs[] = { 0, 0 }; gPlayState->csCtx.segment = &null_cs; } @@ -481,14 +490,15 @@ GameInteractionEffectQueryResult GameInteractor::RawAction::SpawnEnemyWithOffset // Don't allow Arwings in certain areas because they cause issues. // Locations: King dodongo room, Morpha room, Twinrova room, Ganondorf room, Fishing pond, Ganon's room // TODO: Swap this to disabling the option in CC options menu instead. - if (sceneNum == SCENE_DODONGOS_CAVERN_BOSS || sceneNum == SCENE_WATER_TEMPLE_BOSS || sceneNum == SCENE_SPIRIT_TEMPLE_BOSS || - sceneNum == SCENE_GANONDORF_BOSS || sceneNum == SCENE_FISHING_POND || sceneNum == SCENE_GANON_BOSS) { + if (sceneNum == SCENE_DODONGOS_CAVERN_BOSS || sceneNum == SCENE_WATER_TEMPLE_BOSS || + sceneNum == SCENE_SPIRIT_TEMPLE_BOSS || sceneNum == SCENE_GANONDORF_BOSS || + sceneNum == SCENE_FISHING_POND || sceneNum == SCENE_GANON_BOSS) { return GameInteractionEffectQueryResult::NotPossible; } } // Generate point in random angle with a radius. - float angle = Random(0, 2 * M_PI); + float angle = static_cast(RandomDouble() * 2 * M_PI); float radius = 150; float posXOffset = radius * cos(angle); float posZOffset = radius * sin(angle); @@ -563,8 +573,9 @@ GameInteractionEffectQueryResult GameInteractor::RawAction::SpawnActor(uint32_t if (actorId == ACTOR_EN_NIW) { // Spawn Cucco and make it angry - EnNiw* cucco = (EnNiw*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, actorId, player->actor.world.pos.x, - player->actor.world.pos.y + 2200, player->actor.world.pos.z, 0, 0, 0, actorParams, 0); + EnNiw* cucco = + (EnNiw*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, actorId, player->actor.world.pos.x, + player->actor.world.pos.y + 2200, player->actor.world.pos.z, 0, 0, 0, actorParams, 0); if (cucco == NULL) { return GameInteractionEffectQueryResult::TemporarilyNotPossible; } @@ -576,8 +587,9 @@ GameInteractionEffectQueryResult GameInteractor::RawAction::SpawnActor(uint32_t return GameInteractionEffectQueryResult::Possible; } else if (actorId == ACTOR_EN_BOM) { // Spawn a bomb, make it explode instantly when params is set to 1 to emulate spawning an explosion - EnBom* bomb = (EnBom*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_BOM, player->actor.world.pos.x, - player->actor.world.pos.y + 30, player->actor.world.pos.z, 0, 0, 0, BOMB_BODY, true); + EnBom* bomb = + (EnBom*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_BOM, player->actor.world.pos.x, + player->actor.world.pos.y + 30, player->actor.world.pos.z, 0, 0, 0, BOMB_BODY, true); if (bomb == NULL) { return GameInteractionEffectQueryResult::TemporarilyNotPossible; @@ -604,5 +616,4 @@ GameInteractionEffectQueryResult GameInteractor::RawAction::SpawnActor(uint32_t } return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index a95dabb00b..186307aede 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1,3 +1,8 @@ +#pragma once + +#ifndef GI_VANILLA_BEHAVIOR_H +#define GI_VANILLA_BEHAVIOR_H + typedef enum { // #### `result` // ```c @@ -15,6 +20,14 @@ typedef enum { // - `int32_t` (entrance index) (promoted from `uint16_t` by va_arg) VB_ALLOW_ENTRANCE_CS_FOR_EITHER_AGE, + // #### `result` + // ```c + // sBgPoEventPuzzleState == 0xF + // ``` + // #### `args` + // - None + VB_AMY_SOLVE, + // #### `result` // ```c // this->actor.textId == 0x401A @@ -95,10 +108,10 @@ typedef enum { // #### `args` // - `*BgDyYoseizo` VB_BE_ELIGIBLE_FOR_GREAT_FAIRY_REWARD, - + // #### `result` // ```c - // CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && + // CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && // CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) && // LINK_IS_ADULT && // !Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) && @@ -118,11 +131,11 @@ typedef enum { // #### `result` // ```c - // (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE) && + // (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE) && // LINK_IS_ADULT && - // Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) && + // Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) && // Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP) && - // Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP) && + // Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP) && // !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL) // ``` // #### `args` @@ -131,7 +144,8 @@ typedef enum { // #### `result` // ```c - // !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) + // !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && + // Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) // ``` // #### `args` // - None @@ -158,7 +172,8 @@ typedef enum { // #### `result` // ```c - // CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) + // CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && + // !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) // ``` // #### `args` // - None @@ -221,6 +236,14 @@ typedef enum { // - `*Actor` (interactRangeActor) VB_BOTTLE_ACTOR, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnPoField` + VB_BOTTLE_BIG_POE, + // #### `result` // ```c // ((this->actor.params == DNS_TYPE_HEART_PIECE) && (Flags_GetItemGetInf(ITEMGETINF_DEKU_SCRUB_HEART_PIECE))) || @@ -271,6 +294,67 @@ typedef enum { // - `*EnDoor` VB_CONSUME_SMALL_KEY, + // #### `result` + // ```c + // itemDropped >= 0 && itemDropped < 0x1A + // ``` + // #### `args` + // - `*ObjKibako2` + VB_CRATE_DROP_ITEM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ObjKibako2` + VB_CRATE_SETUP_DRAW, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_CRAWL_SPEED_ENTER, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_CRAWL_SPEED_EXIT, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Camera` + // - 'int16_t' (csId) + // - 'int16_t' (actionParameters) + // - 'int16_t' (initTimer) + // - 'CutsceneCameraPoint*' (atPoints) + // - 'CutsceneCameraPoint*' (eyePoints) + VB_CRAWL_SPEED_EXIT_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_CRAWL_SPEED_INCREASE, + + // #### `result` + // ```c + // this->actionTimer == 0 && Rand_ZeroOne() < 0.03f + // ``` + // #### `args` + // - `*EnPoRelay` + VB_DAMPE_DROP_FLAME, + // #### `result` // ```c // !Flags_GetItemGetInf(ITEMGETINF_1C) @@ -281,7 +365,8 @@ typedef enum { // #### `result` // ```c - // gSaveContext.dayTime <= 0xC000 || gSaveContext.dayTime >= 0xE000 || LINK_IS_ADULT || play->sceneNum != SCENE_GRAVEYARD + // gSaveContext.dayTime <= 0xC000 || gSaveContext.dayTime >= 0xE000 || LINK_IS_ADULT || play->sceneNum != + // SCENE_GRAVEYARD // ``` // #### `args` // - `*EnTk` @@ -350,7 +435,8 @@ typedef enum { // #### `result` // ```c - // play->sceneNum == SCENE_LINKS_HOUSE && (!LINK_IS_ADULT || !Flags_GetEventChkInf(EVENTCHKINF_WON_COW_IN_MALONS_RACE) + // play->sceneNum == SCENE_LINKS_HOUSE && (!LINK_IS_ADULT || + // !Flags_GetEventChkInf(EVENTCHKINF_WON_COW_IN_MALONS_RACE) // ``` // #### `args` // - `*EnCow` @@ -400,6 +486,22 @@ typedef enum { // - `*int16_t` (item id) VB_DRAW_AMMO_COUNT, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - Player* + VB_EMPTYING_BOTTLE, + + // #### `result` + // ```c + // (Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play) + // ``` + // #### `args` + // - None + VB_END_GERUDO_MEMBERSHIP_TALK, + // #### `result` // ```c // !(this->stateFlags3 & PLAYER_STATE3_PAUSE_ACTION_FUNC) @@ -441,6 +543,14 @@ typedef enum { // - `*BgHeavyBlock` VB_FREEZE_LINK_FOR_BLOCK_THROW, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_FREEZE_LINK_FOR_FOREST_PILLARS, + // #### `result` // ```c // true @@ -465,6 +575,14 @@ typedef enum { // - None VB_GANON_HEAL_BEFORE_FIGHT, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnGe2` + VB_GERUDO_GUARD_SET_ACTION_AFTER_TALK, + // #### `result` // See logic in // ```c @@ -473,7 +591,7 @@ typedef enum { // and // ```c // EnGe2_CheckCarpentersFreed() - // ``` + // ``` // #### `args` // - None VB_GERUDOS_BE_FRIENDLY, @@ -913,6 +1031,14 @@ typedef enum { // - `*VBFishingData` VB_GIVE_RANDO_FISHING_PRIZE, + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - '*Fishing' + VB_GIVE_RANDO_GLITCH_FISHING_PRIZE, + // #### `result` // ```c // true @@ -961,6 +1087,22 @@ typedef enum { // - `*EnDs` VB_GRANNY_TAKE_MONEY, + // ### `result` + // ```c + // false + // ``` + // ### `args` + // - `*EnKusa` + VB_GRASS_DROP_ITEM, + + // ### `result` + // ```c + // true + // ``` + // ### `args` + // - `*EnKusa` + VB_GRASS_SETUP_DRAW, + // #### `result` // ```c // Flags_GetSwitch(play, this->dyna.actor.params & 0x3F) @@ -969,6 +1111,22 @@ typedef enum { // - None VB_GTG_GATE_BE_OPEN, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnCrow` + VB_GUAY_DO_DIVE_ATTACK, + + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - `*EnCrow` + VB_GUAY_FORCE_FLY_AWAY, + // #### `result` // ```c // true @@ -1057,6 +1215,22 @@ typedef enum { // - None VB_KALEIDO_UNPAUSE_CLOSE, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnFirefly` + VB_KEESE_DO_DIVE_ATTACK, + + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - `*EnFirefly` + VB_KEESE_FORCE_FLY_AWAY, + // #### `result` // ```c // Flags_GetEventChkInf(EVENTCHKINF_KING_ZORA_MOVED) @@ -1265,11 +1439,20 @@ typedef enum { // - None VB_PLAY_BOLERO_OF_FIRE_CS, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnDaiku` + VB_PLAY_CARPENTER_FREE_CS, + // #### `result` // Close enough & various cutscene checks // ```c - // (func_80AEC5FC(this, play)) && (!Play_InCsMode(play)) && - // (!(player->stateFlags1 & (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_CLIMBING_LADDER))) && + // (func_80AEC5FC(this, play)) && (!Play_InCsMode(play)) && + // (!(player->stateFlags1 & (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | + // PLAYER_STATE1_CLIMBING_LADDER))) && // (player->actor.bgCheckFlags & 1) // ``` // #### `args` @@ -1292,6 +1475,14 @@ typedef enum { // - `*BgTreemouth` VB_PLAY_DEKU_TREE_INTRO_CS, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*DemoKekkai` + VB_PLAY_DISPEL_BARRIER_CS, + // #### `result` // ```c // true @@ -1356,6 +1547,15 @@ typedef enum { // - None VB_PLAY_FIRE_ARROW_CS, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnHeishi2` + // - `bool` (clearCamera - true if the code clears a sub-camera, false otherwise) + VB_PLAY_GATE_OPENING_OR_CLOSING_CS, + // #### `result` // ```c // true @@ -1537,6 +1737,23 @@ typedef enum { // - `*ObjTsubo` VB_POT_SETUP_DRAW, + // #### `result` + // ```c + // dropId == ITEM00_STICK + // ``` + // #### `args` + // - None + VB_PREVENT_ADULT_STICK, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnRd` + VB_REDEAD_GIBDO_FREEZE_LINK, + + // #### `result` // #### `result` // ```c // true @@ -1597,6 +1814,22 @@ typedef enum { // - `*EnRu1` VB_RUTO_WANT_TO_BE_TOSSED_TO_SAPPHIRE, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnGb` + VB_SELL_POES_TO_POE_COLLECTOR, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `int32_t` (button - promoted from `s16`) + VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, + // #### `result` // ```c // true @@ -1615,7 +1848,17 @@ typedef enum { // #### `result` // ```c - // (!CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER)) && LINK_IS_ADULT + // true + // ``` + // #### `args` + // - BgHakaShip* + // - PlayState* + VB_SHADOW_SHIP_SET_SPEED, + + // #### `result` + // ```c + // (!CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && + // !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER)) && LINK_IS_ADULT // ``` // #### `args` // - None @@ -1658,6 +1901,15 @@ typedef enum { // - `*VBFishingData` VB_SHOULD_SET_FISHING_RECORD, + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - `*s8 iter2` + // - `s8 sp3C[4]` + VB_SHOULD_QUICKSPIN, + // #### `result` // ```c // (interactedActor->id == ACTOR_BG_TOKI_SWD) && LINK_IS_ADULT @@ -1674,6 +1926,22 @@ typedef enum { // - None VB_SHOW_TITLE_CARD, + // #### `result` + // ```c + // (collectible >= 0) && (collectible <= 0x19 + // ``` + // #### `args` + // - `*ObjKibako` + VB_SMALL_CRATE_DROP_ITEM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ObjKibako` + VB_SMALL_CRATE_SETUP_DRAW, + // #### `result` // ```c // false @@ -1690,6 +1958,14 @@ typedef enum { // - `*ObjBean` VB_SPAWN_BEAN_STALK_FAIRIES, + // #### `result` + // ```c + // this->timer >= 60 + // ``` + // #### `args` + // - `None` + VB_SPAWN_BEAN_SKULLTULA, + // #### `result` // ```c // true @@ -1697,25 +1973,25 @@ typedef enum { // #### `args` // ##### In `z_boss_dodongo.c`: // - `*BossDodongo` - // + // // ##### In `z_boss_fd2.c` // - `*BossFd2` - // + // // ##### In `z_boss_ganondrof.c`: // - `*BossGanondrof` - // + // // ##### In `z_boss_goma.c`: // - `*BossGoma` - // + // // ##### In `z_boss_mo.c`: // - `*BossMo` - // + // // ##### In `z_boss_sst.c`: // - `*BossSst` - // + // // ##### In `z_boss_tw.c`: // - `*BossTw` - // + // // ##### In `z_boss_va.c`: // - `*BossVa` VB_SPAWN_BLUE_WARP, @@ -1773,6 +2049,24 @@ typedef enum { // - `*ShotSun` VB_SPAWN_SONG_FAIRY, + // #### `result` + // ```c + // varies, never set should to true + // ``` + // #### `args` + // - `*Actor` + // - `*s16` - timer value + VB_SWITCH_TIMER_TICK, + + // #### `result` + // ```c + // (this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) && (this->heldActor != NULL) && + // CHECK_BTN_ANY(sControlInput->press.button, buttonsToCheck) + // ``` + // #### `args` + // - `*Input` + VB_THROW_OR_PUT_DOWN_HELD_ITEM, + // #### `result` // ```c // true @@ -1853,6 +2147,22 @@ typedef enum { // - `*PauseContext` VB_TRANSITION_TO_SAVE_SCREEN_ON_DEATH, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnWood02` + VB_TREE_DROP_COLLECTIBLE, + + // ```c + // true + // ``` + // #### `args` + // - `int32_t` (button - promoted from `u8`) + // - `int32_t` (item - promoted from `u8`) + VB_UPDATE_BOTTLE_ITEM, + // #### `result` // ```c // INV_CONTENT(ITEM_ODD_MUSHROOM) == ITEM_EYEDROPS @@ -1860,7 +2170,7 @@ typedef enum { // #### `args` // - `*EnMk` VB_USE_EYEDROP_DIALOGUE, - + // #### `result` // ```c // true @@ -1868,4 +2178,50 @@ typedef enum { // #### `args` // - `*EnWonderTalk2` VB_WONDER_TALK, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` + VB_TRIGGER_VOIDOUT, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` + VB_TORCH2_HANDLE_CLANKING, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` + VB_RECIEVE_FALL_DAMAGE, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnRr` + VB_LIKE_LIKE_GRAB_PLAYER, + + // #### `result` + // ```c + // entry != NULL + // ``` + // #### `args` + // - `*AnimationEntry` + // - `*LinkAnimationHeader` + // - `s32` frame + // - `s32` limbCount + // - `*Vec3s` frameTable + VB_LOAD_PLAYER_ANIMATION_FRAME, } GIVanillaBehavior; + +#endif diff --git a/soh/soh/Enhancements/gameconsole.c b/soh/soh/Enhancements/gameconsole.c index da0c7cf979..6992b7fb45 100644 --- a/soh/soh/Enhancements/gameconsole.c +++ b/soh/soh/Enhancements/gameconsole.c @@ -17,4 +17,5 @@ extern PlayState* gPlayState; -void GameConsole_Init() {} \ No newline at end of file +void GameConsole_Init() { +} \ No newline at end of file diff --git a/soh/soh/Enhancements/gameconsole.h b/soh/soh/Enhancements/gameconsole.h index e9a3634a1d..0952baf08a 100644 --- a/soh/soh/Enhancements/gameconsole.h +++ b/soh/soh/Enhancements/gameconsole.h @@ -8,22 +8,19 @@ #define MAX_CVARS 2048 #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif -typedef enum -{ +typedef enum { CONSOLECOMMAND_RESULT_SUCCESS, CONSOLECOMMAND_RESULT_INVALIDARGS, CONSOLECOMMAND_RESULT_INVALIDCOMMAND, CONSOLECOMMAND_RESULT_FAILURE } ConsoleCommandResult; -typedef ConsoleCommandResult(*ConsoleCommandFunc)(char** argv, s32 argc); // Returns the number of arguments it read +typedef ConsoleCommandResult (*ConsoleCommandFunc)(char** argv, s32 argc); // Returns the number of arguments it read -typedef struct ConsoleCommand -{ +typedef struct ConsoleCommand { char* name; ConsoleCommandFunc func; char* description; diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index aff0d07267..ca360543fa 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -1,11 +1,11 @@ #include "gameplaystats.h" -#include "gameplaystatswindow.h" #include "soh/SaveManager.h" #include "functions.h" #include "macros.h" #include "soh/cvar_prefixes.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "soh/util.h" #include @@ -35,7 +35,7 @@ const char* const sceneMappings[] = { "Ice Cavern", "Ganon's Tower", "Gerudo Training Ground", - "Theives' Hideout", + "Thieves' Hideout", "Inside Ganon's Castle", "Tower Collapse", "Castle Collapse", @@ -124,7 +124,7 @@ const char* const sceneMappings[] = { "Goron City", "Lon Lon Ranch", "Outside Ganon's Castle", - //Debug Rooms + // Debug Rooms "Test Map", "Test Room", "Depth Test", @@ -189,7 +189,7 @@ const char* const countMappings[] = { "Poe Sisters:", "Redead:", "Shabom:", - "Shellblade:", + "Shell Blade:", "Skull Kid:", "Skulltula:", "Skulltula (Big):", @@ -230,15 +230,15 @@ const char* const countMappings[] = { "Start:", }; -#define COLOR_WHITE ImVec4(1.00f, 1.00f, 1.00f, 1.00f) -#define COLOR_RED ImVec4(1.00f, 0.00f, 0.00f, 1.00f) -#define COLOR_GREEN ImVec4(0.10f, 1.00f, 0.10f, 1.00f) -#define COLOR_BLUE ImVec4(0.00f, 0.33f, 1.00f, 1.00f) -#define COLOR_PURPLE ImVec4(0.54f, 0.19f, 0.89f, 1.00f) -#define COLOR_YELLOW ImVec4(1.00f, 1.00f, 0.00f, 1.00f) -#define COLOR_ORANGE ImVec4(1.00f, 0.67f, 0.11f, 1.00f) +#define COLOR_WHITE ImVec4(1.00f, 1.00f, 1.00f, 1.00f) +#define COLOR_RED ImVec4(1.00f, 0.00f, 0.00f, 1.00f) +#define COLOR_GREEN ImVec4(0.10f, 1.00f, 0.10f, 1.00f) +#define COLOR_BLUE ImVec4(0.00f, 0.33f, 1.00f, 1.00f) +#define COLOR_PURPLE ImVec4(0.54f, 0.19f, 0.89f, 1.00f) +#define COLOR_YELLOW ImVec4(1.00f, 1.00f, 0.00f, 1.00f) +#define COLOR_ORANGE ImVec4(1.00f, 0.67f, 0.11f, 1.00f) #define COLOR_LIGHT_BLUE ImVec4(0.00f, 0.88f, 1.00f, 1.00f) -#define COLOR_GREY ImVec4(0.78f, 0.78f, 0.78f, 1.00f) +#define COLOR_GREY ImVec4(0.78f, 0.78f, 0.78f, 1.00f) char itemTimestampDisplayName[TIMESTAMP_MAX][21] = { "" }; ImVec4 itemTimestampDisplayColor[TIMESTAMP_MAX]; @@ -248,14 +248,14 @@ typedef struct { u32 time; ImVec4 color; bool isRoom; -}TimestampInfo; +} TimestampInfo; // Timestamps are an array of structs, each with a name, time, and color -// Names and colors are set up at the bottom of this file -// Times are stored in gSaveContext.ship.stats.itemTimestamp +// Names and colors are set up at the bottom of this file. +// Times are stored in gSaveContext.ship.stats.itemTimestamp. TimestampInfo itemTimestampDisplay[TIMESTAMP_MAX]; TimestampInfo sceneTimestampDisplay[8191]; -//std::vector sceneTimestampDisplay; +// std::vector sceneTimestampDisplay; std::string formatTimestampGameplayStat(uint32_t value) { uint32_t sec = value / 10; @@ -302,37 +302,38 @@ void LoadStatsVersion1() { SaveManager::Instance->LoadData("fileCreatedAt", gSaveContext.ship.stats.fileCreatedAt); SaveManager::Instance->LoadData("playTimer", gSaveContext.ship.stats.playTimer); SaveManager::Instance->LoadData("pauseTimer", gSaveContext.ship.stats.pauseTimer); - SaveManager::Instance->LoadArray("itemTimestamps", ARRAY_COUNT(gSaveContext.ship.stats.itemTimestamp), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.ship.stats.itemTimestamp[i]); - }); - SaveManager::Instance->LoadArray("sceneTimestamps", ARRAY_COUNT(gSaveContext.ship.stats.sceneTimestamps), [&](size_t i) { - SaveManager::Instance->LoadStruct("", [&]() { - int scene, room, sceneTime, roomTime, isRoom; - SaveManager::Instance->LoadData("scene", scene); - SaveManager::Instance->LoadData("room", room); - SaveManager::Instance->LoadData("sceneTime", sceneTime); - SaveManager::Instance->LoadData("roomTime", roomTime); - SaveManager::Instance->LoadData("isRoom", isRoom); - if (scene == 0 && room == 0 && sceneTime == 0 && roomTime == 0 && isRoom == 0) { - return; - } - gSaveContext.ship.stats.sceneTimestamps[i].scene = scene; - gSaveContext.ship.stats.sceneTimestamps[i].room = room; - gSaveContext.ship.stats.sceneTimestamps[i].sceneTime = sceneTime; - gSaveContext.ship.stats.sceneTimestamps[i].roomTime = roomTime; - gSaveContext.ship.stats.sceneTimestamps[i].isRoom = isRoom; + SaveManager::Instance->LoadArray( + "itemTimestamps", ARRAY_COUNT(gSaveContext.ship.stats.itemTimestamp), + [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.ship.stats.itemTimestamp[i]); }); + SaveManager::Instance->LoadArray( + "sceneTimestamps", ARRAY_COUNT(gSaveContext.ship.stats.sceneTimestamps), [&](size_t i) { + SaveManager::Instance->LoadStruct("", [&]() { + int scene, room, sceneTime, roomTime, isRoom; + SaveManager::Instance->LoadData("scene", scene); + SaveManager::Instance->LoadData("room", room); + SaveManager::Instance->LoadData("sceneTime", sceneTime); + SaveManager::Instance->LoadData("roomTime", roomTime); + SaveManager::Instance->LoadData("isRoom", isRoom); + if (scene == 0 && room == 0 && sceneTime == 0 && roomTime == 0 && isRoom == 0) { + return; + } + gSaveContext.ship.stats.sceneTimestamps[i].scene = scene; + gSaveContext.ship.stats.sceneTimestamps[i].room = room; + gSaveContext.ship.stats.sceneTimestamps[i].sceneTime = sceneTime; + gSaveContext.ship.stats.sceneTimestamps[i].roomTime = roomTime; + gSaveContext.ship.stats.sceneTimestamps[i].isRoom = isRoom; + }); }); - }); SaveManager::Instance->LoadData("tsIdx", gSaveContext.ship.stats.tsIdx); SaveManager::Instance->LoadArray("counts", ARRAY_COUNT(gSaveContext.ship.stats.count), [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.ship.stats.count[i]); }); - SaveManager::Instance->LoadArray("scenesDiscovered", ARRAY_COUNT(gSaveContext.ship.stats.scenesDiscovered), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.ship.stats.scenesDiscovered[i]); - }); - SaveManager::Instance->LoadArray("entrancesDiscovered", ARRAY_COUNT(gSaveContext.ship.stats.entrancesDiscovered), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.ship.stats.entrancesDiscovered[i]); - }); + SaveManager::Instance->LoadArray( + "scenesDiscovered", ARRAY_COUNT(gSaveContext.ship.stats.scenesDiscovered), + [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.ship.stats.scenesDiscovered[i]); }); + SaveManager::Instance->LoadArray( + "entrancesDiscovered", ARRAY_COUNT(gSaveContext.ship.stats.entrancesDiscovered), + [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.ship.stats.entrancesDiscovered[i]); }); } void SaveStats(SaveContext* saveContext, int sectionID, bool fullSave) { @@ -350,47 +351,53 @@ void SaveStats(SaveContext* saveContext, int sectionID, bool fullSave) { SaveManager::Instance->SaveData("fileCreatedAt", saveContext->ship.stats.fileCreatedAt); SaveManager::Instance->SaveData("playTimer", saveContext->ship.stats.playTimer); SaveManager::Instance->SaveData("pauseTimer", saveContext->ship.stats.pauseTimer); - SaveManager::Instance->SaveArray("itemTimestamps", ARRAY_COUNT(saveContext->ship.stats.itemTimestamp), [&](size_t i) { - SaveManager::Instance->SaveData("", saveContext->ship.stats.itemTimestamp[i]); - }); - SaveManager::Instance->SaveArray("sceneTimestamps", ARRAY_COUNT(saveContext->ship.stats.sceneTimestamps), [&](size_t i) { - if (saveContext->ship.stats.sceneTimestamps[i].scene != 254 && saveContext->ship.stats.sceneTimestamps[i].room != 254) { - SaveManager::Instance->SaveStruct("", [&]() { - SaveManager::Instance->SaveData("scene", saveContext->ship.stats.sceneTimestamps[i].scene); - SaveManager::Instance->SaveData("room", saveContext->ship.stats.sceneTimestamps[i].room); - SaveManager::Instance->SaveData("sceneTime", saveContext->ship.stats.sceneTimestamps[i].sceneTime); - SaveManager::Instance->SaveData("roomTime", saveContext->ship.stats.sceneTimestamps[i].roomTime); - SaveManager::Instance->SaveData("isRoom", saveContext->ship.stats.sceneTimestamps[i].isRoom); - }); - } - }); + SaveManager::Instance->SaveArray( + "itemTimestamps", ARRAY_COUNT(saveContext->ship.stats.itemTimestamp), + [&](size_t i) { SaveManager::Instance->SaveData("", saveContext->ship.stats.itemTimestamp[i]); }); + SaveManager::Instance->SaveArray( + "sceneTimestamps", ARRAY_COUNT(saveContext->ship.stats.sceneTimestamps), [&](size_t i) { + if (saveContext->ship.stats.sceneTimestamps[i].scene != 254 && + saveContext->ship.stats.sceneTimestamps[i].room != 254) { + SaveManager::Instance->SaveStruct("", [&]() { + SaveManager::Instance->SaveData("scene", saveContext->ship.stats.sceneTimestamps[i].scene); + SaveManager::Instance->SaveData("room", saveContext->ship.stats.sceneTimestamps[i].room); + SaveManager::Instance->SaveData("sceneTime", saveContext->ship.stats.sceneTimestamps[i].sceneTime); + SaveManager::Instance->SaveData("roomTime", saveContext->ship.stats.sceneTimestamps[i].roomTime); + SaveManager::Instance->SaveData("isRoom", saveContext->ship.stats.sceneTimestamps[i].isRoom); + }); + } + }); SaveManager::Instance->SaveData("tsIdx", saveContext->ship.stats.tsIdx); SaveManager::Instance->SaveArray("counts", ARRAY_COUNT(saveContext->ship.stats.count), [&](size_t i) { SaveManager::Instance->SaveData("", saveContext->ship.stats.count[i]); }); - SaveManager::Instance->SaveArray("scenesDiscovered", ARRAY_COUNT(saveContext->ship.stats.scenesDiscovered), [&](size_t i) { - SaveManager::Instance->SaveData("", saveContext->ship.stats.scenesDiscovered[i]); - }); - SaveManager::Instance->SaveArray("entrancesDiscovered", ARRAY_COUNT(saveContext->ship.stats.entrancesDiscovered), [&](size_t i) { - SaveManager::Instance->SaveData("", saveContext->ship.stats.entrancesDiscovered[i]); - }); + SaveManager::Instance->SaveArray( + "scenesDiscovered", ARRAY_COUNT(saveContext->ship.stats.scenesDiscovered), + [&](size_t i) { SaveManager::Instance->SaveData("", saveContext->ship.stats.scenesDiscovered[i]); }); + SaveManager::Instance->SaveArray( + "entrancesDiscovered", ARRAY_COUNT(saveContext->ship.stats.entrancesDiscovered), + [&](size_t i) { SaveManager::Instance->SaveData("", saveContext->ship.stats.entrancesDiscovered[i]); }); } -void GameplayStatsRow(const char* label, const std::string& value, ImVec4 color = COLOR_WHITE) { +void GameplayStatsRow(const char* label, const std::string& value, ImVec4 color = COLOR_WHITE, + const char* tooltip = "") { ImGui::PushStyleColor(ImGuiCol_Text, color); ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("%s", label); - ImGui::SameLine(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize(value.c_str()).x - 8.0f)); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize(value.c_str()).x)); ImGui::Text("%s", value.c_str()); ImGui::PopStyleColor(); + if (tooltip != "" && ImGui::IsItemHovered()) { + ImGui::SetTooltip("%s", tooltip); + } } bool compareTimestampInfoByTime(const TimestampInfo& a, const TimestampInfo& b) { - return CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.ReverseTimestamps"), 0) ? a.time > b.time : a.time < b.time; + return CVarGetInteger(CVAR_GAMEPLAY_STATS("ReverseTimestamps"), 0) ? a.time > b.time : a.time < b.time; } -const char* ResolveSceneID(int sceneID, int roomID){ +const char* ResolveSceneID(int sceneID, int roomID) { if (sceneID == SCENE_GROTTOS) { switch (roomID) { case 0: @@ -423,7 +430,7 @@ const char* ResolveSceneID(int sceneID, int roomID){ return "Big Skulltula Grotto"; }; } else if (sceneID == SCENE_WINDMILL_AND_DAMPES_GRAVE) { - //Only the last room of Dampe's Grave (rm 6) is considered the windmill + // Only the last room of Dampe's Grave (rm 6) is considered the windmill. return roomID == 6 ? "Windmill" : "Dampe's Grave"; } else if (sceneID < SCENE_ID_MAX) { return sceneMappings[sceneID]; @@ -436,7 +443,7 @@ void DrawGameplayStatsHeader() { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 4.0f, 4.0f }); ImGui::BeginTable("gameplayStatsHeader", 1, ImGuiTableFlags_BordersOuter); ImGui::TableSetupColumn("stat", ImGuiTableColumnFlags_WidthStretch); - //if tag is empty (not a release build) + // if tag is empty (not a release build) if (gGitCommitTag[0] == 0) { GameplayStatsRow("Git Branch:", (char*)gGitBranch); GameplayStatsRow("Git Commit Hash:", (char*)gGitCommitHash); @@ -444,21 +451,30 @@ void DrawGameplayStatsHeader() { GameplayStatsRow("Build Version:", (char*)gBuildVersion); } if (gSaveContext.ship.stats.rtaTiming) { - GameplayStatsRow("Total Time (RTA):", formatTimestampGameplayStat(GAMEPLAYSTAT_TOTAL_TIME), gSaveContext.ship.stats.gameComplete ? COLOR_GREEN : COLOR_WHITE); + GameplayStatsRow("Total Time (RTA):", formatTimestampGameplayStat(GAMEPLAYSTAT_TOTAL_TIME), + gSaveContext.ship.stats.gameComplete ? COLOR_GREEN : COLOR_WHITE); } else { - GameplayStatsRow("Total Game Time:", formatTimestampGameplayStat(GAMEPLAYSTAT_TOTAL_TIME), gSaveContext.ship.stats.gameComplete ? COLOR_GREEN : COLOR_WHITE); + GameplayStatsRow("Total Game Time:", formatTimestampGameplayStat(GAMEPLAYSTAT_TOTAL_TIME), + gSaveContext.ship.stats.gameComplete ? COLOR_GREEN : COLOR_WHITE); } - if (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.ShowAdditionalTimers"), 0)) { // !Only display total game time - GameplayStatsRow("Gameplay Time:", formatTimestampGameplayStat(gSaveContext.ship.stats.playTimer / 2), COLOR_GREY); - GameplayStatsRow("Pause Menu Time:", formatTimestampGameplayStat(gSaveContext.ship.stats.pauseTimer / 3), COLOR_GREY); - GameplayStatsRow("Time in scene:", formatTimestampGameplayStat(gSaveContext.ship.stats.sceneTimer / 2), COLOR_LIGHT_BLUE); - GameplayStatsRow("Time in room:", formatTimestampGameplayStat(gSaveContext.ship.stats.roomTimer / 2), COLOR_LIGHT_BLUE); + if (CVarGetInteger(CVAR_GAMEPLAY_STATS("ShowAdditionalTimers"), 0)) { // !Only display total game time + GameplayStatsRow("Gameplay Time:", formatTimestampGameplayStat(gSaveContext.ship.stats.playTimer / 2), + COLOR_GREY); + GameplayStatsRow("Pause Menu Time:", formatTimestampGameplayStat(gSaveContext.ship.stats.pauseTimer / 3), + COLOR_GREY); + GameplayStatsRow("Time in scene:", formatTimestampGameplayStat(gSaveContext.ship.stats.sceneTimer / 2), + COLOR_LIGHT_BLUE); + GameplayStatsRow("Time in room:", formatTimestampGameplayStat(gSaveContext.ship.stats.roomTimer / 2), + COLOR_LIGHT_BLUE); } - if (gPlayState != NULL && CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.ShowDebugInfo"), 0)) { // && display debug info + if (gPlayState != NULL && CVarGetInteger(CVAR_GAMEPLAY_STATS("ShowDebugInfo"), 0)) { // && display debug info GameplayStatsRow("play->sceneNum:", formatHexGameplayStat(gPlayState->sceneNum), COLOR_YELLOW); - GameplayStatsRow("gSaveContext.entranceIndex:", formatHexGameplayStat(gSaveContext.entranceIndex), COLOR_YELLOW); - GameplayStatsRow("gSaveContext.cutsceneIndex:", formatHexOnlyGameplayStat(gSaveContext.cutsceneIndex), COLOR_YELLOW); - GameplayStatsRow("play->roomCtx.curRoom.num:", formatIntGameplayStat(gPlayState->roomCtx.curRoom.num), COLOR_YELLOW); + GameplayStatsRow("gSaveContext.entranceIndex:", formatHexGameplayStat(gSaveContext.entranceIndex), + COLOR_YELLOW); + GameplayStatsRow("gSaveContext.cutsceneIndex:", formatHexOnlyGameplayStat(gSaveContext.cutsceneIndex), + COLOR_YELLOW); + GameplayStatsRow("play->roomCtx.curRoom.num:", formatIntGameplayStat(gPlayState->roomCtx.curRoom.num), + COLOR_YELLOW); } ImGui::EndTable(); ImGui::PopStyleVar(1); @@ -480,12 +496,12 @@ void DrawGameplayStatsTimestampsTab() { for (int i = 0; i < TIMESTAMP_MAX; i++) { // To be shown, the entry must have a non-zero time and a string for its display name if (itemTimestampDisplay[i].time > 0 && strnlen(itemTimestampDisplay[i].name, 21) > 1) { - GameplayStatsRow(itemTimestampDisplay[i].name, formatTimestampGameplayStat(itemTimestampDisplay[i].time), itemTimestampDisplay[i].color); + GameplayStatsRow(itemTimestampDisplay[i].name, formatTimestampGameplayStat(itemTimestampDisplay[i].time), + itemTimestampDisplay[i].color); } } ImGui::EndTable(); ImGui::PopStyleVar(1); - } void DrawGameplayStatsCountsTab() { @@ -516,7 +532,8 @@ void DrawGameplayStatsCountsTab() { ImGui::TableSetupColumn("stat", ImGuiTableColumnFlags_WidthStretch); GameplayStatsRow("Enemies Defeated:", formatIntGameplayStat(enemiesDefeated)); if (enemiesDefeated > 0) { - ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); if (ImGui::TreeNodeEx("Enemy Details...", ImGuiTreeNodeFlags_NoTreePushOnOpen)) { for (int i = COUNT_ENEMIES_DEFEATED_ANUBIS; i <= COUNT_ENEMIES_DEFEATED_WOLFOS; i++) { if (i == COUNT_ENEMIES_DEFEATED_FLOORMASTER) { @@ -527,13 +544,14 @@ void DrawGameplayStatsCountsTab() { } } } - GameplayStatsRow("Rupees Collected:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_RUPEES_COLLECTED])); - UIWidgets::Tooltip("Includes rupees collected with a full wallet."); + GameplayStatsRow("Rupees Collected:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_RUPEES_COLLECTED]), + COLOR_WHITE, "Includes rupees collected with a full wallet."); GameplayStatsRow("Rupees Spent:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_RUPEES_SPENT])); GameplayStatsRow("Chests Opened:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_CHESTS_OPENED])); GameplayStatsRow("Ammo Used:", formatIntGameplayStat(ammoUsed)); if (ammoUsed > 0) { - ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); if (ImGui::TreeNodeEx("Ammo Details...", ImGuiTreeNodeFlags_NoTreePushOnOpen)) { for (int i = COUNT_AMMO_USED_STICK; i <= COUNT_AMMO_USED_BEAN; i++) { GameplayStatsRow(countMappings[i], formatIntGameplayStat(gSaveContext.ship.stats.count[i])); @@ -544,8 +562,10 @@ void DrawGameplayStatsCountsTab() { GameplayStatsRow("Sword Swings:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_SWORD_SWINGS])); GameplayStatsRow("Steps Taken:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_STEPS])); // If using MM Bunny Hood enhancement, show how long it's been equipped (not counting pause time) - if (CVarGetInteger(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA || gSaveContext.ship.stats.count[COUNT_TIME_BUNNY_HOOD] > 0) { - GameplayStatsRow("Bunny Hood Time:", formatTimestampGameplayStat(gSaveContext.ship.stats.count[COUNT_TIME_BUNNY_HOOD] / 2)); + if (CVarGetInteger(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA || + gSaveContext.ship.stats.count[COUNT_TIME_BUNNY_HOOD] > 0) { + GameplayStatsRow("Bunny Hood Time:", + formatTimestampGameplayStat(gSaveContext.ship.stats.count[COUNT_TIME_BUNNY_HOOD] / 2)); } GameplayStatsRow("Rolls:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_ROLLS])); GameplayStatsRow("Bonks:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_BONKS])); @@ -557,7 +577,8 @@ void DrawGameplayStatsCountsTab() { GameplayStatsRow("Bushes Cut:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_BUSHES_CUT])); GameplayStatsRow("Buttons Pressed:", formatIntGameplayStat(buttonPresses)); if (buttonPresses > 0) { - ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); if (ImGui::TreeNodeEx("Buttons...", ImGuiTreeNodeFlags_NoTreePushOnOpen)) { for (int i = COUNT_BUTTON_PRESSES_A; i <= COUNT_BUTTON_PRESSES_START; i++) { GameplayStatsRow(countMappings[i], formatIntGameplayStat(gSaveContext.ship.stats.count[i])); @@ -570,16 +591,19 @@ void DrawGameplayStatsCountsTab() { void DrawGameplayStatsBreakdownTab() { for (int i = 0; i < gSaveContext.ship.stats.tsIdx; i++) { - std::string sceneName = ResolveSceneID(gSaveContext.ship.stats.sceneTimestamps[i].scene, gSaveContext.ship.stats.sceneTimestamps[i].room); + std::string sceneName = ResolveSceneID(gSaveContext.ship.stats.sceneTimestamps[i].scene, + gSaveContext.ship.stats.sceneTimestamps[i].room); std::string name; - if (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) && gSaveContext.ship.stats.sceneTimestamps[i].scene != SCENE_GROTTOS) { + if (CVarGetInteger(CVAR_GAMEPLAY_STATS("RoomBreakdown"), 0) && + gSaveContext.ship.stats.sceneTimestamps[i].scene != SCENE_GROTTOS) { name = fmt::format("{:s} Room {:d}", sceneName, gSaveContext.ship.stats.sceneTimestamps[i].room); } else { name = sceneName; } strcpy(sceneTimestampDisplay[i].name, name.c_str()); - sceneTimestampDisplay[i].time = CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) ? - gSaveContext.ship.stats.sceneTimestamps[i].roomTime : gSaveContext.ship.stats.sceneTimestamps[i].sceneTime; + sceneTimestampDisplay[i].time = CVarGetInteger(CVAR_GAMEPLAY_STATS("RoomBreakdown"), 0) + ? gSaveContext.ship.stats.sceneTimestamps[i].roomTime + : gSaveContext.ship.stats.sceneTimestamps[i].sceneTime; sceneTimestampDisplay[i].color = COLOR_GREY; sceneTimestampDisplay[i].isRoom = gSaveContext.ship.stats.sceneTimestamps[i].isRoom; } @@ -589,14 +613,16 @@ void DrawGameplayStatsBreakdownTab() { ImGui::TableSetupColumn("stat", ImGuiTableColumnFlags_WidthStretch); for (int i = 0; i < gSaveContext.ship.stats.tsIdx; i++) { TimestampInfo tsInfo = sceneTimestampDisplay[i]; - bool canShow = !tsInfo.isRoom || CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0); + bool canShow = !tsInfo.isRoom || CVarGetInteger(CVAR_GAMEPLAY_STATS("RoomBreakdown"), 0); if (tsInfo.time > 0 && strnlen(tsInfo.name, 40) > 1 && canShow) { GameplayStatsRow(tsInfo.name, formatTimestampGameplayStat(tsInfo.time), tsInfo.color); } } std::string toPass; - if (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) && gSaveContext.ship.stats.sceneNum != SCENE_GROTTOS) { - toPass = fmt::format("{:s} Room {:d}", ResolveSceneID(gSaveContext.ship.stats.sceneNum, gSaveContext.ship.stats.roomNum), gSaveContext.ship.stats.roomNum); + if (CVarGetInteger(CVAR_GAMEPLAY_STATS("RoomBreakdown"), 0) && gSaveContext.ship.stats.sceneNum != SCENE_GROTTOS) { + toPass = fmt::format("{:s} Room {:d}", + ResolveSceneID(gSaveContext.ship.stats.sceneNum, gSaveContext.ship.stats.roomNum), + gSaveContext.ship.stats.roomNum); } else { toPass = ResolveSceneID(gSaveContext.ship.stats.sceneNum, gSaveContext.ship.stats.roomNum); } @@ -606,26 +632,36 @@ void DrawGameplayStatsBreakdownTab() { } void DrawGameplayStatsOptionsTab() { - UIWidgets::PaddedEnhancementCheckbox("Show in-game total timer", CVAR_ENHANCEMENT("GameplayStats.ShowIngameTimer"), true, false); - UIWidgets::InsertHelpHoverText("Keep track of the timer as an in-game HUD element. The position of the timer can be changed in the Cosmetics Editor."); - UIWidgets::PaddedEnhancementCheckbox("Show latest timestamps on top", CVAR_ENHANCEMENT("GameplayStats.ReverseTimestamps"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Room Breakdown", CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), true, false); - ImGui::SameLine(); - UIWidgets::InsertHelpHoverText("Allows a more in-depth perspective of time spent in a certain map."); - UIWidgets::PaddedEnhancementCheckbox("RTA Timing on new files", CVAR_ENHANCEMENT("GameplayStats.RTATiming"), true, false); - ImGui::SameLine(); - UIWidgets::InsertHelpHoverText( - "Timestamps are relative to starting timestamp rather than in game time, usually necessary for races/speedruns.\n\n" - "Starting timestamp is on first non-c-up input after intro cutscene.\n\n" - "NOTE: THIS NEEDS TO BE SET BEFORE CREATING A FILE TO TAKE EFFECT" - ); - UIWidgets::PaddedEnhancementCheckbox("Show additional detail timers", CVAR_ENHANCEMENT("GameplayStats.ShowAdditionalTimers"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Show Debug Info", CVAR_ENHANCEMENT("GameplayStats.ShowDebugInfo")); + UIWidgets::CVarCheckbox("Show in-game total timer", CVAR_GAMEPLAY_STATS("ShowIngameTimer"), + UIWidgets::CheckboxOptions() + .Tooltip("Keep track of the timer as an in-game HUD element. The position of the " + "timer can be changed in the Cosmetics Editor.") + .Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Show latest timestamps on top", CVAR_GAMEPLAY_STATS("ReverseTimestamps"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Room Breakdown", CVAR_GAMEPLAY_STATS("RoomBreakdown"), + UIWidgets::CheckboxOptions() + .Tooltip("Allows a more in-depth perspective of time spent in a certain map.") + .Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("RTA Timing on new files", CVAR_GAMEPLAY_STATS("RTATiming"), + UIWidgets::CheckboxOptions() + .Tooltip("Timestamps are relative to starting timestamp rather than in game time, " + "usually necessary for races/speedruns.\n\n" + "Starting timestamp is on first non-C-up input after intro cutscene.\n\n" + "NOTE: THIS NEEDS TO BE SET BEFORE CREATING A FILE TO TAKE EFFECT") + .Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Show additional detail timers", CVAR_GAMEPLAY_STATS("ShowAdditionalTimers"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Show Debug Info", CVAR_GAMEPLAY_STATS("ShowDebugInfo"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); } void GameplayStatsWindow::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); DrawGameplayStatsHeader(); + UIWidgets::PushStyleTabs(THEME_COLOR); + if (ImGui::BeginTabBar("Stats", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { if (ImGui::BeginTabItem("Timestamps")) { DrawGameplayStatsTimestampsTab(); @@ -646,6 +682,9 @@ void GameplayStatsWindow::DrawElement() { ImGui::EndTabBar(); } + UIWidgets::PopStyleTabs(); + ImGui::PopFont(); + ImGui::Text("Note: Gameplay stats are saved to the current file and will be\nlost if you quit without saving."); } void InitStats(bool isDebug) { @@ -654,7 +693,7 @@ void InitStats(bool isDebug) { for (int dungeon = 0; dungeon < ARRAY_COUNT(gSaveContext.ship.stats.dungeonKeys); dungeon++) { gSaveContext.ship.stats.dungeonKeys[dungeon] = isDebug ? 8 : 0; } - gSaveContext.ship.stats.rtaTiming = CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RTATiming"), 0); + gSaveContext.ship.stats.rtaTiming = CVarGetInteger(CVAR_GAMEPLAY_STATS("RTATiming"), 0); gSaveContext.ship.stats.fileCreatedAt = 0; gSaveContext.ship.stats.playTimer = 0; gSaveContext.ship.stats.pauseTimer = 0; @@ -676,7 +715,8 @@ void InitStats(bool isDebug) { for (int scenesIdx = 0; scenesIdx < ARRAY_COUNT(gSaveContext.ship.stats.scenesDiscovered); scenesIdx++) { gSaveContext.ship.stats.scenesDiscovered[scenesIdx] = 0; } - for (int entrancesIdx = 0; entrancesIdx < ARRAY_COUNT(gSaveContext.ship.stats.entrancesDiscovered); entrancesIdx++) { + for (int entrancesIdx = 0; entrancesIdx < ARRAY_COUNT(gSaveContext.ship.stats.entrancesDiscovered); + entrancesIdx++) { gSaveContext.ship.stats.entrancesDiscovered[entrancesIdx] = 0; } @@ -692,6 +732,7 @@ void SetupDisplayNames() { // To add a timestamp for an item or event, add it to this list and ensure // it has a corresponding entry in the enum (see gameplaystats.h) + // clang-format off strcpy(itemTimestampDisplayName[ITEM_BOW], "Fairy Bow: "); strcpy(itemTimestampDisplayName[ITEM_ARROW_FIRE], "Fire Arrows: "); strcpy(itemTimestampDisplayName[ITEM_DINS_FIRE], "Din's Fire: "); @@ -782,6 +823,7 @@ void SetupDisplayNames() { strcpy(itemTimestampDisplayName[TIMESTAMP_BOSSRUSH_FINISH], "Boss Rush Finished: "); strcpy(itemTimestampDisplayName[TIMESTAMP_FOUND_GREG], "Greg Found: "); strcpy(itemTimestampDisplayName[TIMESTAMP_TRIFORCE_COMPLETED], "Triforce Completed: "); + // clang-format on } void SetupDisplayColors() { @@ -850,9 +892,9 @@ void GameplayStatsWindow::InitElement() { SetupDisplayColors(); SaveManager::Instance->AddLoadFunction("sohStats", 1, LoadStatsVersion1); - // Add main section save, no parent + // Add main section save, no parent. SaveManager::Instance->AddSaveFunction("sohStats", 1, SaveStats, true, SECTION_PARENT_NONE); - // Add subsections, parent of "sohStats". Not sure how to do this without the redundant references to "SaveStats" + // Add subsections, parent of "sohStats". Not sure how to do this without the redundant references to "SaveStats". SaveManager::Instance->AddSaveFunction("entrances", 1, SaveStats, false, SECTION_ID_STATS); SaveManager::Instance->AddSaveFunction("scenes", 1, SaveStats, false, SECTION_ID_STATS); SaveManager::Instance->AddInitFunction(InitStats); diff --git a/soh/soh/Enhancements/gameplaystats.h b/soh/soh/Enhancements/gameplaystats.h index 81190c01eb..1f89cb3a43 100644 --- a/soh/soh/Enhancements/gameplaystats.h +++ b/soh/soh/Enhancements/gameplaystats.h @@ -6,30 +6,32 @@ #ifdef __cplusplus extern "C" { #endif - uint64_t GetUnixTimestamp(void); - char* GameplayStats_GetCurrentTime(); +uint64_t GetUnixTimestamp(void); +char* GameplayStats_GetCurrentTime(); #ifdef __cplusplus }; #endif // When using RTA timing - // get the diff since the save was created, - // unless the game is complete in which we use the defeated ganon timestamp +// get the diff since the save was created, +// unless the game is complete in which we use the defeated ganon timestamp // When not using RTA timing - // Total gameplay time is tracked in tenths of seconds - // I.E. game time counts frames at 20fps/2, pause time counts frames at 30fps/3 - // Frame counts in z_play.c and z_kaleido_scope_call.c -#define GAMEPLAYSTAT_TOTAL_TIME (gSaveContext.ship.stats.rtaTiming ?\ - (!gSaveContext.ship.stats.gameComplete ?\ - (!gSaveContext.ship.stats.fileCreatedAt ? 0 : ((GetUnixTimestamp() - gSaveContext.ship.stats.fileCreatedAt) / 100)) :\ - (gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] \ +// Total gameplay time is tracked in tenths of seconds +// I.E. game time counts frames at 20fps/2, pause time counts frames at 30fps/3 +// Frame counts in z_play.c and z_kaleido_scope_call.c +#define GAMEPLAYSTAT_TOTAL_TIME \ + (gSaveContext.ship.stats.rtaTiming \ + ? (!gSaveContext.ship.stats.gameComplete \ + ? (!gSaveContext.ship.stats.fileCreatedAt \ + ? 0 \ + : ((GetUnixTimestamp() - gSaveContext.ship.stats.fileCreatedAt) / 100)) \ + : (gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] \ ? gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] \ : gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_TRIFORCE_COMPLETED])) \ - :\ - (gSaveContext.ship.stats.playTimer / 2 + gSaveContext.ship.stats.pauseTimer / 3)) -#define CURRENT_MODE_TIMER (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) ?\ - gSaveContext.ship.stats.roomTimer :\ - gSaveContext.ship.stats.sceneTimer) + : (gSaveContext.ship.stats.playTimer / 2 + gSaveContext.ship.stats.pauseTimer / 3)) +#define CURRENT_MODE_TIMER \ + (CVarGetInteger(CVAR_GAMEPLAY_STATS("RoomBreakdown"), 0) ? gSaveContext.ship.stats.roomTimer \ + : gSaveContext.ship.stats.sceneTimer) void InitStatTracker(); @@ -37,22 +39,22 @@ typedef enum { // 0x00 to 0x9B (0 to 155) used for getting items, // piggybacked off enum "ItemID" in z64item.h - /* 0xA0 */ TIMESTAMP_DEFEAT_GOHMA = 0xA0, // z_boss_goma.c - /* 0xA1 */ TIMESTAMP_DEFEAT_KING_DODONGO, // z_boss_dodongo.c - /* 0xA2 */ TIMESTAMP_DEFEAT_BARINADE, // z_boss_va.c - /* 0xA3 */ TIMESTAMP_DEFEAT_PHANTOM_GANON, // z_boss_ganondrof.c - /* 0xA4 */ TIMESTAMP_DEFEAT_VOLVAGIA, // z_boss_fd2.c - /* 0xA5 */ TIMESTAMP_DEFEAT_MORPHA, // z_boss_mo.c - /* 0xA6 */ TIMESTAMP_DEFEAT_BONGO_BONGO, // z_boss_sst.c - /* 0xA7 */ TIMESTAMP_DEFEAT_TWINROVA, // z_boss_tw.c - /* 0xA8 */ TIMESTAMP_DEFEAT_GANONDORF, // z_boss_ganon.c - /* 0xA9 */ TIMESTAMP_DEFEAT_GANON, // z_boss_ganon2.c - /* 0xA9 */ TIMESTAMP_BOSSRUSH_FINISH, // z_boss_ganon2.c - /* 0xAA */ TIMESTAMP_FOUND_GREG, // z_parameter.c - /* 0xAA */ TIMESTAMP_TRIFORCE_COMPLETED, // z_parameter.c + /* 0xA0 */ TIMESTAMP_DEFEAT_GOHMA = 0xA0, // z_boss_goma.c + /* 0xA1 */ TIMESTAMP_DEFEAT_KING_DODONGO, // z_boss_dodongo.c + /* 0xA2 */ TIMESTAMP_DEFEAT_BARINADE, // z_boss_va.c + /* 0xA3 */ TIMESTAMP_DEFEAT_PHANTOM_GANON, // z_boss_ganondrof.c + /* 0xA4 */ TIMESTAMP_DEFEAT_VOLVAGIA, // z_boss_fd2.c + /* 0xA5 */ TIMESTAMP_DEFEAT_MORPHA, // z_boss_mo.c + /* 0xA6 */ TIMESTAMP_DEFEAT_BONGO_BONGO, // z_boss_sst.c + /* 0xA7 */ TIMESTAMP_DEFEAT_TWINROVA, // z_boss_tw.c + /* 0xA8 */ TIMESTAMP_DEFEAT_GANONDORF, // z_boss_ganon.c + /* 0xA9 */ TIMESTAMP_DEFEAT_GANON, // z_boss_ganon2.c + /* 0xA9 */ TIMESTAMP_BOSSRUSH_FINISH, // z_boss_ganon2.c + /* 0xAA */ TIMESTAMP_FOUND_GREG, // z_parameter.c + /* 0xAA */ TIMESTAMP_TRIFORCE_COMPLETED, // z_parameter.c /* 0xAB */ TIMESTAMP_MAX -}GameplayStatTimestamp; +} GameplayStatTimestamp; typedef enum { // Enemies defeated diff --git a/soh/soh/Enhancements/gameplaystatswindow.h b/soh/soh/Enhancements/gameplaystatswindow.h index 453b24559c..515820307d 100644 --- a/soh/soh/Enhancements/gameplaystatswindow.h +++ b/soh/soh/Enhancements/gameplaystatswindow.h @@ -1,11 +1,10 @@ #include -#include "gameplaystats.h" -class GameplayStatsWindow : public Ship::GuiWindow { +class GameplayStatsWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; \ No newline at end of file diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.h b/soh/soh/Enhancements/item-tables/ItemTableManager.h index e20632f387..8420e68976 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.h +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.h @@ -8,16 +8,16 @@ typedef std::unordered_map ItemTable; class ItemTableManager { public: - static ItemTableManager* Instance; - ItemTableManager(); - ~ItemTableManager(); - bool AddItemTable(uint16_t tableID); - bool AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry); - GetItemEntry RetrieveItemEntry(uint16_t tableID, uint16_t getItemID); - bool ClearItemTable(uint16_t tableID); + static ItemTableManager* Instance; + ItemTableManager(); + ~ItemTableManager(); + bool AddItemTable(uint16_t tableID); + bool AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry); + GetItemEntry RetrieveItemEntry(uint16_t tableID, uint16_t getItemID); + bool ClearItemTable(uint16_t tableID); private: - std::unordered_map itemTables; + std::unordered_map itemTables; - ItemTable* RetrieveItemTable(uint16_t tableID); + ItemTable* RetrieveItemTable(uint16_t tableID); }; diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index d9d7427177..df59d67704 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -29,11 +29,18 @@ typedef enum GetItemCategory { /* 0x05 */ ITEM_CATEGORY_MAJOR, } GetItemCategory; -#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, getItemId) \ - { itemId, field, (int16_t)((chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1)), textId, objectId, modIndex, modIndex, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, itemId, modIndex, NULL } +#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, getItemId) \ + { \ + itemId, field, (int16_t)((chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1)), textId, objectId, modIndex, \ + modIndex, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, itemId, modIndex, NULL \ + } -#define GET_ITEM_CUSTOM_TABLE(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, tableId, getItemId) \ - { itemId, field, (int16_t)((chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1)), textId, objectId, modIndex, tableId, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, itemId, modIndex, NULL } +#define GET_ITEM_CUSTOM_TABLE(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, tableId, \ + getItemId) \ + { \ + itemId, field, (int16_t)((chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1)), textId, objectId, modIndex, \ + tableId, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, itemId, modIndex, NULL \ + } #define GET_ITEM_NONE \ { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, ITEM_NONE, 0, NULL } @@ -50,13 +57,16 @@ typedef struct GetItemEntry { /* 0x03 */ uint16_t textId; /* 0x04 */ uint16_t objectId; /* 0x06 */ uint16_t modIndex; // Primarily used for determining whether to use Item_Give or Randomizer_Item_Give - /* 0x07 */ uint16_t tableId; // GetItemEntry table this entry is in (usually the same as modIndex, but not always) + /* 0x07 */ uint16_t tableId; // GetItemEntry table this entry is in (usually the same as modIndex, but not always) /* 0x08 */ int16_t getItemId; /* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference. - /* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. + /* 0x0C */ uint16_t + collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. /* 0x0E */ GetItemFrom getItemFrom; /* 0x0F */ GetItemCategory getItemCategory; // Primarily made and used for chest size/texture matches contents - /* 0x10 */ uint16_t drawItemId; // Will be a copy of itemId unless the item is an ice trap. Needed for particles to function on ice traps. - /* 0x11 */ uint16_t drawModIndex; // Will be a copy of modIndex unless the item is an ice trap. Needed for particles to function on ice traps. + /* 0x10 */ uint16_t drawItemId; // Will be a copy of itemId unless the item is an ice trap. Needed for particles to + // function on ice traps. + /* 0x11 */ uint16_t drawModIndex; // Will be a copy of modIndex unless the item is an ice trap. Needed for particles + // to function on ice traps. CustomDrawFunc drawFunc; } GetItemEntry; // size = 0x11 diff --git a/soh/soh/Enhancements/kaleido.cpp b/soh/soh/Enhancements/kaleido.cpp index 4cddeef43e..eef19b4952 100644 --- a/soh/soh/Enhancements/kaleido.cpp +++ b/soh/soh/Enhancements/kaleido.cpp @@ -1,6 +1,7 @@ #include "kaleido.h" #include "soh/frame_interpolation.h" +#include "soh/ShipUtils.h" extern "C" { #include "z64.h" @@ -26,444 +27,423 @@ void KaleidoScope_MoveCursorToSpecialPos(PlayState* play, u16 specialPos); namespace Rando { - void KaleidoEntryIcon::LoadIconTex(std::vector* mEntryDl) { - if (mIconFormat == G_IM_FMT_IA) { - if (mIconSize == G_IM_SIZ_8b) { - Gfx iconTexture[] = { gsDPLoadTextureBlock(mIconResourceName, G_IM_FMT_IA, G_IM_SIZ_8b, mIconWidth, mIconHeight, 0, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOLOD) }; - mEntryDl->insert(mEntryDl->end(), std::begin(iconTexture), std::end(iconTexture)); - } - } else if (mIconFormat == G_IM_FMT_RGBA) { - if (mIconSize == G_IM_SIZ_32b) { - Gfx iconTexture[] = { gsDPLoadTextureBlock(mIconResourceName, G_IM_FMT_RGBA, G_IM_SIZ_32b, mIconWidth, mIconHeight, 0, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOLOD) }; - mEntryDl->insert(mEntryDl->end(), std::begin(iconTexture), std::end(iconTexture)); - } +void KaleidoEntryIcon::LoadIconTex(std::vector* mEntryDl) { + if (mIconFormat == G_IM_FMT_IA) { + if (mIconSize == G_IM_SIZ_8b) { + Gfx iconTexture[] = { gsDPLoadTextureBlock( + mIconResourceName, G_IM_FMT_IA, G_IM_SIZ_8b, mIconWidth, mIconHeight, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; + mEntryDl->insert(mEntryDl->end(), std::begin(iconTexture), std::end(iconTexture)); + } + } else if (mIconFormat == G_IM_FMT_RGBA) { + if (mIconSize == G_IM_SIZ_32b) { + Gfx iconTexture[] = { gsDPLoadTextureBlock( + mIconResourceName, G_IM_FMT_RGBA, G_IM_SIZ_32b, mIconWidth, mIconHeight, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; + mEntryDl->insert(mEntryDl->end(), std::begin(iconTexture), std::end(iconTexture)); } } +} - KaleidoEntry::KaleidoEntry(int16_t x, int16_t y, std::string text) : mX(x), mY(y), mText(std::move(text)) { - mHeight = 0; - mWidth = 0; - vtx = nullptr; +KaleidoEntry::KaleidoEntry(int16_t x, int16_t y, std::string text) : mX(x), mY(y), mText(std::move(text)) { + mHeight = 0; + mWidth = 0; + vtx = nullptr; +} + +void KaleidoEntry::SetYOffset(int yOffset) { + mY = yOffset; +} + +void KaleidoEntryIcon::Draw(PlayState* play, std::vector* mEntryDl) { + if (vtx == nullptr) { + return; + } + size_t numChar = mText.length(); + if (numChar == 0) { + return; } - void KaleidoEntry::SetYOffset(int yOffset) { - mY = yOffset; + Color_RGBA8 textColor = { 255, 255, 255, 255 }; + if (mAchieved) { + textColor = { 0x98, 0xFF, 0x44, 255 }; } - void KaleidoEntryIcon::Draw(PlayState* play, std::vector* mEntryDl) { - if (vtx == nullptr) { - return; - } - size_t numChar = mText.length(); - if (numChar == 0) { - return; - } + Matrix_Translate(mX, mY, 0.0f, MTXMODE_APPLY); - Color_RGBA8 textColor = { 255, 255, 255, 255 }; - if (mAchieved) { - textColor = { 0x98, 0xFF, 0x44, 255 }; - } + mEntryDl->push_back(gsSPMatrix(Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW)); - Matrix_Translate(mX, mY, 0.0f, MTXMODE_APPLY); - - mEntryDl->push_back(gsSPMatrix(Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW)); - - // icon - if (!mAchieved) { - mEntryDl->push_back(gsDPSetGrayscaleColor(109, 109, 109, 255)); - mEntryDl->push_back(gsSPGrayscale(true)); - } - mEntryDl->push_back(gsDPSetPrimColor(0, 0, mIconColor.r, mIconColor.g, mIconColor.b, mIconColor.a)); - mEntryDl->push_back(gsSPVertex(vtx, 4, 0)); - LoadIconTex(mEntryDl); - mEntryDl->push_back(gsSP1Quadrangle(0, 2, 3, 1, 0)); - mEntryDl->push_back(gsSPGrayscale(false)); - - // text - mEntryDl->push_back(gsDPSetPrimColor(0, 0, textColor.r, textColor.g, textColor.b, textColor.a)); - for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { - uint16_t texIndex = mText[i] - 32; - - // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters - // handle loading groups of 16 chars at a time until there are no more left to load. - // By this point 4 vertices have already been loaded for the preceding icon. - if (i % 16 == 0) { - size_t numVtxToLoad = std::min(numChar - i, 16) * 4; - mEntryDl->push_back(gsSPVertex(&vtx[4 + (vtxGroup * 16 * 4)], numVtxToLoad, 0)); - vtxGroup++; - } - - if (texIndex != 0) { - auto texture = reinterpret_cast(Font_FetchCharTexture(texIndex)); - auto vertexStart = static_cast(4 * (i % 16)); - - Gfx charTexture[] = {gsDPLoadTextureBlock_4b(texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, - FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD)}; - mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); - mEntryDl->push_back( - gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); - } - } - mEntryDl->push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); + // icon + if (!mAchieved) { + mEntryDl->push_back(gsDPSetGrayscaleColor(109, 109, 109, 255)); + mEntryDl->push_back(gsSPGrayscale(true)); } + mEntryDl->push_back(gsDPSetPrimColor(0, 0, mIconColor.r, mIconColor.g, mIconColor.b, mIconColor.a)); + mEntryDl->push_back(gsSPVertex(vtx, 4, 0)); + LoadIconTex(mEntryDl); + mEntryDl->push_back(gsSP1Quadrangle(0, 2, 3, 1, 0)); + mEntryDl->push_back(gsSPGrayscale(false)); - Kaleido::Kaleido() { - const auto ctx = Rando::Context::GetInstance(); - int yOffset = 2; - mEntries.push_back(std::make_shared(gRupeeCounterIconTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, - Color_RGBA8{ 0xC8, 0xFF, 0x64, 255 }, FlagType::FLAG_RANDOMIZER_INF, - static_cast(RAND_INF_GREG_FOUND), 0, yOffset, "Greg")); + // text + mEntryDl->push_back(gsDPSetPrimColor(0, 0, textColor.r, textColor.g, textColor.b, textColor.a)); + for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { + // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters + // handle loading groups of 16 chars at a time until there are no more left to load. + // By this point 4 vertices have already been loaded for the preceding icon. + if (i % 16 == 0) { + size_t numVtxToLoad = std::min(numChar - i, 16) * 4; + mEntryDl->push_back(gsSPVertex(&vtx[4 + (vtxGroup * 16 * 4)], numVtxToLoad, 0)); + vtxGroup++; + } + + auto texture = reinterpret_cast(Ship_GetCharFontTexture(mText[i])); + auto vertexStart = static_cast(4 * (i % 16)); + + Gfx charTexture[] = { gsDPLoadTextureBlock_4b(texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; + mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); + mEntryDl->push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); + } + mEntryDl->push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); +} + +Kaleido::Kaleido() { + const auto ctx = Rando::Context::GetInstance(); + int yOffset = 2; + mEntries.push_back(std::make_shared( + gRupeeCounterIconTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, Color_RGBA8{ 0xC8, 0xFF, 0x64, 255 }, + FlagType::FLAG_RANDOMIZER_INF, static_cast(RAND_INF_GREG_FOUND), 0, yOffset, "Greg")); + yOffset += 18; + if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { + mEntries.push_back(std::make_shared( + gTriforcePieceTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, Color_RGBA8{ 255, 255, 255, 255 }, 0, yOffset, + reinterpret_cast(&gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected), + ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_REQUIRED).Get() + 1, + ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_TOTAL).Get() + 1)); yOffset += 18; - if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { - mEntries.push_back( - std::make_shared( - gTriforcePieceTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, Color_RGBA8{ 255,255,255,255 }, 0, - yOffset, reinterpret_cast(&gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected), - ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_REQUIRED).Get() + 1, - ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_TOTAL).Get() + 1)); - yOffset += 18; - } - if (ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS)) { - mEntries.push_back(std::make_shared(0, yOffset)); - yOffset += 18; - } - if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).IsNot(RO_BOSS_SOULS_OFF)) { - static const char* bossSoulNames[] = { - "Gohma's Soul", - "King Dodongo's Soul", - "Barinade's Soul", - "Phantom Ganon's Soul", - "Volvagia's Soul", - "Morpha's Soul", - "Bongo Bongo's Soul", - "Twinrova's Soul", - }; - for (int i = RAND_INF_GOHMA_SOUL; i < RAND_INF_GANON_SOUL; i++) { - mEntries.push_back( - std::make_shared( - gBossSoulTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, Color_RGBA8{ 255, 255, 255, 255 }, - FlagType::FLAG_RANDOMIZER_INF, i, 0, yOffset, bossSoulNames[i - RAND_INF_GOHMA_SOUL] - ) - ); - yOffset += 18; - } - } - if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON)) { - mEntries.push_back( - std::make_shared( - gBossSoulTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, Color_RGBA8{ 255, 255, 255, 255 }, - FlagType::FLAG_RANDOMIZER_INF, RAND_INF_GANON_SOUL, 0, yOffset, "Ganon's Soul" - ) - ); + } + if (ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS)) { + mEntries.push_back(std::make_shared(0, yOffset)); + yOffset += 18; + } + if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).IsNot(RO_BOSS_SOULS_OFF)) { + static const char* bossSoulNames[] = { + "Gohma's Soul", "King Dodongo's Soul", "Barinade's Soul", "Phantom Ganon's Soul", + "Volvagia's Soul", "Morpha's Soul", "Bongo Bongo's Soul", "Twinrova's Soul", + }; + for (int i = RAND_INF_GOHMA_SOUL; i < RAND_INF_GANON_SOUL; i++) { + mEntries.push_back(std::make_shared( + gBossSoulTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, Color_RGBA8{ 255, 255, 255, 255 }, + FlagType::FLAG_RANDOMIZER_INF, i, 0, yOffset, bossSoulNames[i - RAND_INF_GOHMA_SOUL])); yOffset += 18; } } - - extern "C" { - void FrameInterpolation_RecordCloseChild(void); - void FrameInterpolation_RecordOpenChild(const void* a, int b); + if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON)) { + mEntries.push_back(std::make_shared( + gBossSoulTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, Color_RGBA8{ 255, 255, 255, 255 }, + FlagType::FLAG_RANDOMIZER_INF, RAND_INF_GANON_SOUL, 0, yOffset, "Ganon's Soul")); + yOffset += 18; } +} - void Kaleido::Draw(PlayState* play) { - if (play == nullptr || mEntries.empty()) { - return; - } - PauseContext* pauseCtx = &play->pauseCtx; - Input* input = &play->state.input[0]; - mEntryDl.clear(); - OPEN_DISPS(play->state.gfxCtx); - mEntryDl.push_back(gsDPPipeSync()); - Gfx_SetupDL_42Opa(play->state.gfxCtx); - mEntryDl.push_back(gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM)); +extern "C" { +void FrameInterpolation_RecordCloseChild(void); +void FrameInterpolation_RecordOpenChild(const void* a, int b); +} - // Move the matrix origin to the top-left corner of the kaleido page - Matrix_Translate(-108.f, 58.f, 0.0f, MTXMODE_APPLY); - // Invert the matrix to render vertices with positive going down - Matrix_Scale(1.0f, -1.0f, 1.0f, MTXMODE_APPLY); - // The scrolling logic is in here because the built in kaleido input throttling happens - // in its Draw functions, which get called after their update functions. I hate it but fixing - // it would be a much larger Kaleido change. - bool shouldScroll = false; - bool dpad = CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0); - if (((pauseCtx->unk_1E4 == 0) || (pauseCtx->unk_1E4 == 5) || (pauseCtx->unk_1E4 == 8)) && - (pauseCtx->pageIndex == PAUSE_QUEST)) { - if (!((pauseCtx->state != 6) || ((pauseCtx->stickRelX == 0) && (pauseCtx->stickRelY == 0)))) { - if (pauseCtx->cursorSpecialPos == 0) { - if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { - if (mTopIndex > 0) { - mTopIndex--; - shouldScroll = true; - } - } else if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { - if (mTopIndex + mNumVisible < mEntries.size()) { - mTopIndex++; - shouldScroll = true; - } +void Kaleido::Draw(PlayState* play) { + if (play == nullptr || mEntries.empty()) { + return; + } + PauseContext* pauseCtx = &play->pauseCtx; + Input* input = &play->state.input[0]; + mEntryDl.clear(); + OPEN_DISPS(play->state.gfxCtx); + mEntryDl.push_back(gsDPPipeSync()); + Gfx_SetupDL_42Opa(play->state.gfxCtx); + mEntryDl.push_back(gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM)); + + // Move the matrix origin to the top-left corner of the kaleido page + Matrix_Translate(-108.f, 58.f, 0.0f, MTXMODE_APPLY); + // Invert the matrix to render vertices with positive going down + Matrix_Scale(1.0f, -1.0f, 1.0f, MTXMODE_APPLY); + // The scrolling logic is in here because the built in kaleido input throttling happens + // in its Draw functions, which get called after their update functions. I hate it but fixing + // it would be a much larger Kaleido change. + bool shouldScroll = false; + bool dpad = CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0); + if (((pauseCtx->unk_1E4 == 0) || (pauseCtx->unk_1E4 == 5) || (pauseCtx->unk_1E4 == 8)) && + (pauseCtx->pageIndex == PAUSE_QUEST)) { + if (!((pauseCtx->state != 6) || ((pauseCtx->stickRelX == 0) && (pauseCtx->stickRelY == 0)))) { + if (pauseCtx->cursorSpecialPos == 0) { + if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { + if (mTopIndex > 0) { + mTopIndex--; + shouldScroll = true; } - if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { - KaleidoScope_MoveCursorToSpecialPos(play, PAUSE_CURSOR_PAGE_LEFT); - pauseCtx->unk_1E4 = 0; - } else if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { - KaleidoScope_MoveCursorToSpecialPos(play, PAUSE_CURSOR_PAGE_RIGHT); - pauseCtx->unk_1E4 = 0; - } - } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { - if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { - pauseCtx->cursorSpecialPos = 0; - Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - } - } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) { - if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { - pauseCtx->cursorSpecialPos = 0; - Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } else if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { + if (mTopIndex + mNumVisible < mEntries.size()) { + mTopIndex++; + shouldScroll = true; } } - } else if (pauseCtx->cursorSpecialPos != 0 && pauseCtx->state == 7) { - pauseCtx->cursorSpecialPos = 0; + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { + KaleidoScope_MoveCursorToSpecialPos(play, PAUSE_CURSOR_PAGE_LEFT); + pauseCtx->unk_1E4 = 0; + } else if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { + KaleidoScope_MoveCursorToSpecialPos(play, PAUSE_CURSOR_PAGE_RIGHT); + pauseCtx->unk_1E4 = 0; + } + } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { + if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { + pauseCtx->cursorSpecialPos = 0; + Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) { + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { + pauseCtx->cursorSpecialPos = 0; + Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } } - } - int yOffset = 2; - for (int i = mTopIndex; i < (mTopIndex + mNumVisible) && i < mEntries.size(); i++) { - auto& entry = mEntries[i]; - if (shouldScroll) { - entry->SetYOffset(yOffset); - yOffset += 18; - Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - } - Matrix_Push(); - entry->Draw(play, &mEntryDl); - Matrix_Pop(); - } - - mEntryDl.push_back(gsSPEndDisplayList()); - gSPDisplayList(POLY_OPA_DISP++, mEntryDl.data()); - CLOSE_DISPS(play->state.gfxCtx); - } - - void Kaleido::Update(PlayState *play) { - for(int i = mTopIndex; i < (mTopIndex + mNumVisible) && i < mEntries.size(); i++) { - const auto& entry = mEntries[i]; - entry->Update(play); + } else if (pauseCtx->cursorSpecialPos != 0 && pauseCtx->state == 7) { + pauseCtx->cursorSpecialPos = 0; } } - - extern "C" void RandoKaleido_DrawMiscCollectibles(PlayState* play) { - OTRGlobals::Instance->gRandoContext->GetKaleido()->Draw(play); - } - - extern "C" void RandoKaleido_UpdateMiscCollectibles(int16_t inDungeonScene) { - PauseContext* pauseCtx = &gPlayState->pauseCtx; - if (pauseCtx->randoQuestMode && pauseCtx->pageIndex == PAUSE_QUEST) { - OTRGlobals::Instance->gRandoContext->GetKaleido()->Update(gPlayState); + int yOffset = 2; + for (int i = mTopIndex; i < (mTopIndex + mNumVisible) && i < mEntries.size(); i++) { + auto& entry = mEntries[i]; + if (shouldScroll) { + entry->SetYOffset(yOffset); + yOffset += 18; + Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } + Matrix_Push(); + entry->Draw(play, &mEntryDl); + Matrix_Pop(); } - KaleidoEntryIconFlag::KaleidoEntryIconFlag(const char *iconResourceName, int iconFormat, int iconSize, int iconWidth, - int iconHeight, Color_RGBA8 iconColor, FlagType flagType, int flag, - int16_t x, int16_t y, std::string name) : - mFlagType(flagType), mFlag(flag), - KaleidoEntryIcon(iconResourceName, iconFormat, iconSize, iconWidth, iconHeight, iconColor, x, y, std::move(name)) { - BuildVertices(); - } + mEntryDl.push_back(gsSPEndDisplayList()); + gSPDisplayList(POLY_OPA_DISP++, mEntryDl.data()); + CLOSE_DISPS(play->state.gfxCtx); +} - void KaleidoEntryIconFlag::Update(PlayState* play) { - mAchieved = GameInteractor::RawAction::CheckFlag(mFlagType, static_cast(mFlag)); +void Kaleido::Update(PlayState* play) { + for (int i = mTopIndex; i < (mTopIndex + mNumVisible) && i < mEntries.size(); i++) { + const auto& entry = mEntries[i]; + entry->Update(play); } +} - KaleidoEntryIconCountRequired::KaleidoEntryIconCountRequired(const char *iconResourceName, int iconFormat, - int iconSize, int iconWidth, int iconHeight, Color_RGBA8 iconColor, int16_t x, int16_t y, int* watch, - int required, int total) : mWatch(watch), mRequired(required), mTotal(total), - KaleidoEntryIcon(iconResourceName, iconFormat, iconSize, iconWidth, iconHeight, iconColor, x, y) { +extern "C" void RandoKaleido_DrawMiscCollectibles(PlayState* play) { + OTRGlobals::Instance->gRandoContext->GetKaleido()->Draw(play); +} + +extern "C" void RandoKaleido_UpdateMiscCollectibles(int16_t inDungeonScene) { + PauseContext* pauseCtx = &gPlayState->pauseCtx; + if (pauseCtx->randoQuestMode && pauseCtx->pageIndex == PAUSE_QUEST) { + OTRGlobals::Instance->gRandoContext->GetKaleido()->Update(gPlayState); + } +} + +KaleidoEntryIconFlag::KaleidoEntryIconFlag(const char* iconResourceName, int iconFormat, int iconSize, int iconWidth, + int iconHeight, Color_RGBA8 iconColor, FlagType flagType, int flag, + int16_t x, int16_t y, std::string name) + : mFlagType(flagType), mFlag(flag), KaleidoEntryIcon(iconResourceName, iconFormat, iconSize, iconWidth, iconHeight, + iconColor, x, y, std::move(name)) { + BuildVertices(); +} + +void KaleidoEntryIconFlag::Update(PlayState* play) { + mAchieved = GameInteractor::RawAction::CheckFlag(mFlagType, static_cast(mFlag)); +} + +KaleidoEntryIconCountRequired::KaleidoEntryIconCountRequired(const char* iconResourceName, int iconFormat, int iconSize, + int iconWidth, int iconHeight, Color_RGBA8 iconColor, + int16_t x, int16_t y, int* watch, int required, int total) + : mWatch(watch), mRequired(required), mTotal(total), + KaleidoEntryIcon(iconResourceName, iconFormat, iconSize, iconWidth, iconHeight, iconColor, x, y) { + mCount = *mWatch; + BuildText(); + BuildVertices(); +} + +void KaleidoEntryIconCountRequired::BuildText() { + std::ostringstream totals; + totals << mCount; + if (mRequired != 0 && mCount < mRequired) { + totals << '/' << mRequired; + } + if (mTotal >= mRequired && mCount >= mRequired) { + totals << '/' << mTotal; + } + mText = totals.str(); +} + +void KaleidoEntryIcon::BuildVertices() { + int offsetY = 0; + int offsetX = 0; + // 4 vertices per character, plus one for the preceding icon. + Vtx* vertices = (Vtx*)calloc(sizeof(Vtx[4]), mText.length() + 1); + // Vertex for the preceding icon. + Ship_CreateQuadVertexGroup(vertices, offsetX, offsetY, mIconWidth, mIconHeight, 0); + offsetX += 18; + for (size_t i = 0; i < mText.length(); i++) { + int charWidth = static_cast(Ship_GetCharFontWidth(mText[i])); + Ship_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, offsetY, charWidth, 16, 0); + offsetX += charWidth; + } + offsetY += FONT_CHAR_TEX_HEIGHT; + mWidth = static_cast(offsetX); + mHeight = static_cast(offsetY); + + vertices[1].v.ob[0] = 16; + vertices[2].v.ob[1] = 16; + vertices[3].v.ob[0] = 16; + vertices[3].v.ob[1] = 16; + vtx = vertices; +} + +KaleidoEntryIcon::KaleidoEntryIcon(const char* iconResourceName, int iconFormat, int iconSize, int iconWidth, + int iconHeight, Color_RGBA8 iconColor, int16_t x, int16_t y, std::string text) + : mIconResourceName(iconResourceName), mIconFormat(iconFormat), mIconSize(iconSize), mIconWidth(iconWidth), + mIconHeight(iconHeight), mIconColor(iconColor), KaleidoEntry(x, y, std::move(text)) { +} + +void KaleidoEntryIcon::RebuildVertices() { + free(vtx); + vtx = nullptr; + BuildVertices(); +} + +void KaleidoEntryIconCountRequired::Update(PlayState* play) { + if (mCount != *mWatch) { mCount = *mWatch; BuildText(); - BuildVertices(); + RebuildVertices(); + mAchieved = mCount >= mRequired; } +} - void KaleidoEntryIconCountRequired::BuildText() { - std::ostringstream totals; - totals << mCount; - if (mRequired != 0 && mCount < mRequired) { - totals << '/' << mRequired; - } - if (mTotal >= mRequired && mCount >= mRequired) { - totals << '/' << mTotal; - } - mText = totals.str(); +KaleidoEntryOcarinaButtons::KaleidoEntryOcarinaButtons(int16_t x, int16_t y) + : KaleidoEntryIcon(gItemIconOcarinaOfTimeTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, + Color_RGBA8{ 255, 255, 255, 255 }, x, y, "\x9F\xA5\xA6\xA7\xA8") { + CalculateColors(); + BuildVertices(); +} + +void KaleidoEntryOcarinaButtons::CalculateColors() { + Color_RGB8 aButtonColor = { 80, 150, 255 }; + if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.Changed"), 0)) { + aButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.AButton.Value"), aButtonColor); + } else if (CVarGetInteger(CVAR_COSMETIC("DefaultColorScheme"), COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) { + aButtonColor = { 80, 255, 150 }; } - - void KaleidoEntryIcon::BuildVertices() { - int offsetY = 0; - int offsetX = 0; - // 4 vertices per character, plus one for the preceding icon. - Vtx* vertices = (Vtx*)calloc(sizeof(Vtx[4]), mText.length() + 1); - // Vertex for the preceding icon. - Interface_CreateQuadVertexGroup(vertices, offsetX, offsetY, mIconWidth, mIconHeight, 0); - offsetX += 18; - for (size_t i = 0; i < mText.length(); i++) { - auto charIndex = static_cast(mText[i] - 32); - int charWidth = 0; - if (charIndex >= 0) { - charWidth = static_cast(Message_GetCharacterWidth(charIndex) * (100.0f / R_TEXT_CHAR_SCALE)); - } - Interface_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, offsetY, charWidth, 16, 0); - offsetX += charWidth; - } - offsetY += FONT_CHAR_TEX_HEIGHT; - mWidth = static_cast(offsetX); - mHeight = static_cast(offsetY); - - vertices[1].v.ob[0] = 16; - vertices[2].v.ob[1] = 16; - vertices[3].v.ob[0] = 16; - vertices[3].v.ob[1] = 16; - vtx = vertices; + mButtonColors[0] = { aButtonColor.r, aButtonColor.g, aButtonColor.b, 255 }; + Color_RGB8 cButtonsColor = { 255, 255, 50 }; + Color_RGB8 cUpButtonColor = cButtonsColor; + Color_RGB8 cDownButtonColor = cButtonsColor; + Color_RGB8 cLeftButtonColor = cButtonsColor; + Color_RGB8 cRightButtonColor = cButtonsColor; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CButtons.Changed"), 0)) { + cUpButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); + cDownButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); + cLeftButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); + cRightButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); } - - KaleidoEntryIcon::KaleidoEntryIcon(const char *iconResourceName, int iconFormat, int iconSize, int iconWidth, - int iconHeight, Color_RGBA8 iconColor, int16_t x, int16_t y, std::string text) - : mIconResourceName(iconResourceName), mIconFormat(iconFormat), mIconSize(iconSize), - mIconWidth(iconWidth), mIconHeight(iconHeight), mIconColor(iconColor), - KaleidoEntry(x, y, std::move(text)) {} - - void KaleidoEntryIcon::RebuildVertices() { - free(vtx); - vtx = nullptr; - BuildVertices(); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.Changed"), 0)) { + cUpButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CUpButton.Value"), cUpButtonColor); } - - void KaleidoEntryIconCountRequired::Update(PlayState *play) { - if (mCount != *mWatch) { - mCount = *mWatch; - BuildText(); - RebuildVertices(); - mAchieved = mCount >= mRequired; - } - + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.Changed"), 0)) { + cDownButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CDownButton.Value"), cDownButtonColor); } - - KaleidoEntryOcarinaButtons::KaleidoEntryOcarinaButtons(int16_t x, int16_t y) : - KaleidoEntryIcon(gItemIconOcarinaOfTimeTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, - Color_RGBA8{ 255, 255, 255, 255 }, x, y, "\x9F\xA5\xA6\xA7\xA8") { - CalculateColors(); - BuildVertices(); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.Changed"), 0)) { + cLeftButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CLeftButton.Value"), cLeftButtonColor); } - - void KaleidoEntryOcarinaButtons::CalculateColors() { - Color_RGB8 aButtonColor = { 80, 150, 255 }; - if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.Changed"), 0)) { - aButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.AButton.Value"), aButtonColor); - } else if (CVarGetInteger(CVAR_COSMETIC("DefaultColorScheme"), COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) { - aButtonColor = { 80, 255, 150}; - } - mButtonColors[0] = { aButtonColor.r, aButtonColor.g, aButtonColor.b, 255 }; - Color_RGB8 cButtonsColor = { 255, 255, 50 }; - Color_RGB8 cUpButtonColor = cButtonsColor; - Color_RGB8 cDownButtonColor = cButtonsColor; - Color_RGB8 cLeftButtonColor = cButtonsColor; - Color_RGB8 cRightButtonColor = cButtonsColor; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CButtons.Changed"), 0)) { - cUpButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); - cDownButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); - cLeftButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); - cRightButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); - } - if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.Changed"), 0)) { - cUpButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CUpButton.Value"), cUpButtonColor); - } - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.Changed"), 0)) { - cDownButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CDownButton.Value"), cDownButtonColor); - } - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.Changed"), 0)) { - cLeftButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CLeftButton.Value"), cLeftButtonColor); - } - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.Changed"), 0)) { - cRightButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CRightButton.Value"), cRightButtonColor); - } - mButtonColors[1] = { cUpButtonColor.r, cUpButtonColor.g, cUpButtonColor.b, 255 }; - mButtonColors[2] = { cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, 255 }; - mButtonColors[3] = { cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, 255 }; - mButtonColors[4] = { cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, 255 }; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.Changed"), 0)) { + cRightButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CRightButton.Value"), cRightButtonColor); } + mButtonColors[1] = { cUpButtonColor.r, cUpButtonColor.g, cUpButtonColor.b, 255 }; + mButtonColors[2] = { cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, 255 }; + mButtonColors[3] = { cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, 255 }; + mButtonColors[4] = { cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, 255 }; +} - void KaleidoEntryOcarinaButtons::Update(PlayState *play) { - mButtonCollected[0] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_A) > 0; - mButtonCollected[1] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_UP) > 0; - mButtonCollected[2] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_DOWN) > 0; - mButtonCollected[3] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_LEFT) > 0; - mButtonCollected[4] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_RIGHT) > 0; - CalculateColors(); - mAchieved = false; - for (int i = 0; i < mButtonCollected.size(); i++) { - if (!mButtonCollected[i]) { - mButtonColors[i] = Color_RGBA8{ 109, 109, 109, 255 }; - } else { - mAchieved = true; - } +void KaleidoEntryOcarinaButtons::Update(PlayState* play) { + mButtonCollected[0] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_A) > 0; + mButtonCollected[1] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_UP) > 0; + mButtonCollected[2] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_DOWN) > 0; + mButtonCollected[3] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_LEFT) > 0; + mButtonCollected[4] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_RIGHT) > 0; + CalculateColors(); + mAchieved = false; + for (int i = 0; i < mButtonCollected.size(); i++) { + if (!mButtonCollected[i]) { + mButtonColors[i] = Color_RGBA8{ 109, 109, 109, 255 }; + } else { + mAchieved = true; } } +} - void KaleidoEntryOcarinaButtons::Draw(PlayState *play, std::vector* mEntryDl) { - if (vtx == nullptr) { - return; - } - size_t numChar = mText.length(); - if (numChar == 0) { - return; - } - - Matrix_Translate(mX, mY, 0.0f, MTXMODE_APPLY); -// Matrix_Scale(0.75f, 0.75f, 0.75f, MTXMODE_APPLY); - - mEntryDl->push_back(gsSPMatrix(Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW)); - - // icon - if (!mAchieved) { - mEntryDl->push_back(gsDPSetGrayscaleColor(109, 109, 109, 255)); - mEntryDl->push_back(gsSPGrayscale(true)); - } - mEntryDl->push_back(gsDPSetPrimColor(0, 0, mIconColor.r, mIconColor.g, mIconColor.b, mIconColor.a)); - mEntryDl->push_back(gsSPVertex(vtx, 4, 0)); - LoadIconTex(mEntryDl); - mEntryDl->push_back(gsSP1Quadrangle(0, 2, 3, 1, 0)); - mEntryDl->push_back(gsSPGrayscale(false)); - - // text - for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { - mEntryDl->push_back(gsDPSetPrimColor(0, 0, mButtonColors[i].r, mButtonColors[i].g, mButtonColors[i].b, mButtonColors[i].a)); - uint16_t texIndex = mText[i] - 32; - - // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters - // handle loading groups of 16 chars at a time until there are no more left to load. - // By this point 4 vertices have already been loaded for the preceding icon. - if (i % 16 == 0) { - size_t numVtxToLoad = std::min(numChar - i, 16) * 4; - mEntryDl->push_back(gsSPVertex(&vtx[4 + (vtxGroup * 16 * 4)], numVtxToLoad, 0)); - vtxGroup++; - } - - if (texIndex != 0) { - auto texture = reinterpret_cast(Font_FetchCharTexture(texIndex)); - auto vertexStart = static_cast(4 * (i % 16)); - - Gfx charTexture[] = {gsDPLoadTextureBlock_4b(texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, - FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD)}; - mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); - mEntryDl->push_back( - gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); - } - } - mEntryDl->push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); +void KaleidoEntryOcarinaButtons::Draw(PlayState* play, std::vector* mEntryDl) { + if (vtx == nullptr) { + return; } -} // Rando + size_t numChar = mText.length(); + if (numChar == 0) { + return; + } + + Matrix_Translate(mX, mY, 0.0f, MTXMODE_APPLY); + // Matrix_Scale(0.75f, 0.75f, 0.75f, MTXMODE_APPLY); + + mEntryDl->push_back(gsSPMatrix(Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW)); + + // icon + if (!mAchieved) { + mEntryDl->push_back(gsDPSetGrayscaleColor(109, 109, 109, 255)); + mEntryDl->push_back(gsSPGrayscale(true)); + } + mEntryDl->push_back(gsDPSetPrimColor(0, 0, mIconColor.r, mIconColor.g, mIconColor.b, mIconColor.a)); + mEntryDl->push_back(gsSPVertex(vtx, 4, 0)); + LoadIconTex(mEntryDl); + mEntryDl->push_back(gsSP1Quadrangle(0, 2, 3, 1, 0)); + mEntryDl->push_back(gsSPGrayscale(false)); + + // text + for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { + mEntryDl->push_back( + gsDPSetPrimColor(0, 0, mButtonColors[i].r, mButtonColors[i].g, mButtonColors[i].b, mButtonColors[i].a)); + + // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters + // handle loading groups of 16 chars at a time until there are no more left to load. + // By this point 4 vertices have already been loaded for the preceding icon. + if (i % 16 == 0) { + size_t numVtxToLoad = std::min(numChar - i, 16) * 4; + mEntryDl->push_back(gsSPVertex(&vtx[4 + (vtxGroup * 16 * 4)], numVtxToLoad, 0)); + vtxGroup++; + } + + auto texture = reinterpret_cast(Ship_GetCharFontTexture(mText[i])); + auto vertexStart = static_cast(4 * (i % 16)); + + Gfx charTexture[] = { gsDPLoadTextureBlock_4b(texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; + mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); + mEntryDl->push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); + } + mEntryDl->push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); +} +} // namespace Rando void RandoKaleido_RegisterHooks() { - GameInteractor::Instance->RegisterGameHook(RandoKaleido_UpdateMiscCollectibles); + GameInteractor::Instance->RegisterGameHook( + RandoKaleido_UpdateMiscCollectibles); } diff --git a/soh/soh/Enhancements/kaleido.h b/soh/soh/Enhancements/kaleido.h index db86a817e9..7776afb663 100644 --- a/soh/soh/Enhancements/kaleido.h +++ b/soh/soh/Enhancements/kaleido.h @@ -2,7 +2,6 @@ #define KALEIDO_H #include - #ifdef __cplusplus #include #include @@ -18,7 +17,7 @@ namespace Rando { * subclasses to declare their Draw and Update functions. */ class KaleidoEntry { -public: + public: /** * @brief Constructor for Base KaleidoEntry class. Sets the position and * initial value of the line of text. @@ -31,7 +30,8 @@ public: virtual void Draw(PlayState* play, std::vector* mEntryDl) = 0; virtual void Update(PlayState* play) = 0; void SetYOffset(int yOffset); -protected: + + protected: int16_t mX; int16_t mY; int16_t mHeight; @@ -39,7 +39,6 @@ protected: Vtx* vtx; std::string mText; bool mAchieved = false; - }; /** @@ -47,7 +46,7 @@ protected: * that wish to render an Icon at the start of their line. */ class KaleidoEntryIcon : public KaleidoEntry { -public: + public: /** * @param iconResourceName resource name of the icon to draw * @param iconFormat flag representing the format of the icon (i.e. G_IM_FMT_IA) @@ -63,7 +62,8 @@ public: Color_RGBA8 iconColor, int16_t x, int16_t y, std::string text = ""); void Draw(PlayState* play, std::vector* mEntryDl) override; void RebuildVertices(); -protected: + + protected: const char* mIconResourceName; int mIconFormat; int mIconSize; @@ -80,7 +80,7 @@ protected: * that is either colored in or Grayscale according to a flag */ class KaleidoEntryIconFlag : public KaleidoEntryIcon { -public : + public: /** * @param iconResourceName resource name of the icon to draw * @param iconFormat flag representing the format of the icon (i.e. G_IM_FMT_IA) @@ -98,7 +98,8 @@ public : Color_RGBA8 iconColor, FlagType flagType, int flag, int16_t x, int16_t y, std::string name = ""); void Update(PlayState* play) override; -private: + + private: FlagType mFlagType; int mFlag; }; @@ -109,7 +110,7 @@ private: * render the count and not show progress towards a required amount or a total. */ class KaleidoEntryIconCountRequired : public KaleidoEntryIcon { -public: + public: /** * @param iconResourceName resource name of the icon to draw * @param iconFormat flag representing the format of the icon (i.e. G_IM_FMT_IA) @@ -126,10 +127,12 @@ public: * @param required The amount of this collectible required to beat the seed. Set to 0 to not render. * @param total The amount of this collectible available in the seed. Set to 0 to not render. */ - KaleidoEntryIconCountRequired(const char* iconResourceName, int iconFormat, int iconSize, int iconWidth, int iconHeight, - Color_RGBA8 iconColor, int16_t x, int16_t y, int* watch, int required = 0, int total = 0); + KaleidoEntryIconCountRequired(const char* iconResourceName, int iconFormat, int iconSize, int iconWidth, + int iconHeight, Color_RGBA8 iconColor, int16_t x, int16_t y, int* watch, + int required = 0, int total = 0); void Update(PlayState* play) override; -private: + + private: int* mWatch; int mRequired; int mTotal; @@ -139,11 +142,12 @@ private: }; class KaleidoEntryOcarinaButtons : public KaleidoEntryIcon { -public: + public: KaleidoEntryOcarinaButtons(int16_t x, int16_t y); void Update(PlayState* play) override; void Draw(PlayState* play, std::vector* mEntryDl) override; -private: + + private: void CalculateColors(); std::array mButtonColors = {}; @@ -151,17 +155,18 @@ private: }; class Kaleido { -public: + public: Kaleido(); void Draw(PlayState* play); void Update(PlayState* play); -private: + + private: std::vector> mEntries; std::vector mEntryDl; int mTopIndex = 0; int mNumVisible = 7; }; -} // Rando +} // namespace Rando extern "C" { #endif @@ -172,5 +177,4 @@ void RandoKaleido_UpdateMiscCollectibles(int16_t inDungeonScene); #endif void RandoKaleido_RegisterHooks(); - -#endif //KALEIDO_H +#endif // KALEIDO_H diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index cd60f7d8c9..6c547db08d 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -12,11 +12,8 @@ #include "soh/Enhancements/randomizer/3drando/random.hpp" #include "soh/Enhancements/cosmetics/authenticGfxPatches.h" #include -#include "soh/Enhancements/nametag.h" #include "soh/Enhancements/timesaver_hook_handlers.h" -#include "soh/Enhancements/TimeSavers/TimeSavers.h" #include "soh/Enhancements/randomizer/hook_handlers.h" -#include "objects/object_gi_compass/object_gi_compass.h" #include "src/overlays/actors/ovl_En_Bb/z_en_bb.h" #include "src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.h" @@ -67,7 +64,8 @@ static const ALIGN_ASSET(2) char tokinoma_room_0DL_007FD0[] = dtokinoma_room_0DL /// Switches Link's age and respawns him at the last entrance he entered. void SwitchAge() { - if (gPlayState == NULL) return; + if (gPlayState == NULL) + return; Player* player = GET_PLAYER(gPlayState); @@ -99,6 +97,13 @@ void SwitchAge() { gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK_FAST; gPlayState->linkAgeOnLoad ^= 1; + // Discover adult/child spawns + if (gPlayState->linkAgeOnLoad == LINK_AGE_ADULT) { + Entrance_SetEntranceDiscovered(ENTR_HYRULE_FIELD_10, false); + } else { + Entrance_SetEntranceDiscovered(ENTR_LINKS_HOUSE_CHILD_SPAWN, false); + } + static HOOK_ID hookId = 0; hookId = REGISTER_VB_SHOULD(VB_INFLICT_VOID_DAMAGE, { *should = false; @@ -115,14 +120,16 @@ void RegisterOcarinaTimeTravel() { } Actor* player = &GET_PLAYER(gPlayState)->actor; - Actor* nearbyTimeBlockEmpty = Actor_FindNearby(gPlayState, player, ACTOR_OBJ_WARP2BLOCK, ACTORCAT_ITEMACTION, 300.0f); + Actor* nearbyTimeBlockEmpty = + Actor_FindNearby(gPlayState, player, ACTOR_OBJ_WARP2BLOCK, ACTORCAT_ITEMACTION, 300.0f); Actor* nearbyTimeBlock = Actor_FindNearby(gPlayState, player, ACTOR_OBJ_TIMEBLOCK, ACTORCAT_ITEMACTION, 300.0f); Actor* nearbyOcarinaSpot = Actor_FindNearby(gPlayState, player, ACTOR_EN_OKARINA_TAG, ACTORCAT_PROP, 120.0f); Actor* nearbyDoorOfTime = Actor_FindNearby(gPlayState, player, ACTOR_DOOR_TOKI, ACTORCAT_BG, 500.0f); Actor* nearbyFrogs = Actor_FindNearby(gPlayState, player, ACTOR_EN_FR, ACTORCAT_NPC, 300.0f); Actor* nearbyGossipStone = Actor_FindNearby(gPlayState, player, ACTOR_EN_GS, ACTORCAT_NPC, 300.0f); bool justPlayedSoT = gPlayState->msgCtx.lastPlayedSong == OCARINA_SONG_TIME; - bool notNearAnySource = !nearbyTimeBlockEmpty && !nearbyTimeBlock && !nearbyOcarinaSpot && !nearbyDoorOfTime && !nearbyFrogs && !nearbyGossipStone; + bool notNearAnySource = !nearbyTimeBlockEmpty && !nearbyTimeBlock && !nearbyOcarinaSpot && !nearbyDoorOfTime && + !nearbyFrogs && !nearbyGossipStone; bool hasOcarinaOfTime = (INV_CONTENT(ITEM_OCARINA_TIME) == ITEM_OCARINA_TIME); bool doesntNeedOcarinaOfTime = CVarGetInteger(CVAR_ENHANCEMENT("TimeTravel"), 0) == 2; bool hasMasterSword = CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER); @@ -133,72 +140,16 @@ void RegisterOcarinaTimeTravel() { }); } -void RegisterRupeeDash() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("RupeeDash"), 0)) { - return; - } - - // Initialize Timer - static uint16_t rupeeDashTimer = 0; - uint16_t rdmTime = CVarGetInteger(CVAR_ENHANCEMENT("RupeeDashInterval"), 5) * 20; - - // Did time change by DashInterval? - if (rupeeDashTimer >= rdmTime) { - rupeeDashTimer = 0; - if (gSaveContext.rupees > 0) { - uint16_t walletSize = (CUR_UPG_VALUE(UPG_WALLET) + 1) * -1; - Rupees_ChangeBy(walletSize); - } else { - Health_ChangeBy(gPlayState, -16); - } - } else { - rupeeDashTimer++; - } - }); -} - -void RegisterShadowTag() { - static bool shouldSpawn = false; - static uint16_t delayTimer = 60; - - GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("ShadowTag"), 0)) { - return; - } - if (gPlayState->sceneNum == SCENE_FOREST_TEMPLE && // Forest Temple Scene - gPlayState->roomCtx.curRoom.num == 16 || // Green Poe Room - gPlayState->roomCtx.curRoom.num == 13 || // Blue Poe Room - gPlayState->roomCtx.curRoom.num == 12) { // Red Poe Room - return; - } else { - if (shouldSpawn && (delayTimer <= 0)) { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_WALLMAS, 0, 0, 0, 0, 0, 0, 3, false); - shouldSpawn = false; - } else { - delayTimer--; - } - } - }); - GameInteractor::Instance->RegisterGameHook([]() { - shouldSpawn = true; - delayTimer = 60; - }); - GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { - shouldSpawn = true; - delayTimer = 60; - }); -} - static bool hasAffectedHealth = false; void UpdatePermanentHeartLossState() { - if (!GameInteractor::IsSaveLoaded()) return; + if (!GameInteractor::IsSaveLoaded()) + return; if (!CVarGetInteger(CVAR_ENHANCEMENT("PermanentHeartLoss"), 0) && hasAffectedHealth) { uint8_t heartContainers = gSaveContext.ship.stats.heartContainers; // each worth 16 health uint8_t heartPieces = gSaveContext.ship.stats.heartPieces; // each worth 4 health, but only in groups of 4 - uint8_t startingHealth = 16 * (IS_RANDO ? (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_STARTING_HEARTS) + 1) : 3); - + uint8_t startingHealth = + 16 * (IS_RANDO ? (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_STARTING_HEARTS) + 1) : 3); uint8_t newCapacity = startingHealth + (heartContainers * 16) + ((heartPieces - (heartPieces % 4)) * 4); gSaveContext.healthCapacity = MAX(newCapacity, gSaveContext.healthCapacity); @@ -214,7 +165,8 @@ void RegisterPermanentHeartLoss() { }); GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("PermanentHeartLoss"), 0) || !GameInteractor::IsSaveLoaded()) return; + if (!CVarGetInteger(CVAR_ENHANCEMENT("PermanentHeartLoss"), 0) || !GameInteractor::IsSaveLoaded()) + return; if (gSaveContext.healthCapacity > 16 && gSaveContext.healthCapacity - gSaveContext.health >= 16) { gSaveContext.healthCapacity -= 16; @@ -226,75 +178,24 @@ void RegisterPermanentHeartLoss() { void RegisterDeleteFileOnDeath() { GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("DeleteFileOnDeath"), 0) || !GameInteractor::IsSaveLoaded() || gPlayState == NULL) return; + if (!CVarGetInteger(CVAR_ENHANCEMENT("DeleteFileOnDeath"), 0) || !GameInteractor::IsSaveLoaded() || + gPlayState == NULL) + return; if (gPlayState->gameOverCtx.state == GAMEOVER_DEATH_MENU && gPlayState->pauseCtx.state == 9) { SaveManager::Instance->DeleteZeldaFile(gSaveContext.fileNum); hasAffectedHealth = false; - std::reinterpret_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->Dispatch("reset"); - } - }); -} - -struct DayTimeGoldSkulltulas { - uint16_t scene; - uint16_t room; - bool forChild; - std::vector actorEntries; -}; - -using DayTimeGoldSkulltulasList = std::vector; - -void RegisterDaytimeGoldSkultullas() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("NightGSAlwaysSpawn"), 0)) { - return; - } - - // Gold Skulltulas that are not part of the scene actor list during the day - // Actor values copied from the night time scene actor list - static const DayTimeGoldSkulltulasList dayTimeGoldSkulltulas = { - // Graveyard - { SCENE_GRAVEYARD, 1, true, { { ACTOR_EN_SW, { 156, 315, 795 }, { 16384, -32768, 0 }, -20096 } } }, - // ZF - { SCENE_ZORAS_FOUNTAIN, 0, true, { { ACTOR_EN_SW, { -1891, 187, 1911 }, { 16384, 18022, 0 }, -19964 } } }, - // GF - { SCENE_GERUDOS_FORTRESS, 0, false, { { ACTOR_EN_SW, { 1598, 999, -2008 }, { 16384, -16384, 0 }, -19198 } } }, - { SCENE_GERUDOS_FORTRESS, 1, false, { { ACTOR_EN_SW, { 3377, 1734, -4935 }, { 16384, 0, 0 }, -19199 } } }, - // Kak - { SCENE_KAKARIKO_VILLAGE, 0, false, { { ACTOR_EN_SW, { -18, 540, 1800 }, { 0, -32768, 0 }, -20160 } } }, - { SCENE_KAKARIKO_VILLAGE, - 0, - true, - { { ACTOR_EN_SW, { -465, 377, -888 }, { 0, 28217, 0 }, -20222 }, - { ACTOR_EN_SW, { 5, 686, -171 }, { 0, -32768, 0 }, -20220 }, - { ACTOR_EN_SW, { 324, 270, 905 }, { 16384, 0, 0 }, -20216 }, - { ACTOR_EN_SW, { -602, 120, 1120 }, { 16384, 0, 0 }, -20208 } } }, - // LLR - { SCENE_LON_LON_RANCH, - 0, - true, - { { ACTOR_EN_SW, { -2344, 180, 672 }, { 16384, 22938, 0 }, -29695 }, - { ACTOR_EN_SW, { 808, 48, 326 }, { 16384, 0, 0 }, -29694 }, - { ACTOR_EN_SW, { 997, 286, -2698 }, { 16384, -16384, 0 }, -29692 } } }, - }; - - for (const auto& dayTimeGS : dayTimeGoldSkulltulas) { - if (IS_DAY && dayTimeGS.forChild == LINK_IS_CHILD && dayTimeGS.scene == gPlayState->sceneNum && - dayTimeGS.room == gPlayState->roomCtx.curRoom.num) { - for (const auto& actorEntry : dayTimeGS.actorEntries) { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, actorEntry.id, actorEntry.pos.x, actorEntry.pos.y, - actorEntry.pos.z, actorEntry.rot.x, actorEntry.rot.y, actorEntry.rot.z, - actorEntry.params, false); - } - } + std::reinterpret_pointer_cast( + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console")) + ->Dispatch("reset"); } }); } bool IsHyperBossesActive() { return CVarGetInteger(CVAR_ENHANCEMENT("HyperBosses"), 0) || - (IS_BOSS_RUSH && gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_HYPERBOSSES] == BR_CHOICE_HYPERBOSSES_YES); + (IS_BOSS_RUSH && + gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_HYPERBOSSES] == BR_CHOICE_HYPERBOSSES_YES); } void UpdateHyperBossesState() { @@ -305,53 +206,53 @@ void UpdateHyperBossesState() { } if (IsHyperBossesActive()) { - actorUpdateHookId = GameInteractor::Instance->RegisterGameHook([](void* refActor) { - // Run the update function a second time to make bosses move and act twice as fast. + actorUpdateHookId = + GameInteractor::Instance->RegisterGameHook([](void* refActor) { + // Run the update function a second time to make bosses move and act twice as fast. - Player* player = GET_PLAYER(gPlayState); - Actor* actor = static_cast(refActor); + Player* player = GET_PLAYER(gPlayState); + Actor* actor = static_cast(refActor); - uint8_t isBossActor = - actor->id == ACTOR_BOSS_GOMA || // Gohma - actor->id == ACTOR_BOSS_DODONGO || // King Dodongo - actor->id == ACTOR_EN_BDFIRE || // King Dodongo Fire Breath - actor->id == ACTOR_BOSS_VA || // Barinade - actor->id == ACTOR_BOSS_GANONDROF || // Phantom Ganon - actor->id == ACTOR_EN_FHG_FIRE || // Phantom Ganon/Ganondorf Energy Ball/Thunder - actor->id == ACTOR_EN_FHG || // Phantom Ganon's Horse - actor->id == ACTOR_BOSS_FD || actor->id == ACTOR_BOSS_FD2 || // Volvagia (grounded/flying) - actor->id == ACTOR_EN_VB_BALL || // Volvagia Rocks - actor->id == ACTOR_BOSS_MO || // Morpha - actor->id == ACTOR_BOSS_SST || // Bongo Bongo - actor->id == ACTOR_BOSS_TW || // Twinrova - actor->id == ACTOR_BOSS_GANON || // Ganondorf - actor->id == ACTOR_BOSS_GANON2; // Ganon + uint8_t isBossActor = actor->id == ACTOR_BOSS_GOMA || // Gohma + actor->id == ACTOR_BOSS_DODONGO || // King Dodongo + actor->id == ACTOR_EN_BDFIRE || // King Dodongo Fire Breath + actor->id == ACTOR_BOSS_VA || // Barinade + actor->id == ACTOR_BOSS_GANONDROF || // Phantom Ganon + actor->id == ACTOR_EN_FHG_FIRE || // Phantom Ganon/Ganondorf Energy Ball/Thunder + actor->id == ACTOR_EN_FHG || // Phantom Ganon's Horse + actor->id == ACTOR_BOSS_FD || + actor->id == ACTOR_BOSS_FD2 || // Volvagia (grounded/flying) + actor->id == ACTOR_EN_VB_BALL || // Volvagia Rocks + actor->id == ACTOR_BOSS_MO || // Morpha + actor->id == ACTOR_BOSS_SST || // Bongo Bongo + actor->id == ACTOR_BOSS_TW || // Twinrova + actor->id == ACTOR_BOSS_GANON || // Ganondorf + actor->id == ACTOR_BOSS_GANON2; // Ganon - // Don't apply during cutscenes because it causes weird behaviour and/or crashes on some bosses. - if (IsHyperBossesActive() && isBossActor && !Player_InBlockingCsMode(gPlayState, player)) { - // Barinade needs to be updated in sequence to avoid unintended behaviour. - if (actor->id == ACTOR_BOSS_VA) { - // params -1 is BOSSVA_BODY - if (actor->params == -1) { - Actor* actorList = gPlayState->actorCtx.actorLists[ACTORCAT_BOSS].head; - while (actorList != NULL) { - GameInteractor::RawAction::UpdateActor(actorList); - actorList = actorList->next; + // Don't apply during cutscenes because it causes weird behaviour and/or crashes on some bosses. + if (IsHyperBossesActive() && isBossActor && !Player_InBlockingCsMode(gPlayState, player)) { + // Barinade needs to be updated in sequence to avoid unintended behaviour. + if (actor->id == ACTOR_BOSS_VA) { + // params -1 is BOSSVA_BODY + if (actor->params == -1) { + Actor* actorList = gPlayState->actorCtx.actorLists[ACTORCAT_BOSS].head; + while (actorList != NULL) { + GameInteractor::RawAction::UpdateActor(actorList); + actorList = actorList->next; + } } + } else { + GameInteractor::RawAction::UpdateActor(actor); } - } else { - GameInteractor::RawAction::UpdateActor(actor); } - } - }); + }); } } void RegisterHyperBosses() { UpdateHyperBossesState(); - GameInteractor::Instance->RegisterGameHook([](int16_t fileNum) { - UpdateHyperBossesState(); - }); + GameInteractor::Instance->RegisterGameHook( + [](int16_t fileNum) { UpdateHyperBossesState(); }); } void UpdateHyperEnemiesState() { @@ -362,22 +263,23 @@ void UpdateHyperEnemiesState() { } if (CVarGetInteger(CVAR_ENHANCEMENT("HyperEnemies"), 0)) { - actorUpdateHookId = GameInteractor::Instance->RegisterGameHook([](void* refActor) { - // Run the update function a second time to make enemies and minibosses move and act twice as fast. + actorUpdateHookId = + GameInteractor::Instance->RegisterGameHook([](void* refActor) { + // Run the update function a second time to make enemies and minibosses move and act twice as fast. - Player* player = GET_PLAYER(gPlayState); - Actor* actor = static_cast(refActor); + Player* player = GET_PLAYER(gPlayState); + Actor* actor = static_cast(refActor); - // Some enemies are not in the ACTORCAT_ENEMY category, and some are that aren't really enemies. - bool isEnemy = actor->category == ACTORCAT_ENEMY || actor->id == ACTOR_EN_TORCH2; - bool isExcludedEnemy = actor->id == ACTOR_EN_FIRE_ROCK || actor->id == ACTOR_EN_ENCOUNT2; + // Some enemies are not in the ACTORCAT_ENEMY category, and some are that aren't really enemies. + bool isEnemy = actor->category == ACTORCAT_ENEMY || actor->id == ACTOR_EN_TORCH2; + bool isExcludedEnemy = actor->id == ACTOR_EN_FIRE_ROCK || actor->id == ACTOR_EN_ENCOUNT2; - // Don't apply during cutscenes because it causes weird behaviour and/or crashes on some cutscenes. - if (CVarGetInteger(CVAR_ENHANCEMENT("HyperEnemies"), 0) && isEnemy && !isExcludedEnemy && - !Player_InBlockingCsMode(gPlayState, player)) { - GameInteractor::RawAction::UpdateActor(actor); - } - }); + // Don't apply during cutscenes because it causes weird behaviour and/or crashes on some cutscenes. + if (CVarGetInteger(CVAR_ENHANCEMENT("HyperEnemies"), 0) && isEnemy && !isExcludedEnemy && + !Player_InBlockingCsMode(gPlayState, player)) { + GameInteractor::RawAction::UpdateActor(actor); + } + }); } } @@ -416,7 +318,7 @@ void RegisterBonkDamage() { default: break; } - + Health_ChangeBy(gPlayState, -bonkDamage); // Set invincibility to make Link flash red as a visual damage indicator. Player* player = GET_PLAYER(gPlayState); @@ -429,7 +331,8 @@ void UpdateDirtPathFixState(int32_t sceneNum) { case SCENE_HYRULE_FIELD: case SCENE_KOKIRI_FOREST: case SCENE_HYRULE_CASTLE: - CVarSetInteger(CVAR_Z_FIGHTING_MODE, CVarGetInteger(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), ZFIGHT_FIX_DISABLED)); + CVarSetInteger(CVAR_Z_FIGHTING_MODE, + CVarGetInteger(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), ZFIGHT_FIX_DISABLED)); return; default: CVarClear(CVAR_Z_FIGHTING_MODE); @@ -437,9 +340,8 @@ void UpdateDirtPathFixState(int32_t sceneNum) { } void RegisterMenuPathFix() { - GameInteractor::Instance->RegisterGameHook([](int32_t sceneNum) { - UpdateDirtPathFixState(sceneNum); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t sceneNum) { UpdateDirtPathFixState(sceneNum); }); } void UpdateMirrorModeState(int32_t sceneNum) { @@ -447,27 +349,28 @@ void UpdateMirrorModeState(int32_t sceneNum) { bool nextMirroredWorld = false; int16_t mirroredMode = CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorldMode"), MIRRORED_WORLD_OFF); - int16_t inDungeon = (sceneNum >= SCENE_DEKU_TREE && sceneNum <= SCENE_INSIDE_GANONS_CASTLE_COLLAPSE && sceneNum != SCENE_THIEVES_HIDEOUT) || + int16_t inDungeon = (sceneNum >= SCENE_DEKU_TREE && sceneNum <= SCENE_INSIDE_GANONS_CASTLE_COLLAPSE && + sceneNum != SCENE_THIEVES_HIDEOUT) || (sceneNum >= SCENE_DEKU_TREE_BOSS && sceneNum <= SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) || (sceneNum == SCENE_GANON_BOSS); if (mirroredMode == MIRRORED_WORLD_RANDOM_SEEDED || mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM_SEEDED) { - uint32_t seed = sceneNum + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() - : gSaveContext.ship.stats.fileCreatedAt); + uint32_t seed = + sceneNum + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); Random_Init(seed); } bool randomMirror = Random(0, 2) == 1; - if ( - mirroredMode == MIRRORED_WORLD_ALWAYS || + if (mirroredMode == MIRRORED_WORLD_ALWAYS || ((mirroredMode == MIRRORED_WORLD_RANDOM || mirroredMode == MIRRORED_WORLD_RANDOM_SEEDED) && randomMirror) || // Dungeon modes - (inDungeon && (mirroredMode == MIRRORED_WORLD_DUNGEONS_All || - (mirroredMode == MIRRORED_WORLD_DUNGEONS_VANILLA && !ResourceMgr_IsSceneMasterQuest(sceneNum)) || - (mirroredMode == MIRRORED_WORLD_DUNGEONS_MQ && ResourceMgr_IsSceneMasterQuest(sceneNum)) || - ((mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM || mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM_SEEDED) && randomMirror))) - ) { + (inDungeon && + (mirroredMode == MIRRORED_WORLD_DUNGEONS_ALL || + (mirroredMode == MIRRORED_WORLD_DUNGEONS_VANILLA && !ResourceMgr_IsSceneMasterQuest(sceneNum)) || + (mirroredMode == MIRRORED_WORLD_DUNGEONS_MQ && ResourceMgr_IsSceneMasterQuest(sceneNum)) || + ((mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM || mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM_SEEDED) && + randomMirror)))) { nextMirroredWorld = true; CVarSetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 1); } else { @@ -482,25 +385,33 @@ void UpdateMirrorModeState(int32_t sceneNum) { } void RegisterMirrorModeHandler() { - GameInteractor::Instance->RegisterGameHook([](int32_t sceneNum) { - UpdateMirrorModeState(sceneNum); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t sceneNum) { UpdateMirrorModeState(sceneNum); }); } void UpdatePatchHand() { if ((CVarGetInteger(CVAR_ENHANCEMENT("EquipmentAlwaysVisible"), 0)) && LINK_IS_CHILD) { - ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "childHammer1", 92, gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "childHammer1", 92, + gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "childHammer2", 93, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingHookshotNearDL, "childHookshot1", 84, gsSPDisplayListOTRFilePath(gLinkChildRightHandClosedNearDL)); - ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingHookshotNearDL, "childHookshot2", 85, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingBowNearDL, "childBow1", 51, gsSPDisplayListOTRFilePath(gLinkChildRightHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingHookshotNearDL, "childHookshot1", 84, + gsSPDisplayListOTRFilePath(gLinkChildRightHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingHookshotNearDL, "childHookshot2", 85, + gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingBowNearDL, "childBow1", 51, + gsSPDisplayListOTRFilePath(gLinkChildRightHandClosedNearDL)); ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingBowNearDL, "childBow2", 52, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingMasterSwordNearDL, "childMasterSword1", 104, gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); - ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingMasterSwordNearDL, "childMasterSword2", 105, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingBgsNearDL, "childBiggoronSword1", 79, gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingMasterSwordNearDL, "childMasterSword1", 104, + gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingMasterSwordNearDL, "childMasterSword2", 105, + gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingBgsNearDL, "childBiggoronSword1", 79, + gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingBgsNearDL, "childBiggoronSword2", 80, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife1", 76, gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); - ResourceMgr_PatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife2", 77, gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife1", 76, + gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife2", 77, + gsSPEndDisplayList()); } else { ResourceMgr_UnpatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "childHammer1"); @@ -515,12 +426,16 @@ void UpdatePatchHand() { ResourceMgr_UnpatchGfxByName(gLinkAdultLeftHandHoldingBgsNearDL, "childBiggoronSword2"); ResourceMgr_UnpatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife1"); ResourceMgr_UnpatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife2"); - } + } if ((CVarGetInteger(CVAR_ENHANCEMENT("EquipmentAlwaysVisible"), 0)) && LINK_IS_ADULT) { - ResourceMgr_PatchGfxByName(gLinkChildLeftFistAndKokiriSwordNearDL, "adultKokiriSword", 13, gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); - ResourceMgr_PatchGfxByName(gLinkChildRightHandHoldingSlingshotNearDL, "adultSlingshot", 13, gsSPDisplayListOTRFilePath(gLinkAdultRightHandClosedNearDL)); - ResourceMgr_PatchGfxByName(gLinkChildLeftFistAndBoomerangNearDL, "adultBoomerang", 50, gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); - ResourceMgr_PatchGfxByName(gLinkChildRightFistAndDekuShieldNearDL, "adultDekuShield", 49, gsSPDisplayListOTRFilePath(gLinkAdultRightHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkChildLeftFistAndKokiriSwordNearDL, "adultKokiriSword", 13, + gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkChildRightHandHoldingSlingshotNearDL, "adultSlingshot", 13, + gsSPDisplayListOTRFilePath(gLinkAdultRightHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkChildLeftFistAndBoomerangNearDL, "adultBoomerang", 50, + gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkChildRightFistAndDekuShieldNearDL, "adultDekuShield", 49, + gsSPDisplayListOTRFilePath(gLinkAdultRightHandClosedNearDL)); } else { ResourceMgr_UnpatchGfxByName(gLinkChildLeftFistAndKokiriSwordNearDL, "adultKokiriSword"); ResourceMgr_UnpatchGfxByName(gLinkChildRightHandHoldingSlingshotNearDL, "adultSlingshot"); @@ -528,7 +443,8 @@ void UpdatePatchHand() { ResourceMgr_UnpatchGfxByName(gLinkChildRightFistAndDekuShieldNearDL, "adultDekuShield"); } if (CVarGetInteger("gEnhancements.FixHammerHand", 0) && LINK_IS_ADULT) { - ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "hammerHand1", 92, gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "hammerHand1", 92, + gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "hammerHand2", 93, gsSPEndDisplayList()); } else { ResourceMgr_UnpatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "hammerHand1"); @@ -537,62 +453,61 @@ void UpdatePatchHand() { } void RegisterPatchHandHandler() { - GameInteractor::Instance->RegisterGameHook([](int32_t sceneNum) { - UpdatePatchHand(); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t sceneNum) { UpdatePatchHand(); }); } void RegisterResetNaviTimer() { GameInteractor::Instance->RegisterGameHook([](int32_t sceneNum) { - if (CVarGetInteger(CVAR_ENHANCEMENT("ResetNaviTimer"), 0)) { - gSaveContext.naviTimer = 0; - } - }); + if (CVarGetInteger(CVAR_ENHANCEMENT("ResetNaviTimer"), 0)) { + gSaveContext.naviTimer = 0; + } + }); } -//this map is used for enemies that can be uniquely identified by their id -//and that are always counted -//enemies that can't be uniquely identified by their id -//or only sometimes count (like ACTOR_EN_TP) -//have to be manually handled in RegisterEnemyDefeatCounts +// this map is used for enemies that can be uniquely identified by their id +// and that are always counted +// enemies that can't be uniquely identified by their id +// or only sometimes count (like ACTOR_EN_TP) +// have to be manually handled in RegisterEnemyDefeatCounts static std::unordered_map uniqueEnemyIdToStatCount = { - { ACTOR_EN_ANUBICE, COUNT_ENEMIES_DEFEATED_ANUBIS }, - { ACTOR_EN_AM, COUNT_ENEMIES_DEFEATED_ARMOS }, - { ACTOR_EN_CLEAR_TAG, COUNT_ENEMIES_DEFEATED_ARWING }, - { ACTOR_EN_VALI, COUNT_ENEMIES_DEFEATED_BARI }, - { ACTOR_EN_VM, COUNT_ENEMIES_DEFEATED_BEAMOS }, - { ACTOR_EN_BIGOKUTA, COUNT_ENEMIES_DEFEATED_BIG_OCTO }, - { ACTOR_EN_BILI, COUNT_ENEMIES_DEFEATED_BIRI }, - { ACTOR_EN_DNS, COUNT_ENEMIES_DEFEATED_BUSINESS_SCRUB }, - { ACTOR_EN_TORCH, COUNT_ENEMIES_DEFEATED_DARK_LINK }, - { ACTOR_EN_DH, COUNT_ENEMIES_DEFEATED_DEAD_HAND }, - { ACTOR_EN_HINTNUTS, COUNT_ENEMIES_DEFEATED_DEKU_SCRUB }, - { ACTOR_EN_DODONGO, COUNT_ENEMIES_DEFEATED_DODONGO }, - { ACTOR_EN_DODOJR, COUNT_ENEMIES_DEFEATED_DODONGO_BABY }, - { ACTOR_DOOR_KILLER, COUNT_ENEMIES_DEFEATED_DOOR_TRAP }, - { ACTOR_EN_FD, COUNT_ENEMIES_DEFEATED_FLARE_DANCER }, - { ACTOR_EN_FLOORMAS, COUNT_ENEMIES_DEFEATED_FLOORMASTER }, - { ACTOR_EN_TUBO_TRAP, COUNT_ENEMIES_DEFEATED_FLYING_POT }, - { ACTOR_EN_YUKABYUN, COUNT_ENEMIES_DEFEATED_FLOOR_TILE }, - { ACTOR_EN_FZ, COUNT_ENEMIES_DEFEATED_FREEZARD }, - { ACTOR_EN_GELDB, COUNT_ENEMIES_DEFEATED_GERUDO_THIEF }, - { ACTOR_EN_GOMA, COUNT_ENEMIES_DEFEATED_GOHMA_LARVA }, - { ACTOR_EN_CROW, COUNT_ENEMIES_DEFEATED_GUAY }, - { ACTOR_EN_RR, COUNT_ENEMIES_DEFEATED_LIKE_LIKE }, - { ACTOR_EN_DEKUNUTS, COUNT_ENEMIES_DEFEATED_MAD_SCRUB }, - { ACTOR_EN_OKUTA, COUNT_ENEMIES_DEFEATED_OCTOROK }, - { ACTOR_EN_BA, COUNT_ENEMIES_DEFEATED_PARASITIC_TENTACLE }, + { ACTOR_EN_ANUBICE, COUNT_ENEMIES_DEFEATED_ANUBIS }, + { ACTOR_EN_AM, COUNT_ENEMIES_DEFEATED_ARMOS }, + { ACTOR_EN_CLEAR_TAG, COUNT_ENEMIES_DEFEATED_ARWING }, + { ACTOR_EN_VALI, COUNT_ENEMIES_DEFEATED_BARI }, + { ACTOR_EN_VM, COUNT_ENEMIES_DEFEATED_BEAMOS }, + { ACTOR_EN_BIGOKUTA, COUNT_ENEMIES_DEFEATED_BIG_OCTO }, + { ACTOR_EN_BILI, COUNT_ENEMIES_DEFEATED_BIRI }, + { ACTOR_EN_DNS, COUNT_ENEMIES_DEFEATED_BUSINESS_SCRUB }, + { ACTOR_EN_TORCH, COUNT_ENEMIES_DEFEATED_DARK_LINK }, + { ACTOR_EN_DH, COUNT_ENEMIES_DEFEATED_DEAD_HAND }, + { ACTOR_EN_HINTNUTS, COUNT_ENEMIES_DEFEATED_DEKU_SCRUB }, + { ACTOR_EN_DODONGO, COUNT_ENEMIES_DEFEATED_DODONGO }, + { ACTOR_EN_DODOJR, COUNT_ENEMIES_DEFEATED_DODONGO_BABY }, + { ACTOR_DOOR_KILLER, COUNT_ENEMIES_DEFEATED_DOOR_TRAP }, + { ACTOR_EN_FD, COUNT_ENEMIES_DEFEATED_FLARE_DANCER }, + { ACTOR_EN_FLOORMAS, COUNT_ENEMIES_DEFEATED_FLOORMASTER }, + { ACTOR_EN_TUBO_TRAP, COUNT_ENEMIES_DEFEATED_FLYING_POT }, + { ACTOR_EN_YUKABYUN, COUNT_ENEMIES_DEFEATED_FLOOR_TILE }, + { ACTOR_EN_FZ, COUNT_ENEMIES_DEFEATED_FREEZARD }, + { ACTOR_EN_GELDB, COUNT_ENEMIES_DEFEATED_GERUDO_THIEF }, + { ACTOR_EN_GOMA, COUNT_ENEMIES_DEFEATED_GOHMA_LARVA }, + { ACTOR_EN_CROW, COUNT_ENEMIES_DEFEATED_GUAY }, + { ACTOR_EN_RR, COUNT_ENEMIES_DEFEATED_LIKE_LIKE }, + { ACTOR_EN_DEKUNUTS, COUNT_ENEMIES_DEFEATED_MAD_SCRUB }, + { ACTOR_EN_OKUTA, COUNT_ENEMIES_DEFEATED_OCTOROK }, + { ACTOR_EN_BA, COUNT_ENEMIES_DEFEATED_PARASITIC_TENTACLE }, { ACTOR_EN_PO_SISTERS, COUNT_ENEMIES_DEFEATED_POE_SISTERS }, - { ACTOR_EN_BUBBLE, COUNT_ENEMIES_DEFEATED_SHABOM }, - { ACTOR_EN_SB, COUNT_ENEMIES_DEFEATED_SHELLBLADE }, - { ACTOR_EN_SKJ, COUNT_ENEMIES_DEFEATED_SKULL_KID }, - { ACTOR_EN_NY, COUNT_ENEMIES_DEFEATED_SPIKE }, - { ACTOR_EN_SKB, COUNT_ENEMIES_DEFEATED_STALCHILD }, - { ACTOR_EN_TEST, COUNT_ENEMIES_DEFEATED_STALFOS }, - { ACTOR_EN_WEIYER, COUNT_ENEMIES_DEFEATED_STINGER }, - { ACTOR_EN_BW, COUNT_ENEMIES_DEFEATED_TORCH_SLUG }, - { ACTOR_EN_WALLMAS, COUNT_ENEMIES_DEFEATED_WALLMASTER }, - { ACTOR_EN_KAREBABA, COUNT_ENEMIES_DEFEATED_WITHERED_DEKU_BABA }, + { ACTOR_EN_BUBBLE, COUNT_ENEMIES_DEFEATED_SHABOM }, + { ACTOR_EN_SB, COUNT_ENEMIES_DEFEATED_SHELLBLADE }, + { ACTOR_EN_SKJ, COUNT_ENEMIES_DEFEATED_SKULL_KID }, + { ACTOR_EN_NY, COUNT_ENEMIES_DEFEATED_SPIKE }, + { ACTOR_EN_SKB, COUNT_ENEMIES_DEFEATED_STALCHILD }, + { ACTOR_EN_TEST, COUNT_ENEMIES_DEFEATED_STALFOS }, + { ACTOR_EN_WEIYER, COUNT_ENEMIES_DEFEATED_STINGER }, + { ACTOR_EN_BW, COUNT_ENEMIES_DEFEATED_TORCH_SLUG }, + { ACTOR_EN_WALLMAS, COUNT_ENEMIES_DEFEATED_WALLMASTER }, + { ACTOR_EN_KAREBABA, COUNT_ENEMIES_DEFEATED_WITHERED_DEKU_BABA }, }; void RegisterEnemyDefeatCounts() { @@ -656,16 +571,14 @@ void RegisterEnemyDefeatCounts() { } break; - case ACTOR_EN_REEBA: - { - EnReeba* reeba = (EnReeba*)actor; - if (reeba->isBig) { - gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER_BIG]++; - } else { - gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER]++; - } + case ACTOR_EN_REEBA: { + EnReeba* reeba = (EnReeba*)actor; + if (reeba->isBig) { + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER_BIG]++; + } else { + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER]++; } - break; + } break; case ACTOR_EN_MB: if (actor->params == 0) { @@ -716,7 +629,8 @@ void RegisterEnemyDefeatCounts() { break; case ACTOR_EN_TP: - if (actor->params == TAILPASARAN_HEAD) { // Only count the head, otherwise each body segment will increment + // Only count the head, otherwise each body segment will increment + if (actor->params == TAILPASARAN_HEAD) { gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_TAILPASARAN]++; } break; @@ -781,26 +695,25 @@ void RegisterBossDefeatTimestamps() { } void UpdateHurtContainerModeState(bool newState) { - static bool hurtEnabled = false; - if (hurtEnabled == newState) { - return; - } + static bool hurtEnabled = false; + if (hurtEnabled == newState) { + return; + } - hurtEnabled = newState; - uint16_t getHeartPieces = gSaveContext.ship.stats.heartPieces / 4; - uint16_t getHeartContainers = gSaveContext.ship.stats.heartContainers; + hurtEnabled = newState; + uint16_t getHeartPieces = gSaveContext.ship.stats.heartPieces / 4; + uint16_t getHeartContainers = gSaveContext.ship.stats.heartContainers; - if (hurtEnabled) { - gSaveContext.healthCapacity = 320 - ((getHeartPieces + getHeartContainers) * 16); - } else { - gSaveContext.healthCapacity = 48 + ((getHeartPieces + getHeartContainers) * 16); - } + if (hurtEnabled) { + gSaveContext.healthCapacity = 320 - ((getHeartPieces + getHeartContainers) * 16); + } else { + gSaveContext.healthCapacity = 48 + ((getHeartPieces + getHeartContainers) * 16); + } } void RegisterHurtContainerModeHandler() { - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { - UpdateHurtContainerModeState(CVarGetInteger(CVAR_ENHANCEMENT("HurtContainer"), 0)); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t fileNum) { UpdateHurtContainerModeState(CVarGetInteger(CVAR_ENHANCEMENT("HurtContainer"), 0)); }); } void RegisterRandomizedEnemySizes() { @@ -810,15 +723,18 @@ void RegisterRandomizedEnemySizes() { Actor* actor = static_cast(refActor); // Exclude wobbly platforms in Jabu because they need to act like platforms. + // Exclude demo effect for Zora sapphire being re-categorized as a "boss". // Exclude Dead Hand hands and Bongo Bongo main body because they make the fights (near) impossible. - uint8_t excludedEnemy = actor->id == ACTOR_EN_BROB || actor->id == ACTOR_EN_DHA || (actor->id == ACTOR_BOSS_SST && actor->params == -1); + uint8_t excludedEnemy = actor->id == ACTOR_EN_BROB || actor->id == ACTOR_EN_DHA || + actor->id == ACTOR_DEMO_EFFECT || (actor->id == ACTOR_BOSS_SST && actor->params == -1); // Dodongo, Volvagia and Dead Hand are always smaller because they're impossible when bigger. uint8_t smallOnlyEnemy = actor->id == ACTOR_BOSS_DODONGO || actor->id == ACTOR_BOSS_FD || actor->id == ACTOR_BOSS_FD2 || actor->id == ACTOR_EN_DH; // Only apply to enemies and bosses. - if (!CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemySizes"), 0) || (actor->category != ACTORCAT_ENEMY && actor->category != ACTORCAT_BOSS) || excludedEnemy) { + if (!CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemySizes"), 0) || + (actor->category != ACTORCAT_ENEMY && actor->category != ACTORCAT_BOSS) || excludedEnemy) { return; } @@ -832,8 +748,8 @@ void RegisterRandomizedEnemySizes() { randomNumber = rand() % 200; // Between 100% and 300% size. randomScale = 1.0f + (randomNumber / 100); - // Small actor } else { + // Small actor randomNumber = rand() % 90; // Between 10% and 100% size. randomScale = 0.1f + (randomNumber / 100); @@ -858,7 +774,8 @@ void RegisterOpenAllHours() { GameInteractor::Instance->RegisterGameHook([](void* refActor) { Actor* actor = static_cast(refActor); - if (CVarGetInteger(CVAR_ENHANCEMENT("OpenAllHours"), 0) && (actor->id == ACTOR_EN_DOOR) && (!IS_RANDO || !OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOCK_OVERWORLD_DOORS))) { + if (CVarGetInteger(CVAR_ENHANCEMENT("OpenAllHours"), 0) && (actor->id == ACTOR_EN_DOOR) && + (!IS_RANDO || !OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOCK_OVERWORLD_DOORS))) { switch (actor->params) { case 4753: // Night Market Bazaar case 1678: // Night Potion Shop @@ -890,47 +807,65 @@ void PatchToTMedallions() { ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_StartGrayscale", 7, gsSPGrayscale(true)); if (CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, gsDPSetGrayscaleColor(0, 161, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, + gsDPSetGrayscaleColor(0, 161, 255, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, gsDPSetGrayscaleColor(255, 135, 0, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, + gsDPSetGrayscaleColor(255, 135, 0, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } if (CHECK_QUEST_ITEM(QUEST_MEDALLION_LIGHT)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, gsDPSetGrayscaleColor(255, 255, 0, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, gsDPSetGrayscaleColor(255, 255, 0, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, + gsDPSetGrayscaleColor(255, 255, 0, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, + gsDPSetGrayscaleColor(255, 255, 0, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, gsDPSetGrayscaleColor(255, 255, 255, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, + gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, gsDPSetGrayscaleColor(0, 255, 0, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, + gsDPSetGrayscaleColor(0, 255, 0, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, gsDPSetGrayscaleColor(255, 0, 0, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, + gsDPSetGrayscaleColor(255, 0, 0, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, gsDPSetGrayscaleColor(212, 0, 255, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, gsDPSetGrayscaleColor(212, 0, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, + gsDPSetGrayscaleColor(212, 0, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, + gsDPSetGrayscaleColor(212, 0, 255, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, gsDPSetGrayscaleColor(255, 255, 255, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, + gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_EndGrayscaleAndEndDlist", 160, gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_EndGrayscaleAndEndDlist", 51, gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_EndGrayscaleAndEndDlist", 160, + gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_EndGrayscaleAndEndDlist", 51, + gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); } else { // Unpatch everything ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_StartGrayscale"); @@ -951,7 +886,8 @@ void PatchToTMedallions() { void RegisterToTMedallions() { GameInteractor::Instance->RegisterGameHook([](GetItemEntry _unused) { - if (!CVarGetInteger(CVAR_ENHANCEMENT("ToTMedallionsColors"), 0) || !gPlayState || gPlayState->sceneNum != SCENE_TEMPLE_OF_TIME) { + if (!CVarGetInteger(CVAR_ENHANCEMENT("ToTMedallionsColors"), 0) || !gPlayState || + gPlayState->sceneNum != SCENE_TEMPLE_OF_TIME) { return; } PatchToTMedallions(); @@ -964,7 +900,6 @@ void RegisterToTMedallions() { }); } - void RegisterFloorSwitchesHook() { GameInteractor::Instance->RegisterGameHook([](void* refActor) { Actor* actor = static_cast(refActor); @@ -989,40 +924,19 @@ void RegisterPauseMenuHooks() { return; } if (!pauseWarpHooksRegistered) { - GameInteractor::Instance->RegisterGameHook([]() {PauseWarp_HandleSelection();}); - GameInteractor::Instance->RegisterGameHook([]() { - PauseWarp_Execute(); - }); + GameInteractor::Instance->RegisterGameHook( + []() { PauseWarp_HandleSelection(); }); + GameInteractor::Instance->RegisterGameHook( + []() { PauseWarp_Execute(); }); pauseWarpHooksRegistered = true; } }); } -extern "C" u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); - -void PatchCompasses() { - s8 compassesCanBeOutsideDungeon = IS_RANDO && DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS); - s8 isColoredCompassesEnabled = compassesCanBeOutsideDungeon && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MatchCompassColors"), 1); - if (isColoredCompassesEnabled) { - ResourceMgr_PatchGfxByName(gGiCompassDL, "Compass_PrimColor", 5, gsDPNoOp()); - ResourceMgr_PatchGfxByName(gGiCompassDL, "Compass_EnvColor", 6, gsDPNoOp()); - } else { - ResourceMgr_UnpatchGfxByName(gGiCompassDL, "Compass_PrimColor"); - ResourceMgr_UnpatchGfxByName(gGiCompassDL, "Compass_EnvColor"); - } -} - -void RegisterRandomizerCompasses() { - GameInteractor::Instance->RegisterGameHook([](int32_t _unused) { - PatchCompasses(); - }); -} - void RegisterCustomSkeletons() { static int8_t previousTunic = -1; GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded() || gPlayState == NULL) { return; } @@ -1046,12 +960,8 @@ void InitMods() { BossRush_RegisterHooks(); RandomizerRegisterHooks(); TimeSaverRegisterHooks(); - TimeSavers_Register(); RegisterTTS(); RegisterOcarinaTimeTravel(); - RegisterDaytimeGoldSkultullas(); - RegisterRupeeDash(); - RegisterShadowTag(); RegisterPermanentHeartLoss(); RegisterDeleteFileOnDeath(); RegisterHyperBosses(); @@ -1065,8 +975,6 @@ void InitMods() { RegisterRandomizedEnemySizes(); RegisterOpenAllHours(); RegisterToTMedallions(); - RegisterRandomizerCompasses(); - NameTag_RegisterHooks(); RegisterFloorSwitchesHook(); RegisterPatchHandHandler(); RegisterHurtContainerModeHandler(); diff --git a/soh/soh/Enhancements/mods.h b/soh/soh/Enhancements/mods.h index 9305222502..8ada99f1e3 100644 --- a/soh/soh/Enhancements/mods.h +++ b/soh/soh/Enhancements/mods.h @@ -11,12 +11,11 @@ void UpdateDirtPathFixState(int32_t sceneNum); void UpdateMirrorModeState(int32_t sceneNum); void UpdateHurtContainerModeState(bool newState); void PatchToTMedallions(); -void PatchCompasses(); void UpdatePermanentHeartLossState(); void UpdateHyperEnemiesState(); void UpdateHyperBossesState(); void InitMods(); -void UpdatePatchHand(); +void UpdatePatchHand(); void SwitchAge(); #ifdef __cplusplus diff --git a/soh/soh/Enhancements/n64_weird_frame_data.inc b/soh/soh/Enhancements/n64_weird_frame_data.inc deleted file mode 100644 index 269450c157..0000000000 --- a/soh/soh/Enhancements/n64_weird_frame_data.inc +++ /dev/null @@ -1,658 +0,0 @@ -static u16 n64WeirdFrames[] = { - 0x0000, 0x0000, 0x1F40, 0x0AA7, 0x06C8, 0xB3C8, 0xF909, 0xFA3E, 0xED5F, - 0x0000, 0x0000, 0x2286, 0xF8F0, 0xF9C3, 0xB101, 0x61C2, 0xFE1D, 0x3AB1, - 0xFA11, 0x1FD2, 0x35C8, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, - 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, - 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D27, - 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DF, 0xBFFD, 0x0000, 0x0000, - 0x0000, 0xFF70, 0x0F7C, 0xF0FD, 0x0000, 0x0000, 0x1F19, 0x0AAC, 0x06BF, - 0xB3E9, 0xF906, 0xFA42, 0xED71, 0x0000, 0x0000, 0x2260, 0xF8EC, 0xF9C8, - 0xB11B, 0x61C2, 0xFE1D, 0x3AB1, 0xF9FD, 0x1FCF, 0x35AC, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, - 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, - 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFFC7, 0x0D29, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, - 0x02DF, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFF7B, 0x0F7B, 0xF111, 0x0000, - 0x0000, 0x1EF3, 0x0AB2, 0x06B7, 0xB409, 0xF902, 0xFA45, 0xED83, 0x0000, - 0x0000, 0x223B, 0xF8E8, 0xF9CC, 0xB133, 0x61C2, 0xFE1D, 0x3AB1, 0xF9EA, - 0x1FCD, 0x3590, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, - 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, - 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D2B, 0xFCAD, - 0x0000, 0x0000, 0x0000, 0x9598, 0x02DF, 0xBFFD, 0x0000, 0x0000, 0x0000, - 0xFF86, 0x0F7A, 0xF125, 0x0000, 0x0000, 0x1ECE, 0x0AB7, 0x06AF, 0xB428, - 0xF8FF, 0xFA49, 0xED95, 0x0000, 0x0000, 0x2218, 0xF8E4, 0xF9D0, 0xB14B, - 0x61C2, 0xFE1D, 0x3AB1, 0xF9D7, 0x1FCA, 0x3576, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, - 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, - 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFFC7, 0x0D2D, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, - 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFF90, 0x0F78, 0xF137, 0x0000, 0x0000, - 0x1EAA, 0x0ABC, 0x06A7, 0xB446, 0xF8FC, 0xFA4D, 0xEDA6, 0x0000, 0x0000, - 0x21F6, 0xF8E1, 0xF9D4, 0xB161, 0x61C2, 0xFE1D, 0x3AB1, 0xF9C6, 0x1FC8, - 0x355D, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, - 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, - 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D2E, 0xFCAD, 0x0000, - 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFF9A, - 0x0F77, 0xF149, 0x0000, 0x0000, 0x1E89, 0x0AC1, 0x06A0, 0xB462, 0xF8F9, - 0xFA50, 0xEDB5, 0x0000, 0x0000, 0x21D6, 0xF8DE, 0xF9D7, 0xB177, 0x61C2, - 0xFE1D, 0x3AB1, 0xF9B5, 0x1FC5, 0x3545, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, - 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, - 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFFC7, 0x0D30, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, - 0x0000, 0x0000, 0x0000, 0xFFA3, 0x0F76, 0xF159, 0x0000, 0x0000, 0x1E6A, - 0x0AC5, 0x0699, 0xB47B, 0xF8F6, 0xFA53, 0xEDC4, 0x0000, 0x0000, 0x21B9, - 0xF8DB, 0xF9DB, 0xB18A, 0x61C2, 0xFE1D, 0x3AB1, 0xF9A6, 0x1FC3, 0x352F, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, - 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, - 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D31, 0xFCAD, 0x0000, 0x0000, - 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFFAB, 0x0F75, - 0xF168, 0x0000, 0x0000, 0x1E4D, 0x0AC9, 0x0693, 0xB493, 0xF8F4, 0xFA56, - 0xEDD1, 0x0000, 0x0000, 0x219D, 0xF8D8, 0xF9DE, 0xB19C, 0x61C2, 0xFE1D, - 0x3AB1, 0xF998, 0x1FC1, 0x351B, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, - 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, - 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, - 0x0D32, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, - 0x0000, 0x0000, 0xFFB3, 0x0F75, 0xF176, 0x0000, 0x0000, 0x1E33, 0x0ACC, - 0x068E, 0xB4A8, 0xF8F1, 0xFA58, 0xEDDE, 0x0000, 0x0000, 0x2185, 0xF8D5, - 0xF9E1, 0xB1AC, 0x61C2, 0xFE1D, 0x3AB1, 0xF98B, 0x1FBF, 0x3509, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, - 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, - 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D33, 0xFCAD, 0x0000, 0x0000, 0x0000, - 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFFB9, 0x0F74, 0xF182, - 0x0000, 0x0000, 0x1E1C, 0x0AD0, 0x0689, 0xB4BB, 0xF8F0, 0xFA5A, 0xEDE8, - 0x0000, 0x0000, 0x216F, 0xF8D3, 0xF9E3, 0xB1BB, 0x61C2, 0xFE1D, 0x3AB1, - 0xF980, 0x1FBE, 0x34FA, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, - 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, - 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D34, - 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, - 0x0000, 0xFFBF, 0x0F73, 0xF18C, 0x0000, 0x0000, 0x1E09, 0x0AD2, 0x0685, - 0xB4CA, 0xF8EE, 0xFA5C, 0xEDF1, 0x0000, 0x0000, 0x215D, 0xF8D1, 0xF9E5, - 0xB1C7, 0x61C2, 0xFE1D, 0x3AB1, 0xF977, 0x1FBD, 0x34EC, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, - 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, - 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFFC7, 0x0D35, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, - 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFFC3, 0x0F73, 0xF194, 0x0000, - 0x0000, 0x1DF9, 0x0AD4, 0x0681, 0xB4D7, 0xF8ED, 0xFA5E, 0xEDF9, 0x0000, - 0x0000, 0x214E, 0xF8D0, 0xF9E7, 0xB1D0, 0x61C2, 0xFE1D, 0x3AB1, 0xF96F, - 0x1FBC, 0x34E2, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, - 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, - 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D35, 0xFCAD, - 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, - 0xFFC6, 0x0F72, 0xF19A, 0x0000, 0x0000, 0x1DEE, 0x0AD6, 0x067F, 0xB4E0, - 0xF8EC, 0xFA5F, 0xEDFE, 0x0000, 0x0000, 0x2143, 0xF8CF, 0xF9E8, 0xB1D7, - 0x61C2, 0xFE1D, 0x3AB1, 0xF96A, 0x1FBB, 0x34DA, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, - 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, - 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFFC7, 0x0D36, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, - 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFFC8, 0x0F72, 0xF19E, 0x0000, 0x0000, - 0x1DE7, 0x0AD7, 0x067D, 0xB4E6, 0xF8EB, 0xFA60, 0xEE01, 0x0000, 0x0000, - 0x213C, 0xF8CE, 0xF9E9, 0xB1DC, 0x61C2, 0xFE1D, 0x3AB1, 0xF966, 0x1FBA, - 0x34D5, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, - 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, - 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D36, 0xFCAD, 0x0000, - 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFFC9, - 0x0F72, 0xF19F, 0x0000, 0x0000, 0x1DE5, 0x0AD7, 0x067D, 0xB4E8, 0xF8EB, - 0xFA60, 0xEE02, 0x0000, 0x0000, 0x213A, 0xF8CE, 0xF9E9, 0xB1DD, 0x61C2, - 0xFE1D, 0x3AB1, 0xF965, 0x1FBA, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, - 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, - 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFFC7, 0x0D31, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, - 0x02DA, 0xC000, 0x0000, 0x0000, 0x0000, 0x04D3, 0x0A4F, 0xEE9D, 0x0000, - 0x0000, 0x2006, 0x0843, 0x075F, 0xB0BC, 0xF9A0, 0xF456, 0xEDD8, 0x0000, - 0x0000, 0x2087, 0xF851, 0xF9F1, 0xB1DE, 0x4000, 0xF709, 0x4000, 0xFFE8, - 0xFE51, 0x34DC, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x0931, - 0xEDA0, 0x7893, 0x0000, 0x0000, 0xE5ED, 0xFFDC, 0xFE09, 0xC0D5, 0xFCE7, - 0x136D, 0x8A32, 0x0000, 0x0000, 0xA937, 0x0F64, 0x0AF3, 0xBE0C, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBB, 0x0C34, 0xFFB9, - 0x0000, 0x0000, 0x0000, 0xBF85, 0xFE57, 0xBFF8, 0x0000, 0x0000, 0x0000, - 0x051E, 0x0D98, 0xEA86, 0x0000, 0x0000, 0x3174, 0x0986, 0x09AB, 0xA6B2, - 0xFF8B, 0xF0C4, 0xEC66, 0x0000, 0x0000, 0x3A30, 0xF5E6, 0xF97D, 0xB12A, - 0x436E, 0xF3CA, 0x4025, 0xFEC7, 0x01A9, 0x3349, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x0F19, 0xEF22, 0x7252, 0x0000, 0x0000, 0xE073, - 0xFFF5, 0x006B, 0xC0AE, 0xF1CB, 0x13A2, 0x7CCB, 0x0000, 0x0000, 0xAE44, - 0x0DD9, 0x0B72, 0xC3AA, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFFA2, 0x0A07, 0xFF1C, 0x0000, 0x0000, 0x0000, 0xB6A0, 0xF8C4, - 0xC0B4, 0x0000, 0x0000, 0x0000, 0x046F, 0x14CD, 0xE515, 0x0000, 0x0000, - 0x4B1D, 0x0BDC, 0x0C10, 0x9B28, 0x0FD5, 0xEB60, 0xF04B, 0x0000, 0x0000, - 0x4FC3, 0xF095, 0xF87E, 0xAF9D, 0x4AE1, 0xECA4, 0x4080, 0xFC4F, 0x08DD, - 0x2FCF, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x1BF1, 0xF27E, - 0x64A8, 0x0000, 0x0000, 0xD467, 0x002E, 0x05AA, 0xC058, 0xD95B, 0x1417, - 0x5F4D, 0x0000, 0x0000, 0xB961, 0x0A76, 0x0C88, 0xD006, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF89, 0x07DA, 0xFE80, 0x0000, - 0x0000, 0x0000, 0xAA24, 0xFF0F, 0xC009, 0x0000, 0x0000, 0x0000, 0xF90E, - 0x1CAF, 0xCEFB, 0x0000, 0x0000, 0x5FFB, 0x0F61, 0x0A4A, 0x9E40, 0x2190, - 0xE393, 0xD7FA, 0x0000, 0x0000, 0x5421, 0xEB43, 0xF77F, 0xAE10, 0x522D, - 0xE580, 0x40F1, 0xF9E3, 0x0FAD, 0x2C50, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x286A, 0xF5F1, 0x573B, 0x0000, 0x0000, 0xC85C, 0x0066, - 0x0AE9, 0xC002, 0xC0EB, 0x148C, 0x41D0, 0x0000, 0x0000, 0xC47E, 0x0713, - 0x0D9E, 0xDC63, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFF7E, 0x06DC, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, - 0x0000, 0x0000, 0x0000, 0xE8F1, 0x1A2A, 0xB8CB, 0x0000, 0x0000, 0x67A9, - 0x11B0, 0x083F, 0xA3A1, 0x232F, 0xE24B, 0xC7CF, 0x0000, 0x0000, 0x5267, - 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF8E4, 0x11DB, 0x2AAB, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, - 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, - 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06DC, 0xFE38, 0x0000, - 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xE8F1, - 0x1A2A, 0xB8CB, 0x0000, 0x0000, 0x67A9, 0x11B0, 0x083F, 0xA3A1, 0x232F, - 0xE24B, 0xC7CF, 0x0000, 0x0000, 0x5267, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, - 0xE241, 0x4131, 0xF8E4, 0x183F, 0x2AAB, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, - 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, - 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFF7E, 0x06E3, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, - 0x0000, 0x0000, 0x0000, 0xE93D, 0x1A35, 0xB905, 0x0000, 0x0000, 0x677C, - 0x11B0, 0x083F, 0xA3A1, 0x22F0, 0xE251, 0xC7F9, 0x0000, 0x0000, 0x524A, - 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF910, 0x1848, 0x2AF9, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, - 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, - 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06E9, 0xFE38, 0x0000, 0x0000, - 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xE987, 0x1A40, - 0xB93F, 0x0000, 0x0000, 0x674F, 0x11B0, 0x083F, 0xA3A1, 0x22B2, 0xE256, - 0xC823, 0x0000, 0x0000, 0x522C, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, - 0x4131, 0xF93C, 0x1851, 0x2B47, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, - 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, - 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, - 0x06F0, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, - 0x0000, 0x0000, 0xE9D2, 0x1A4A, 0xB978, 0x0000, 0x0000, 0x6721, 0x11B0, - 0x083F, 0xA3A1, 0x2275, 0xE25B, 0xC84D, 0x0000, 0x0000, 0x520E, 0xE8D8, - 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF969, 0x185A, 0x2B96, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, - 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, - 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06F6, 0xFE38, 0x0000, 0x0000, 0x0000, - 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEA1B, 0x1A54, 0xB9B1, - 0x0000, 0x0000, 0x66F4, 0x11B0, 0x083F, 0xA3A1, 0x2237, 0xE261, 0xC876, - 0x0000, 0x0000, 0x51F0, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, - 0xF995, 0x1863, 0x2BE4, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, - 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, - 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06FD, - 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, - 0x0000, 0xEA64, 0x1A5E, 0xB9EA, 0x0000, 0x0000, 0x66C6, 0x11B0, 0x083F, - 0xA3A1, 0x21FA, 0xE266, 0xC8A0, 0x0000, 0x0000, 0x51D1, 0xE8D8, 0xF70B, - 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF9C2, 0x186D, 0x2C32, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, - 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, - 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFF7E, 0x0703, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, - 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEAAC, 0x1A68, 0xBA22, 0x0000, - 0x0000, 0x6698, 0x11B0, 0x083F, 0xA3A1, 0x21BD, 0xE26C, 0xC8C9, 0x0000, - 0x0000, 0x51B2, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF9EE, - 0x1876, 0x2C81, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, - 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, - 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x070A, 0xFE38, - 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, - 0xEAF4, 0x1A71, 0xBA5B, 0x0000, 0x0000, 0x6669, 0x11B0, 0x083F, 0xA3A1, - 0x2180, 0xE271, 0xC8F3, 0x0000, 0x0000, 0x5193, 0xE8D8, 0xF70B, 0xAD5B, - 0x556C, 0xE241, 0x4131, 0xFA1A, 0x187F, 0x2CCF, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, - 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, - 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFF7E, 0x0710, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, - 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEB3B, 0x1A7B, 0xBA93, 0x0000, 0x0000, - 0x663B, 0x11B0, 0x083F, 0xA3A1, 0x2144, 0xE277, 0xC91C, 0x0000, 0x0000, - 0x5174, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFA47, 0x1888, - 0x2D1D, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, - 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, - 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0717, 0xFE38, 0x0000, - 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEB81, - 0x1A83, 0xBACA, 0x0000, 0x0000, 0x660C, 0x11B0, 0x083F, 0xA3A1, 0x2107, - 0xE27C, 0xC945, 0x0000, 0x0000, 0x5154, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, - 0xE241, 0x4131, 0xFA73, 0x1891, 0x2D6C, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, - 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, - 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFF7E, 0x071D, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, - 0x0000, 0x0000, 0x0000, 0xEBC7, 0x1A8C, 0xBB02, 0x0000, 0x0000, 0x65DD, - 0x11B0, 0x083F, 0xA3A1, 0x20CB, 0xE282, 0xC96E, 0x0000, 0x0000, 0x5134, - 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFAA0, 0x189A, 0x2DBA, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, - 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, - 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0724, 0xFE38, 0x0000, 0x0000, - 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEC0D, 0x1A95, - 0xBB3A, 0x0000, 0x0000, 0x65AF, 0x11B0, 0x083F, 0xA3A1, 0x2090, 0xE287, - 0xC997, 0x0000, 0x0000, 0x5114, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, - 0x4131, 0xFACC, 0x18A3, 0x2E08, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, - 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, - 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, - 0x072A, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, - 0x0000, 0x0000, 0xEC51, 0x1A9D, 0xBB71, 0x0000, 0x0000, 0x657F, 0x11B0, - 0x083F, 0xA3A1, 0x2054, 0xE28D, 0xC9C0, 0x0000, 0x0000, 0x50F4, 0xE8D8, - 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFAF8, 0x18AD, 0x2E57, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, - 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, - 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0731, 0xFE38, 0x0000, 0x0000, 0x0000, - 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEC95, 0x1AA5, 0xBBA8, - 0x0000, 0x0000, 0x6550, 0x11B0, 0x083F, 0xA3A1, 0x2019, 0xE293, 0xC9E9, - 0x0000, 0x0000, 0x50D4, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, - 0xFB25, 0x18B6, 0x2EA5, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, - 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, - 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0737, - 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, - 0x0000, 0xECD9, 0x1AAD, 0xBBDF, 0x0000, 0x0000, 0x6521, 0x11B0, 0x083F, - 0xA3A1, 0x1FDE, 0xE298, 0xCA12, 0x0000, 0x0000, 0x50B3, 0xE8D8, 0xF70B, - 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFB51, 0x18BF, 0x2EF3, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, - 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, - 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFF7E, 0x0732, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, - 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEC9E, 0x1AA6, 0xBBAF, 0x0000, - 0x0000, 0x654A, 0x11B0, 0x083F, 0xA3A1, 0x2011, 0xE293, 0xC9EE, 0x0000, - 0x0000, 0x50D0, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFB7E, - 0x18C8, 0x2F42, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, - 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, - 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x072C, 0xFE38, - 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, - 0xEC62, 0x1A9F, 0xBB7F, 0x0000, 0x0000, 0x6574, 0x11B0, 0x083F, 0xA3A1, - 0x2045, 0xE28E, 0xC9CA, 0x0000, 0x0000, 0x50EC, 0xE8D8, 0xF70B, 0xAD5B, - 0x556C, 0xE241, 0x4131, 0xFBAA, 0x18D1, 0x2F90, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, - 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, - 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFF7E, 0x0726, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, - 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEC26, 0x1A98, 0xBB4E, 0x0000, 0x0000, - 0x659D, 0x11B0, 0x083F, 0xA3A1, 0x2079, 0xE289, 0xC9A7, 0x0000, 0x0000, - 0x5108, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFBA0, 0x18CF, - 0x2F7E, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, - 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, - 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0721, 0xFE38, 0x0000, - 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEBEA, - 0x1A90, 0xBB1E, 0x0000, 0x0000, 0x65C6, 0x11B0, 0x083F, 0xA3A1, 0x20AD, - 0xE284, 0xC983, 0x0000, 0x0000, 0x5125, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, - 0xE241, 0x4131, 0xFB83, 0x18C9, 0x2F4B, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, - 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, - 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFF7E, 0x071B, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, - 0x0000, 0x0000, 0x0000, 0xEBAD, 0x1A89, 0xBAED, 0x0000, 0x0000, 0x65EF, - 0x11B0, 0x083F, 0xA3A1, 0x20E2, 0xE280, 0xC95F, 0x0000, 0x0000, 0x5140, - 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFB56, 0x18C0, 0x2EFC, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, - 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, - 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0715, 0xFE38, 0x0000, 0x0000, - 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEB70, 0x1A81, - 0xBABD, 0x0000, 0x0000, 0x6618, 0x11B0, 0x083F, 0xA3A1, 0x2117, 0xE27B, - 0xC93B, 0x0000, 0x0000, 0x515C, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, - 0x4131, 0xFB1D, 0x18B4, 0x2E98, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, - 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, - 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, - 0x0710, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, - 0x0000, 0x0000, 0xEB32, 0x1A79, 0xBA8C, 0x0000, 0x0000, 0x6641, 0x11B0, - 0x083F, 0xA3A1, 0x214B, 0xE276, 0xC917, 0x0000, 0x0000, 0x5178, 0xE8D8, - 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFADB, 0x18A7, 0x2E23, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, - 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, - 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFF7E, 0x070A, 0xFE38, 0x0000, 0x0000, 0x0000, - 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEAF4, 0x1A71, 0xBA5B, - 0x0000, 0x0000, 0x6669, 0x11B0, 0x083F, 0xA3A1, 0x2180, 0xE271, 0xC8F3, - 0x0000, 0x0000, 0x5193, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, - 0xFA92, 0x1898, 0x2DA3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, - 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, - 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0704, - 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, - 0x0000, 0xEAB5, 0x1A69, 0xBA29, 0x0000, 0x0000, 0x6692, 0x11B0, 0x083F, - 0xA3A1, 0x21B5, 0xE26C, 0xC8CE, 0x0000, 0x0000, 0x51AE, 0xE8D8, 0xF70B, - 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFA47, 0x1888, 0x2D1D, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, - 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, - 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFF7E, 0x06FF, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, - 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEA76, 0x1A61, 0xB9F8, 0x0000, - 0x0000, 0x66BA, 0x11B0, 0x083F, 0xA3A1, 0x21EB, 0xE268, 0xC8AA, 0x0000, - 0x0000, 0x51C9, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF9FB, - 0x1878, 0x2C98, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, - 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, - 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06F9, 0xFE38, - 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, - 0xEA36, 0x1A58, 0xB9C6, 0x0000, 0x0000, 0x66E2, 0x11B0, 0x083F, 0xA3A1, - 0x2220, 0xE263, 0xC886, 0x0000, 0x0000, 0x51E4, 0xE8D8, 0xF70B, 0xAD5B, - 0x556C, 0xE241, 0x4131, 0xF9B3, 0x186A, 0x2C18, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, - 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, - 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFF7E, 0x06F3, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, - 0xBDD2, 0x0000, 0x0000, 0x0000, 0xE9F6, 0x1A4F, 0xB994, 0x0000, 0x0000, - 0x670A, 0x11B0, 0x083F, 0xA3A1, 0x2256, 0xE25E, 0xC862, 0x0000, 0x0000, - 0x51FF, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF970, 0x185C, - 0x2BA3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, - 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, - 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06EE, 0xFE38, 0x0000, - 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xE9B6, - 0x1A46, 0xB962, 0x0000, 0x0000, 0x6732, 0x11B0, 0x083F, 0xA3A1, 0x228C, - 0xE259, 0xC83D, 0x0000, 0x0000, 0x5219, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, - 0xE241, 0x4131, 0xF937, 0x1850, 0x2B3F, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, - 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, - 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFF7E, 0x06E8, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, - 0x0000, 0x0000, 0x0000, 0xE975, 0x1A3D, 0xB930, 0x0000, 0x0000, 0x675A, - 0x11B0, 0x083F, 0xA3A1, 0x22C2, 0xE255, 0xC819, 0x0000, 0x0000, 0x5233, - 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF90B, 0x1847, 0x2AF0, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, - 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, - 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06E2, 0xFE38, 0x0000, 0x0000, - 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xE933, 0x1A34, - 0xB8FE, 0x0000, 0x0000, 0x6782, 0x11B0, 0x083F, 0xA3A1, 0x22F8, 0xE250, - 0xC7F4, 0x0000, 0x0000, 0x524D, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, - 0x4131, 0xF8EE, 0x1841, 0x2ABD, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, - 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, - 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, - 0x06DC, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, - 0x0000, 0x0000, 0xE8F1, 0x1A2A, 0xB8CB, 0x0000, 0x0000, 0x67A9, 0x11B0, - 0x083F, 0xA3A1, 0x232F, 0xE24B, 0xC7CF, 0x0000, 0x0000, 0x5267, 0xE8D8, - 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF8E4, 0x183F, 0x2AAB, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, - 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, - 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00F7, 0x0CAE, 0xFD93, - 0x0000, 0x0000, 0x0000, 0x9953, 0x02B3, 0xC0ED, 0x0000, 0x0000, 0x0000, - 0x087B, 0xFFC0, 0xE175, 0x0000, 0x0000, 0x21F0, 0xF6DE, 0x077F, 0xB7DB, - 0xF4E5, 0x0606, 0x05E6, 0x0000, 0x0000, 0x20F1, 0xF94E, 0xF7A2, 0xA326, - 0x61C2, 0xFE1D, 0x37D7, 0xF95E, 0x1FDD, 0x34D3, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x4557, 0xF959, 0x2A44, 0x0000, 0x0000, 0xAABB, - 0xF8B0, 0x8BB6, 0xD4CC, 0xD92F, 0x1D54, 0x3848, 0x0000, 0x0000, 0x0000, - 0xFB26, 0x0549, 0xC9CC, 0xC000, 0x6A5E, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0116, 0x0CC0, 0xFD9A, 0x0000, 0x0000, 0x0000, 0x9887, 0x0329, - 0xC09E, 0x0000, 0x0000, 0x0000, 0x0799, 0x00ED, 0xE1D3, 0x0000, 0x0000, - 0x22E2, 0xF7D8, 0x0726, 0xB67D, 0xF49C, 0x03DB, 0x005E, 0x0000, 0x0000, - 0x2B3C, 0xF915, 0xF7F1, 0xA454, 0x62C0, 0xFE54, 0x3797, 0xF92C, 0x20DE, - 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x4621, 0xF96D, - 0x27EA, 0x0000, 0x0000, 0xA9E6, 0xF91F, 0x8B69, 0xD466, 0xD95F, 0x1EAC, - 0x371C, 0x0000, 0x0000, 0x0000, 0xFB3D, 0x055A, 0xC9C2, 0xC000, 0x69B8, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0121, 0x0CE8, 0xFD9C, 0x0000, - 0x0000, 0x0000, 0x97EA, 0x0386, 0xC05E, 0x0000, 0x0000, 0x0000, 0x0626, - 0x032D, 0xE3FB, 0x0000, 0x0000, 0x2426, 0xFAD2, 0x0685, 0xB38C, 0xF57E, - 0xFFB5, 0xF6A9, 0x0000, 0x0000, 0x387B, 0xF8D1, 0xF858, 0xA605, 0x6384, - 0xFE7E, 0x3766, 0xF906, 0x21A4, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x46BC, 0xF97C, 0x261B, 0x0000, 0x0000, 0xA942, 0xF975, - 0x8B2E, 0xD418, 0xD984, 0x1FB4, 0x3636, 0x0000, 0x0000, 0x0000, 0xFB4E, - 0x0566, 0xC9BA, 0xC000, 0x68B8, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0122, 0x0D15, 0xFD9C, 0x0000, 0x0000, 0x0000, 0x9777, 0x03CA, 0xC02D, - 0x0000, 0x0000, 0x0000, 0x046D, 0x05D9, 0xE7E4, 0x0000, 0x0000, 0x2423, - 0xFEA9, 0x05BE, 0xB001, 0xF807, 0xFB50, 0xEC3D, 0x0000, 0x0000, 0x41C4, - 0xF886, 0xF8D0, 0xA815, 0x63DC, 0xFE9D, 0x3742, 0xF8EA, 0x2233, 0x34D3, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x472C, 0xF987, 0x24CA, - 0x0000, 0x0000, 0xA8CB, 0xF9B3, 0x8B03, 0xD3DF, 0xD99F, 0x2074, 0x358F, - 0x0000, 0x0000, 0x0000, 0xFB5B, 0x0570, 0xC9B4, 0xC000, 0x67AE, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0x011D, 0x0D3B, 0xFD9B, 0x0000, 0x0000, - 0x0000, 0x972A, 0x03F9, 0xC00C, 0x0000, 0x0000, 0x0000, 0x02CD, 0x0871, - 0xECF0, 0x0000, 0x0000, 0x2282, 0x0237, 0x04F5, 0xACD1, 0xFAB6, 0xF82C, - 0xE46E, 0x0000, 0x0000, 0x441A, 0xF838, 0xF952, 0xAA60, 0x63D8, 0xFEB2, - 0x372A, 0xF8E4, 0x2293, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x4777, 0xF98E, 0x23EB, 0x0000, 0x0000, 0xA87C, 0xF9DC, 0x8AE6, - 0xD3B9, 0xD9B1, 0x20F3, 0x3520, 0x0000, 0x0000, 0x0000, 0xFB63, 0x0576, - 0xC9B0, 0xC000, 0x66EA, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0119, - 0x0D48, 0xFD9B, 0x0000, 0x0000, 0x0000, 0x9700, 0x0413, 0xBFF9, 0x0000, - 0x0000, 0x0000, 0x0166, 0x0A9F, 0xF199, 0x0000, 0x0000, 0x20E8, 0x05CA, - 0x03DE, 0xAA10, 0xFC09, 0xF67D, 0xE107, 0x0000, 0x0000, 0x3F53, 0xF7EC, - 0xF9D9, 0xACBF, 0x63D6, 0xFEBD, 0x371C, 0xF8E4, 0x22C7, 0x34D3, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x47A0, 0xF992, 0x2370, 0x0000, - 0x0000, 0xA851, 0xF9F3, 0x8AD7, 0xD3A4, 0xD9BB, 0x2139, 0x34E3, 0x0000, - 0x0000, 0x0000, 0xFB68, 0x0579, 0xC9AE, 0xC000, 0x66BD, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0115, 0x0D1A, 0xFD9A, 0x0000, 0x0000, 0x0000, - 0x96F2, 0x041B, 0xBFF3, 0x0000, 0x0000, 0x0000, 0xFF60, 0x0D4F, 0xF565, - 0x0000, 0x0000, 0x22E9, 0x0918, 0x0309, 0xA7C3, 0xFC6B, 0xF55C, 0xE057, - 0x0000, 0x0000, 0x36FF, 0xF7A5, 0xFA5C, 0xAF0E, 0x63D5, 0xFEC1, 0x3718, - 0xF8E4, 0x22D5, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x47AB, 0xF993, 0x234F, 0x0000, 0x0000, 0xA845, 0xF9F9, 0x8AD2, 0xD39F, - 0xD9BE, 0x214C, 0x34D2, 0x0000, 0x0000, 0x0000, 0xFB69, 0x057A, 0xC9AE, - 0xC000, 0x67B5, 0xFD27, 0x0000, 0x0000, 0x0000, 0x0000, 0x010A, 0x0CC6, - 0xFD97, 0x0000, 0x0000, 0x0000, 0x96FE, 0x0414, 0xBFF9, 0x0000, 0x0000, - 0x0000, 0xFD19, 0x1014, 0xF9A5, 0x0000, 0x0000, 0x2559, 0x0C01, 0x0311, - 0xA5B2, 0xFC12, 0xF4B0, 0xE1B0, 0x0000, 0x0000, 0x2D81, 0xF767, 0xFAD6, - 0xB129, 0x63D6, 0xFEBE, 0x371C, 0xF8E4, 0x22C3, 0x34D3, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x479D, 0xF992, 0x2378, 0x0000, 0x0000, - 0xA853, 0xF9F1, 0x8AD8, 0xD3A6, 0xD9BA, 0x2135, 0x34E7, 0x0000, 0x0000, - 0x0000, 0xFB67, 0x0579, 0xC9AF, 0xC000, 0x6992, 0xFD28, 0x0000, 0x0000, - 0x0000, 0x0000, 0x00FF, 0x0C98, 0xFD95, 0x0000, 0x0000, 0x0000, 0x971F, - 0x0400, 0xC007, 0x0000, 0x0000, 0x0000, 0xFB52, 0x1123, 0xFA0F, 0x0000, - 0x0000, 0x2963, 0x0E7F, 0x036D, 0xA3F8, 0xFB18, 0xF4A7, 0xE4FB, 0x0000, - 0x0000, 0x238E, 0xF736, 0xFB41, 0xB2EA, 0x63D7, 0xFEB5, 0x3726, 0xF8E4, - 0x2297, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x477A, - 0xF98F, 0x23E1, 0x0000, 0x0000, 0xA878, 0xF9DE, 0x8AE5, 0xD3B8, 0xD9B2, - 0x20F9, 0x351B, 0x0000, 0x0000, 0x0000, 0xFB63, 0x0576, 0xC9B0, 0xC000, - 0x6B72, 0xFD27, 0x0000, 0x0000, 0x0000, 0x0000, 0x00F7, 0x0CAA, 0xFD93, - 0x0000, 0x0000, 0x0000, 0x9751, 0x03E1, 0xC01D, 0x0000, 0x0000, 0x0000, - 0xFA1E, 0x1043, 0xF463, 0x0000, 0x0000, 0x3152, 0x0EB9, 0x03DB, 0xA3FA, - 0xFA58, 0xF5A9, 0xE7CE, 0x0000, 0x0000, 0x21A2, 0xF716, 0xFB95, 0xB42C, - 0x63DA, 0xFEA7, 0x3736, 0xF8E4, 0x2254, 0x34D3, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x4746, 0xF98A, 0x247C, 0x0000, 0x0000, 0xA8AF, - 0xF9C1, 0x8AF9, 0xD3D2, 0xD9A6, 0x20A0, 0x3568, 0x0000, 0x0000, 0x0000, - 0xFB5E, 0x0572, 0xC9B3, 0xC000, 0x6C75, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0x00F4, 0x0CD4, 0xFD92, 0x0000, 0x0000, 0x0000, 0x9790, 0x03BC, - 0xC038, 0x0000, 0x0000, 0x0000, 0xF9E3, 0x0E84, 0xEC75, 0x0000, 0x0000, - 0x3A01, 0x0CB5, 0x0446, 0xA5B7, 0xF9B9, 0xF749, 0xEA3F, 0x0000, 0x0000, - 0x24A0, 0xF79E, 0xFB49, 0xB1AD, 0x63DD, 0xFE96, 0x3749, 0xF8F3, 0x2202, - 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x4706, 0xF983, - 0x253D, 0x0000, 0x0000, 0xA8F4, 0xF99E, 0x8B11, 0xD3F2, 0xD996, 0x2033, - 0x35C8, 0x0000, 0x0000, 0x0000, 0xFB56, 0x056C, 0xC9B6, 0xC000, 0x6C9C, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x00F3, 0x0D0A, 0xFD92, 0x0000, - 0x0000, 0x0000, 0x97D7, 0x0391, 0xC056, 0x0000, 0x0000, 0x0000, 0xFB3A, - 0x0C31, 0xE450, 0x0000, 0x0000, 0x408E, 0x09E0, 0x04C3, 0xA81B, 0xF8D4, - 0xF91B, 0xEDE4, 0x0000, 0x0000, 0x2489, 0xF85F, 0xFAAF, 0xADC3, 0x639C, - 0xFE83, 0x3760, 0xF905, 0x21A6, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x46BD, 0xF97C, 0x2616, 0x0000, 0x0000, 0xA941, 0xF976, - 0x8B2D, 0xD417, 0xD985, 0x1FB6, 0x3634, 0x0000, 0x0000, 0x0000, 0xFB4E, - 0x0567, 0xC9BA, 0xC000, 0x6C8A, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0x00F3, 0x0D3F, 0xFD92, 0x0000, 0x0000, 0x0000, 0x9822, 0x0364, 0xC075, - 0x0000, 0x0000, 0x0000, 0xFDE4, 0x09B2, 0xDDC3, 0x0000, 0x0000, 0x435A, - 0x0683, 0x054B, 0xAAEB, 0xF7D0, 0xFB63, 0xF278, 0x0000, 0x0000, 0x235F, - 0xF8A5, 0xFA74, 0xAC83, 0x633E, 0xFE6F, 0x3777, 0xF918, 0x2144, 0x34D3, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x4670, 0xF975, 0x26FC, - 0x0000, 0x0000, 0xA992, 0xF94B, 0x8B4A, 0xD43E, 0xD972, 0x1F33, 0x36A6, - 0x0000, 0x0000, 0x0000, 0xFB46, 0x0560, 0xC9BE, 0xC000, 0x6C4D, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0x00F3, 0x0D69, 0xFD92, 0x0000, 0x0000, - 0x0000, 0x986D, 0x0338, 0xC094, 0x0000, 0x0000, 0x0000, 0x00CB, 0x079B, - 0xDA49, 0x0000, 0x0000, 0x4227, 0x02E6, 0x05D5, 0xADEC, 0xF6E0, 0xFDF9, - 0xF7A1, 0x0000, 0x0000, 0x211C, 0xF8CB, 0xFA47, 0xABDD, 0x62E0, 0xFE5B, - 0x378F, 0xF92B, 0x20E2, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x4624, 0xF96D, 0x27E1, 0x0000, 0x0000, 0xA9E3, 0xF921, 0x8B68, - 0xD465, 0xD960, 0x1EB1, 0x3718, 0x0000, 0x0000, 0x0000, 0xFB3D, 0x055A, - 0xC9C2, 0xC000, 0x6BF3, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x00F4, - 0x0D7B, 0xFD92, 0x0000, 0x0000, 0x0000, 0x98B5, 0x030E, 0xC0B0, 0x0000, - 0x0000, 0x0000, 0x037C, 0x05C8, 0xDA0F, 0x0000, 0x0000, 0x3CBF, 0xFF51, - 0x0658, 0xB0E4, 0xF62F, 0x009C, 0xFCD9, 0x0000, 0x0000, 0x1E4D, 0xF8EA, - 0xF9F8, 0xAAD9, 0x6287, 0xFE48, 0x37A5, 0xF93D, 0x2086, 0x34D3, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x45DC, 0xF966, 0x28B9, 0x0000, - 0x0000, 0xAA2F, 0xF8F9, 0x8B83, 0xD489, 0xD94F, 0x1E36, 0x3783, 0x0000, - 0x0000, 0x0000, 0xFB35, 0x0554, 0xC9C5, 0xC000, 0x6B8A, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0x00F4, 0x0D5C, 0xFD92, 0x0000, 0x0000, 0x0000, - 0x98F4, 0x02E9, 0xC0C9, 0x0000, 0x0000, 0x0000, 0x05C7, 0x03CA, 0xDBA1, - 0x0000, 0x0000, 0x34B7, 0xFC0A, 0x06CD, 0xB399, 0xF5B8, 0x02DC, 0x00ED, - 0x0000, 0x0000, 0x1D69, 0xF90D, 0xF95C, 0xA8CB, 0x6239, 0xFE37, 0x37B9, - 0xF94D, 0x2035, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x459C, 0xF960, 0x2977, 0x0000, 0x0000, 0xAA73, 0xF8D6, 0x8B9C, 0xD4AA, - 0xD93F, 0x1DC9, 0x37E2, 0x0000, 0x0000, 0x0000, 0xFB2E, 0x054F, 0xC9C9, - 0xC000, 0x6B20, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x00F5, 0x0D15, - 0xFD93, 0x0000, 0x0000, 0x0000, 0x9926, 0x02CD, 0xC0DC, 0x0000, 0x0000, - 0x0000, 0x075C, 0x01E0, 0xDDF8, 0x0000, 0x0000, 0x2C46, 0xF95A, 0x072A, - 0xB5D0, 0xF554, 0x0489, 0x039F, 0x0000, 0x0000, 0x1EA1, 0xF92D, 0xF895, - 0xA63E, 0x61FA, 0xFE29, 0x37C9, 0xF95A, 0x1FF4, 0x34D3, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x4569, 0xF95B, 0x2A0E, 0x0000, 0x0000, - 0xAAA8, 0xF8BA, 0x8BAF, 0xD4C3, 0xD933, 0x1D73, 0x382D, 0x0000, 0x0000, - 0x0000, 0xFB28, 0x054B, 0xC9CB, 0xC000, 0x6AC3, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0x00F6, 0x0CCE, 0xFD93, 0x0000, 0x0000, 0x0000, 0x9947, - 0x02BA, 0xC0E8, 0x0000, 0x0000, 0x0000, 0x0838, 0x005F, 0xE057, 0x0000, - 0x0000, 0x2512, 0xF789, 0x0768, 0xB74F, 0xF506, 0x05A2, 0x054F, 0x0000, - 0x0000, 0x202D, 0xF945, 0xF7EA, 0xA411, 0x61D1, 0xFE20, 0x37D3, 0xF962, - 0x1FCA, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x4548, - 0xF958, 0x2A72, 0x0000, 0x0000, 0xAACC, 0xF8A7, 0x8BBC, 0xD4D4, 0xD92B, - 0x1D3A, 0x385F, 0x0000, 0x0000, 0x0000, 0xFB24, 0x0548, 0xC9CD, 0xC000, - 0x6A81, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD57, - 0x0C75, 0xFD93, 0x0000, 0x0000, 0x0000, 0x95A0, 0x02DA, 0xC000, 0x0000, - 0x0000, 0x0000, 0x0244, 0x0D14, 0xE896, 0x0000, 0x0000, 0x2E92, 0x08FA, - 0x0919, 0xAA50, 0xFC76, 0xF14F, 0xE452, 0x0000, 0x0000, 0x2291, 0xF851, - 0xF9F1, 0xB1DE, 0x61C2, 0xFE1D, 0x35CD, 0xF95B, 0x1FEF, 0x34D3, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, - 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD92F, 0x1D54, 0x3848, 0x0000, - 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC006, 0x6A68, 0xFD32, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFD54, 0x0C77, 0xFD9E, 0x0000, 0x0000, 0x0000, - 0x94AD, 0x0356, 0xBF9C, 0x0000, 0x0000, 0x0000, 0x0259, 0x0CB4, 0xE74A, - 0x0000, 0x0000, 0x2EEA, 0x0809, 0x08E4, 0xAAB8, 0xFE17, 0xF127, 0xDF5D, - 0x0000, 0x0000, 0x2B98, 0xF8F7, 0xF9E2, 0xB095, 0x61B8, 0xFE53, 0x357E, - 0xF916, 0x212E, 0x34CB, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, - 0xD95F, 0x1EAA, 0x371E, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, - 0xC04E, 0x6A68, 0xFDC0, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD53, 0x0C8C, - 0xFDA3, 0x0000, 0x0000, 0x0000, 0x93F0, 0x03B8, 0xBF4B, 0x0000, 0x0000, - 0x0000, 0x02C7, 0x0BD5, 0xE5AA, 0x0000, 0x0000, 0x2E30, 0x0652, 0x0865, - 0xABEB, 0xFFCD, 0xF110, 0xDABC, 0x0000, 0x0000, 0x34F5, 0xF9DB, 0xF9BC, - 0xAEBB, 0x61AF, 0xFE7D, 0x3540, 0xF8EF, 0x21B7, 0x34B9, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, - 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD984, 0x1FB1, 0x3639, 0x0000, 0x0000, - 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC0B7, 0x6A6B, 0xFE8E, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFD51, 0x0CAA, 0xFDA5, 0x0000, 0x0000, 0x0000, 0x9366, - 0x0400, 0xBF0D, 0x0000, 0x0000, 0x0000, 0x0364, 0x0A9D, 0xE3F4, 0x0000, - 0x0000, 0x2C91, 0x047C, 0x07C5, 0xADB1, 0x00D9, 0xF153, 0xD839, 0x0000, - 0x0000, 0x3C47, 0xFAE5, 0xF986, 0xAC76, 0x61A8, 0xFE9C, 0x3513, 0xF8E4, - 0x21B6, 0x34A5, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, - 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD99F, - 0x2070, 0x3592, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC133, - 0x6A70, 0xFF83, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD50, 0x0CC4, 0xFDA5, - 0x0000, 0x0000, 0x0000, 0x930A, 0x0432, 0xBEE3, 0x0000, 0x0000, 0x0000, - 0x040C, 0x0932, 0xE254, 0x0000, 0x0000, 0x2A5B, 0x032F, 0x072C, 0xAFD6, - 0x007B, 0xF22A, 0xD940, 0x0000, 0x0000, 0x3FC3, 0xFC00, 0xF947, 0xA9EC, - 0x61A4, 0xFEB0, 0x34F5, 0xF8E4, 0x2157, 0x3493, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, - 0xF8A1, 0x8BC0, 0xD4DA, 0xD9B1, 0x20EF, 0x3524, 0x0000, 0x0000, 0x0000, - 0xFB23, 0x0547, 0xC9CE, 0xC1B6, 0x6A78, 0x0088, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFD50, 0x0CCF, 0xFDA6, 0x0000, 0x0000, 0x0000, 0x92D5, 0x044D, - 0xBECA, 0x0000, 0x0000, 0x0000, 0x049D, 0x07BC, 0xE0C0, 0x0000, 0x0000, - 0x2834, 0x0288, 0x067C, 0xB323, 0xFE75, 0xF3EA, 0xDE7B, 0x0000, 0x0000, - 0x3F06, 0xFD16, 0xF905, 0xA741, 0x61A1, 0xFEBC, 0x34E4, 0xF8F8, 0x20C9, - 0x3489, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, - 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD9BA, 0x2134, - 0x34E7, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC235, 0x6A82, - 0x0184, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4F, 0x0CC6, 0xFDA6, 0x0000, - 0x0000, 0x0000, 0x92C4, 0x0457, 0xBEC2, 0x0000, 0x0000, 0x0000, 0x0547, - 0x05B8, 0xDF1F, 0x0000, 0x0000, 0x24E0, 0x0233, 0x05AE, 0xB76D, 0xFBC0, - 0xF679, 0xE64F, 0x0000, 0x0000, 0x3AF5, 0xFE10, 0xF8C7, 0xA49B, 0x61A1, - 0xFEBF, 0x34DF, 0xF917, 0x2036, 0x348C, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, - 0x8BC0, 0xD4DA, 0xD9BD, 0x2148, 0x34D6, 0x0000, 0x0000, 0x0000, 0xFB23, - 0x0547, 0xC9CE, 0xC2A3, 0x6A8D, 0x0260, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFD4F, 0x0CAE, 0xFDA6, 0x0000, 0x0000, 0x0000, 0x92D1, 0x0450, 0xBEC8, - 0x0000, 0x0000, 0x0000, 0x05F3, 0x030D, 0xDE5A, 0x0000, 0x0000, 0x1E9D, - 0x022D, 0x050A, 0xBB0D, 0xF963, 0xF95F, 0xEEBA, 0x0000, 0x0000, 0x33EA, - 0xFEDA, 0xF893, 0xA21E, 0x61A1, 0xFEBC, 0x34E4, 0xF93D, 0x1FCD, 0x34A3, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, - 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD9BA, 0x2130, 0x34EB, - 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC2F5, 0x6A97, 0x0304, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4E, 0x0C90, 0xFDA6, 0x0000, 0x0000, - 0x0000, 0x92F8, 0x043B, 0xBEDA, 0x0000, 0x0000, 0x0000, 0x063A, 0x009D, - 0xDE80, 0x0000, 0x0000, 0x17CA, 0x0272, 0x04DA, 0xBC5D, 0xF7F1, 0xFBE8, - 0xF5E9, 0x0000, 0x0000, 0x2BD5, 0xFF5C, 0xF86F, 0x9FF1, 0x61A3, 0xFEB3, - 0x34F1, 0xF965, 0x1FBA, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, - 0xD4DA, 0xD9B1, 0x20F4, 0x351F, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, - 0xC9CE, 0xC320, 0x6A9D, 0x0359, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4E, - 0x0C75, 0xFDA5, 0x0000, 0x0000, 0x0000, 0x9332, 0x041C, 0xBEF5, 0x0000, - 0x0000, 0x0000, 0x0643, 0xFF9C, 0xDC98, 0x0000, 0x0000, 0x1859, 0x02F7, - 0x0515, 0xBB8A, 0xF76E, 0xFD33, 0xF9B4, 0x0000, 0x0000, 0x26AE, 0xFF80, - 0xF863, 0x9E38, 0x61A6, 0xFEA6, 0x3504, 0xF9C6, 0x2019, 0x356D, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, - 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD9A5, 0x209C, 0x356C, 0x0000, - 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC317, 0x6A9B, 0x0346, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFD4D, 0x0C58, 0xFDA3, 0x0000, 0x0000, 0x0000, - 0x937C, 0x03F5, 0xBF17, 0x0000, 0x0000, 0x0000, 0x0645, 0x0057, 0xD6D7, - 0x0000, 0x0000, 0x23BD, 0x03A8, 0x0578, 0xB9FB, 0xF78A, 0xFCE7, 0xF92C, - 0x0000, 0x0000, 0x26FA, 0xFD92, 0xF8C4, 0x9DB0, 0x61AA, 0xFE95, 0x351D, - 0xFA67, 0x20B7, 0x366D, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, - 0xD996, 0x202F, 0x35CB, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, - 0xC249, 0x6A84, 0x01AB, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4D, 0x0C3A, - 0xFDA2, 0x0000, 0x0000, 0x0000, 0x93D1, 0x03C8, 0xBF3D, 0x0000, 0x0000, - 0x0000, 0x05EF, 0x01C8, 0xD0E9, 0x0000, 0x0000, 0x3122, 0x0477, 0x05F9, - 0xB7E3, 0xF80A, 0xFBA8, 0xF635, 0x0000, 0x0000, 0x29F3, 0xF9E9, 0xF981, - 0x9EA1, 0x61AE, 0xFE82, 0x3539, 0xFAFF, 0x214C, 0x375D, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, - 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD984, 0x1FB3, 0x3637, 0x0000, 0x0000, - 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC0AA, 0x6A6A, 0xFE71, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFD4D, 0x0C2C, 0xFDA0, 0x0000, 0x0000, 0x0000, 0x942B, - 0x0399, 0xBF64, 0x0000, 0x0000, 0x0000, 0x050D, 0x039A, 0xCCEF, 0x0000, - 0x0000, 0x3C88, 0x0557, 0x068B, 0xB571, 0xF8DE, 0xF9EF, 0xF23F, 0x0000, - 0x0000, 0x2CE0, 0xF780, 0xF9FF, 0xA080, 0x61B2, 0xFE6E, 0x3556, 0xFB42, - 0x218E, 0x37C8, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, - 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD972, - 0x1F31, 0x36A8, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xBEF9, - 0x6A6D, 0xFB18, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4C, 0x0C31, 0xFD9E, - 0x0000, 0x0000, 0x0000, 0x9485, 0x036B, 0xBF8B, 0x0000, 0x0000, 0x0000, - 0x03A2, 0x059C, 0xCBA5, 0x0000, 0x0000, 0x4487, 0x063A, 0x0725, 0xB2D8, - 0xF9DF, 0xF818, 0xEE47, 0x0000, 0x0000, 0x2E5B, 0xF701, 0xFA1D, 0xA340, - 0x61B6, 0xFE5A, 0x3574, 0xFB1E, 0x216B, 0x3790, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, - 0xF8A1, 0x8BC0, 0xD4DA, 0xD960, 0x1EAF, 0x371A, 0x0000, 0x0000, 0x0000, - 0xFB23, 0x0547, 0xC9CE, 0xBDFA, 0x6A7E, 0xF923, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFD4D, 0x0C3F, 0xFD9B, 0x0000, 0x0000, 0x0000, 0x94DB, 0x033F, - 0xBFAF, 0x0000, 0x0000, 0x0000, 0x021E, 0x0783, 0xCD13, 0x0000, 0x0000, - 0x4842, 0x0713, 0x07BC, 0xB04A, 0xFAD8, 0xF65E, 0xEADE, 0x0000, 0x0000, - 0x2E4B, 0xF6FD, 0xFA23, 0xA6CE, 0x61BA, 0xFE47, 0x358F, 0xFAC6, 0x2115, - 0x3704, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, - 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD94E, 0x1E34, - 0x3784, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xBE13, 0x6A7C, - 0xF955, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4D, 0x0C50, 0xFD98, 0x0000, - 0x0000, 0x0000, 0x9527, 0x0318, 0xBFCF, 0x0000, 0x0000, 0x0000, 0x00F9, - 0x098E, 0xD2CD, 0x0000, 0x0000, 0x45FA, 0x07D4, 0x0844, 0xADF7, 0xFB87, - 0xF4FB, 0xE893, 0x0000, 0x0000, 0x2CAA, 0xF748, 0xFA1B, 0xAA9C, 0x61BD, - 0xFE37, 0x35A8, 0xFA53, 0x20A4, 0x364E, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, - 0x8BC0, 0xD4DA, 0xD93F, 0x1DC8, 0x37E2, 0x0000, 0x0000, 0x0000, 0xFB23, - 0x0547, 0xC9CE, 0xBECB, 0x6A70, 0xFAC2, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFD4D, 0x0C62, 0xFD95, 0x0000, 0x0000, 0x0000, 0x9565, 0x02F8, 0xBFE8, - 0x0000, 0x0000, 0x0000, 0x00C4, 0x0B84, 0xDBCB, 0x0000, 0x0000, 0x3E09, - 0x086E, 0x08B3, 0xAC11, 0xFC24, 0xF370, 0xE65E, 0x0000, 0x0000, 0x299C, - 0xF7B6, 0xFA0A, 0xAE18, 0x61C0, 0xFE29, 0x35BC, 0xF9E1, 0x2033, 0x3597, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, - 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD933, 0x1D72, 0x382D, - 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xBF9C, 0x6A69, 0xFC60, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4D, 0x0C70, 0xFD93, 0x0000, 0x0000, - 0x0000, 0x958F, 0x02E3, 0xBFF9, 0x0000, 0x0000, 0x0000, 0x019D, 0x0CAF, - 0xE462, 0x0000, 0x0000, 0x3400, 0x08D5, 0x08FE, 0xAAC9, 0xFC7A, 0xF1EA, - 0xE4AD, 0x0000, 0x0000, 0x251B, 0xF81D, 0xF9FA, 0xB0B2, 0x61C1, 0xFE20, - 0x35C9, 0xF988, 0x1FDD, 0x350B, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, - 0xD4DA, 0xD92B, 0x1D3A, 0x385F, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, - 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4D, - 0x0C75, 0xFD93, 0x0000, 0x0000, 0x0000, 0x95A0, 0x02DA, 0xC000, 0x0000, - 0x0000, 0x0000, 0x024A, 0x0D01, 0xE869, 0x0000, 0x0000, 0x2EA2, 0x08FA, - 0x0919, 0xAA50, 0xFC74, 0xF144, 0xE44B, 0x0000, 0x0000, 0x2254, 0xF850, - 0xF9F2, 0xB1DA, 0x61C2, 0xFE1D, 0x35CD, 0xF965, 0x1FBA, 0x34D3, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, - 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, - 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, -}; diff --git a/soh/soh/Enhancements/nametag.cpp b/soh/soh/Enhancements/nametag.cpp index 49b0891fa3..1989b35528 100644 --- a/soh/soh/Enhancements/nametag.cpp +++ b/soh/soh/Enhancements/nametag.cpp @@ -5,7 +5,7 @@ #include "soh/frame_interpolation.h" #include "soh/Enhancements/custom-message/CustomMessageInterfaceAddon.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipUtils.h" extern "C" { #include "z64.h" @@ -19,19 +19,23 @@ extern PlayState* gPlayState; typedef struct { Actor* actor; - std::string text; // Original text + std::string text; // Original text std::string processedText; // Text filtered for supported font textures - const char* tag; // Tag identifier - Color_RGBA8 textColor; // Text color override. Global color is used if alpha is 0 - int16_t height; // Textbox height - int16_t width; // Textbox width - int16_t yOffset; // Addition Y offset - Mtx* mtx; // Allocated Mtx for rendering - Vtx* vtx; // Allocated Vtx for rendering + const char* tag; // Tag identifier + Color_RGBA8 textColor; // Text color override. Global color is used if alpha is 0 + int16_t height; // Textbox height + int16_t width; // Textbox width + int16_t yOffset; // Addition Y offset + uint8_t noZBuffer; // Allow rendering over geometry + Mtx* mtx; // Allocated Mtx for rendering + Vtx* vtx; // Allocated Vtx for rendering } NameTag; static std::vector nameTags; static std::vector nameTagDl; +static bool sMirrorWorldActive = false; + +void NameTag_RegisterHooks(); void FreeNameTag(NameTag* nameTag) { if (nameTag->vtx != nullptr) { @@ -51,14 +55,14 @@ void DrawNameTag(PlayState* play, const NameTag* nameTag) { } // Name tag is too far away to meaningfully read, don't bother rendering it - if (nameTag->actor->xyzDistToPlayerSq > 200000.0f) { + if (nameTag->actor->xyzDistToPlayerSq > 440000.0f) { return; } // Fade out name tags that are far away float alpha = 1.0f; - if (nameTag->actor->xyzDistToPlayerSq > 160000.0f) { - alpha = (200000.0f - nameTag->actor->xyzDistToPlayerSq) / 40000.0f; + if (nameTag->actor->xyzDistToPlayerSq > 360000.0f) { + alpha = (440000.0f - nameTag->actor->xyzDistToPlayerSq) / 80000.0f; } float scale = 75.0f / 100.f; @@ -69,7 +73,7 @@ void DrawNameTag(PlayState* play, const NameTag* nameTag) { return; } - Color_RGBA8 textboxColor = { 0, 0, 0, 80}; + Color_RGBA8 textboxColor = { 0, 0, 0, 80 }; Color_RGBA8 textColor = { 255, 255, 255, 255 }; if (CVarGetInteger(CVAR_COSMETIC("HUD.NameTagActorBackground.Changed"), 0)) { @@ -79,7 +83,7 @@ void DrawNameTag(PlayState* play, const NameTag* nameTag) { textColor = CVarGetColor(CVAR_COSMETIC("HUD.NameTagActorText.Value"), textColor); } - FrameInterpolation_RecordOpenChild(nameTag->actor, 10); + FrameInterpolation_RecordOpenChild(nameTag->actor, 0); // Prefer the highest between world position and focus position if targetable float posY = nameTag->actor->world.pos.y; @@ -92,7 +96,7 @@ void DrawNameTag(PlayState* play, const NameTag* nameTag) { // Set position, billboard effect, scale (with mirror mode), then center nametag Matrix_Translate(nameTag->actor->world.pos.x, posY, nameTag->actor->world.pos.z, MTXMODE_NEW); Matrix_ReplaceRotation(&play->billboardMtxF); - Matrix_Scale(scale * (CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0) ? -1 : 1), -scale, 1.0f, MTXMODE_APPLY); + Matrix_Scale(scale * (sMirrorWorldActive ? -1.0f : 1.0f), -scale, 1.0f, MTXMODE_APPLY); Matrix_Translate(-(float)nameTag->width / 2, -nameTag->height, 0, MTXMODE_APPLY); Matrix_ToMtx(nameTag->mtx, (char*)__FILE__, __LINE__); @@ -118,8 +122,6 @@ void DrawNameTag(PlayState* play, const NameTag* nameTag) { } for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { - uint16_t texIndex = nameTag->processedText[i] - 32; - // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters // handle loading groups of 16 chars at a time until there are no more left to load if (i % 16 == 0) { @@ -128,18 +130,16 @@ void DrawNameTag(PlayState* play, const NameTag* nameTag) { vtxGroup++; } - if (texIndex != 0 && nameTag->processedText[i] != '\n') { - uintptr_t texture = (uintptr_t)Font_FetchCharTexture(texIndex); - int16_t vertexStart = 4 * (i % 16); + uintptr_t texture = (uintptr_t)Ship_GetCharFontTexture(nameTag->processedText[i]); + int16_t vertexStart = 4 * (i % 16); - // Multi-instruction macro, need to insert all to the dl buffer - Gfx charTexture[] = { gsDPLoadTextureBlock_4b( - texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; - nameTagDl.insert(nameTagDl.end(), std::begin(charTexture), std::end(charTexture)); + // Multi-instruction macro, need to insert all to the dl buffer + Gfx charTexture[] = { gsDPLoadTextureBlock_4b(texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; + nameTagDl.insert(nameTagDl.end(), std::begin(charTexture), std::end(charTexture)); - nameTagDl.push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); - } + nameTagDl.push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); } nameTagDl.push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); @@ -158,15 +158,27 @@ void DrawNameTags() { OPEN_DISPS(gPlayState->state.gfxCtx); // Setup before rendering name tags - Gfx_SetupDL_38Xlu(gPlayState->state.gfxCtx); - nameTagDl.push_back(gsDPSetAlphaDither(G_AD_DISABLE)); - nameTagDl.push_back(gsSPClearGeometryMode(G_SHADE)); + POLY_XLU_DISP = Gfx_SetupDL_39(POLY_XLU_DISP); + nameTagDl.push_back(gsDPSetAlphaCompare(G_AC_NONE)); nameTagDl.push_back( gsDPSetCombineLERP(0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0)); + bool zbufferEnabled = false; + // Add all the name tags for (const auto& nameTag : nameTags) { + // Toggle ZBuffer mode based on last state and next tag + if (zbufferEnabled == nameTag.noZBuffer) { + if (nameTag.noZBuffer) { + nameTagDl.push_back(gsSPClearGeometryMode(G_ZBUFFER)); + zbufferEnabled = false; + } else { + nameTagDl.push_back(gsSPSetGeometryMode(G_ZBUFFER)); + zbufferEnabled = true; + } + } + DrawNameTag(gPlayState, &nameTag); } @@ -193,19 +205,22 @@ void UpdateNameTags() { return aDistToCamera > bDistToCamera; }); + + sMirrorWorldActive = CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0); } extern "C" void NameTag_RegisterForActorWithOptions(Actor* actor, const char* text, NameTagOptions options) { std::string processedText = std::string(Interface_ReplaceSpecialCharacters((char*)text)); // Strip out unsupported characters - processedText.erase(std::remove_if(processedText.begin(), processedText.end(), [](const char& c) { - // 172 is max supported texture for the in-game font system, - // and filter anything less than a space but not the newline or nul characters - return (unsigned char)c > 172 || (c < ' ' && c != '\n' && c != '\0'); - }), processedText.end()); + // 172 is max supported texture for the in-game font system, + // and filter anything less than a space but not the newline or nul characters + processedText.erase( + std::remove_if(processedText.begin(), processedText.end(), + [](const char& c) { return (uint8_t)c > 172 || (c < ' ' && c != '\n' && c != '\0'); }), + processedText.end()); - int16_t numChar = processedText.length(); + size_t numChar = processedText.length(); int16_t numLines = 1; int16_t offsetX = 0; int16_t maxOffsetX = 0; @@ -214,20 +229,15 @@ extern "C" void NameTag_RegisterForActorWithOptions(Actor* actor, const char* te Vtx* vertices = (Vtx*)calloc(sizeof(Vtx[4]), numChar + 1); // Set all the char vtx first to get the total size for the textbox - for (int16_t i = 0; i < numChar; i++) { + for (size_t i = 0; i < numChar; i++) { if (processedText[i] == '\n') { offsetX = 0; numLines++; } - int16_t charIndex = processedText[i] - 32; - int16_t charWidth = 0; - // Don't add width for newline chars - if (charIndex >= 0) { - charWidth = (int16_t)(Message_GetCharacterWidth(charIndex) * (100.0f / R_TEXT_CHAR_SCALE)); - } + int16_t charWidth = (int16_t)(Ship_GetCharFontWidth(processedText[i])); - Interface_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, (numLines - 1) * 16, charWidth, 16, 0); + Ship_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, (numLines - 1) * 16, charWidth, 16, 0); offsetX += charWidth; if (offsetX > maxOffsetX) { @@ -238,7 +248,7 @@ extern "C" void NameTag_RegisterForActorWithOptions(Actor* actor, const char* te // Vtx for textbox, add +/- 4 in all directions int16_t height = (numLines * 16) + 8; int16_t width = maxOffsetX + 8; - Interface_CreateQuadVertexGroup(vertices, -4, -4, width, height, 0); + Ship_CreateQuadVertexGroup(vertices, -4, -4, width, height, 0); // Update the texture coordinates to consume the full textbox texture size (including mirror region) vertices[1].v.tc[0] = 256 << 5; @@ -255,10 +265,13 @@ extern "C" void NameTag_RegisterForActorWithOptions(Actor* actor, const char* te nameTag.height = height; nameTag.width = width; nameTag.yOffset = options.yOffset; + nameTag.noZBuffer = options.noZBuffer; nameTag.mtx = new Mtx(); nameTag.vtx = vertices; nameTags.push_back(nameTag); + + NameTag_RegisterHooks(); } extern "C" void NameTag_RegisterForActor(Actor* actor, const char* text) { @@ -274,6 +287,8 @@ extern "C" void NameTag_RemoveAllForActor(Actor* actor) { it++; } } + + NameTag_RegisterHooks(); } extern "C" void NameTag_RemoveAllByTag(const char* tag) { @@ -285,6 +300,8 @@ extern "C" void NameTag_RemoveAllByTag(const char* tag) { it++; } } + + NameTag_RegisterHooks(); } void RemoveAllNameTags() { @@ -293,23 +310,49 @@ void RemoveAllNameTags() { } nameTags.clear(); + + NameTag_RegisterHooks(); } -static bool sRegisteredHooks = false; - void NameTag_RegisterHooks() { - if (sRegisteredHooks) { + static HOOK_ID gameStatUpdateHookID = 0; + static HOOK_ID drawHookID = 0; + static HOOK_ID playDestroyHookID = 0; + static HOOK_ID actorDestroyHookID = 0; + static bool sRegisteredHooks = false; + + // Hooks already (un)registered based on nametags + if ((nameTags.size() > 0) == sRegisteredHooks) { + return; + } + + GameInteractor::Instance->UnregisterGameHook(gameStatUpdateHookID); + GameInteractor::Instance->UnregisterGameHook(drawHookID); + GameInteractor::Instance->UnregisterGameHook(playDestroyHookID); + GameInteractor::Instance->UnregisterGameHook(actorDestroyHookID); + gameStatUpdateHookID = 0; + drawHookID = 0; + playDestroyHookID = 0; + actorDestroyHookID = 0; + sRegisteredHooks = false; + + if (nameTags.size() == 0) { return; } sRegisteredHooks = true; // Reorder tags every frame to mimic depth rendering - GameInteractor::Instance->RegisterGameHook([]() { UpdateNameTags(); }); + gameStatUpdateHookID = + GameInteractor::Instance->RegisterGameHook(UpdateNameTags); - // Render name tags at the end of player draw to avoid overflowing the display buffers - GameInteractor::Instance->RegisterGameHook([]() { DrawNameTags(); }); + // Render name tags at the end of the Play World drawing + drawHookID = GameInteractor::Instance->RegisterGameHook(DrawNameTags); // Remove all name tags on play state destroy as all actors are removed anyways - GameInteractor::Instance->RegisterGameHook([]() { RemoveAllNameTags(); }); + playDestroyHookID = GameInteractor::Instance->RegisterGameHook(RemoveAllNameTags); + + // Remove all name tags for actor on destroy + actorDestroyHookID = GameInteractor::Instance->RegisterGameHook( + [](void* actor) { NameTag_RemoveAllForActor((Actor*)actor); }); } diff --git a/soh/soh/Enhancements/nametag.h b/soh/soh/Enhancements/nametag.h index 9fd26643e8..47908e875e 100644 --- a/soh/soh/Enhancements/nametag.h +++ b/soh/soh/Enhancements/nametag.h @@ -1,11 +1,16 @@ -#ifndef _NAMETAG_H_ -#define _NAMETAG_H_ -#include +#ifndef NAMETAG_H +#define NAMETAG_H + +#include +#include + +struct Actor; typedef struct { - const char* tag; // Tag identifier to filter/remove multiple tags - int16_t yOffset; // Additional Y offset to apply for the name tag + const char* tag; // Tag identifier to filter/remove multiple tags + int16_t yOffset; // Additional Y offset to apply for the name tag Color_RGBA8 textColor; // Text color override. Global color is used if alpha is 0 + uint8_t noZBuffer; // Allow rendering over geometry } NameTagOptions; // Register required hooks for nametags on startup @@ -28,4 +33,4 @@ void NameTag_RemoveAllByTag(const char* tag); } #endif -#endif // _NAMETAG_H_ +#endif // NAMETAG_H diff --git a/soh/soh/Enhancements/pausewarp.c b/soh/soh/Enhancements/pausewarp.c index c767a34123..10f7e4e395 100644 --- a/soh/soh/Enhancements/pausewarp.c +++ b/soh/soh/Enhancements/pausewarp.c @@ -4,49 +4,37 @@ #include "game-interactor/GameInteractor.h" #include "soh/OTRGlobals.h" -static const int songMessageMap[] = { - TEXT_WARP_MINUET_OF_FOREST, - TEXT_WARP_BOLERO_OF_FIRE, - TEXT_WARP_SERENADE_OF_WATER, - TEXT_WARP_REQUIEM_OF_SPIRIT, - TEXT_WARP_NOCTURNE_OF_SHADOW, - TEXT_WARP_PRELUDE_OF_LIGHT +static const int songMessageMap[] = { + TEXT_WARP_MINUET_OF_FOREST, TEXT_WARP_BOLERO_OF_FIRE, TEXT_WARP_SERENADE_OF_WATER, + TEXT_WARP_REQUIEM_OF_SPIRIT, TEXT_WARP_NOCTURNE_OF_SHADOW, TEXT_WARP_PRELUDE_OF_LIGHT, }; static const int ocarinaSongMap[] = { - OCARINA_SONG_MINUET, - OCARINA_SONG_BOLERO, - OCARINA_SONG_SERENADE, - OCARINA_SONG_REQUIEM, - OCARINA_SONG_NOCTURNE, - OCARINA_SONG_PRELUDE + OCARINA_SONG_MINUET, OCARINA_SONG_BOLERO, OCARINA_SONG_SERENADE, + OCARINA_SONG_REQUIEM, OCARINA_SONG_NOCTURNE, OCARINA_SONG_PRELUDE, }; static const int entranceIndexMap[] = { - ENTR_SACRED_FOREST_MEADOW_WARP_PAD, // Minuet + ENTR_SACRED_FOREST_MEADOW_WARP_PAD, // Minuet ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD, // Bolero - ENTR_LAKE_HYLIA_WARP_PAD, // Serenade - ENTR_DESERT_COLOSSUS_WARP_PAD, // Requiem - ENTR_GRAVEYARD_WARP_PAD, // Nocturne - ENTR_TEMPLE_OF_TIME_WARP_PAD // Prelude + ENTR_LAKE_HYLIA_WARP_PAD, // Serenade + ENTR_DESERT_COLOSSUS_WARP_PAD, // Requiem + ENTR_GRAVEYARD_WARP_PAD, // Nocturne + ENTR_TEMPLE_OF_TIME_WARP_PAD, // Prelude }; -static const int songAudioMap[] = { - NA_BGM_OCA_MINUET, - NA_BGM_OCA_BOLERO, - NA_BGM_OCA_SERENADE, - NA_BGM_OCA_REQUIEM, - NA_BGM_OCA_NOCTURNE, - NA_BGM_OCA_LIGHT +static const int songAudioMap[] = { + NA_BGM_OCA_MINUET, NA_BGM_OCA_BOLERO, NA_BGM_OCA_SERENADE, + NA_BGM_OCA_REQUIEM, NA_BGM_OCA_NOCTURNE, NA_BGM_OCA_LIGHT, }; -static bool isWarpActive = false; +static bool isWarpActive = false; void PauseWarp_Execute() { if (!isWarpActive || gPlayState->msgCtx.msgMode != MSGMODE_NONE) { return; } - isWarpActive = false; + isWarpActive = false; GET_PLAYER(gPlayState)->stateFlags1 &= ~PLAYER_STATE1_IN_CUTSCENE; if (gPlayState->msgCtx.choiceIndex != 0) { return; @@ -88,41 +76,42 @@ void PauseWarp_HandleSelection() { int song = gPlayState->pauseCtx.cursorPoint[PAUSE_QUEST]; if (aButtonPressed && CHECK_QUEST_ITEM(song) && song >= QUEST_SONG_MINUET && song <= QUEST_SONG_PRELUDE && gPlayState->pauseCtx.pageIndex == PAUSE_QUEST && gPlayState->pauseCtx.state == 6) { - if (gSaveContext.ship.quest.id == QUEST_RANDOMIZER && Randomizer_GetSettingValue(RSK_SHUFFLE_OCARINA_BUTTONS)) { + if (gSaveContext.ship.quest.id == QUEST_RANDOMIZER && + Randomizer_GetSettingValue(RSK_SHUFFLE_OCARINA_BUTTONS)) { bool canplay = false; switch (song) { case QUEST_SONG_MINUET: canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP); + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP); break; case QUEST_SONG_BOLERO: canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); break; case QUEST_SONG_SERENADE: canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); break; case QUEST_SONG_REQUIEM: canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); break; case QUEST_SONG_NOCTURNE: canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); break; case QUEST_SONG_PRELUDE: canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && - Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP); + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP); break; } if (!canplay) { diff --git a/soh/soh/Enhancements/presets.cpp b/soh/soh/Enhancements/presets.cpp deleted file mode 100644 index 2b1812d216..0000000000 --- a/soh/soh/Enhancements/presets.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "presets.h" -#include -#include -#include -#include -#include "soh/SohGui/UIWidgets.hpp" -#include - -std::string FormatLocations(std::vector locs) { - std::string locString = ""; - for (auto loc: locs) { - locString += std::to_string(loc) + ","; - } - return locString; -} - -void applyPreset(std::vector entries) { - for(auto& [cvar, type, value] : entries) { - switch (type) { - case PRESET_ENTRY_TYPE_S32: - CVarSetInteger(cvar, std::get(value)); - break; - case PRESET_ENTRY_TYPE_FLOAT: - CVarSetFloat(cvar, std::get(value)); - break; - case PRESET_ENTRY_TYPE_STRING: - CVarSetString(cvar, std::get(value)); - break; - case PRESET_ENTRY_TYPE_CPP_STRING: - CVarSetString(cvar, std::get(value).c_str()); - break; - } - } -} - -void DrawPresetSelector(PresetType presetTypeId) { - const std::string presetTypeCvar = CVAR_GENERAL("SelectedPresets.") + std::to_string(presetTypeId); - const PresetTypeDefinition presetTypeDef = presetTypes.at(presetTypeId); - uint16_t selectedPresetId = CVarGetInteger(presetTypeCvar.c_str(), 0); - if(selectedPresetId >= presetTypeDef.presets.size()){ - selectedPresetId = 0; - } - const PresetDefinition selectedPresetDef = presetTypeDef.presets.at(selectedPresetId); - std::string comboboxTooltip = ""; - for ( auto iter = presetTypeDef.presets.begin(); iter != presetTypeDef.presets.end(); ++iter ) { - if (iter->first != 0) comboboxTooltip += "\n\n"; - comboboxTooltip += std::string(iter->second.label) + " - " + std::string(iter->second.description); - } - - UIWidgets::PaddedText("Presets", false, true); - if (ImGui::BeginCombo("##PresetsComboBox", selectedPresetDef.label)) { - for ( auto iter = presetTypeDef.presets.begin(); iter != presetTypeDef.presets.end(); ++iter ) { - if (ImGui::Selectable(iter->second.label, iter->first == selectedPresetId)) { - CVarSetInteger(presetTypeCvar.c_str(), iter->first); - } - } - - ImGui::EndCombo(); - } - UIWidgets::Tooltip(comboboxTooltip.c_str()); - - UIWidgets::Spacer(0); - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6.0f, 4.0f)); - if (ImGui::Button(("Apply Preset##" + presetTypeCvar).c_str())) { - for(const char* block : presetTypeDef.blocksToClear) { - CVarClearBlock(block); - } - if (selectedPresetId != 0) { - applyPreset(selectedPresetDef.entries); - } - CVarSetInteger(presetTypeCvar.c_str(), selectedPresetId); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - if (presetTypeId == PRESET_TYPE_RANDOMIZER){ - Rando::Settings::GetInstance()->ReloadOptions(); - } - } - ImGui::PopStyleVar(1); -} diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h deleted file mode 100644 index 2922ec589b..0000000000 --- a/soh/soh/Enhancements/presets.h +++ /dev/null @@ -1,907 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include "soh/Enhancements/randomizer/randomizerTypes.h" -#include "soh/Enhancements/enhancementTypes.h" -#include "soh/OTRGlobals.h" -#include "soh/cvar_prefixes.h" - -enum PresetEntryType { - PRESET_ENTRY_TYPE_S32, - PRESET_ENTRY_TYPE_FLOAT, - PRESET_ENTRY_TYPE_STRING, - PRESET_ENTRY_TYPE_CPP_STRING, -}; - -enum PresetType { - PRESET_TYPE_ENHANCEMENTS, - PRESET_TYPE_RANDOMIZER, -}; - -enum EnhancementPreset { - ENHANCEMENT_PRESET_DEFAULT, - ENHANCEMENT_PRESET_VANILLA_PLUS, - ENHANCEMENT_PRESET_ENHANCED, - ENHANCEMENT_PRESET_RANDOMIZER, -}; - -enum RandomizerPreset { - RANDOMIZER_PRESET_DEFAULT, - RANDOMIZER_PRESET_SPOCK_RACE, - RANDOMIZER_PRESET_SPOCK_RACE_NO_LOGIC, - RANDOMIZER_PRESET_S6, - RANDOMIZER_PRESET_HELL_MODE, - RANDOMIZER_PRESET_BENCHMARK, -}; - -typedef struct PresetEntry { - const char* cvar; - PresetEntryType type; - std::variant value; -} PresetEntry; - -std::string FormatLocations(std::vector locs); - -#define PRESET_ENTRY_S32(cvar, value) \ - { cvar, PRESET_ENTRY_TYPE_S32, value } -#define PRESET_ENTRY_FLOAT(cvar, value) \ - { cvar, PRESET_ENTRY_TYPE_FLOAT, value } -#define PRESET_ENTRY_STRING(cvar, value) \ - { cvar, PRESET_ENTRY_TYPE_STRING, value } -#define PRESET_ENTRY_CPP_STRING(cvar, value) \ - { cvar, PRESET_ENTRY_TYPE_CPP_STRING, value } - -void DrawPresetSelector(PresetType presetType); -void clearCvars(std::vector cvarsToClear); -void applyPreset(std::vector entries); - -// TODO: Ideally everything below this point will come from one/many JSON files - -const std::vector vanillaPlusPresetEntries = { - // D-pad Support in text and file select - PRESET_ENTRY_S32(CVAR_SETTING("DpadInText"), 1), - // Play Ocarina with D-pad - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.Dpad"), 1), - // Play Ocarina with Right Stick - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.RStick"), 1), - // D-pad as Equip Items - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), - // Prevent Dropped Ocarina Inputs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), - - // Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), - // Slow Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SlowTextSpeed"), 5), - // Skip Text - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), - // King Zora Speed (1 to 5) - PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 2.0f), - // Faster Block Push (+0 to +5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), - // Better Owl - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), - - // Assignable Tunics and Boots - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), - // Enable passage of time on file select - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 1), - // Inject Item Counts in messages - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - - // Dynamic Wallet Icon - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), - // Always show dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), 1), - - // Fix L&R Pause menu - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), - // Fix Dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1), - // Fix Two Handed idle animations - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), - // Fix the Gravedigging Tour Glitch - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GravediggingTourFix"), 1), - // Fix Deku Nut upgrade - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), - // Fix Navi text HUD position - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), - // Extend Silver Rupee Jingle - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 1), - // Fix some Floor Switches - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixFloorSwitches"), 1), - - // Red Ganon blood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), - // Fish while hovering - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("HoverFishing"), 1), - // N64 Weird Frames - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("N64WeirdFrames"), 1), - // Bombchus out of bounds - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), - // Quick Putaway - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), - // Skip save confirmation - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 1), -}; - -const std::vector enhancedPresetEntries = { - // D-pad Support in text and file select - PRESET_ENTRY_S32(CVAR_SETTING("DpadInText"), 1), - // Play Ocarina with D-pad - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.Dpad"), 1), - // Play Ocarina with Right Stick - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.RStick"), 1), - // D-pad as Equip Items - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), - // Prevent Dropped Ocarina Inputs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), - - // Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), - // Slow Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SlowTextSpeed"), 5), - // Skip Text - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), - // King Zora Speed (1 to 5) - PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), - // Faster Block Push (+0 to +5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), - // Better Owl - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), - - // Assignable Tunics and Boots - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), - // Enable passage of time on file select - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 1), - // Inject Item Counts in messages - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - - // Dynamic Wallet Icon - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), - // Always show dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), 1), - - // Fix L&R Pause menu - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), - // Fix Dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1), - // Fix Two Handed idle animations - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), - // Fix the Gravedigging Tour Glitch - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GravediggingTourFix"), 1), - // Fix Deku Nut upgrade - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), - // Fix Navi text HUD position - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), - // Extend Silver Rupee Jingle - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 1), - // Fix enemies not spawning on ground over water - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), 1), - // Fix some Floor Switches - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixFloorSwitches"), 1), - - // Red Ganon blood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), - // Fish while hovering - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("HoverFishing"), 1), - // N64 Weird Frames - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("N64WeirdFrames"), 1), - // Bombchus out of bounds - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), - // Quick Putaway - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), - // Skip save confirmation - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 1), - // Biggoron Forge Time (0 to 3) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ForgeTime"), 0), - // Vine/Ladder Climb speed (+0 to +12) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 3), - // Faster Heavy Block Lift - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), - // No Forced Navi - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoForcedNavi"), 1), - // No Skulltula Freeze - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkulltulaFreeze"), 1), - // MM Bunny Hood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST_AND_JUMP), - // Adult Bunny Hood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), - // Fast Chests - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - // Fast Drops - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastDrops"), 1), - // Fast Ocarina Playback - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastOcarinaPlayback"), 1), - // Instant Putaway - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), - // Instant Boomerang Recall - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), - // Nuts Explode Bombs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NutsExplodeBombs"), 1), - // Ask to Equip New Items - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AskToEquip"), 1), - // Mask Select in Inventory - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MaskSelect"), 1), - // Always Win Goron Pot - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GoronPot"), 1), - // Always Win Dampe Digging - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeWin"), 1), - // Skip Magic Arrow Equip Animation - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipArrowAnimation"), 1), - - // Equip arrows on multiple slots - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), - - // Disable Navi Call Audio - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableNaviCallAudio"), 1), - - // Equipment Toggle - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), - // Link's Cow in Both Time Periods - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CowOfTime"), 1), - - // Enable 3D Dropped items/projectiles - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NewDrops"), 1), - - // Fix Anubis fireballs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AnubisFix"), 1), - - // Autosave - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), 1), - - // Bombchu shop doesn't sell out, and 10 bombchus cost 99 instead of 100 - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterBombchuShopping"), 1), -}; - -const std::vector randomizerPresetEntries = { - // D-pad Support in text and file select - PRESET_ENTRY_S32(CVAR_SETTING("DpadInText"), 1), - // Play Ocarina with D-pad - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.Dpad"), 1), - // Play Ocarina with Right Stick - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.RStick"), 1), - // D-pad as Equip Items - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), - // Prevent Dropped Ocarina Inputs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), - - // Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), - // Slow Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SlowTextSpeed"), 5), - // Skip Text - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), - // King Zora Speed (1 to 5) - PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), - // Faster Block Push (+0 to +5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), - // Better Owl - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), - - // Assignable Tunics and Boots - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), - // Enable passage of time on file select - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 1), - // Inject Item Counts in messages - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - - // Dynamic Wallet Icon - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), - // Always show dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), 1), - - // Fix L&R Pause menu - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), - // Fix Dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1), - // Fix Two Handed idle animations - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), - // Fix the Gravedigging Tour Glitch - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GravediggingTourFix"), 1), - // Fix Deku Nut upgrade - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), - // Fix Navi text HUD position - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), - // Extend Silver Rupee Jingle - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 1), - // Fix some Floor Switches - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixFloorSwitches"), 1), - - // Red Ganon blood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), - // Fish while hovering - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("HoverFishing"), 1), - // N64 Weird Frames - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("N64WeirdFrames"), 1), - // Bombchus out of bounds - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), - // Quick Putaway - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), - // Skip save confirmation - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 1), - // Biggoron Forge Time (0 to 3) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ForgeTime"), 0), - // Vine/Ladder Climb speed (+0 to +12) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 3), - // Faster Heavy Block Lift - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), - // No Forced Navi - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoForcedNavi"), 1), - // No Skulltula Freeze - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkulltulaFreeze"), 1), - // MM Bunny Hood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST_AND_JUMP), - // Adult Bunny Hood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), - // Fast Chests - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - // Fast Drops - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastDrops"), 1), - // Fast Ocarina Playback - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastOcarinaPlayback"), 1), - // Instant Putaway - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), - // Instant Boomerang Recall - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), - // Nuts Explode Bombs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NutsExplodeBombs"), 1), - // Ask to Equip New Items - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AskToEquip"), 1), - // Mask Select in Inventory - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MaskSelect"), 1), - // Always Win Goron Pot - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GoronPot"), 1), - // Always Win Dampe Digging - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeWin"), 1), - // Skip Magic Arrow Equip Animation - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipArrowAnimation"), 1), - // Exit Market at Night - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MarketSneak"), 1), - - // Equip arrows on multiple slots - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), - - // Disable Navi Call Audio - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableNaviCallAudio"), 1), - - // Equipment Toggle - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), - // Link's Cow in Both Time Periods - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CowOfTime"), 1), - - // Enable 3D Dropped items/projectiles - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NewDrops"), 1), - - // Fix Anubis fireballs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AnubisFix"), 1), - - // Autosave - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), 1), - - // Customize Fishing Behaviour - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFishing"), 1), - // Guarantee Bite - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GuaranteeFishingBite"), 1), - // Fish Never Escape - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FishNeverEscape"), 1), - // Child Minimum Weight (6 to 10) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 3), - // Adult Minimum Weight (8 to 13) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 6), - - // Customize Lost Woods Ocarina Game Behavior - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeOcarinaGame"), 1), - // Start With Five Notes - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("OcarinaGame.StartingNotes"), 5), - // Round One Notes - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("OcarinaGame.RoundOneNotes"), 5), - - // Visual Stone of Agony - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("VisualAgony"), 1), - // Pull grave during the day - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DayGravePull"), 1), - // Pull out Ocarina to Summon Scarecrow - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantScarecrow"), 1), - // Chest size & texture matches contents - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_BOTH), - - // Color Temple of Time's Medallions - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ToTMedallionsColors"), 1), - - // Frames to wait - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinFrameCount"), 200), - - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoInputForCredits"), 1), - - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastFarores"), 1), -}; - -const std::vector spockRacePresetEntries = { - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LogicRules"), 0), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SlowTextSpeed"), 5), - PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 4), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoForcedNavi"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableNaviCallAudio"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastDrops"), 1), - PRESET_ENTRY_S32(CVAR_SETTING("DpadInText"), 1), - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.Dpad"), 1), - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.RStick"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastOcarinaPlayback"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantScarecrow"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MarketSneak"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DayGravePull"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NewDrops"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CreditsFix"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkulltulaFreeze"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseAnyCursor"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastFarores"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoInputForCredits"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MaskSelect"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFishing"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FishNeverEscape"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantFishing"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GuaranteeFishingBite"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 6), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 3), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GoronPot"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ForgeTime"), 0), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeAllNight"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("10GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("20GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("30GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("40GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("50GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), 0), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchuBag"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DampeHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1), - PRESET_ENTRY_CPP_STRING(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), FormatLocations( - { RC_MARKET_10_BIG_POES, RC_KAK_40_GOLD_SKULLTULA_REWARD, RC_KAK_50_GOLD_SKULLTULA_REWARD, RC_ZR_FROGS_OCARINA_GAME })), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FullWallets"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SKIP), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_FAST), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GregHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), RO_KAK_GATE_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LacsRewardCount"), 5), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_GREG), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubText"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shopsanity"), RO_SHOPSANITY_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_BALANCED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_REWARDS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), RO_KEYRINGS_COUNT), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), RO_SCRUBS_ALL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubsPrice"), RO_PRICE_FIXED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubsFixedPrice"), 10), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildStealth"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildZelda"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipTowerEscape"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingConsumables"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_STARTWITH), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingOcarina"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), 1), -}; - -const std::vector spockRaceNoLogicPresetEntries = { - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 6), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 3), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 4), - PRESET_ENTRY_S32(CVAR_COSMETIC("Goron.NeckLength"), 1000), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CreditsFix"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFishing"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeAllNight"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DayGravePull"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableNaviCallAudio"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastDrops"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastFarores"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastOcarinaPlayback"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FishNeverEscape"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ForgeTime"), 0), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GoronPot"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GuaranteeFishingBite"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantFishing"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MarketSneak"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MaskSelect"), 1), - PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoForcedNavi"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoInputForCredits"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseAnyCursor"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("10GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("20GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("30GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("40GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("50GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), 0), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchuBag"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BossKeysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DampeHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1), - PRESET_ENTRY_CPP_STRING(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), FormatLocations( - { RC_MARKET_10_BIG_POES, RC_KAK_40_GOLD_SKULLTULA_REWARD, RC_KAK_50_GOLD_SKULLTULA_REWARD, RC_ZR_FROGS_OCARINA_GAME })), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FullWallets"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SKIP), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_FAST), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GregHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), 0), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), RO_KAK_GATE_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LacsRewardCount"), 5), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_NO_LOGIC), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_GREG), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubText"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shopsanity"), RO_SHOPSANITY_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_BALANCED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), 0), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_BEANS_ONLY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchantPrices"), RO_PRICE_VANILLA), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_REWARDS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), RO_KEYRINGS_COUNT), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_ALL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildStealth"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildZelda"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipTowerEscape"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingConsumables"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_STARTWITH), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingOcarina"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantScarecrow"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkulltulaFreeze"), 1), -}; - -const std::vector s6PresetEntries = { - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_BOTH), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 4), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN), - PRESET_ENTRY_CPP_STRING(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), FormatLocations({ RC_DEKU_THEATER_MASK_OF_TRUTH })), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_DEKU_ONLY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SKIP), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_FAST), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IceTraps"), RO_ICE_TRAPS_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), RO_KAK_GATE_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MedallionCount"), 6), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_MEDALLIONS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDungeonReward"), RO_DUNGEON_REWARDS_END_OF_DUNGEON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_STARTWITH), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOverworldSpawns"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildStealth"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildZelda"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipTowerEscape"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SleepingWaterfall"), RO_WATERFALL_CLOSED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingAge"), RO_AGE_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingConsumables"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingDekuShield"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_STARTWITH), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingOcarina"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ZorasFountain"), RO_ZF_CLOSED), -}; - -const std::vector hellModePresetEntries = { - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_BOTH), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BossKeysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SET_NUMBER), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrialCount"), 6), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IceTraps"), RO_ICE_TRAPS_ONSLAUGHT), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ItemPool"), RO_ITEM_POOL_MINIMAL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), RO_KAK_GATE_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LinksPocket"), RO_LINKS_POCKET_NOTHING), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_RANDOM_NUMBER), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_DUNGEON_REWARDS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shopsanity"), RO_SHOPSANITY_SPECIFIC_COUNT), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityCount"), RO_SHOPSANITY_COUNT_FOUR_ITEMS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_RANGE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPriceRange1"), 0), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPriceRange2"), 999), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_BEANS_ONLY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchantPrices"), RO_PRICE_VANILLA), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleCows"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDungeonReward"), RO_DUNGEON_REWARDS_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_DUNGEONS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), RO_KEYRINGS_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMasterSword"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), RO_SCRUBS_ALL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubsPrice"), RO_PRICE_CHEAP_BALANCED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_ALL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleWeirdEgg"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildStealth"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipTowerEscape"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SleepingWaterfall"), RO_WATERFALL_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingAge"), RO_AGE_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ZorasFountain"), RO_ZF_OPEN), -}; - -const std::vector BenchmarkPresetEntries = { - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_DEKU_ONLY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), RO_KAK_GATE_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_SONGONLY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SleepingWaterfall"), RO_WATERFALL_CLOSED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ZorasFountain"), RO_ZF_CLOSED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_DUNGEON_REWARDS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RewardCount"), 5), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BridgeRewardOptions"), RO_BRIDGE_GREG_REWARD), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SET_NUMBER), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrialCount"), 6), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingAge"), RO_AGE_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDungeonsEntrances"), RO_DUNGEON_ENTRANCE_SHUFFLE_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBossEntrances"), RO_BOSS_ROOM_ENTRANCE_SHUFFLE_FULL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOverworldEntrances"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleInteriorsEntrances"), RO_INTERIOR_ENTRANCE_SHUFFLE_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleWarpSongs"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOverworldSpawns"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MixedEntrances"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DecoupleEntrances"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchusInLogic"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("TriforceHunt"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_RANDOM_NUMBER), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MQDungeonsSelection"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDungeonReward"), RO_DUNGEON_REWARDS_END_OF_DUNGEON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LinksPocket"), RO_LINKS_POCKET_DUNGEON_REWARD), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shopsanity"), RO_SHOPSANITY_SPECIFIC_COUNT), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityCount"), RO_SHOPSANITY_COUNT_FOUR_ITEMS), - //RANDOTODO add refactored price/scrub/merchant settings - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMasterSword"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleChildWallet"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinaButtons"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSwim"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shuffle100GSReward"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBossSouls"), RO_BOSS_SOULS_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Fishsanity"), RO_FISHSANITY_BOTH), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BossKeysanity"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_MEDALLIONS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LacsMedallionCount"), 6), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), RO_KEYRINGS_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildZelda"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 4), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GossipStoneHints"), RO_GOSSIP_STONES_NEED_NOTHING), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("HintClarity"), RO_HINT_CLARITY_CLEAR), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("HintDistribution"), RO_HINT_DIST_STRONG), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("AltarHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanondorfHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SheikLAHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DampeHint"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GregHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SariaHint"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FrogsHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("OoTHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BiggoronHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoesHint"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ChickensHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MalonHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("HBAHint"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("WarpSongText"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubText"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("10GSHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("20GSHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("30GSHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("40GSHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("50GSHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MaskShopHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("InfiniteUpgrades"), RO_INF_UPGRADES_PROGRESSIVE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkeletonKey"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ItemPool"), RO_ITEM_POOL_BALANCED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IceTraps"), RO_ICE_TRAPS_NORMAL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingOcarina"), RO_STARTING_OCARINA_FAIRY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingDekuShield"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingKokiriSword"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMasterSword"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingConsumables"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FullWallets"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingZeldasLullaby"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingEponasSong"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSariasSong"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSunsSong"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSongOfTime"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSongOfStorms"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMinuetOfForest"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingBoleroOfFire"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSerenadeOfWater"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingRequiemOfSpirit"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingNocturneOfShadow"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingPreludeOfLight"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSkulltulaToken"), 0), - PRESET_ENTRY_S32("gRandomizeStartingHearts", 2), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), RO_GENERIC_ON), -}; - -typedef struct PresetDefinition { - const char* label; - const char* description; - std::vector entries; -} PresetDefinition; - -typedef struct PresetTypeDefinition { - std::vector blocksToClear; - std::map presets; -} PresetTypeDefinition; - -const std::map presetTypes = { - { PRESET_TYPE_ENHANCEMENTS, { { CVAR_PREFIX_ENHANCEMENT, CVAR_PREFIX_CHEAT }, { - { ENHANCEMENT_PRESET_DEFAULT, { - "Default", - "Reset all options to their default values.", - {}, - } }, - { ENHANCEMENT_PRESET_VANILLA_PLUS, { - "Vanilla Plus", - "Adds Quality of Life features that enhance your experience, but don't alter gameplay. Recommended for a first playthrough of OoT.", - vanillaPlusPresetEntries, - } }, - { ENHANCEMENT_PRESET_ENHANCED, { - "Enhanced", - "The \"Vanilla Plus\" preset, but with more quality of life enhancements that might alter gameplay slightly. Recommended for returning players.", - enhancedPresetEntries - } }, - { ENHANCEMENT_PRESET_RANDOMIZER, { - "Randomizer", - "The \"Enhanced\" preset, plus any other enhancements that are recommended for playing Randomizer.", - randomizerPresetEntries - } }, - } } }, - { PRESET_TYPE_RANDOMIZER, { { CVAR_PREFIX_RANDOMIZER_SETTING, CVAR_PREFIX_RANDOMIZER_ENHANCEMENT }, { - { RANDOMIZER_PRESET_DEFAULT, { - "Default", - "Reset all options to their default values.", - {}, - } }, - { RANDOMIZER_PRESET_SPOCK_RACE, { - "Spock Race", - "Race preset used for the official Ship of Harkinian race on June 3rd 2023. The following settings are notable:\n" \ - "- Rainbow Bridge is set to Greg\n" \ - "- Ganon's Boss Key is 5 dungeon rewards\n" \ - "- Shopsanity and Scrubsanity enabled\n" \ - "- All locations reachable is off\n", \ - spockRacePresetEntries, - } }, - { RANDOMIZER_PRESET_SPOCK_RACE_NO_LOGIC, { - "Spock Race - No Logic", - "No Logic Race preset used for official Ship of Harkinian No Logic races. The following settings are " - "notable:\n" - "- Rainbow Bridge is set to Greg\n" - "- Ganon's Boss Key is 5 dungeon rewards\n" - "- Shopsanity and Scrubsanity enabled\n" - "- All locations reachable is off\n", - spockRaceNoLogicPresetEntries, - } }, - { RANDOMIZER_PRESET_S6, { - "S6 Tournament (Adapted)", - "Matches OOTR S6 tournament settings as close as we can get with the options available in SoH. The following differences are notable:\n" \ - "- Both child and adult overworld spawns are randomized\n" \ - "- Dungeon rewards are shuffled at the end of dungeons, rather than at the end of their own dungeon\n" \ - "- Full adult trade sequence is shuffled instead of the selected 4\n" \ - "- Hint distribution no \"tournament\" mode, falling back to balanced", - s6PresetEntries, - } }, - { RANDOMIZER_PRESET_HELL_MODE, { - "Hell Mode", - "All settings maxed but still using glitchless logic. Expect pain.", - hellModePresetEntries - } }, - { RANDOMIZER_PRESET_BENCHMARK, { - "Benchmark", - "Used for benchmarking the logic.", - BenchmarkPresetEntries - } }, - } } } -}; diff --git a/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp b/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp index 179987dcc3..cec16a468f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp @@ -2,292 +2,79 @@ #include "../../custom-message/CustomMessageManager.h" #include "z64item.h" -#include -#include -#include - namespace CustomMessages { - using namespace std::literals::string_literals; -class MessageEntryComp { -public: - bool operator()(const MessageEntry& lhs, const MessageEntry& rhs) const { - return lhs.id < rhs.id; - } -}; - -constexpr std::array EnglishDungeonNames = { - "Deku Tree", - "Dodongo's Cavern", - "Jabu Jabu's Belly", - "Forest Temple", - "Fire Temple", - "Water Temple", - "Spirit Temple", - "Shadow Temple", - "Bottom of the Well", - "Ice Cavern", - "Ganon's Tower", - "Gerudo Training Ground", - "Gerudo Fortress", - "Ganon's Castle", -}; - -constexpr std::array FrenchDungeonNames = { - "Vénérable Arbre Mojo", - "Caverne Dodongo", - "Ventre de Jabu-Jabu", - "Temple de la Forêt", - "Temple du Feu", - "Temple de l'Eau", - "Temple de l'Esprit", - "Temple de l'Ombre", - "Puits", - "Caverne Polaire", - "Tour de Ganon", - "Gymnase Gerudo", - "Repaire des Voleurs", - "Château de Ganon", -}; - -constexpr std::array FrenchDungeonArticles = { - "du ", - "de la ", - "du ", - "du ", - "du ", - "du ", - "du ", - "du ", - "du ", - "de la ", - "", - "du ", - "de la ", - "du ", -}; - -constexpr std::array SpanishDungeonNames = { - "Gran Árbol Deku", - "Cueva de los Dodongos", - "Tripa de Jabu-Jabu", - "Templo del Bosque", - "Templo del Fuego", - "Templo del Agua", - "Templo del Espíritu", - "Templo de las Sombras", - "Fondo del pozo", - "Caverna de hielo", - "Torre de Ganon", - "Centro de Instrucción Gerudo", - "Fortaleza Gerudo", - "Castillo de Ganon", -}; - -constexpr std::array SpanishDungeonArticles = { - "del", - "de la", - "de la", - "del", - "del", - "del", - "del", - "del", - "del", - "de la", - "de la", - "del", - "de la", - "del", -}; - -constexpr std::array DungeonColors = { - QM_GREEN, - QM_RED, - QM_BLUE, - QM_GREEN, - QM_RED, - QM_BLUE, - QM_YELLOW, - QM_PINK, - QM_PINK, - QM_LBLUE, - QM_BLACK, - QM_YELLOW, - QM_YELLOW, - QM_RED, -}; - - std::set messageEntries; - std::stringstream messageData; - - //textBoxType and textBoxPosition are defined here: https://wiki.cloudmodding.com/oot/Text_Format#Message_Id - void CreateMessage(uint32_t textId, uint32_t unk_04, uint32_t textBoxType, uint32_t textBoxPosition, - std::string englishText, std::string frenchText, std::string spanishText) { - MessageEntry newEntry = { textId, unk_04, textBoxType, textBoxPosition, { 0 } }; - - while ((englishText.size() % 4) != 0) { - englishText += "\0"s; - } - messageData.seekg(0, messageData.end); - newEntry.info[ENGLISH_U].offset = (char*)((int)messageData.tellg()); - newEntry.info[ENGLISH_U].length = englishText.size(); - messageData << englishText; - - while ((frenchText.size() % 4) != 0) { - frenchText += "\0"s; - } - messageData.seekg(0, messageData.end); - newEntry.info[FRENCH_U].offset = (char*)((int)messageData.tellg()); - newEntry.info[FRENCH_U].length = frenchText.size(); - messageData << frenchText; - - while ((spanishText.size() % 4) != 0) { - spanishText += "\0"s; - } - messageData.seekg(0, messageData.end); - newEntry.info[SPANISH_U].offset = (char*)((int)messageData.tellg()); - newEntry.info[SPANISH_U].length = spanishText.size(); - messageData << spanishText; - - messageEntries.insert(newEntry); - } - - void CreateMessageFromTextObject(uint32_t textId, uint32_t unk_04, uint32_t textBoxType, uint32_t textBoxPosition, const Text& text) { - CreateMessage(textId, unk_04, textBoxType, textBoxPosition, text.GetEnglish(), text.GetFrench(), text.GetSpanish()); - } - - Text AddColorsAndFormat(Text text, const std::vector& colors /*= {}*/) { - - //for each language - for (std::string* textStr : {&text.english, &text.french, &text.spanish}) { - - //insert playername - size_t atSymbol = textStr->find('@'); - while (atSymbol != std::string::npos) { - textStr->replace(atSymbol, 1, PLAYER_NAME()); - atSymbol = textStr->find('@'); - } - //insert newlines either manually or when encountering a '&' - constexpr size_t lineLength = 44; - size_t lastNewline = 0; - while (lastNewline + lineLength < textStr->length()) { - size_t carrot = textStr->find('^', lastNewline); - size_t ampersand = textStr->find('&', lastNewline); - size_t lastSpace = textStr->rfind(' ', lastNewline + lineLength); - size_t lastPeriod = textStr->rfind('.', lastNewline + lineLength); - //replace '&' first if it's within the newline range - if (ampersand < lastNewline + lineLength) { - textStr->replace(ampersand, 1, NEWLINE()); - lastNewline = ampersand + NEWLINE().length(); - //or move the lastNewline cursor to the next line if a '^' is encountered - } else if (carrot < lastNewline + lineLength) { - lastNewline = carrot + 1; - //some lines need to be split but don't have spaces, look for periods instead - } else if (lastSpace == std::string::npos) { - textStr->replace(lastPeriod, 1, "."+NEWLINE()); - lastNewline = lastPeriod + NEWLINE().length() + 1; - } else { - textStr->replace(lastSpace, 1, NEWLINE()); - lastNewline = lastSpace + NEWLINE().length(); - } - } - //clean up any remaining '&' characters - size_t ampersand = textStr->find('&'); - while (ampersand != std::string::npos) { - textStr->replace(ampersand, 1, NEWLINE()); - ampersand = textStr->find('&'); - } - - //insert box break - size_t carrotSymbol = textStr->find('^'); - while (carrotSymbol != std::string::npos) { - textStr->replace(carrotSymbol, 1, INSTANT_TEXT_OFF()+WAIT_FOR_INPUT()+INSTANT_TEXT_ON()); - carrotSymbol = textStr->find('^'); - } - - //If there's a two-way choice and only 1 newline before it in the same text box, add another one - size_t choice = textStr->find(TWO_WAY_CHOICE()); - if (choice != std::string::npos) { - size_t newLinesCount = 0; - size_t lastBoxBreak = textStr->rfind(WAIT_FOR_INPUT(), choice); - lastNewline = choice; - - if (lastBoxBreak == std::string::npos) { - lastBoxBreak = 0; - } - - while ((lastNewline != std::string::npos)) { - lastNewline = textStr->rfind(NEWLINE(), lastNewline - 1); - if (lastNewline != std::string::npos && lastNewline > lastBoxBreak) { - newLinesCount++; - } else { - break; - } - } - - if (newLinesCount <= 1) { - textStr->replace(choice, TWO_WAY_CHOICE().length(), NEWLINE()+TWO_WAY_CHOICE()); - } - } - - //add colors - for (auto color : colors) { - size_t firstHashtag = textStr->find('#'); - if (firstHashtag != std::string::npos) { - textStr->replace(firstHashtag, 1, COLOR(color)); - size_t secondHashtag = textStr->find('#'); - if (secondHashtag == std::string::npos) { - //CitraPrint("ERROR: Couldn't find second '#' in " + (*textStr)); - } else { - textStr->replace(secondHashtag, 1, COLOR(QM_WHITE)); - } - } - } - } - return Text{"","",""}+UNSKIPPABLE()+INSTANT_TEXT_ON()+text+INSTANT_TEXT_OFF()+MESSAGE_END(); - } - - void ClearMessages() { - messageEntries.clear(); - messageData.str(""); - } - - std::string MESSAGE_END() { return "\x7F\x00"s; } - std::string WAIT_FOR_INPUT() { return "\x7F\x01"s; } - std::string HORIZONTAL_SPACE(uint8_t x) { - return "\x7F\x02"s + char(x); - } - std::string GO_TO(uint16_t x) { - return "\x7F\x03"s + char(x >> 8) + char(x & 0x00FF); - } - std::string INSTANT_TEXT_ON() { return "\x7F\x04"s; } - std::string INSTANT_TEXT_OFF() { return "\x7F\x05"s; } - std::string SHOP_MESSAGE_BOX() { return "\x7F\x06\x00"s; } - std::string EVENT_TRIGGER() { return "\x7F\x07"s; } - std::string DELAY_FRAMES(uint8_t x) { - return "\x7F\x08"s + char(x); - } - std::string CLOSE_AFTER(uint8_t x) { - return "\x7F\x0A"s + char(x); - } - std::string PLAYER_NAME() { return "\x7F\x0B"s; } - std::string PLAY_OCARINA() { return "\x7F\x0C"s; } - std::string ITEM_OBTAINED(uint8_t x) { - return "\x7F\x0F"s + char(x); - } - std::string SET_SPEED(uint8_t x) { - return "\x7F\x10"s + char(x); - } - std::string SKULLTULAS_DESTROYED() { return "\x7F\x15"s; } //RANDOTODO just refernce the versions in CustomMessage - std::string CURRENT_TIME() { return "\x7F\x17"s; } - std::string UNSKIPPABLE() { return "\x7F\x19"s; } - std::string TWO_WAY_CHOICE() { return "\x1B"s; } - std::string NEWLINE() { return "\x7F\x1C"s; } - std::string COLOR(std::string x) { return "\x7F\x1D"s + x; } - std::string CENTER_TEXT() { return "\x7F\x1E"s; } - std::string IF_NOT_MQ() { return "\x7F\x29"s; } - std::string MQ_ELSE() { return "\x7F\x2A"s; } - std::string MQ_END() { return "\x7F\x2B"s; } +std::string MESSAGE_END() { + return "\x7F\x00"s; } +std::string WAIT_FOR_INPUT() { + return "\x7F\x01"s; +} +std::string HORIZONTAL_SPACE(uint8_t x) { + return "\x7F\x02"s + char(x); +} +std::string GO_TO(uint16_t x) { + return "\x7F\x03"s + char(x >> 8) + char(x & 0x00FF); +} +std::string INSTANT_TEXT_ON() { + return "\x7F\x04"s; +} +std::string INSTANT_TEXT_OFF() { + return "\x7F\x05"s; +} +std::string SHOP_MESSAGE_BOX() { + return "\x7F\x06\x00"s; +} +std::string EVENT_TRIGGER() { + return "\x7F\x07"s; +} +std::string DELAY_FRAMES(uint8_t x) { + return "\x7F\x08"s + char(x); +} +std::string CLOSE_AFTER(uint8_t x) { + return "\x7F\x0A"s + char(x); +} +std::string PLAYER_NAME() { + return "\x7F\x0B"s; +} +std::string PLAY_OCARINA() { + return "\x7F\x0C"s; +} +std::string ITEM_OBTAINED(uint8_t x) { + return "\x7F\x0F"s + char(x); +} +std::string SET_SPEED(uint8_t x) { + return "\x7F\x10"s + char(x); +} +std::string SKULLTULAS_DESTROYED() { + return "\x7F\x15"s; +} +std::string CURRENT_TIME() { + return "\x7F\x17"s; +} +std::string UNSKIPPABLE() { + return "\x7F\x19"s; +} +std::string TWO_WAY_CHOICE() { + return "\x1B"s; +} +std::string NEWLINE() { + return "\x7F\x1C"s; +} +std::string COLOR(std::string x) { + return "\x7F\x1D"s + x; +} +std::string CENTER_TEXT() { + return "\x7F\x1E"s; +} +std::string IF_NOT_MQ() { + return "\x7F\x29"s; +} +std::string MQ_ELSE() { + return "\x7F\x2A"s; +} +std::string MQ_END() { + return "\x7F\x2B"s; +} +} // namespace CustomMessages diff --git a/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp b/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp index b9d2a08c63..71a0e66b0d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp @@ -1,72 +1,33 @@ #pragma once #include -#include -#include #include #include "text.hpp" namespace CustomMessages { -typedef struct { - // In the true file format, offset is the offset into the QM file. - // In randomizer, offset will be a pointer to the text in the game's address space. - // Since these pointers will be much larger as u32 than the original script's offsets, - // We will be able to distinguish between original and custom text using their numerical value. - const char* offset; - uint32_t length; -} MessageLanguageInfo; - -typedef enum { - /* 0x00 */ JAPANESE_J, - /* 0x01 */ ENGLISH_U, - /* 0x02 */ ENGLISH_E, - /* 0x03 */ GERMAN_E, - /* 0x04 */ FRENCH_E, - /* 0x05 */ FRENCH_U, - /* 0x06 */ SPANISH_E, - /* 0x07 */ SPANISH_U, - /* 0x08 */ ITALIAN_E, - /* 0x09 */ DUTCH_E, -} MessageLanguage; - -typedef struct { - uint32_t id; - uint32_t unk_04; - uint32_t unk_08; - uint32_t unk_0C; - MessageLanguageInfo info[10]; -} MessageEntry; // size = 0x60 - - void CreateMessage(uint32_t textId, uint32_t unk_04, uint32_t textBoxType, uint32_t textBoxPosition, - std::string englishText, std::string frenchText, std::string spanishText); - void CreateMessageFromTextObject(uint32_t textId, uint32_t unk_04, uint32_t textBoxType, uint32_t textBoxPosition, const Text& text); - - Text AddColorsAndFormat(Text text, const std::vector& colors = {}); - void ClearMessages(); - - std::string MESSAGE_END(); - std::string WAIT_FOR_INPUT(); - std::string HORIZONTAL_SPACE(uint8_t x); - std::string GO_TO(uint16_t x); - std::string INSTANT_TEXT_ON(); - std::string INSTANT_TEXT_OFF(); - std::string SHOP_MESSAGE_BOX(); - std::string EVENT_TRIGGER(); - std::string DELAY_FRAMES(uint8_t x); - std::string CLOSE_AFTER(uint8_t x); - std::string PLAYER_NAME(); - std::string PLAY_OCARINA(); - std::string ITEM_OBTAINED(uint8_t x); - std::string SET_SPEED(uint8_t x); - std::string SKULLTULAS_DESTROYED(); - std::string CURRENT_TIME(); - std::string UNSKIPPABLE(); - std::string TWO_WAY_CHOICE(); - std::string NEWLINE(); - std::string COLOR(std::string x); - std::string CENTER_TEXT(); - std::string IF_NOT_MQ(); - std::string MQ_ELSE(); - std::string MQ_END(); -} +std::string MESSAGE_END(); +std::string WAIT_FOR_INPUT(); +std::string HORIZONTAL_SPACE(uint8_t x); +std::string GO_TO(uint16_t x); +std::string INSTANT_TEXT_ON(); +std::string INSTANT_TEXT_OFF(); +std::string SHOP_MESSAGE_BOX(); +std::string EVENT_TRIGGER(); +std::string DELAY_FRAMES(uint8_t x); +std::string CLOSE_AFTER(uint8_t x); +std::string PLAYER_NAME(); +std::string PLAY_OCARINA(); +std::string ITEM_OBTAINED(uint8_t x); +std::string SET_SPEED(uint8_t x); +std::string SKULLTULAS_DESTROYED(); +std::string CURRENT_TIME(); +std::string UNSKIPPABLE(); +std::string TWO_WAY_CHOICE(); +std::string NEWLINE(); +std::string COLOR(std::string x); +std::string CENTER_TEXT(); +std::string IF_NOT_MQ(); +std::string MQ_ELSE(); +std::string MQ_END(); +} // namespace CustomMessages diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 351c57fd2e..2ac5a35928 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -1,6 +1,5 @@ #include "fill.hpp" -#include "custom_messages.hpp" #include "../dungeon.h" #include "../context.h" #include "item_pool.hpp" @@ -19,267 +18,288 @@ #include #include -using namespace CustomMessages; using namespace Rando; - static bool placementFailure = false; +PriceSettingsStruct shopsanityPrices = { + RSK_SHOPSANITY_PRICES, + RSK_SHOPSANITY_PRICES_FIXED_PRICE, + RSK_SHOPSANITY_PRICES_RANGE_1, + RSK_SHOPSANITY_PRICES_RANGE_2, + RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT, + RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT, + RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT, + RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT, + RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT, + RSK_SHOPSANITY_PRICES_AFFORDABLE, +}; -PriceSettingsStruct shopsanityPrices = {RSK_SHOPSANITY_PRICES, - RSK_SHOPSANITY_PRICES_FIXED_PRICE, - RSK_SHOPSANITY_PRICES_RANGE_1, - RSK_SHOPSANITY_PRICES_RANGE_2, - RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT, - RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT, - RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT, - RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT, - RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT, - RSK_SHOPSANITY_PRICES_AFFORDABLE}; - -PriceSettingsStruct scrubPrices = {RSK_SCRUBS_PRICES, - RSK_SCRUBS_PRICES_FIXED_PRICE, - RSK_SCRUBS_PRICES_RANGE_1, - RSK_SCRUBS_PRICES_RANGE_2, - RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT, - RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT, - RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT, - RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT, - RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT, - RSK_SCRUBS_PRICES_AFFORDABLE}; +PriceSettingsStruct scrubPrices = { + RSK_SCRUBS_PRICES, + RSK_SCRUBS_PRICES_FIXED_PRICE, + RSK_SCRUBS_PRICES_RANGE_1, + RSK_SCRUBS_PRICES_RANGE_2, + RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT, + RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT, + RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT, + RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT, + RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT, + RSK_SCRUBS_PRICES_AFFORDABLE, +}; -PriceSettingsStruct merchantPrices = {RSK_MERCHANT_PRICES, - RSK_MERCHANT_PRICES_FIXED_PRICE, - RSK_MERCHANT_PRICES_RANGE_1, - RSK_MERCHANT_PRICES_RANGE_2, - RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT, - RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT, - RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT, - RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT, - RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT, - RSK_MERCHANT_PRICES_AFFORDABLE}; +PriceSettingsStruct merchantPrices = { + RSK_MERCHANT_PRICES, + RSK_MERCHANT_PRICES_FIXED_PRICE, + RSK_MERCHANT_PRICES_RANGE_1, + RSK_MERCHANT_PRICES_RANGE_2, + RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT, + RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT, + RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT, + RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT, + RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT, + RSK_MERCHANT_PRICES_AFFORDABLE, +}; static void RemoveStartingItemsFromPool() { - for (RandomizerGet startingItem : StartingInventory) { - for (size_t i = 0; i < ItemPool.size(); i++) { - if (startingItem == RG_BIGGORON_SWORD) { - if (ItemPool[i] == RG_GIANTS_KNIFE || ItemPool[i] == RG_BIGGORON_SWORD) { - ItemPool[i] = GetJunkItem(); + for (RandomizerGet startingItem : StartingInventory) { + for (size_t i = 0; i < ItemPool.size(); i++) { + if (startingItem == RG_BIGGORON_SWORD) { + if (ItemPool[i] == RG_GIANTS_KNIFE || ItemPool[i] == RG_BIGGORON_SWORD) { + ItemPool[i] = GetJunkItem(); + } + continue; + } else if (startingItem == ItemPool[i] || (Rando::StaticData::RetrieveItem(startingItem).IsBottleItem() && + Rando::StaticData::RetrieveItem(ItemPool[i]).IsBottleItem())) { + if (AdditionalHeartContainers > 0 && + (startingItem == RG_PIECE_OF_HEART || startingItem == RG_TREASURE_GAME_HEART)) { + ItemPool[i] = RG_HEART_CONTAINER; + AdditionalHeartContainers--; + } else { + ItemPool[i] = GetJunkItem(); + } + break; + } } - continue; - } else if (startingItem == ItemPool[i] || (Rando::StaticData::RetrieveItem(startingItem).IsBottleItem() && - Rando::StaticData::RetrieveItem(ItemPool[i]).IsBottleItem())) { - if (AdditionalHeartContainers > 0 && - (startingItem == RG_PIECE_OF_HEART || startingItem == RG_TREASURE_GAME_HEART)) { - ItemPool[i] = RG_HEART_CONTAINER; - AdditionalHeartContainers--; - } else { - ItemPool[i] = GetJunkItem(); - } - break; - } } - } } -static void PropagateTimeTravel(GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, - bool stopOnBeatable = false, bool addToPlaythrough = false){ - //special check for temple of time - if(gals.haveTimeAccess && gals.foundTempleOfTime && gals.validatedStartingRegion){ - if (!RegionTable(RR_ROOT)->Adult() && RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Child()) { //RANDOTODO: sphere weirdness, other age locations not propagated in this sphere - RegionTable(RR_ROOT)->adultDay = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->childDay; - RegionTable(RR_ROOT)->adultNight = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->childNight; - ProcessRegion(RegionTable(RR_ROOT), gals, ignore, stopOnBeatable, addToPlaythrough); - } else if (!RegionTable(RR_ROOT)->Child() && RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult()){ - RegionTable(RR_ROOT)->childDay = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultDay; - RegionTable(RR_ROOT)->childNight = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultNight; - ProcessRegion(RegionTable(RR_ROOT), gals, ignore, stopOnBeatable, addToPlaythrough); +static void PropagateTimeTravel(GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, + bool stopOnBeatable = false, bool addToPlaythrough = false) { + // special check for temple of time + if (gals.haveTimeAccess && gals.foundTempleOfTime && gals.validatedStartingRegion) { + if (!RegionTable(RR_ROOT)->Adult() && + RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME) + ->Child()) { // RANDOTODO: sphere weirdness, other age locations not propagated in this sphere + RegionTable(RR_ROOT)->adultDay = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->childDay; + RegionTable(RR_ROOT)->adultNight = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->childNight; + ProcessRegion(RegionTable(RR_ROOT), gals, ignore, stopOnBeatable, addToPlaythrough); + } else if (!RegionTable(RR_ROOT)->Child() && RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult()) { + RegionTable(RR_ROOT)->childDay = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultDay; + RegionTable(RR_ROOT)->childNight = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultNight; + ProcessRegion(RegionTable(RR_ROOT), gals, ignore, stopOnBeatable, addToPlaythrough); + } } - } } -//This function will propagate Time of Day access through the entrance +// This function will propagate Time of Day access through the entrance static bool UpdateToDAccess(Entrance* entrance, Region* connection) { - StartPerformanceTimer(PT_TOD_ACCESS); + StartPerformanceTimer(PT_TOD_ACCESS); - bool ageTimePropogated = false; - Region* parent = entrance->GetParentRegion(); + bool ageTimePropogated = false; + Region* parent = entrance->GetParentRegion(); - if (!connection->childDay && parent->childDay && entrance->CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) { - connection->childDay = true; - ageTimePropogated = true; - } - if (!connection->childNight && parent->childNight && entrance->CheckConditionAtAgeTime(logic->IsChild, logic->AtNight)) { - connection->childNight = true; - ageTimePropogated = true; - } - if (!connection->adultDay && parent->adultDay && entrance->CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) { - connection->adultDay = true; - ageTimePropogated = true; - } - if (!connection->adultNight && parent->adultNight && entrance->CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight)) { - connection->adultNight = true; - ageTimePropogated = true; - } + if (!connection->childDay && parent->childDay && entrance->CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) { + connection->childDay = true; + ageTimePropogated = true; + } + if (!connection->childNight && parent->childNight && + entrance->CheckConditionAtAgeTime(logic->IsChild, logic->AtNight)) { + connection->childNight = true; + ageTimePropogated = true; + } + if (!connection->adultDay && parent->adultDay && entrance->CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) { + connection->adultDay = true; + ageTimePropogated = true; + } + if (!connection->adultNight && parent->adultNight && + entrance->CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight)) { + connection->adultNight = true; + ageTimePropogated = true; + } - StopPerformanceTimer(PT_TOD_ACCESS); - return ageTimePropogated; + StopPerformanceTimer(PT_TOD_ACCESS); + return ageTimePropogated; } // Check if key locations in the overworld are accessable static void ValidateOtherEntrance(GetAccessibleLocationsStruct& gals) { - auto ctx = Rando::Context::GetInstance(); - // Condition for validating Temple of Time Access - if (!gals.foundTempleOfTime && ((ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD) && RegionTable(RR_TEMPLE_OF_TIME)->Adult()) || - (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT) && RegionTable(RR_TEMPLE_OF_TIME)->Child()))) { - gals.foundTempleOfTime = true; - } - // Condition for validating a valid starting region - if (!gals.validatedStartingRegion) { - bool childAccess = ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD) || RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Child(); - bool adultAccess = ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT) || RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult(); - - Region* kokiri = RegionTable(RR_KOKIRI_FOREST); - Region* kakariko = RegionTable(RR_KAKARIKO_VILLAGE); - - if ((childAccess && (kokiri->Child() || kakariko->Child())) ||// RANDOTODO when proper ammo logic is done, this could probably be made optional - (adultAccess && (kokiri->Adult() || kakariko->Adult()))) { - gals.validatedStartingRegion = true; - ApplyStartingInventory(); // RANDOTODO when proper ammo logic is done, this could be moved to the start + auto ctx = Rando::Context::GetInstance(); + // Condition for validating Temple of Time Access + if (!gals.foundTempleOfTime && + ((ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD) && RegionTable(RR_TEMPLE_OF_TIME)->Adult()) || + (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT) && RegionTable(RR_TEMPLE_OF_TIME)->Child()))) { + gals.foundTempleOfTime = true; + } + // Condition for validating a valid starting region + if (!gals.validatedStartingRegion) { + bool childAccess = ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD) || + RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Child(); + bool adultAccess = ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT) || + RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult(); + + Region* kokiri = RegionTable(RR_KOKIRI_FOREST); + Region* kakariko = RegionTable(RR_KAKARIKO_VILLAGE); + + if ((childAccess && + (kokiri->Child() || + kakariko->Child())) || // RANDOTODO when proper ammo logic is done, this could probably be made optional + (adultAccess && (kokiri->Adult() || kakariko->Adult()))) { + gals.validatedStartingRegion = true; + ApplyStartingInventory(); // RANDOTODO when proper ammo logic is done, this could be moved to the start + } } - } } // Apply all items that are necessary for checking all location access -static void ApplyAllAdvancmentItems(){ - std::vector itemsToPlace = - FilterFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); - for (RandomizerGet unplacedItem : itemsToPlace) { - Rando::StaticData::RetrieveItem(unplacedItem).ApplyEffect(); - } +static void ApplyAllAdvancmentItems() { + std::vector itemsToPlace = + FilterFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); + for (RandomizerGet unplacedItem : itemsToPlace) { + Rando::StaticData::RetrieveItem(unplacedItem).ApplyEffect(); + } } // Check if everything in an entrance rando seed that needs to be avalible without items, is, // and if so allow obtaining items in logic -static void ValidateSphereZero(GetAccessibleLocationsStruct& gals){ - auto ctx = Rando::Context::GetInstance(); - // Condition for verifying everything required for sphere 0, expanding search to all locations - if (logic->CouldEmptyBigPoes && gals.validatedStartingRegion && gals.foundTempleOfTime && gals.haveTimeAccess) { - // Apply all items that are necessary for checking all location access - ApplyAllAdvancmentItems(); - // Reset access as the non-starting age - if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { - for (RandomizerRegion regionKey : gals.regionPool) { - RegionTable(regionKey)->adultDay = false; - RegionTable(regionKey)->adultNight = false; - } - } else { - for (RandomizerRegion regionKey : gals.regionPool) { - RegionTable(regionKey)->childDay = false; - RegionTable(regionKey)->childNight = false; - } +static void ValidateSphereZero(GetAccessibleLocationsStruct& gals) { + auto ctx = Rando::Context::GetInstance(); + // Condition for verifying everything required for sphere 0, expanding search to all locations + if (gals.validatedStartingRegion && gals.foundTempleOfTime && gals.haveTimeAccess) { + // Apply all items that are necessary for checking all location access + ApplyAllAdvancmentItems(); + // Reset access as the non-starting age + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + for (RandomizerRegion regionKey : gals.regionPool) { + RegionTable(regionKey)->adultDay = false; + RegionTable(regionKey)->adultNight = false; + } + } else { + for (RandomizerRegion regionKey : gals.regionPool) { + RegionTable(regionKey)->childDay = false; + RegionTable(regionKey)->childNight = false; + } + } + // RANDOTODO do we want to keep the region pool after this reset? + // It's a lot of potential looping over regions we have no access to + gals.sphereZeroComplete = true; } - //RANDOTODO do we want to keep the region pool after this reset? - //It's a lot of potential looping over regions we have no access to - gals.sphereZeroComplete = true; - } } -//This function handles each possible exit -void ProcessExits(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, - bool stopOnBeatable = false, bool addToPlaythrough = false){ - auto ctx = Rando::Context::GetInstance(); - for (auto& exit : region->exits) { - Region* exitRegion = exit.GetConnectedRegion(); - //Update Time of Day Access for the exit - if (UpdateToDAccess(&exit, exitRegion)) { - gals.logicUpdated = true; - if (!gals.sphereZeroComplete){ - if (!gals.foundTempleOfTime || !gals.validatedStartingRegion){ - ValidateOtherEntrance(gals); +// This function handles each possible exit +void ProcessExits(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, + bool stopOnBeatable = false, bool addToPlaythrough = false) { + auto ctx = Rando::Context::GetInstance(); + for (auto& exit : region->exits) { + int16_t entranceIndex = exit.GetIndex(); + if (!logic->ACProcessUndiscoveredExits && logic->CalculatingAvailableChecks && + ctx->GetOption(RSK_SHUFFLE_ENTRANCES).Get() && exit.IsShuffled() && entranceIndex != -1 && + !Entrance_GetIsEntranceDiscovered(entranceIndex)) { + continue; } - ValidateSphereZero(gals); - } - //process the region we just expanded to, to reduce looping - ProcessRegion(exitRegion, gals, ignore, stopOnBeatable, addToPlaythrough); - } - //If the exit is accessible and hasn't been added yet, add it to the pool - //RANDOTODO do we want to add the region after the loop now, considering we - //are processing the new region immediately. Maybe a reverse for loop in ProcessRegion? - if (!exitRegion->addedToPool && exit.ConditionsMet()) { - exitRegion->addedToPool = true; - gals.regionPool.push_back(exit.GetConnectedRegionKey()); - } + Region* exitRegion = exit.GetConnectedRegion(); + // Update Time of Day Access for the exit + if (UpdateToDAccess(&exit, exitRegion)) { + gals.logicUpdated = true; + if (!gals.sphereZeroComplete) { + if (!gals.foundTempleOfTime || !gals.validatedStartingRegion) { + ValidateOtherEntrance(gals); + } + ValidateSphereZero(gals); + } + // If the exit is accessible and hasn't been added yet, add it to the pool + // RANDOTODO do we want to add the region after the loop now, considering we + // are processing the new region immediately. Maybe a reverse for loop in ProcessRegion? + if (!exitRegion->addedToPool) { + exitRegion->addedToPool = true; + gals.regionPool.push_back(exit.GetConnectedRegionKey()); + } - if (addToPlaythrough){ - // RANDOTODO Should this match the regular spheres? - // Add shuffled entrances to the entrance playthrough - // Include bluewarps when unshuffled but dungeon or boss shuffle is on - if((exit.IsShuffled() || (exit.GetType() == Rando::EntranceType::BlueWarp && - (ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_BOSS_ENTRANCES)))) && - !exit.IsAddedToPool() && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { - gals.entranceSphere.push_back(&exit); - exit.AddToPool(); - // Don't list a two-way coupled entrance from both directions - if (exit.GetReverse() != nullptr && exit.GetReplacement()->GetReverse() != nullptr && !exit.IsDecoupled()) { - exit.GetReplacement()->GetReverse()->AddToPool(); + // process the region we just expanded to, to reduce looping + ProcessRegion(exitRegion, gals, ignore, stopOnBeatable, addToPlaythrough); + } + + if (addToPlaythrough) { + // RANDOTODO Should this match the regular spheres? + // Add shuffled entrances to the entrance playthrough + // Include bluewarps when unshuffled but dungeon or boss shuffle is on + if ((exit.IsShuffled() || + (exit.GetType() == Rando::EntranceType::BlueWarp && + (ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_BOSS_ENTRANCES)))) && + !exit.IsAddedToPool() && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { + gals.entranceSphere.push_back(&exit); + exit.AddToPool(); + // Don't list a two-way coupled entrance from both directions + if (exit.GetReverse() != nullptr && exit.GetReplacement()->GetReverse() != nullptr && + !exit.IsDecoupled()) { + exit.GetReplacement()->GetReverse()->AddToPool(); + } + } } - } } - } } - -//Get the max number of tokens that can possibly be useful +// Get the max number of tokens that can possibly be useful static int GetMaxGSCount() { - auto ctx = Rando::Context::GetInstance(); - //If bridge or LACS is set to tokens, get how many are required - int maxBridge = 0; - int maxLACS = 0; - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { - maxBridge = ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Get(); - } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_TOKENS)) { - maxLACS = ctx->GetOption(RSK_LACS_TOKEN_COUNT).Get(); - } - maxBridge = std::max(maxBridge, maxLACS); - //Get the max amount of GS which could be useful from token reward locations - int maxUseful = 0; - //If the highest advancement item is a token, we know it is useless since it won't lead to an otherwise useful item - if (ctx->GetItemLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && ctx->GetItemLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 100; - } else if (ctx->GetItemLocation(RC_KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && - ctx->GetItemLocation(RC_KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 50; - } else if (ctx->GetItemLocation(RC_KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && - ctx->GetItemLocation(RC_KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 40; - } else if (ctx->GetItemLocation(RC_KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && - ctx->GetItemLocation(RC_KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 30; - } else if (ctx->GetItemLocation(RC_KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && - ctx->GetItemLocation(RC_KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 20; - } else if (ctx->GetItemLocation(RC_KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && - ctx->GetItemLocation(RC_KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 10; - } - //Return max of the two possible reasons tokens could be important, minus the tokens in the starting inventory - return std::max(maxUseful, maxBridge) - ctx->GetOption(RSK_STARTING_SKULLTULA_TOKEN).Get(); + auto ctx = Rando::Context::GetInstance(); + // If bridge or LACS is set to tokens, get how many are required + int maxBridge = 0; + int maxLACS = 0; + if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { + maxBridge = ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Get(); + } + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_TOKENS)) { + maxLACS = ctx->GetOption(RSK_LACS_TOKEN_COUNT).Get(); + } + maxBridge = std::max(maxBridge, maxLACS); + // Get the max amount of GS which could be useful from token reward locations + int maxUseful = 0; + // If the highest advancement item is a token, we know it is useless since it won't lead to an otherwise useful item + if (ctx->GetItemLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 100; + } else if (ctx->GetItemLocation(RC_KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 50; + } else if (ctx->GetItemLocation(RC_KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 40; + } else if (ctx->GetItemLocation(RC_KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 30; + } else if (ctx->GetItemLocation(RC_KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 20; + } else if (ctx->GetItemLocation(RC_KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 10; + } + // Return max of the two possible reasons tokens could be important, minus the tokens in the starting inventory + return std::max(maxUseful, maxBridge) - ctx->GetOption(RSK_STARTING_SKULLTULA_TOKEN).Get(); } std::string GetShopItemBaseName(std::string itemName) { - std::string baseName = itemName.erase(0, 4); //Delete "Buy " - //Delete amount, if present (so when it looks like Buy Deku Nut (10) remove the (10)) - if (baseName.find("(") != std::string::npos) { - baseName = baseName.erase(baseName.find("(")); - } - //Do the same for [] (only applies to red potions, other things with [] also have a ()) - if (baseName.find("[") != std::string::npos) { - baseName = baseName.erase(baseName.find("[")); - } - return baseName; + std::string baseName = itemName.erase(0, 4); // Delete "Buy " + // Delete amount, if present (so when it looks like Buy Deku Nut (10) remove the (10)) + if (baseName.find("(") != std::string::npos) { + baseName = baseName.erase(baseName.find("(")); + } + // Do the same for [] (only applies to red potions, other things with [] also have a ()) + if (baseName.find("[") != std::string::npos) { + baseName = baseName.erase(baseName.find("[")); + } + return baseName; } std::vector GetEmptyLocations(std::vector targetLocations) { @@ -296,486 +316,520 @@ std::vector GetAllEmptyLocations() { }); } -bool IsBombchus(RandomizerGet item, bool includeShops = false){ - return (item >= RG_BOMBCHU_5 && item <= RG_BOMBCHU_20) || item == RG_PROGRESSIVE_BOMBCHUS || - (includeShops && (item == RG_BUY_BOMBCHUS_10 || item == RG_BUY_BOMBCHUS_20)); +bool IsBombchus(RandomizerGet item, bool includeShops = false) { + return (item >= RG_BOMBCHU_5 && item <= RG_BOMBCHU_20) || item == RG_PROGRESSIVE_BOMBCHUS || + (includeShops && (item == RG_BUY_BOMBCHUS_10 || item == RG_BUY_BOMBCHUS_20)); } -bool IsBeatableWithout(RandomizerCheck excludedCheck, bool replaceItem, RandomizerGet ignore = RG_NONE){ //RANDOTODO make excludCheck an ItemLocation - auto ctx = Rando::Context::GetInstance(); - RandomizerGet copy = ctx->GetItemLocation(excludedCheck)->GetPlacedRandomizerGet(); //Copy out item - ctx->GetItemLocation(excludedCheck)->SetPlacedItem(RG_NONE); //Write in empty item - ctx->playthroughBeatable = false; - logic->Reset(); - CheckBeatable(ignore); - if (replaceItem){ - ctx->GetItemLocation(excludedCheck)->SetPlacedItem(copy); //Immediately put item back - } - return ctx->playthroughBeatable; +bool IsBeatableWithout(RandomizerCheck excludedCheck, bool replaceItem, + RandomizerGet ignore = RG_NONE) { // RANDOTODO make excludCheck an ItemLocation + auto ctx = Rando::Context::GetInstance(); + RandomizerGet copy = ctx->GetItemLocation(excludedCheck)->GetPlacedRandomizerGet(); // Copy out item + ctx->GetItemLocation(excludedCheck)->SetPlacedItem(RG_NONE); // Write in empty item + logic->Reset(); + bool result = CheckBeatable(ignore); + if (replaceItem) { + ctx->GetItemLocation(excludedCheck)->SetPlacedItem(copy); // Immediately put item back + } + return result; } // Reset non-Logic-class logic, and optionally apply the initial inventory -void ResetLogic(std::shared_ptr& ctx, GetAccessibleLocationsStruct& gals, bool applyInventory = false){ - gals.timePassChildDay = true; - gals.timePassChildNight = true; - gals.timePassAdultDay = true; - gals.timePassAdultNight = true; - gals.haveTimeAccess = true; - gals.foundTempleOfTime = true; - gals.validatedStartingRegion = true; - gals.sphereZeroComplete = true; - if (applyInventory){ - ApplyStartingInventory(); - } - Regions::AccessReset(); - ctx->LocationReset(); -} - -//Generate the playthrough, so we want to add advancement items, unless we know to ignore them -void AddToPlaythrough(LocationAccess& locPair, GetAccessibleLocationsStruct& gals){ - auto ctx = Rando::Context::GetInstance(); - RandomizerCheck loc = locPair.GetLocation(); - Rando::ItemLocation* location = ctx->GetItemLocation(loc); - RandomizerGet locItem = location->GetPlacedRandomizerGet(); - //Item is an advancement item, figure out if it should be added to this sphere - if (!ctx->playthroughBeatable && location->GetPlacedItem().IsAdvancement()) { - ItemType type = location->GetPlacedItem().GetItemType(); - - //Decide whether to exclude this location - //This preprocessing is done to reduce the amount of searches performed in PareDownPlaythrough - //Want to exclude: - //1) Tokens after the last potentially useful one (the last one that gives an advancement item or last for token bridge) - //2) Buy items of the same type, after the first (So only see Buy Deku Nut of any amount once) - bool exclude = true; - //Exclude tokens after the last possibly useful one - if (type == ITEMTYPE_TOKEN && gals.gsCount < gals.maxGsCount) { - gals.gsCount++; - exclude = false; +void ResetLogic(std::shared_ptr& ctx, GetAccessibleLocationsStruct& gals, bool applyInventory = false) { + gals.timePassChildDay = true; + gals.timePassChildNight = true; + gals.timePassAdultDay = true; + gals.timePassAdultNight = true; + gals.haveTimeAccess = true; + gals.foundTempleOfTime = true; + gals.validatedStartingRegion = true; + gals.sphereZeroComplete = true; + if (applyInventory) { + ApplyStartingInventory(); } - //Handle buy items - //If ammo drops are off, don't do this step, since buyable ammo becomes logically important - // TODO: Reimplement Ammo Drops setting - else if (/*AmmoDrops.IsNot(AMMODROPS_NONE) &&*/ type == ITEMTYPE_SHOP) { - //Only check each buy item once - auto buyItem = location->GetPlacedItem().GetLogicVal(); - //Buy item not in list to ignore, add it to list and write to playthrough - if (std::find(gals.buyIgnores.begin(), gals.buyIgnores.end(), buyItem) == gals.buyIgnores.end()) { - exclude = false; - gals.buyIgnores.push_back(buyItem); - } - } - //Add all other advancement items - else if (type != ITEMTYPE_TOKEN && (/*AmmoDrops.Is(AMMODROPS_NONE) ||*/ type != ITEMTYPE_SHOP)) { - exclude = false; - } - //Has not been excluded, add to playthrough - if (!exclude) { - gals.itemSphere.push_back(loc); - } - } - //Triforce has been found, seed is beatable, nothing else in this or future spheres matters - else if (location->GetPlacedRandomizerGet() == RG_TRIFORCE) { - gals.itemSphere.clear(); - gals.itemSphere.push_back(loc); - ctx->playthroughBeatable = true; - } + Regions::AccessReset(); + ctx->LocationReset(); } -void ApplyOrStoreItem(Rando::ItemLocation* loc, GetAccessibleLocationsStruct& gals, bool addToPlaythrough){ - if (addToPlaythrough){ - gals.newItemLocations.push_back(loc); - } else { - loc->ApplyPlacedItemEffect(); - } - gals.logicUpdated = true; +// Generate the playthrough, so we want to add advancement items, unless we know to ignore them +void AddToPlaythrough(LocationAccess& locPair, GetAccessibleLocationsStruct& gals) { + auto ctx = Rando::Context::GetInstance(); + RandomizerCheck loc = locPair.GetLocation(); + Rando::ItemLocation* location = ctx->GetItemLocation(loc); + RandomizerGet locItem = location->GetPlacedRandomizerGet(); + // Item is an advancement item, figure out if it should be added to this sphere + if (!ctx->playthroughBeatable && location->GetPlacedItem().IsAdvancement()) { + ItemType type = location->GetPlacedItem().GetItemType(); + + // Decide whether to exclude this location + // This preprocessing is done to reduce the amount of searches performed in PareDownPlaythrough + // Want to exclude: + // 1) Tokens after the last potentially useful one (the last one that gives an advancement item or last for + // token bridge) 2) Buy items of the same type, after the first (So only see Buy Deku Nut of any amount once) + bool exclude = true; + // Exclude tokens after the last possibly useful one + if (type == ITEMTYPE_TOKEN && gals.gsCount < gals.maxGsCount) { + gals.gsCount++; + exclude = false; + } + // Handle buy items + // If ammo drops are off, don't do this step, since buyable ammo becomes logically important + // TODO: Reimplement Ammo Drops setting + else if (/*AmmoDrops.IsNot(AMMODROPS_NONE) &&*/ type == ITEMTYPE_SHOP) { + // Only check each buy item once + auto buyItem = location->GetPlacedItem().GetLogicVal(); + // Buy item not in list to ignore, add it to list and write to playthrough + if (std::find(gals.buyIgnores.begin(), gals.buyIgnores.end(), buyItem) == gals.buyIgnores.end()) { + exclude = false; + gals.buyIgnores.push_back(buyItem); + } + } + // Add all other advancement items + else if (type != ITEMTYPE_TOKEN && (/*AmmoDrops.Is(AMMODROPS_NONE) ||*/ type != ITEMTYPE_SHOP)) { + exclude = false; + } + // Has not been excluded, add to playthrough + if (!exclude) { + gals.itemSphere.push_back(loc); + } + } + // Triforce has been found, seed is beatable, nothing else in this or future spheres matters + else if (location->GetPlacedRandomizerGet() == RG_TRIFORCE) { + gals.itemSphere.clear(); + gals.itemSphere.push_back(loc); + ctx->playthroughBeatable = true; + } +} + +void ApplyOrStoreItem(Rando::ItemLocation* loc, GetAccessibleLocationsStruct& gals, bool addToPlaythrough) { + if (addToPlaythrough) { + gals.newItemLocations.push_back(loc); + } else { + loc->ApplyPlacedItemEffect(); + } + gals.logicUpdated = true; } // Adds the contents of a location to the current progression and optionally playthrough -bool AddCheckToLogic(LocationAccess& locPair, GetAccessibleLocationsStruct& gals, RandomizerGet ignore, bool stopOnBeatable, Region* parentRegion, bool addToPlaythrough=false){ - auto ctx = Rando::Context::GetInstance(); - StartPerformanceTimer(PT_LOCATION_LOGIC); - RandomizerCheck loc = locPair.GetLocation(); - Rando::ItemLocation* location = ctx->GetItemLocation(loc); - RandomizerGet locItem = location->GetPlacedRandomizerGet(); +bool AddCheckToLogic(LocationAccess& locPair, GetAccessibleLocationsStruct& gals, RandomizerGet ignore, + bool stopOnBeatable, Region* parentRegion, bool addToPlaythrough = false) { + auto ctx = Rando::Context::GetInstance(); + StartPerformanceTimer(PT_LOCATION_LOGIC); + RandomizerCheck loc = locPair.GetLocation(); + Rando::ItemLocation* location = ctx->GetItemLocation(loc); + RandomizerGet locItem = location->GetPlacedRandomizerGet(); - if (!location->IsAddedToPool() && locPair.ConditionsMet(parentRegion)) { - location->AddToPool(); + if (!location->IsAddedToPool() && locPair.ConditionsMet(parentRegion, logic->CalculatingAvailableChecks)) { + location->AddToPool(); - if (locItem == RG_NONE) { - gals.accessibleLocations.push_back(loc); //Empty location, consider for placement - } else { - //If ignore has a value, we want to check if the item location should be considered or not - //This is necessary due to the below preprocessing for playthrough generation - if (ignore != RG_NONE) { - ItemType type = location->GetPlacedItem().GetItemType(); - //If we want to ignore tokens, only add if not a token - if (ignore == RG_GOLD_SKULLTULA_TOKEN && type != ITEMTYPE_TOKEN) { - ApplyOrStoreItem(location, gals, addToPlaythrough); + if (locItem == RG_NONE || logic->CalculatingAvailableChecks) { + gals.accessibleLocations.push_back(loc); // Empty location, consider for placement } - //If we want to ignore bombchus, only add if bombchu is not in the name - else if (IsBombchus(ignore) && IsBombchus(locItem, true)) { - ApplyOrStoreItem(location, gals, addToPlaythrough); + if (locItem != RG_NONE) { + // If ignore has a value, we want to check if the item location should be considered or not + // This is necessary due to the below preprocessing for playthrough generation + if (ignore != RG_NONE) { + ItemType type = location->GetPlacedItem().GetItemType(); + // If we want to ignore tokens, only add if not a token + if (ignore == RG_GOLD_SKULLTULA_TOKEN && type != ITEMTYPE_TOKEN) { + ApplyOrStoreItem(location, gals, addToPlaythrough); + } + // If we want to ignore bombchus, only add if bombchu is not in the name + else if (IsBombchus(ignore) && IsBombchus(locItem, true)) { + ApplyOrStoreItem(location, gals, addToPlaythrough); + } + // We want to ignore a specific Buy item. Buy items with different RandomizerGets are recognised by a + // shared GetLogicVal + else if (ignore != RG_GOLD_SKULLTULA_TOKEN && IsBombchus(ignore)) { + if ((type == ITEMTYPE_SHOP && Rando::StaticData::GetItemTable()[ignore].GetLogicVal() != + location->GetPlacedItem().GetLogicVal()) || + type != ITEMTYPE_SHOP) { + ApplyOrStoreItem(location, gals, addToPlaythrough); + } + } + } + // If it doesn't, we can just add the location + else { + ApplyOrStoreItem(location, gals, + addToPlaythrough); // Add item to cache to be considered in logic next iteration + } } - //We want to ignore a specific Buy item. Buy items with different RandomizerGets are recognised by a shared GetLogicVal - else if (ignore != RG_GOLD_SKULLTULA_TOKEN && IsBombchus(ignore)) { - if ((type == ITEMTYPE_SHOP && Rando::StaticData::GetItemTable()[ignore].GetLogicVal() != location->GetPlacedItem().GetLogicVal()) || type != ITEMTYPE_SHOP) { - ApplyOrStoreItem(location, gals, addToPlaythrough); - } + if (addToPlaythrough) { + AddToPlaythrough(locPair, gals); + } + // All we care about is if the game is beatable, used to pare down playthrough + if (location->GetPlacedRandomizerGet() == RG_TRIFORCE && stopOnBeatable) { + StopPerformanceTimer(PT_LOCATION_LOGIC); + return true; // Return early for efficiency } - } - //If it doesn't, we can just add the location - else { - ApplyOrStoreItem(location, gals, addToPlaythrough); //Add item to cache to be considered in logic next iteration - } } - if (addToPlaythrough){ - AddToPlaythrough(locPair, gals); - } - //All we care about is if the game is beatable, used to pare down playthrough - if (location->GetPlacedRandomizerGet() == RG_TRIFORCE && stopOnBeatable) { - StopPerformanceTimer(PT_LOCATION_LOGIC); - return true; //Return early for efficiency - } - } - StopPerformanceTimer(PT_LOCATION_LOGIC); - return false; + StopPerformanceTimer(PT_LOCATION_LOGIC); + return false; } -void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore, - bool stopOnBeatable, bool addToPlaythrough){ - - if (gals.haveTimeAccess) { - region->ApplyTimePass(); - } else { - // If we're checking for TimePass access do that for each region as it's being updated. - // TimePass Access is satisfied when every AgeTime can reach a region with TimePass - // without the aid of TimePass. During this mode, TimePass won't update ToD access - // in any region. - //RANDOTODO can probably be removed after a ToD rework that accounts for having Dampe time access - if (region->timePass) { - if (region->childDay) { - gals.timePassChildDay = true; - } - if (region->childNight) { - gals.timePassChildNight = true; - } - if (region->adultDay) { - gals.timePassAdultDay = true; - } - if (region->adultNight) { - gals.timePassAdultNight = true; - } - } - // Condition for validating that all startring AgeTimes have timepass access - if (gals.timePassChildDay && gals.timePassChildNight && - gals.timePassAdultDay && gals.timePassAdultNight) { - gals.haveTimeAccess = true; - region->ApplyTimePass(); - } - } +void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore, bool stopOnBeatable, + bool addToPlaythrough) { - if (region->UpdateEvents()){ - gals.logicUpdated = true; - //if we are working in spheres, reset the sphere on an event being enabled to avoid sphere skipping - if (addToPlaythrough){ - gals.resetSphere = true; + if (gals.haveTimeAccess) { + region->ApplyTimePass(); + } else { + // If we're checking for TimePass access do that for each region as it's being updated. + // TimePass Access is satisfied when every AgeTime can reach a region with TimePass + // without the aid of TimePass. During this mode, TimePass won't update ToD access + // in any region. + // RANDOTODO can probably be removed after a ToD rework that accounts for having Dampe time access + if (region->TimePass()) { + if (region->childDay) { + gals.timePassChildDay = true; + } + if (region->childNight) { + gals.timePassChildNight = true; + } + if (region->adultDay) { + gals.timePassAdultDay = true; + } + if (region->adultNight) { + gals.timePassAdultNight = true; + } + } + // Condition for validating that all startring AgeTimes have timepass access + if (gals.timePassChildDay && gals.timePassChildNight && gals.timePassAdultDay && gals.timePassAdultNight) { + gals.haveTimeAccess = true; + region->ApplyTimePass(); + } } - } - - ProcessExits(region, gals, ignore, stopOnBeatable, addToPlaythrough); - - PropagateTimeTravel(gals, ignore, stopOnBeatable, addToPlaythrough); - for (size_t k = 0; k < region->locations.size(); k++) { - if(AddCheckToLogic(region->locations[k], gals, ignore, stopOnBeatable, region, addToPlaythrough)){ - Rando::Context::GetInstance()->playthroughBeatable = true; - return; + + if (region->UpdateEvents()) { + gals.logicUpdated = true; + // if we are working in spheres, reset the sphere on an event being enabled to avoid sphere skipping + if (addToPlaythrough) { + gals.resetSphere = true; + } + } + + ProcessExits(region, gals, ignore, stopOnBeatable, addToPlaythrough); + + PropagateTimeTravel(gals, ignore, stopOnBeatable, addToPlaythrough); + for (size_t k = 0; k < region->locations.size(); k++) { + if (AddCheckToLogic(region->locations[k], gals, ignore, stopOnBeatable, region, addToPlaythrough)) { + Rando::Context::GetInstance()->playthroughBeatable = true; + return; + } } - } } // Return any of the targetLocations that are accessible in logic -std::vector ReachabilitySearch(const std::vector& targetLocations, RandomizerGet ignore /* = RG_NONE*/) { - auto ctx = Rando::Context::GetInstance(); - GetAccessibleLocationsStruct gals(0); - ResetLogic(ctx, gals, true); - do { - gals.InitLoop(); - for (size_t i = 0; i < gals.regionPool.size(); i++) { - ProcessRegion(RegionTable(gals.regionPool[i]), gals, ignore); +std::vector ReachabilitySearch(const std::vector& targetLocations, + RandomizerGet ignore /* = RG_NONE*/, + bool calculatingAvailableChecks /* = false */, + RandomizerRegion startingRegion /* = RR_ROOT */) { + auto ctx = Rando::Context::GetInstance(); + GetAccessibleLocationsStruct gals(0); + ResetLogic(ctx, gals, !calculatingAvailableChecks); + if (startingRegion != RR_ROOT) { + gals.regionPool.insert(gals.regionPool.begin(), startingRegion); + + const auto& region = RegionTable(startingRegion); + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + region->childDay = true; + } else { + region->adultDay = true; + } + if (region->timePass) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + region->childNight = true; + } else { + region->adultNight = true; + } + } } - } while (gals.logicUpdated); - erase_if(gals.accessibleLocations, [&targetLocations, ctx](RandomizerCheck loc){ - for (RandomizerCheck allowedLocation : targetLocations) { - if (loc == allowedLocation || ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() != RG_NONE) { - return false; - } + if (calculatingAvailableChecks) { + logic->Reset(false); + logic->CalculatingAvailableChecks = true; } - return true; - }); - return gals.accessibleLocations; + do { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + ProcessRegion(RegionTable(gals.regionPool[i]), gals, ignore); + } + } while (gals.logicUpdated); + erase_if(gals.accessibleLocations, [&targetLocations, ctx, calculatingAvailableChecks](RandomizerCheck loc) { + if (ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() != RG_NONE && !calculatingAvailableChecks) { + return false; + } + for (RandomizerCheck allowedLocation : targetLocations) { + if (loc == allowedLocation) { + return false; + } + } + return true; + }); + return gals.accessibleLocations; } // Create the playthrough for the seed void GeneratePlaythrough() { - auto ctx = Rando::Context::GetInstance(); - ctx->playthroughBeatable = false; - logic->Reset(); - GetAccessibleLocationsStruct gals(GetMaxGSCount()); - ResetLogic(ctx, gals, true); - do { - gals.InitLoop(); - for (size_t i = 0; i < gals.regionPool.size(); i++) { - ProcessRegion(RegionTable(gals.regionPool[i]), gals, RG_NONE, false, true); - if (gals.resetSphere){ - gals.resetSphere = false; - i = -1; - } - } - if (gals.itemSphere.size() > 0) { - ctx->playthroughLocations.push_back(gals.itemSphere); - } - if (gals.entranceSphere.size() > 0 && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { - ctx->GetEntranceShuffler()->playthroughEntrances.push_back(gals.entranceSphere); - } - } while (gals.logicUpdated); + auto ctx = Rando::Context::GetInstance(); + ctx->playthroughBeatable = false; + logic->Reset(); + GetAccessibleLocationsStruct gals(GetMaxGSCount()); + ResetLogic(ctx, gals, true); + do { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + ProcessRegion(RegionTable(gals.regionPool[i]), gals, RG_NONE, false, true); + if (gals.resetSphere) { + gals.resetSphere = false; + i = -1; + } + } + if (gals.itemSphere.size() > 0) { + ctx->playthroughLocations.push_back(gals.itemSphere); + } + if (gals.entranceSphere.size() > 0 && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { + ctx->GetEntranceShuffler()->playthroughEntrances.push_back(gals.entranceSphere); + } + } while (gals.logicUpdated); } // return if the seed is currently beatable or not bool CheckBeatable(RandomizerGet ignore /* = RG_NONE*/) { - auto ctx = Rando::Context::GetInstance(); - GetAccessibleLocationsStruct gals(0); - ResetLogic(ctx, gals, true); - do { - gals.InitLoop(); - for (size_t i = 0; i < gals.regionPool.size(); i++) { - ProcessRegion(RegionTable(gals.regionPool[i]), gals, ignore, true); - if (ctx->playthroughBeatable == true){ - return true; - } - } - } while (gals.logicUpdated); - return false; + auto ctx = Rando::Context::GetInstance(); + ctx->playthroughBeatable = false; + GetAccessibleLocationsStruct gals(0); + ResetLogic(ctx, gals, true); + do { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + ProcessRegion(RegionTable(gals.regionPool[i]), gals, ignore, true); + if (ctx->playthroughBeatable == true) { + return true; + } + } + } while (gals.logicUpdated); + return false; } // Check if the currently randomised set of entrances is a valid game map. -void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAccess) { - auto ctx = Rando::Context::GetInstance(); - GetAccessibleLocationsStruct gals(0); - ResetLogic(ctx, gals, !checkOtherEntranceAccess); +void ValidateEntrances(bool checkOtherEntranceAccess) { + auto ctx = Rando::Context::GetInstance(); + GetAccessibleLocationsStruct gals(0); + ResetLogic(ctx, gals, !checkOtherEntranceAccess); - ctx->allLocationsReachable = false; - if (checkPoeCollectorAccess){ - logic->CouldEmptyBigPoes = false; - } + ctx->allLocationsReachable = false; - if (checkOtherEntranceAccess){ - gals.foundTempleOfTime = false; - gals.validatedStartingRegion = false; - //Variables for Time Pass access - gals.timePassChildDay = false; - gals.timePassChildNight = false; - gals.timePassAdultDay = false; - gals.timePassAdultNight = false; - gals.haveTimeAccess = false; - gals.sphereZeroComplete = false; - RegionTable(RR_ROOT)->childNight = true; - RegionTable(RR_ROOT)->adultNight = true; - RegionTable(RR_ROOT)->childDay = true; - RegionTable(RR_ROOT)->adultDay = true; - } else { - ApplyAllAdvancmentItems(); - } - - do { - gals.InitLoop(); - for (size_t i = 0; i < gals.regionPool.size(); i++) { - ProcessRegion(RegionTable(gals.regionPool[i]), gals); + if (checkOtherEntranceAccess) { + gals.foundTempleOfTime = false; + gals.validatedStartingRegion = false; + // Variables for Time Pass access + gals.timePassChildDay = false; + gals.timePassChildNight = false; + gals.timePassAdultDay = false; + gals.timePassAdultNight = false; + gals.haveTimeAccess = false; + gals.sphereZeroComplete = false; + RegionTable(RR_ROOT)->childNight = true; + RegionTable(RR_ROOT)->adultNight = true; + RegionTable(RR_ROOT)->childDay = true; + RegionTable(RR_ROOT)->adultDay = true; + } else { + ApplyAllAdvancmentItems(); } - } while (gals.logicUpdated); - if (gals.sphereZeroComplete) { - ctx->allLocationsReachable = true; - //RANDOTODO a size check here before getting the exact fails would be a minor optimization - //and a full list of location failures would be useful for logging when it does fail - for (const RandomizerCheck loc : ctx->allLocations) { - if (!ctx->GetItemLocation(loc)->IsAddedToPool()) { - ctx->allLocationsReachable = false; - auto message = "Location " + - Rando::StaticData::GetLocation(ctx->GetItemLocation(loc)->GetRandomizerCheck())->GetName() + - " not reachable\n"; - LUSLOG_DEBUG("%s", message.c_str()); - #ifndef ENABLE_DEBUG - break; - #endif - } - } - } -} -void LookForExternalArea(Region* currentRegion, std::set &alreadyChecked, std::set &areas, bool LowPriorityMode=false){ - for (const auto& entrance : currentRegion->entrances) { - //if the region is arealess and hasn't already been checked, recursivly check what connects to it - //if this entrance does not pass areas, only process it if we are in low priority mode - if ((LowPriorityMode || entrance->DoesSpreadAreas()) && !alreadyChecked.contains(entrance->GetParentRegion())){ - std::set otherAreas = entrance->GetParentRegion()->GetAllAreas(); - if (otherAreas.size() == 0) { - alreadyChecked.insert(entrance->GetParentRegion()); - LookForExternalArea(entrance->GetParentRegion(), alreadyChecked, areas, LowPriorityMode); - //If we find a valid area we should add it. - //If it's Links Pocket or RA_NONE, do not propagate those, they are not real areas. - //This check is likely to fail if a region somehow is both in Link's Pocket and elsewhere, but this should never happen - } else if (*otherAreas.begin() > RA_LINKS_POCKET){ - areas.merge(otherAreas); - } - } - } -} - -void SetAreas(){ - auto ctx = Rando::Context::GetInstance(); -//RANDOTODO give entrances an enum like RandomizerCheck, the give them all areas here, -//then use those areas to not need to recursivly find ItemLocation areas when an identifying entrance's area - for (int regionType = 0; regionType < RR_MARKER_AREAS_END; regionType++) { - Region* region = &areaTable[regionType]; - std::set areas = region->GetAllAreas(); - std::set regionsToSet = {region}; - if (areas.empty()) { - LookForExternalArea(region, regionsToSet, areas); - //If we found nothing, try again in low priority mode to try every entrance - if (areas.empty()) { - LookForExternalArea(region, regionsToSet, areas, true); - //If we still found nothing, we're disconnected, use RA_NONE to represent that - if (areas.empty()){ - areas.insert(RA_NONE); + do { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + ProcessRegion(RegionTable(gals.regionPool[i]), gals); + } + } while (gals.logicUpdated); + if (gals.sphereZeroComplete) { + ctx->allLocationsReachable = true; + // RANDOTODO a size check here before getting the exact fails would be a minor optimization + // and a full list of location failures would be useful for logging when it does fail + for (const RandomizerCheck loc : ctx->allLocations) { + if (!ctx->GetItemLocation(loc)->IsAddedToPool()) { + ctx->allLocationsReachable = false; + auto message = + "Location " + + Rando::StaticData::GetLocation(ctx->GetItemLocation(loc)->GetRandomizerCheck())->GetName() + + " not reachable\n"; + LUSLOG_DEBUG("%s", message.c_str()); +#ifndef ENABLE_DEBUG + break; +#endif + } } - } } - for (auto regionToSet : regionsToSet) { - regionToSet->ReplaceAreas(areas); - for (auto& loc : regionToSet->locations){ - ctx->GetItemLocation(loc.GetLocation())->MergeAreas(areas); - } - } - } } -//Remove unnecessary items from playthrough by removing their location, and checking if game is still beatable -//To reduce searches, some preprocessing is done in playthrough generation to avoid adding obviously unnecessary items +void LookForExternalArea(Region* currentRegion, std::set& alreadyChecked, std::set& areas, + bool LowPriorityMode = false) { + for (const auto& entrance : currentRegion->entrances) { + // if the region is arealess and hasn't already been checked, recursivly check what connects to it + // if this entrance does not pass areas, only process it if we are in low priority mode + if ((LowPriorityMode || entrance->DoesSpreadAreas()) && !alreadyChecked.contains(entrance->GetParentRegion())) { + std::set otherAreas = entrance->GetParentRegion()->GetAllAreas(); + if (otherAreas.size() == 0) { + alreadyChecked.insert(entrance->GetParentRegion()); + LookForExternalArea(entrance->GetParentRegion(), alreadyChecked, areas, LowPriorityMode); + // If we find a valid area we should add it. + // If it's Links Pocket or RA_NONE, do not propagate those, they are not real areas. + // This check is likely to fail if a region somehow is both in Link's Pocket and elsewhere, but this + // should never happen + } else if (*otherAreas.begin() > RA_LINKS_POCKET) { + areas.merge(otherAreas); + } + } + } +} + +void SetAreas() { + auto ctx = Rando::Context::GetInstance(); + // RANDOTODO give entrances an enum like RandomizerCheck, the give them all areas here, + // then use those areas to not need to recursivly find ItemLocation areas when an identifying entrance's area + for (int regionType = 0; regionType < RR_MARKER_AREAS_END; regionType++) { + Region* region = &areaTable[regionType]; + std::set areas = region->GetAllAreas(); + std::set regionsToSet = { region }; + if (areas.empty()) { + LookForExternalArea(region, regionsToSet, areas); + // If we found nothing, try again in low priority mode to try every entrance + if (areas.empty()) { + LookForExternalArea(region, regionsToSet, areas, true); + // If we still found nothing, we're disconnected, use RA_NONE to represent that + if (areas.empty()) { + areas.insert(RA_NONE); + } + } + } + for (auto regionToSet : regionsToSet) { + regionToSet->ReplaceAreas(areas); + for (auto& loc : regionToSet->locations) { + ctx->GetItemLocation(loc.GetLocation())->MergeAreas(areas); + } + } + } +} + +// Remove unnecessary items from playthrough by removing their location, and checking if game is still beatable +// To reduce searches, some preprocessing is done in playthrough generation to avoid adding obviously unnecessary items static void PareDownPlaythrough() { - auto ctx = Rando::Context::GetInstance(); - std::vector toAddBackItem; - //Start at sphere before Ganon's and count down - for (int i = ctx->playthroughLocations.size() - 2; i >= 0; i--) { - //Check each item location in sphere - std::vector erasableIndices; - std::vector sphere = ctx->playthroughLocations.at(i); - for (int j = sphere.size() - 1; j >= 0; j--) { - RandomizerCheck loc = sphere.at(j); - RandomizerGet locGet = ctx->GetItemLocation(loc)->GetPlacedRandomizerGet(); //Copy out item + auto ctx = Rando::Context::GetInstance(); + std::vector toAddBackItem; + // Start at sphere before Ganon's and count down + for (int32_t i = static_cast(ctx->playthroughLocations.size()) - 2; i >= 0; i--) { + // Check each item location in sphere + std::vector erasableIndices; + std::vector sphere = ctx->playthroughLocations.at(i); + for (int32_t j = static_cast(sphere.size()) - 1; j >= 0; j--) { + RandomizerCheck loc = sphere.at(j); + RandomizerGet locGet = ctx->GetItemLocation(loc)->GetPlacedRandomizerGet(); // Copy out item - RandomizerGet ignore = RG_NONE; - if (locGet == RG_GOLD_SKULLTULA_TOKEN || IsBombchus(locGet, true) - || Rando::StaticData::RetrieveItem(locGet).GetItemType() == ITEMTYPE_SHOP) { - ignore = locGet; - } + RandomizerGet ignore = RG_NONE; + if (locGet == RG_GOLD_SKULLTULA_TOKEN || IsBombchus(locGet, true) || + Rando::StaticData::RetrieveItem(locGet).GetItemType() == ITEMTYPE_SHOP) { + ignore = locGet; + } - //Playthrough is still beatable without this item, therefore it can be removed from playthrough section. - if (IsBeatableWithout(loc, false, ignore)) { - ctx->playthroughLocations[i].erase(ctx->playthroughLocations[i].begin() + j); - ctx->GetItemLocation(loc)->SetDelayedItem(locGet); //Game is still beatable, don't add back until later - toAddBackItem.push_back(loc); - } - else { - ctx->GetItemLocation(loc)->SetPlacedItem(locGet); //Immediately put item back so game is beatable again - } + // Playthrough is still beatable without this item, therefore it can be removed from playthrough section. + if (IsBeatableWithout(loc, false, ignore)) { + ctx->playthroughLocations[i].erase(ctx->playthroughLocations[i].begin() + j); + ctx->GetItemLocation(loc)->SetDelayedItem(locGet); // Game is still beatable, don't add back until later + toAddBackItem.push_back(loc); + } else { + ctx->GetItemLocation(loc)->SetPlacedItem(locGet); // Immediately put item back so game is beatable again + } + } } - } - //Some spheres may now be empty, remove these - for (int i = ctx->playthroughLocations.size() - 2; i >= 0; i--) { - if (ctx->playthroughLocations.at(i).size() == 0) { - ctx->playthroughLocations.erase(ctx->playthroughLocations.begin() + i); + // Some spheres may now be empty, remove these + for (int i = ctx->playthroughLocations.size() - 2; i >= 0; i--) { + if (ctx->playthroughLocations.at(i).size() == 0) { + ctx->playthroughLocations.erase(ctx->playthroughLocations.begin() + i); + } } - } - //Now we can add back items which were removed previously - for (RandomizerCheck loc : toAddBackItem) { - ctx->GetItemLocation(loc)->SaveDelayedItem(); - } + // Now we can add back items which were removed previously + for (RandomizerCheck loc : toAddBackItem) { + ctx->GetItemLocation(loc)->SaveDelayedItem(); + } } -//Very similar to PareDownPlaythrough except it sets WotH candidacy of Way of the Hero items -//Way of the Hero items are more specific than playthrough items in that they are items which *must* -// be obtained to logically be able to complete the seed, rather than playthrough items which -// are just possible items you *can* collect to complete the seed. +// Very similar to PareDownPlaythrough except it sets WotH candidacy of Way of the Hero items +// Way of the Hero items are more specific than playthrough items in that they are items which *must* +// be obtained to logically be able to complete the seed, rather than playthrough items which +// are just possible items you *can* collect to complete the seed. static void CalculateWotH() { - auto ctx = Rando::Context::GetInstance(); - //size - 1 so Triforce is not counted - for (size_t i = 0; i < ctx->playthroughLocations.size() - 1; i++) { - for (size_t j = 0; j < ctx->playthroughLocations[i].size(); j++) { - //If removing this item and no other item caused the game to become unbeatable, then it is strictly necessary, - //so add it unless it is in Links Pocket or an isolated place. - auto itemLoc = ctx->GetItemLocation(ctx->playthroughLocations[i][j]); - if (itemLoc->IsHintable() && itemLoc->GetFirstArea() > RA_LINKS_POCKET && - !(IsBeatableWithout(ctx->playthroughLocations[i][j], true))) { - itemLoc->SetWothCandidate(); - } + auto ctx = Rando::Context::GetInstance(); + // size - 1 so Triforce is not counted + for (size_t i = 0; i < ctx->playthroughLocations.size() - 1; i++) { + for (size_t j = 0; j < ctx->playthroughLocations[i].size(); j++) { + // If removing this item and no other item caused the game to become unbeatable, then it is strictly + // necessary, so add it unless it is in Links Pocket or an isolated place. + auto itemLoc = ctx->GetItemLocation(ctx->playthroughLocations[i][j]); + if (itemLoc->IsHintable() && itemLoc->GetFirstArea() > RA_LINKS_POCKET && + !(IsBeatableWithout(ctx->playthroughLocations[i][j], true))) { + itemLoc->SetWothCandidate(); + } + } } - } - ctx->playthroughBeatable = true; - logic->Reset(); - ReachabilitySearch(ctx->allLocations); + ctx->playthroughBeatable = true; + logic->Reset(); + ReachabilitySearch(ctx->allLocations); } -static bool FindIfBarren(Rando::ItemLocation* itemLoc, std::array NotBarren){ - std::set locAreas = itemLoc->GetAreas(); - for (auto locArea: locAreas){ - if (NotBarren[locArea]){ - return false; - } - } - return true; -} - -//Calculate barren locations and assign Barren Candidacy to all locations inside those areas -static void CalculateBarren() { - auto ctx = Rando::Context::GetInstance(); - std::array NotBarren = {}; //I would invert this but the "initialise all as true" syntax wasn't working - //Isolated Areas and Link's Pocket are never Hinted Barren - NotBarren[RA_NONE] = true; - NotBarren[RA_LINKS_POCKET] = true; - - for (RandomizerCheck loc : ctx->allLocations) { - Rando::ItemLocation* itemLoc = ctx->GetItemLocation(loc); +static bool FindIfBarren(Rando::ItemLocation* itemLoc, std::array NotBarren) { std::set locAreas = itemLoc->GetAreas(); - for (auto locArea: locAreas){ - // If a location has a major item or is a way of the hero location, it is not barren - if (NotBarren[locArea] == false && (itemLoc->GetPlacedItem().IsMajorItem() || itemLoc->IsWothCandidate())) { - NotBarren[locArea] = true; - } + for (auto locArea : locAreas) { + if (NotBarren[locArea]) { + return false; + } } - } - - for (RandomizerCheck loc : ctx->allLocations) { - Rando::ItemLocation* itemLoc = ctx->GetItemLocation(loc); - if (FindIfBarren(itemLoc, NotBarren)){ - itemLoc->SetBarrenCandidate(); - } - } + return true; } -//Will place things completely randomly, no logic checks are performed -static void FastFill(std::vector items, std::vector locations, bool endOnItemsEmpty = false) { - auto ctx = Rando::Context::GetInstance(); - //Loop until locations are empty, or also end if items are empty and the parameters specify to end then - while (!locations.empty() && (!endOnItemsEmpty || !items.empty())) { - if (items.empty() && !endOnItemsEmpty) { - items.push_back(GetJunkItem()); +// Calculate barren locations and assign Barren Candidacy to all locations inside those areas +static void CalculateBarren() { + auto ctx = Rando::Context::GetInstance(); + std::array + NotBarren = {}; // I would invert this but the "initialise all as true" syntax wasn't working + // Isolated Areas and Link's Pocket are never Hinted Barren + NotBarren[RA_NONE] = true; + NotBarren[RA_LINKS_POCKET] = true; + + for (RandomizerCheck loc : ctx->allLocations) { + Rando::ItemLocation* itemLoc = ctx->GetItemLocation(loc); + std::set locAreas = itemLoc->GetAreas(); + for (auto locArea : locAreas) { + // If a location has a major item or is a way of the hero location, it is not barren + if (NotBarren[locArea] == false && (itemLoc->GetPlacedItem().IsMajorItem() || itemLoc->IsWothCandidate())) { + NotBarren[locArea] = true; + } + } } - RandomizerCheck loc = RandomElement(locations, true); - ctx->GetItemLocation(loc)->SetAsHintable(); - ctx->PlaceItemInLocation(loc, RandomElement(items, true)); - } + for (RandomizerCheck loc : ctx->allLocations) { + Rando::ItemLocation* itemLoc = ctx->GetItemLocation(loc); + if (FindIfBarren(itemLoc, NotBarren)) { + itemLoc->SetBarrenCandidate(); + } + } +} + +// Will place things completely randomly, no logic checks are performed +static void FastFill(std::vector items, std::vector locations, + bool endOnItemsEmpty = false) { + auto ctx = Rando::Context::GetInstance(); + // Loop until locations are empty, or also end if items are empty and the parameters specify to end then + while (!locations.empty() && (!endOnItemsEmpty || !items.empty())) { + if (items.empty() && !endOnItemsEmpty) { + items.push_back(GetJunkItem()); + } + + RandomizerCheck loc = RandomElement(locations, true); + ctx->GetItemLocation(loc)->SetAsHintable(); + ctx->PlaceItemInLocation(loc, RandomElement(items, true)); + } } /* @@ -859,7 +913,7 @@ static void AssumedFill(const std::vector& items, const std::vect // reset any locations that got an item for (RandomizerCheck loc : attemptedLocations) { ctx->GetItemLocation(loc)->SetPlacedItem(RG_NONE); - //itemsPlaced--; + // itemsPlaced--; } attemptedLocations.clear(); @@ -882,12 +936,10 @@ static void AssumedFill(const std::vector& items, const std::vect // If ALR is off, then we check beatability after placing the item. // If the game is beatable, then we can stop placing items with logic. if (!ctx->GetOption(RSK_ALL_LOCATIONS_REACHABLE)) { - ctx->playthroughBeatable = false; logic->Reset(); - CheckBeatable(); - if (ctx->playthroughBeatable) { + if (CheckBeatable()) { SPDLOG_DEBUG("Game beatable, now placing items randomly. " + std::to_string(itemsToPlace.size()) + - " major items remaining.\n\n"); + " major items remaining.\n\n"); FastFill(itemsToPlace, GetEmptyLocations(allowedLocations), true); return; } @@ -896,121 +948,136 @@ static void AssumedFill(const std::vector& items, const std::vect } while (unsuccessfulPlacement); } -//This function will specifically randomize dungeon rewards for the End of Dungeons -//setting, or randomize one dungeon reward to Link's Pocket if that setting is on +// This function will specifically randomize dungeon rewards for the End of Dungeons +// setting, or randomize one dungeon reward to Link's Pocket if that setting is on static void RandomizeDungeonRewards() { - auto ctx = Rando::Context::GetInstance(); - //quest item bit mask of each stone/medallion for the savefile - // static constexpr std::array bitMaskTable = { - // 0x00040000, //Kokiri Emerald - // 0x00080000, //Goron Ruby - // 0x00100000, //Zora Sapphire - // 0x00000001, //Forest Medallion - // 0x00000002, //Fire Medallion - // 0x00000004, //Water Medallion - // 0x00000008, //Spirit Medallion - // 0x00000010, //Shadow Medallion - // 0x00000020, //Light Medallion - // }; - int baseOffset = Rando::StaticData::RetrieveItem(RG_KOKIRI_EMERALD).GetItemID(); + auto ctx = Rando::Context::GetInstance(); + // quest item bit mask of each stone/medallion for the savefile + // static constexpr std::array bitMaskTable = { + // 0x00040000, //Kokiri Emerald + // 0x00080000, //Goron Ruby + // 0x00100000, //Zora Sapphire + // 0x00000001, //Forest Medallion + // 0x00000002, //Fire Medallion + // 0x00000004, //Water Medallion + // 0x00000008, //Spirit Medallion + // 0x00000010, //Shadow Medallion + // 0x00000020, //Light Medallion + // }; + int baseOffset = Rando::StaticData::RetrieveItem(RG_KOKIRI_EMERALD).GetItemID(); - //End of Dungeons includes Link's Pocket - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { - //get stones and medallions - std::vector rewards = FilterAndEraseFromPool(ItemPool, [](const auto i) {return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD;}); + // End of Dungeons includes Link's Pocket + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { + // get stones and medallions + std::vector rewards = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; + }); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { // Place dungeon rewards in vanilla locations - for (RandomizerCheck loc : Rando::StaticData::dungeonRewardLocations) { - ctx->GetItemLocation(loc)->PlaceVanillaItem(); - } - ctx->GetItemLocation(RC_GIFT_FROM_RAURU)->PlaceVanillaItem(); - } else { // Randomize dungeon rewards with assumed fill - std::vector rewardLocations(Rando::StaticData::dungeonRewardLocations); - // If there are less than 9 dungeon rewards, prioritize actual dungeons for placement - if (rewards.size() < 9) { - ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); - } else { - rewardLocations.push_back(RC_LINKS_POCKET); - } - AssumedFill(rewards, rewardLocations); + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA) || + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS) + .Is(RO_DUNGEON_REWARDS_VANILLA)) { // Place dungeon rewards in vanilla locations + for (RandomizerCheck loc : Rando::StaticData::dungeonRewardLocations) { + ctx->GetItemLocation(loc)->PlaceVanillaItem(); + } + ctx->GetItemLocation(RC_GIFT_FROM_RAURU)->PlaceVanillaItem(); + } else { // Randomize dungeon rewards with assumed fill + std::vector rewardLocations(Rando::StaticData::dungeonRewardLocations); + // If there are less than 9 dungeon rewards, prioritize actual dungeons for placement + if (rewards.size() < 9) { + ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); + } else { + rewardLocations.push_back(RC_LINKS_POCKET); + } + AssumedFill(rewards, rewardLocations); + } + } else if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_DUNGEON_REWARD)) { + // get 1 stone/medallion + std::vector rewards = FilterFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; + }); + // If there are no remaining stones/medallions, then Link's pocket won't get one + if (rewards.empty()) { + ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); + return; + } + RandomizerGet startingReward = RandomElement(rewards, true); + + // LinksPocketRewardBitMask = bitMaskTable[Rando::StaticData::RetrieveItem(startingReward).GetItemID() - + // baseOffset]; + ctx->PlaceItemInLocation(RC_LINKS_POCKET, startingReward); + // erase the stone/medallion from the Item Pool + FilterAndEraseFromPool(ItemPool, [startingReward](const RandomizerGet i) { return i == startingReward; }); } - } else if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_DUNGEON_REWARD)) { - //get 1 stone/medallion - std::vector rewards = FilterFromPool( - ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; }); - // If there are no remaining stones/medallions, then Link's pocket won't get one - if (rewards.empty()) { - ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); - return; - } - RandomizerGet startingReward = RandomElement(rewards, true); - - //LinksPocketRewardBitMask = bitMaskTable[Rando::StaticData::RetrieveItem(startingReward).GetItemID() - baseOffset]; - ctx->PlaceItemInLocation(RC_LINKS_POCKET, startingReward); - //erase the stone/medallion from the Item Pool - FilterAndEraseFromPool(ItemPool, [startingReward](const RandomizerGet i) {return i == startingReward;}); - } } -//Fills any locations excluded by the player with junk items so that advancement items -//can't be placed there. +// Fills any locations excluded by the player with junk items so that advancement items +// can't be placed there. static void FillExcludedLocations() { - auto ctx = Rando::Context::GetInstance(); - //Only fill in excluded locations that don't already have something and are forbidden - std::vector excludedLocations = FilterFromPool(ctx->allLocations, [ctx](const auto loc){ - return ctx->GetItemLocation(loc)->IsExcluded(); - }); + auto ctx = Rando::Context::GetInstance(); + // Only fill in excluded locations that don't already have something and are forbidden + std::vector excludedLocations = + FilterFromPool(ctx->allLocations, [ctx](const auto loc) { return ctx->GetItemLocation(loc)->IsExcluded(); }); - for (RandomizerCheck loc : excludedLocations) { - PlaceJunkInExcludedLocation(loc); - } + for (RandomizerCheck loc : excludedLocations) { + PlaceJunkInExcludedLocation(loc); + } } -//Function to handle the Own Dungeon setting +// Function to handle the Own Dungeon setting static void RandomizeOwnDungeon(const Rando::DungeonInfo* dungeon) { - auto ctx = Rando::Context::GetInstance(); - std::vector dungeonItems; + auto ctx = Rando::Context::GetInstance(); + std::vector dungeonItems; - // Search and filter for locations that match the hint region of the dungeon - // This accounts for boss room shuffle so that own dungeon items can be placed - // in the shuffled boss room - std::vector dungeonLocations = FilterFromPool(ctx->allLocations, [dungeon, ctx](const auto loc) { - return ctx->GetItemLocation(loc)->GetAreas().contains(dungeon->GetArea()); - }); + // Search and filter for locations that match the hint region of the dungeon + // This accounts for boss room shuffle so that own dungeon items can be placed + // in the shuffled boss room + std::vector dungeonLocations = FilterFromPool(ctx->allLocations, [dungeon, ctx](const auto loc) { + return ctx->GetItemLocation(loc)->GetAreas().contains(dungeon->GetArea()); + }); - //filter out locations that may be required to have songs placed at them - dungeonLocations = FilterFromPool(dungeonLocations, [ctx](const auto loc) { - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_SONG_LOCATIONS)) { - return !(Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION); + // filter out locations that may be required to have songs placed at them + dungeonLocations = FilterFromPool(dungeonLocations, [ctx](const auto loc) { + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_SONG_LOCATIONS) || + ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_OFF)) { + return !(Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION); + } + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_DUNGEON_REWARDS)) { + return !(Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_BOSS_HEART_OR_OTHER_REWARD || + loc == RC_SHEIK_IN_ICE_CAVERN || loc == RC_SONG_FROM_IMPA); + } + return true; + }); + + // Add specific items that need be randomized within this dungeon + if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && dungeon->GetSmallKey() != RG_NONE) { + std::vector dungeonSmallKeys = + FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing()); + }); + AddElementsToPool(dungeonItems, dungeonSmallKeys); } - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_DUNGEON_REWARDS)) { - return !(Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_BOSS_HEART_OR_OTHER_REWARD || - loc == RC_SHEIK_IN_ICE_CAVERN || - loc == RC_SONG_FROM_IMPA); - } - return true; - }); - //Add specific items that need be randomized within this dungeon - if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && dungeon->GetSmallKey() != RG_NONE) { - std::vector dungeonSmallKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){ return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); - AddElementsToPool(dungeonItems, dungeonSmallKeys); - } - - if ((ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) || - (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON) && dungeon->GetBossKey() == RG_GANONS_CASTLE_BOSS_KEY)) { - auto dungeonBossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){ return i == dungeon->GetBossKey();}); + if ((ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && + dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) || + (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON) && + dungeon->GetBossKey() == RG_GANONS_CASTLE_BOSS_KEY)) { + auto dungeonBossKey = + FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { return i == dungeon->GetBossKey(); }); AddElementsToPool(dungeonItems, dungeonBossKey); - } + } - //randomize boss key and small keys together for even distribution - AssumedFill(dungeonItems, dungeonLocations); + // randomize boss key and small keys together for even distribution + AssumedFill(dungeonItems, dungeonLocations); - //randomize map and compass separately since they're not progressive - if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && dungeon->GetMap() != RG_NONE && dungeon->GetCompass() != RG_NONE) { - auto dungeonMapAndCompass = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){ return i == dungeon->GetMap() || i == dungeon->GetCompass();}); - AssumedFill(dungeonMapAndCompass, dungeonLocations); - } + // randomize map and compass separately since they're not progressive + if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && dungeon->GetMap() != RG_NONE && + dungeon->GetCompass() != RG_NONE) { + auto dungeonMapAndCompass = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return i == dungeon->GetMap() || i == dungeon->GetCompass(); + }); + AssumedFill(dungeonMapAndCompass, dungeonLocations); + } } /*Randomize items restricted to a certain set of locations. @@ -1022,353 +1089,373 @@ static void RandomizeOwnDungeon(const Rando::DungeonInfo* dungeon) { will be randomized together if they have the same setting. Maps and Compasses are randomized separately once the dungeon advancement items have all been placed.*/ static void RandomizeDungeonItems() { - auto ctx = Rando::Context::GetInstance(); + auto ctx = Rando::Context::GetInstance(); - //Get Any Dungeon and Overworld group locations - std::vector anyDungeonLocations = Rando::StaticData::GetAllDungeonLocations(); + // Get Any Dungeon and Overworld group locations + std::vector anyDungeonLocations = Rando::StaticData::GetAllDungeonLocations(); - //Create Any Dungeon and Overworld item pools - std::vector anyDungeonItems; - std::vector overworldItems; + // Create Any Dungeon and Overworld item pools + std::vector anyDungeonItems; + std::vector overworldItems; - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON)) { - auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); - AddElementsToPool(anyDungeonItems, dungeonKeys); - } else if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { - auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); - AddElementsToPool(overworldItems, dungeonKeys); + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON)) { + auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing()); + }); + AddElementsToPool(anyDungeonItems, dungeonKeys); + } else if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { + auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing()); + }); + AddElementsToPool(overworldItems, dungeonKeys); + } + + if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) && + dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) { + auto bossKey = FilterAndEraseFromPool( + ItemPool, [dungeon](const RandomizerGet i) { return i == dungeon->GetBossKey(); }); + AddElementsToPool(anyDungeonItems, bossKey); + } else if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD) && + dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) { + auto bossKey = FilterAndEraseFromPool( + ItemPool, [dungeon](const RandomizerGet i) { return i == dungeon->GetBossKey(); }); + AddElementsToPool(overworldItems, bossKey); + } + + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON)) { + auto ganonBossKey = + FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GANONS_CASTLE_BOSS_KEY; }); + AddElementsToPool(anyDungeonItems, ganonBossKey); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { + auto ganonBossKey = + FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GANONS_CASTLE_BOSS_KEY; }); + AddElementsToPool(overworldItems, ganonBossKey); + } } - if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) && dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) { - auto bossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetBossKey();}); - AddElementsToPool(anyDungeonItems, bossKey); - } else if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD) && dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) { - auto bossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetBossKey();}); - AddElementsToPool(overworldItems, bossKey); + if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_ANY_DUNGEON)) { + auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return i == RG_GERUDO_FORTRESS_SMALL_KEY || i == RG_GERUDO_FORTRESS_KEY_RING; + }); + AddElementsToPool(anyDungeonItems, gerudoKeys); + } else if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_OVERWORLD)) { + auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return i == RG_GERUDO_FORTRESS_SMALL_KEY || i == RG_GERUDO_FORTRESS_KEY_RING; + }); + AddElementsToPool(overworldItems, gerudoKeys); } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON)) { - auto ganonBossKey = FilterAndEraseFromPool(ItemPool, [](const auto i){return i == RG_GANONS_CASTLE_BOSS_KEY;}); - AddElementsToPool(anyDungeonItems, ganonBossKey); - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { - auto ganonBossKey = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GANONS_CASTLE_BOSS_KEY; }); - AddElementsToPool(overworldItems, ganonBossKey); + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_ANY_DUNGEON)) { + auto rewards = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; + }); + AddElementsToPool(anyDungeonItems, rewards); + } else if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_OVERWORLD)) { + auto rewards = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; + }); + AddElementsToPool(overworldItems, rewards); } - } - if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_ANY_DUNGEON)) { - auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GERUDO_FORTRESS_SMALL_KEY || i == RG_GERUDO_FORTRESS_KEY_RING; }); - AddElementsToPool(anyDungeonItems, gerudoKeys); - } else if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_OVERWORLD)) { - auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GERUDO_FORTRESS_SMALL_KEY || i == RG_GERUDO_FORTRESS_KEY_RING; }); - AddElementsToPool(overworldItems, gerudoKeys); - } + // Randomize Any Dungeon and Overworld pools + AssumedFill(anyDungeonItems, anyDungeonLocations, true); + AssumedFill(overworldItems, ctx->overworldLocations, true); - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_ANY_DUNGEON)) { - auto rewards = FilterAndEraseFromPool( - ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; }); - AddElementsToPool(anyDungeonItems, rewards); - } else if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_OVERWORLD)) { - auto rewards = FilterAndEraseFromPool( - ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; }); - AddElementsToPool(overworldItems, rewards); - } - - //Randomize Any Dungeon and Overworld pools - AssumedFill(anyDungeonItems, anyDungeonLocations, true); - AssumedFill(overworldItems, ctx->overworldLocations, true); - - //Randomize maps and compasses after since they're not advancement items - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON)) { - auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetMap() || i == dungeon->GetCompass();}); - AssumedFill(mapAndCompassItems, anyDungeonLocations, true); - } else if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { - auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetMap() || i == dungeon->GetCompass();}); - AssumedFill(mapAndCompassItems, ctx->overworldLocations, true); + // Randomize maps and compasses after since they're not advancement items + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON)) { + auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return i == dungeon->GetMap() || i == dungeon->GetCompass(); + }); + AssumedFill(mapAndCompassItems, anyDungeonLocations, true); + } else if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { + auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return i == dungeon->GetMap() || i == dungeon->GetCompass(); + }); + AssumedFill(mapAndCompassItems, ctx->overworldLocations, true); + } } - } } static void RandomizeLinksPocket() { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_ADVANCEMENT)) { - //Get all the advancement items don't include tokens - std::vector advancementItems = FilterAndEraseFromPool(ItemPool, [](const auto i) { - return Rando::StaticData::RetrieveItem(i).IsAdvancement() && Rando::StaticData::RetrieveItem(i).GetItemType() != ITEMTYPE_TOKEN; - }); - //select a random one - RandomizerGet startingItem = RandomElement(advancementItems, true); - //add the others back - AddElementsToPool(ItemPool, advancementItems); + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_ADVANCEMENT)) { + // Get all the advancement items don't include tokens + std::vector advancementItems = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).IsAdvancement() && + Rando::StaticData::RetrieveItem(i).GetItemType() != ITEMTYPE_TOKEN; + }); + // select a random one + RandomizerGet startingItem = RandomElement(advancementItems, true); + // add the others back + AddElementsToPool(ItemPool, advancementItems); - ctx->PlaceItemInLocation(RC_LINKS_POCKET, startingItem); - } else if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_NOTHING)) { - ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); - } + ctx->PlaceItemInLocation(RC_LINKS_POCKET, startingItem); + } else if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_NOTHING)) { + ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); + } } void VanillaFill() { - auto ctx = Rando::Context::GetInstance(); - //Perform minimum needed initialization - RegionTable_Init(); - ctx->GenerateLocationPool(); - GenerateItemPool(); - GenerateStartingInventory(); - //Place vanilla item in each location - RandomizeDungeonRewards(); - for (RandomizerCheck loc : ctx->allLocations) { - ctx->GetItemLocation(loc)->PlaceVanillaItem(); - } - //If necessary, handle ER stuff - if (ctx->GetOption(RSK_SHUFFLE_ENTRANCES)) { - SPDLOG_INFO("Shuffling Entrances..."); - ctx->GetEntranceShuffler()->ShuffleAllEntrances(); - SPDLOG_INFO("Shuffling Entrances Done"); - } - // Populate the playthrough for entrances so they are placed in the spoiler log - GeneratePlaythrough(); - //Finish up - ctx->CreateItemOverrides(); - ctx->GetEntranceShuffler()->CreateEntranceOverrides(); - CreateWarpSongTexts(); + auto ctx = Rando::Context::GetInstance(); + // Perform minimum needed initialization + RegionTable_Init(); + ctx->GenerateLocationPool(); + GenerateItemPool(); + GenerateStartingInventory(); + // Place vanilla item in each location + RandomizeDungeonRewards(); + for (RandomizerCheck loc : ctx->allLocations) { + ctx->GetItemLocation(loc)->PlaceVanillaItem(); + } + // If necessary, handle ER stuff + if (ctx->GetOption(RSK_SHUFFLE_ENTRANCES)) { + SPDLOG_INFO("Shuffling Entrances..."); + ctx->GetEntranceShuffler()->ShuffleAllEntrances(); + SPDLOG_INFO("Shuffling Entrances Done"); + } + // Populate the playthrough for entrances so they are placed in the spoiler log + GeneratePlaythrough(); + // Finish up + ctx->CreateItemOverrides(); + ctx->GetEntranceShuffler()->CreateEntranceOverrides(); + CreateWarpSongTexts(); } void ClearProgress() { } int Fill() { - auto ctx = Rando::Context::GetInstance(); - int retries = 0; - SPDLOG_INFO("Starting seed generation..."); - while(retries < 5) { - SPDLOG_INFO("Attempt {}...", retries + 1); - placementFailure = false; - //showItemProgress = false; - ctx->playthroughLocations.clear(); - ctx->GetEntranceShuffler()->playthroughEntrances.clear(); - RegionTable_Init(); //Reset the world graph to intialize the proper locations - ctx->ItemReset(); //Reset shops incase of shopsanity random - ctx->GenerateLocationPool(); - GenerateItemPool(); - GenerateStartingInventory(); - RemoveStartingItemsFromPool(); - FillExcludedLocations(); + auto ctx = Rando::Context::GetInstance(); + int retries = 0; + SPDLOG_INFO("Starting seed generation..."); + while (retries < 5) { + SPDLOG_INFO("Attempt {}...", retries + 1); + placementFailure = false; + // showItemProgress = false; + ctx->playthroughLocations.clear(); + ctx->GetEntranceShuffler()->playthroughEntrances.clear(); + RegionTable_Init(); // Reset the world graph to intialize the proper locations + ctx->ItemReset(); // Reset shops incase of shopsanity random + ctx->GenerateLocationPool(); + GenerateItemPool(); + GenerateStartingInventory(); + RemoveStartingItemsFromPool(); + FillExcludedLocations(); - //Temporarily add shop items to the ItemPool so that entrance randomization - //can validate the world using deku/hylian shields - StartPerformanceTimer(PT_ENTRANCE_SHUFFLE); - AddElementsToPool(ItemPool, GetMinVanillaShopItems(8)); //assume worst case shopsanity 7 - if (ctx->GetOption(RSK_SHUFFLE_ENTRANCES)) { - SPDLOG_INFO("Shuffling Entrances..."); - if (ctx->GetEntranceShuffler()->ShuffleAllEntrances() == ENTRANCE_SHUFFLE_FAILURE) { + // Temporarily add shop items to the ItemPool so that entrance randomization + // can validate the world using deku/hylian shields + StartPerformanceTimer(PT_ENTRANCE_SHUFFLE); + AddElementsToPool(ItemPool, GetMinVanillaShopItems(8)); // assume worst case shopsanity 7 + if (ctx->GetOption(RSK_SHUFFLE_ENTRANCES)) { + SPDLOG_INFO("Shuffling Entrances..."); + if (ctx->GetEntranceShuffler()->ShuffleAllEntrances() == ENTRANCE_SHUFFLE_FAILURE) { + retries++; + ClearProgress(); + continue; + } + SPDLOG_INFO("Shuffling Entrances Done"); + } + SetAreas(); + // erase temporary shop items + FilterAndEraseFromPool(ItemPool, [](const auto item) { + return Rando::StaticData::RetrieveItem(item).GetItemType() == ITEMTYPE_SHOP; + }); + StopPerformanceTimer(PT_ENTRANCE_SHUFFLE); + + // ctx->showItemProgress = true; + // Place shop items first, since a buy shield is needed to place a dungeon reward on Gohma due to access + + StartPerformanceTimer(PT_SHOPSANITY); + if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF)) { + SPDLOG_INFO("Placing Vanilla Shop Items..."); + PlaceVanillaShopItems(); // Place vanilla shop items in vanilla location + } else { + SPDLOG_INFO("Shuffling Shop Items"); + int total_replaced = 0; + if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_RANDOM) || + ctx->GetOption(RSK_SHOPSANITY_COUNT).IsNot(RO_SHOPSANITY_COUNT_ZERO_ITEMS)) { // Shopsanity 1-7, random + /* + Indices from OoTR. So shopsanity one will overwrite 7, three will overwrite 7, 5, 8, etc. + 8 6 2 4 + 7 5 1 3 + */ + const std::array indices = { 7, 5, 8, 6, 3, 1, 4, 2 }; +// Overwrite appropriate number of shop items +#define LOCATIONS_PER_SHOP 8 + for (size_t i = 0; i < Rando::StaticData::GetShopLocations().size() / LOCATIONS_PER_SHOP; i++) { + int num_to_replace = + GetShopsanityReplaceAmount(); // 1-7 shop items will be overwritten, depending on settings + total_replaced += num_to_replace; + for (int j = 0; j < num_to_replace; j++) { + int itemindex = indices[j]; + RandomizerCheck rc = + Rando::StaticData::GetShopLocations()[i * LOCATIONS_PER_SHOP + itemindex - 1]; + Rando::ItemLocation* itemLoc = ctx->GetItemLocation(rc); + uint16_t shopsanityPrice = GetRandomPrice(Rando::StaticData::GetLocation(rc), shopsanityPrices); + itemLoc->SetCustomPrice(shopsanityPrice); + } + } +#undef LOCATIONS_PER_SHOP + } + // Get all locations and items that don't have a shopsanity price attached + std::vector shopLocations = {}; + // Get as many vanilla shop items as the total number of shop items minus the number of replaced items + // So shopsanity 0 will get all 64 vanilla items, shopsanity 4 will get 32, etc. + std::vector shopItems = GetMinVanillaShopItems(total_replaced); + + for (RandomizerCheck& randomizerCheck : Rando::StaticData::GetShopLocations()) { + if (!(ctx->GetItemLocation(randomizerCheck)->HasCustomPrice())) { + shopLocations.push_back(randomizerCheck); + } + } + // Place the shop items which will still be at shop locations + AssumedFill(shopItems, shopLocations); + } + + // Add prices to scrubs + auto scrubLoc = Rando::StaticData::GetScrubLocations(); + if (ctx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_ALL)) { + for (size_t i = 0; i < scrubLoc.size(); i++) { + ctx->GetItemLocation(scrubLoc[i]) + ->SetCustomPrice(GetRandomPrice(Rando::StaticData::GetLocation(scrubLoc[i]), scrubPrices)); + } + } else { + for (size_t i = 0; i < scrubLoc.size(); i++) { + ctx->GetItemLocation(scrubLoc[i]) + ->SetCustomPrice(Rando::StaticData::GetLocation(scrubLoc[i])->GetVanillaPrice()); + } + } + + // set merchant prices + if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_BEANS_ONLY) || + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { + ctx->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN) + ->SetCustomPrice( + GetRandomPrice(Rando::StaticData::GetLocation(RC_ZR_MAGIC_BEAN_SALESMAN), merchantPrices)); + } else { + ctx->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN) + ->SetCustomPrice(Rando::StaticData::GetLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetVanillaPrice()); + } + + auto merchantLoc = Rando::StaticData::GetMerchantLocations(); + + if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { + for (size_t i = 0; i < merchantLoc.size(); i++) { + ctx->GetItemLocation(merchantLoc[i]) + ->SetCustomPrice(GetRandomPrice(Rando::StaticData::GetLocation(merchantLoc[i]), merchantPrices)); + } + } else { + for (size_t i = 0; i < merchantLoc.size(); i++) { + ctx->GetItemLocation(merchantLoc[i]) + ->SetCustomPrice(Rando::StaticData::GetLocation(merchantLoc[i])->GetVanillaPrice()); + } + } + StopPerformanceTimer(PT_SHOPSANITY); + + StartPerformanceTimer(PT_OWN_DUNGEON); + // Place dungeon rewards + SPDLOG_INFO("Shuffling and Placing Dungeon Items..."); + RandomizeDungeonRewards(); + + // Place dungeon items restricted to their Own Dungeon + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + RandomizeOwnDungeon(dungeon); + } + StopPerformanceTimer(PT_OWN_DUNGEON); + + StartPerformanceTimer(PT_LIMITED_CHECKS); + // Then Place songs if song shuffle is set to specific locations + if (ctx->GetOption(RSK_SHUFFLE_SONGS).IsNot(RO_SONG_SHUFFLE_ANYWHERE) && + ctx->GetOption(RSK_SHUFFLE_SONGS).IsNot(RO_SONG_SHUFFLE_OFF)) { + // Get each song + std::vector songs = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_SONG; + }); + + // Get each song location + std::vector songLocations; + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_SONG_LOCATIONS)) { + songLocations = FilterFromPool(ctx->allLocations, [](const auto loc) { + return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION; + }); + + } else if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_DUNGEON_REWARDS)) { + songLocations = FilterFromPool(ctx->allLocations, [](const auto loc) { + return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_BOSS_HEART_OR_OTHER_REWARD || + loc == RC_SHEIK_IN_ICE_CAVERN || loc == RC_SONG_FROM_IMPA; + }); + } + + AssumedFill(songs, songLocations, true); + } + + // Then place dungeon items that are assigned to restrictive location pools + RandomizeDungeonItems(); + SPDLOG_INFO("Dungeon Items Done"); + + // Then place Link's Pocket Item if it has to be an advancement item + RandomizeLinksPocket(); + StopPerformanceTimer(PT_LIMITED_CHECKS); + + StartPerformanceTimer(PT_ADVANCEMENT_ITEMS); + SPDLOG_INFO("Shuffling Advancement Items"); + // Then place the rest of the advancement items + std::vector remainingAdvancementItems = FilterAndEraseFromPool( + ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); + AssumedFill(remainingAdvancementItems, ctx->allLocations, true); + StopPerformanceTimer(PT_ADVANCEMENT_ITEMS); + + StartPerformanceTimer(PT_REMAINING_ITEMS); + // Fast fill for the rest of the pool + SPDLOG_INFO("Shuffling Remaining Items"); + std::vector remainingPool = FilterAndEraseFromPool(ItemPool, [](const auto i) { return true; }); + FastFill(remainingPool, GetAllEmptyLocations(), false); + StopPerformanceTimer(PT_REMAINING_ITEMS); + + StartPerformanceTimer(PT_PLAYTHROUGH_GENERATION); + GeneratePlaythrough(); + StopPerformanceTimer(PT_PLAYTHROUGH_GENERATION); + // Successful placement, produced beatable result + if (ctx->playthroughBeatable && !placementFailure) { + + SPDLOG_INFO("Calculating Playthrough..."); + StartPerformanceTimer(PT_PARE_DOWN_PLAYTHROUGH); + PareDownPlaythrough(); + StopPerformanceTimer(PT_PARE_DOWN_PLAYTHROUGH); + + StartPerformanceTimer(PT_WOTH); + CalculateWotH(); + StopPerformanceTimer(PT_WOTH); + + StartPerformanceTimer(PT_FOOLISH); + CalculateBarren(); + StopPerformanceTimer(PT_FOOLISH); + SPDLOG_INFO("Calculating Playthrough Done"); + + StartPerformanceTimer(PT_OVERRIDES); + ctx->CreateItemOverrides(); + ctx->GetEntranceShuffler()->CreateEntranceOverrides(); + StopPerformanceTimer(PT_OVERRIDES); + + StartPerformanceTimer(PT_HINTS); + CreateAllHints(); + CreateWarpSongTexts(); + StopPerformanceTimer(PT_HINTS); + SPDLOG_DEBUG("Number of retries {}", retries); + return 1; + } + // Unsuccessful placement + if (retries < 4) { + SPDLOG_DEBUG("Failed to generate a beatable seed. Retrying..."); + Regions::ResetAllLocations(); + logic->Reset(); + ClearProgress(); + } retries++; - ClearProgress(); - continue; - } - SPDLOG_INFO("Shuffling Entrances Done"); } - SetAreas(); - //erase temporary shop items - FilterAndEraseFromPool(ItemPool, [](const auto item) { return Rando::StaticData::RetrieveItem(item).GetItemType() == ITEMTYPE_SHOP; }); - StopPerformanceTimer(PT_ENTRANCE_SHUFFLE); - - //ctx->showItemProgress = true; - //Place shop items first, since a buy shield is needed to place a dungeon reward on Gohma due to access - - StartPerformanceTimer(PT_SHOPSANITY); - if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF)) { - SPDLOG_INFO("Placing Vanilla Shop Items..."); - PlaceVanillaShopItems(); //Place vanilla shop items in vanilla location - } else { - SPDLOG_INFO("Shuffling Shop Items"); - int total_replaced = 0; - if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_RANDOM) || ctx->GetOption(RSK_SHOPSANITY_COUNT).IsNot(RO_SHOPSANITY_COUNT_ZERO_ITEMS)) { //Shopsanity 1-7, random - /* - Indices from OoTR. So shopsanity one will overwrite 7, three will overwrite 7, 5, 8, etc. - 8 6 2 4 - 7 5 1 3 - */ - const std::array indices = { 7, 5, 8, 6, 3, 1, 4, 2 }; - //Overwrite appropriate number of shop items - #define LOCATIONS_PER_SHOP 8 - for (size_t i = 0; i < Rando::StaticData::GetShopLocations().size() / LOCATIONS_PER_SHOP; i++) { - int num_to_replace = GetShopsanityReplaceAmount(); //1-7 shop items will be overwritten, depending on settings - total_replaced += num_to_replace; - for (int j = 0; j < num_to_replace; j++) { - int itemindex = indices[j]; - RandomizerCheck rc = Rando::StaticData::GetShopLocations()[i * LOCATIONS_PER_SHOP + itemindex - 1]; - Rando::ItemLocation* itemLoc = ctx->GetItemLocation(rc); - uint16_t shopsanityPrice = GetRandomPrice(Rando::StaticData::GetLocation(rc), shopsanityPrices); - itemLoc->SetCustomPrice(shopsanityPrice); - } - } - #undef LOCATIONS_PER_SHOP - } - //Get all locations and items that don't have a shopsanity price attached - std::vector shopLocations = {}; - //Get as many vanilla shop items as the total number of shop items minus the number of replaced items - //So shopsanity 0 will get all 64 vanilla items, shopsanity 4 will get 32, etc. - std::vector shopItems = GetMinVanillaShopItems(total_replaced); - - for (RandomizerCheck& randomizerCheck : Rando::StaticData::GetShopLocations()) { - if (!(ctx->GetItemLocation(randomizerCheck)->HasCustomPrice())) { - shopLocations.push_back(randomizerCheck); - } - } - //Place the shop items which will still be at shop locations - AssumedFill(shopItems, shopLocations); - } - - //Add prices to scrubs - auto scrubLoc = Rando::StaticData::GetScrubLocations(); - if (ctx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_ALL)) { - for (size_t i = 0; i < scrubLoc.size(); i++) { - ctx->GetItemLocation(scrubLoc[i])->SetCustomPrice( - GetRandomPrice(Rando::StaticData::GetLocation(scrubLoc[i]), scrubPrices) - ); - } - } else { - for (size_t i = 0; i < scrubLoc.size(); i++) { - ctx->GetItemLocation(scrubLoc[i])->SetCustomPrice( - Rando::StaticData::GetLocation(scrubLoc[i])->GetVanillaPrice() - ); - } - } - - //set merchant prices - if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_BEANS_ONLY) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)){ - ctx->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->SetCustomPrice( - GetRandomPrice(Rando::StaticData::GetLocation(RC_ZR_MAGIC_BEAN_SALESMAN), merchantPrices) - ); - } else { - ctx->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->SetCustomPrice( - Rando::StaticData::GetLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetVanillaPrice() - ); - } - - auto merchantLoc = Rando::StaticData::GetMerchantLocations(); - - if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)){ - for (size_t i = 0; i < merchantLoc.size(); i++) { - ctx->GetItemLocation(merchantLoc[i])->SetCustomPrice( - GetRandomPrice(Rando::StaticData::GetLocation(merchantLoc[i]), merchantPrices) - ); - } - } else { - for (size_t i = 0; i < merchantLoc.size(); i++) { - ctx->GetItemLocation(merchantLoc[i])->SetCustomPrice( - Rando::StaticData::GetLocation(merchantLoc[i])->GetVanillaPrice() - ); - } - } - StopPerformanceTimer(PT_SHOPSANITY); - - StartPerformanceTimer(PT_OWN_DUNGEON); - //Place dungeon rewards - SPDLOG_INFO("Shuffling and Placing Dungeon Items..."); - RandomizeDungeonRewards(); - - //Place dungeon items restricted to their Own Dungeon - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - RandomizeOwnDungeon(dungeon); - } - StopPerformanceTimer(PT_OWN_DUNGEON); - - StartPerformanceTimer(PT_LIMITED_CHECKS); - //Then Place songs if song shuffle is set to specific locations - if (ctx->GetOption(RSK_SHUFFLE_SONGS).IsNot(RO_SONG_SHUFFLE_ANYWHERE)) { - - //Get each song - std::vector songs = FilterAndEraseFromPool( - ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_SONG; }); - - //Get each song location - std::vector songLocations; - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_SONG_LOCATIONS)) { - songLocations = FilterFromPool( - ctx->allLocations, [](const auto loc) { return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION; }); - - } else if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_DUNGEON_REWARDS)) { - songLocations = FilterFromPool(ctx->allLocations, [](const auto loc) { - return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_BOSS_HEART_OR_OTHER_REWARD || - loc == RC_SHEIK_IN_ICE_CAVERN || - loc == RC_SONG_FROM_IMPA; - }); - } - - AssumedFill(songs, songLocations, true); - } - - //Then place dungeon items that are assigned to restrictive location pools - RandomizeDungeonItems(); - SPDLOG_INFO("Dungeon Items Done"); - - //Then place Link's Pocket Item if it has to be an advancement item - RandomizeLinksPocket(); - StopPerformanceTimer(PT_LIMITED_CHECKS); - - - StartPerformanceTimer(PT_ADVANCEMENT_ITEMS); - SPDLOG_INFO("Shuffling Advancement Items"); - //Then place the rest of the advancement items - std::vector remainingAdvancementItems = - FilterAndEraseFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); - AssumedFill(remainingAdvancementItems, ctx->allLocations, true); - StopPerformanceTimer(PT_ADVANCEMENT_ITEMS); - - StartPerformanceTimer(PT_REMAINING_ITEMS); - //Fast fill for the rest of the pool - SPDLOG_INFO("Shuffling Remaining Items"); - std::vector remainingPool = FilterAndEraseFromPool(ItemPool, [](const auto i) { return true; }); - FastFill(remainingPool, GetAllEmptyLocations(), false); - StopPerformanceTimer(PT_REMAINING_ITEMS); - - - StartPerformanceTimer(PT_PLAYTHROUGH_GENERATION); - GeneratePlaythrough(); - StopPerformanceTimer(PT_PLAYTHROUGH_GENERATION); - //Successful placement, produced beatable result - if(ctx->playthroughBeatable && !placementFailure) { - - SPDLOG_INFO("Calculating Playthrough..."); - StartPerformanceTimer(PT_PARE_DOWN_PLAYTHROUGH); - PareDownPlaythrough(); - StopPerformanceTimer(PT_PARE_DOWN_PLAYTHROUGH); - - StartPerformanceTimer(PT_WOTH); - CalculateWotH(); - StopPerformanceTimer(PT_WOTH); - - StartPerformanceTimer(PT_FOOLISH); - CalculateBarren(); - StopPerformanceTimer(PT_FOOLISH); - SPDLOG_INFO("Calculating Playthrough Done"); - - StartPerformanceTimer(PT_OVERRIDES); - ctx->CreateItemOverrides(); - ctx->GetEntranceShuffler()->CreateEntranceOverrides(); - StopPerformanceTimer(PT_OVERRIDES); - - StartPerformanceTimer(PT_HINTS); - CreateAllHints(); - CreateWarpSongTexts(); - StopPerformanceTimer(PT_HINTS); - SPDLOG_DEBUG("Number of retries {}", retries); - return 1; - } - //Unsuccessful placement - if(retries < 4) { - SPDLOG_DEBUG("Failed to generate a beatable seed. Retrying..."); - Regions::ResetAllLocations(); - logic->Reset(); - ClearProgress(); - } - retries++; - } - //All retries failed - return -1; + // All retries failed + return -1; } diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.hpp b/soh/soh/Enhancements/randomizer/3drando/fill.hpp index 106af7aab6..0e032985e0 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.hpp @@ -7,65 +7,70 @@ #include #include -//RANDOTODO merge into Logic once Logic is a class passed to logic funtions +// RANDOTODO merge into Logic once Logic is a class passed to logic funtions struct GetAccessibleLocationsStruct { - std::vector accessibleLocations; - std::vector regionPool; - //Variables for playthrough - int gsCount; - int maxGsCount; - std::vector buyIgnores; + std::vector accessibleLocations; + std::vector regionPool; + // Variables for playthrough + int gsCount; + int maxGsCount; + std::vector buyIgnores; - //Variables for search - std::vector newItemLocations; - bool logicUpdated; - bool resetSphere; + // Variables for search + std::vector newItemLocations; + bool logicUpdated; + bool resetSphere; - //Variables For Validating Entrences - bool haveTimeAccess; - bool foundTempleOfTime; - bool validatedStartingRegion; - bool sphereZeroComplete; - bool timePassChildDay; - bool timePassChildNight; - bool timePassAdultDay; - bool timePassAdultNight; + // Variables For Validating Entrences + bool haveTimeAccess; + bool foundTempleOfTime; + bool validatedStartingRegion; + bool sphereZeroComplete; + bool timePassChildDay; + bool timePassChildNight; + bool timePassAdultDay; + bool timePassAdultNight; - std::vector itemSphere; - std::list entranceSphere; + std::vector itemSphere; + std::list entranceSphere; - GetAccessibleLocationsStruct(int _maxGsCount){ - regionPool = {RR_ROOT}; - gsCount = 0; - maxGsCount = _maxGsCount; - logicUpdated = false; - resetSphere = false; - } + bool calculatingAvailableChecks = false; - void InitLoop(){ - logicUpdated = false; - for (Rando::ItemLocation* location : newItemLocations) { - location->ApplyPlacedItemEffect(); + GetAccessibleLocationsStruct(int _maxGsCount) { + regionPool = { RR_ROOT }; + gsCount = 0; + maxGsCount = _maxGsCount; + logicUpdated = false; + resetSphere = false; + } + + void InitLoop() { + logicUpdated = false; + for (Rando::ItemLocation* location : newItemLocations) { + location->ApplyPlacedItemEffect(); + } + newItemLocations.clear(); + itemSphere.clear(); + entranceSphere.clear(); } - newItemLocations.clear(); - itemSphere.clear(); - entranceSphere.clear(); - } }; void ClearProgress(); void VanillaFill(); int Fill(); +void SetAreas(); std::vector GetEmptyLocations(std::vector allowedLocations); -void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, +void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, bool stopOnBeatable = false, bool addToPlaythrough = false); -std::vector ReachabilitySearch(const std::vector& allowedLocations, RandomizerGet ignore=RG_NONE); +std::vector ReachabilitySearch(const std::vector& allowedLocations, + RandomizerGet ignore = RG_NONE, bool calculatingAvailableChecks = false, + RandomizerRegion startingRegion = RR_ROOT); void GeneratePlaythrough(); -bool CheckBeatable(RandomizerGet ignore=RG_NONE); +bool CheckBeatable(RandomizerGet ignore = RG_NONE); -void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAccess); \ No newline at end of file +void ValidateEntrances(bool checkOtherEntranceAccess); diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index 3081d48630..2d597bc955 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -9,7 +9,7 @@ using namespace std::literals::string_literals; // Big thanks to Lioncache, Gabyelnuevo, Danius88, and Charade for their translations! -// Text is {english, french, spanish} +// Text is {english, german, french} // there are special characters that are read for certain in game commands: // ^ is a box break @@ -19,50 +19,55 @@ using namespace std::literals::string_literals; // - OoT Randomizer // '[[d]]' indicates a number will be placed there, numbers in [[]] will be replaced by other text in hints +// '€' at the end of an item name indicates that it's plural. +// '|' separates singular and plural form |singular|plural|. + namespace Rando { void StaticData::HintTable_Init() { + // clang-format off /*-------------------------- | GENERAL TEXT | ---------------------------*/ hintTextTable[RHT_NONE] = HintText(CustomMessage("No Hint", "Kein Hinweis", "Pas d'Indice" )); hintTextTable[RHT_WAY_OF_THE_HERO] = HintText(CustomMessage( "They say that #[[1]]# is on #the way of the hero#.", - "Man erzählt sich, daß #[[1]]# auf #dem Weg des Helden# sei.", + /*german*/ "Man erzählt sich, daß #[[1]]# #der Weg des Helden# verlaufe.", /*french*/ "Selon moi, #[[1]]# est sur #la voie du héros#.", {QM_RED, QM_LBLUE})); // /*spanish*/ "Según dicen, #[[1]]# conduce a la senda del héroe." hintTextTable[RHT_FOOLISH] = HintText(CustomMessage( "They say that plundering #[[1]]# is #a foolish choice#.", - "Man erzählt sich, daß das Plündern von #[[1]]# #eine törichte Entscheidung# sei.", - /*french*/ "Selon moi, explorer #[[1]]# est #futile#.", {QM_RED, QM_PINK})); - // /*spanish*/ "Según dicen, inspeccionar #[[1]]# #no es una sabia decisión#." + /*german*/ "Man erzählt sich, daß es #eine törichte Entscheidung# sei #[[1]]# Schätze zu plündern.", + /*french*/ "Selon moi, explorer #[[1]]# est #futile#.", {QM_RED, QM_PINK})); + // /*spanish*/ "Según dicen, inspeccionar #[[1]]# #no es una sabia decisión#." hintTextTable[RHT_CAN_BE_FOUND_AT] = HintText(CustomMessage( "They say that #[[1]]# can be found at #[[2]]#.", - "Man erzählt sich, daß #[[1]]# bei #[[2]]# gefunden werden könne.", - /*french*/ "Selon moi, #[[1]]# se trouve dans #[[2]]#.", {QM_GREEN, QM_RED})); - // /*spanish*/ "Según dicen, #[[1]]# aguarda en #[[2]]#." + /*german*/ "Man erzählt sich, daß #[[1]]# #[[2]]# zu finden |sei|seien|.", + /*french*/ "Selon moi, #[[1]]# se trouve dans #[[2]]#.", {QM_GREEN, QM_RED})); + // /*spanish*/ "Según dicen, #[[1]]# aguarda en #[[2]]#." hintTextTable[RHT_HOARDS] = HintText(CustomMessage( "They say that #[[2]]# hoards #[[1]]#.", - "Man erzählt sich, daß #[[2]]# #[[1]]# horte.", + /*german*/ "Man erzählt sich, daß #[[2]]# #[[1]]# |horte|horten|.", /*french*/ "Selon moi, #[[2]]# recèle #[[1]]#.", {QM_RED, QM_GREEN})); - // /*spanish*/ "Según dicen, #[[2]]# acapara #[[1]]#." + // /*spanish*/ "Según dicen, #[[2]]# acapara #[[1]]#." + // clang-format on HintTable_Init_Item(); HintTable_Init_Exclude_Overworld(); HintTable_Init_Exclude_Dungeon(); - + // clang-format off /*-------------------------- | SOMETIMES HINT TEXT | ---------------------------*/ hintTextTable[RHT_KF_LINKS_HOUSE_COW] = HintText(CustomMessage("They say that #Malon's obstacle course# leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Malons Hinderniskurs# zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß das Erzielen eines neuen Rekordes bei #Malons Hindernisparcours# #[[1]]# gewähre.", /*french*/ "Selon moi, la #course à obstacle de Malon# amène à #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/la #carrera de obstáculos de Malon# brinda #[[1]]#. {}, {CustomMessage("They say that the #bovine bounty of a horseback hustle# gifts #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #bovine Schatz einer Pferdehast# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der #bovine Schatz einer Pferdehast# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le cadeau #qui découle d'une réussite équestre# est #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #recompensa bovina de un paseo a caballo# brinda #[[1]]#. @@ -72,15 +77,15 @@ void StaticData::HintTable_Init() { // /*spanish*/exterminar #100 skulltulas doradas# revela #[[1]]#. {}, {CustomMessage("They say that #100 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #100 Insektenplaketten# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß die Belohnung für #100 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #100 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#100 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #100 spider souls# yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß #100 Spinnenseelen# #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß #100 Spinnenseelen# #[[1]]# einbrächten.", /*french*/ "Selon moi, #100 âmes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#100 almas de araña# otorgan #[[1]]#. CustomMessage("They say that #100 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #100 goldhaltige Arachniden# zu #[[1]]# führen würde.", + /*german*/ "Man erzählt sich, daß #100 goldhaltige Arachniden# #[[1]]# gewähren.", /*french*/ "Selon moi, #100 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#100 arácnidos auríferos# otorgan #[[1]]#. @@ -90,7 +95,7 @@ void StaticData::HintTable_Init() { // /*spanish*/la #Ocarina del Tiempo# enseña #[[1]]#. hintTextTable[RHT_SONG_FROM_ROYAL_FAMILYS_TOMB] = HintText(CustomMessage("They say that #ReDead in the Composers' Grave# guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Zombies im Grab des Komponisten# #[[1]]# bewache.", + /*german*/ "Man erzählt sich, daß #Remorts im Grab des Komponisten# #[[1]]# bewachen.", /*french*/ "Selon moi, les #Éffrois du tombeau des compositeurs# protègent #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/los #ReDeads del Panteón Real# guardan #[[1]]#. @@ -105,17 +110,17 @@ void StaticData::HintTable_Init() { // /*spanish*/Sheik espera en el #momumento del tiempo# para enseñar #[[1]]#. hintTextTable[RHT_SHEIK_IN_CRATER] = HintText(CustomMessage("They say that the #crater's melody# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Melodie eines Kraters# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß die #Melodie des Kraters# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, Sheik confiera, #entouré de lave#, #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/la #melodía del cráter# otorga #[[1]]#. hintTextTable[RHT_SHEIK_IN_ICE_CAVERN] = HintText(CustomMessage("They say that the #frozen cavern# echoes with #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #gefrorene Kaverne# mit #[[1]]# echoe.", + /*german*/ "Man erzählt sich, daß die #gefrorene Kaverne# #[[1]]# ertönen lasse.", /*french*/ "Selon moi, Sheik confiera, #dans une caverne enneigée#, #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/en la #caverna de hielo# retumban los ecos de #[[1]]#. hintTextTable[RHT_SHEIK_IN_KAKARIKO] = HintText(CustomMessage("They say that a #ravaged village# mourns with #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #verwüstetes Dorf# mit #[[1]]# trauere.", + /*german*/ "Man erzählt sich, daß ein #verwüstetes Dorf# um #[[1]]# trauere.", /*french*/ "Selon moi, Sheik confirera, #au coeur d'un village ravagé#, #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/un #arrasado pueblo# llora #[[1]]#. @@ -125,12 +130,12 @@ void StaticData::HintTable_Init() { // /*spanish*/el héroe que se adentre #más allá del desierto# aprenderá #[[1]]#. hintTextTable[RHT_MARKET_10_BIG_POES] = HintText(CustomMessage("They say that catching #Big Poes# leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß das Fangen #großer Irrlichter# zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß die Belohnung für das Fangen von #Nachtschwärmern# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #d'attraper des Àmes# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/hacerte con #Grandes Poes# conduce a #[[1]]#. {}, {CustomMessage("They say that #ghost hunters# will be rewarded with #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Geisterjäger# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß die Belohnung für #Geisterjäger# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #les chasseurs de fantômes# sont récompensés avec #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/los #cazafantasmas# son premiados con #[[1]]#. @@ -145,12 +150,12 @@ void StaticData::HintTable_Init() { // /*spanish*/la #máscara de la verdad# premia #[[1]]#. {}, {CustomMessage("They say that showing a #truthful eye to the crowd# rewards #[[1]]#.", - /*german*/ "Man erzählt sich, daß das Zeigen eines #wahrhaftigen Auges zu der Menge# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß der #Menge ein wahrhaftiges Auge# zu zeigen #[[1]]# einbrächte.", /*french*/ "Selon moi, montrer #l'oeil de vérité à la foule# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#mostrarle el ojo verdadero# a una multitud brinda #[[1]]#. hintTextTable[RHT_HF_OCARINA_OF_TIME_ITEM] = HintText(CustomMessage("They say that the #treasure thrown by Princess Zelda# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #von Prinzessin Zelda geworfene Schatz# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der #von Prinzessin Zelda geworfene Schatz# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le trésor #laissé par la princesse# est #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/el #tesoro arrojado por la Princesa Zelda# se trata de #[[1]]#. @@ -175,7 +180,7 @@ void StaticData::HintTable_Init() { // /*spanish*/exterminar #50 skulltulas doradas# revela #[[1]]#. {}, {CustomMessage("They say that #50 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #50 Insektenplaketten# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß die Belohnung für #50 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #50 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#50 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #50 spider souls# yields #[[1]]#.", @@ -183,7 +188,7 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #50 âmes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#50 almas de araña# otorgan #[[1]]#. CustomMessage("They say that #50 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #50 goldhaltige Arachniden# zu #[[1]]# führen würde.", + /*german*/ "Man erzählt sich, daß #50 goldhaltige Arachniden# #[[1]]# gewähren.", /*french*/ "Selon moi, #50 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#50 arácnidos auríferos# otorgan #[[1]]#. @@ -193,7 +198,7 @@ void StaticData::HintTable_Init() { // /*spanish*/exterminar #40 skulltulas doradas# revela #[[1]]#. {}, {CustomMessage("They say that #40 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #40 Insektenplaketten# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß die Belohnung für #40 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #40 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#40 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #40 spider souls# yields #[[1]]#.", @@ -201,7 +206,7 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #40 âmes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#40 almas de araña# otorgan #[[1]]#. CustomMessage("They say that #40 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #40 goldhaltige Arachniden# zu #[[1]]# führen würde.", + /*german*/ "Man erzählt sich, daß #40 goldhaltige Arachniden# #[[1]]# gewähren.", /*french*/ "Selon moi, #40 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#40 arácnidos auríferos# otorgan #[[1]]#. @@ -211,7 +216,7 @@ void StaticData::HintTable_Init() { // /*spanish*/exterminar #30 skulltulas doradas# revela #[[1]]#. {}, {CustomMessage("They say that #30 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #30 Insektenplaketten# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß die Belohnung für #30 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #30 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#30 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #30 spider souls# yields #[[1]]#.", @@ -219,7 +224,7 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #30 âmes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#30 almas de araña# otorgan #[[1]]#. CustomMessage("They say that #30 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #30 goldhaltige Arachniden# zu #[[1]]# führen würde.", + /*german*/ "Man erzählt sich, daß #30 goldhaltige Arachniden# #[[1]]# gewähren.", /*french*/ "Selon moi, #30 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#30 arácnidos auríferos# otorgan #[[1]]#. @@ -229,7 +234,7 @@ void StaticData::HintTable_Init() { // /*spanish*/exterminar #20 skulltulas doradas# revela #[[1]]#. {}, {CustomMessage("They say that #20 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #20 Insektenplaketten# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß die Belohnung für #20 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #20 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#20 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #20 spider souls# yields #[[1]]#.", @@ -237,21 +242,21 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #20 âmes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#20 almas de araña# otorgan #[[1]]#. CustomMessage("They say that #20 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #20 goldhaltige Arachniden# zu #[[1]]# führen würde.", + /*german*/ "Man erzählt sich, daß #20 goldhaltige Arachniden# #[[1]]# gewähren.", /*french*/ "Selon moi, #20 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#20 arácnidos auríferos# otorgan #[[1]]#. hintTextTable[RHT_KAK_ANJU_AS_CHILD] = HintText(CustomMessage("They say that #collecting cuccos# rewards #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Sammeln von Hühnern# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß das #Sammeln von Hühnern# #[[1]]# einbrächte.", /*french*/ "Selon moi, #rapporter les Cocottes# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#hacerte con todos los cucos# premia #[[1]]#. {}, {CustomMessage("They say that #wrangling roosters# rewards #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Rangeln mit Hähnen# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß das #Rangeln mit Hähnen# #[[1]]# einbrächte.", /*french*/ "Selon moi, #plumer des poulets# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#atrapar a las gallinas# premia #[[1]]#. CustomMessage("They say that #chucking chickens# gifts #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Werfen von Hühnchen# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß das #Werfen von Hühnchen# #[[1]]# einbrächte.", /*french*/ "Selon moi, #lancer des poulets# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#reunir a unos emplumados# premia #[[1]]#. @@ -261,12 +266,12 @@ void StaticData::HintTable_Init() { // /*spanish*/un #alegre cuco# en la madurez otorga #[[1]]#. hintTextTable[RHT_KAK_TRADE_ODD_MUSHROOM] = HintText(CustomMessage("They say that the #potion shop lady# entrusts #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Dame des Trankladens# #[[1]]# anvertraue.", + /*german*/ "Man erzählt sich, daß die #Dame des Hexenladens# #[[1]]# anvertraue.", /*french*/ "Selon moi, la #gribiche du magasin de potion# confie #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/la #señora de la tienda de pociones# otorga #[[1]]#. hintTextTable[RHT_GC_DARUNIAS_JOY] = HintText(CustomMessage("They say that #Darunia's dance# leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Darunias Tanz# zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß #Darunias Tanz# #[[1]]# gewähre.", /*french*/ "Selon moi, #la dance de Darunia# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#el baile de Darunia# conduce a #[[1]]#. {}, @@ -306,7 +311,7 @@ void StaticData::HintTable_Init() { // /*spanish*/el #científico del Lago Hylia# otorga con prisa #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_REWARD] = HintText(CustomMessage("They say that the #treasure chest game# grants #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Schatzkisten-Poker# #[[1]]# gewähre.", + /*german*/ "Man erzählt sich, daß die #Truhenlotterie# #[[1]]# gewähre.", /*french*/ "Selon moi, la #Chasse-aux-Trésors# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#el Cofre del Tesoro# premia #[[1]]#. {}, @@ -315,12 +320,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#los juegos de azar# revelan #[[1]]#. CustomMessage("They say that there is a #1/32 chance# to win #[[1]]#.", - /*german*/ "Man erzählt sich, daß es eine #Chance von 1 zu 32# gäbe, um #[[1]]# zu gewinnen.", + /*german*/ "Man erzählt sich, daß es eine #Chance von 1 zu 32# gäbe um #[[1]]# zu gewinnen.", /*french*/ "Selon moi, être #le gagnant parmi 32# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/hay una #probabilidad de 1/32# de ganar #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_1] = HintText(CustomMessage("They say that the #first locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #erste verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #erste verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #première salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la primera sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -329,12 +334,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier une fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar solo una vez# revelará #[[1]]#. CustomMessage("They say that the #first or second game chest# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #erste oder zweite Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #erste oder zweite Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #premier ou deuxième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el primer o segundo cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_2] = HintText(CustomMessage("They say that the #second locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #zweite verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #zweite verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #deuxième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la segunda sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -343,12 +348,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier deux fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar dos veces# revelará #[[1]]#. CustomMessage("They say that the #third or fourth game chest# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #dritte oder vierte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #dritte oder vierte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #troisième ou quatrième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el tercer o cuarto cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_3] = HintText(CustomMessage("They say that the #third locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #dritte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #dritte verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #troisième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la tercera sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -357,12 +362,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier trois fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar tres veces# revelará #[[1]]#. CustomMessage("They say that the #fifth or sixth game chest# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #fünfte oder sechste Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #fünfte oder sechste Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #cinquième ou sixième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el quinto o sexto cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_4] = HintText(CustomMessage("They say that the #fourth locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #vierte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #vierte verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #quatrième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la cuarta sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -371,12 +376,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier quatre fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar cuatro veces# revelará #[[1]]#. CustomMessage("They say that the #seventh or eighth game chest# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #siebente oder achte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #siebente oder achte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #septième ou huitième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el séptimo u octavo cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_5] = HintText(CustomMessage("They say that the #fifth locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #fünfte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #fünfte verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #cinquième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la quinta sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -385,12 +390,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier cinq fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar cinco veces# revelará #[[1]]#. CustomMessage("They say that the #ninth or tenth game chest# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #neunte oder zehnte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #neunte oder zehnte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #neuvième ou dixième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el noveno o décimo cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_KEY_1] = HintText(CustomMessage("They say that the #first locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #erste verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #erste verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #première salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la primera sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -399,12 +404,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier une fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar solo una vez# revelará #[[1]]#. CustomMessage("They say that the #first or second game chest# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #erste oder zweite Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #erste oder zweite Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #premier ou deuxième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el primer o segundo cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_KEY_2] = HintText(CustomMessage("They say that the #second locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #zweite verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #zweite verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #deuxième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la segunda sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -413,12 +418,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier deux fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar dos veces# revelará #[[1]]#. CustomMessage("They say that the #third or fourth game chest# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #dritte oder vierte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #dritte oder vierte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #troisième ou quatrième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el tercer o cuarto cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_KEY_3] = HintText(CustomMessage("They say that the #third locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #dritte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #dritte verschloßene Raum# in der Truhenlotterie, #[[1]]# enthielte.", /*french*/ "Selon moi, la #troisième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la tercera sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -427,12 +432,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier trois fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar tres veces# revelará #[[1]]#. CustomMessage("They say that the #fifth or sixth game chest# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #fünfte oder sechste Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #fünfte oder sechste Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #cinquième ou sixième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el quinto o sexto cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_KEY_4] = HintText(CustomMessage("They say that the #fourth locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #vierte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #vierte verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #quatrième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la cuarta sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -441,12 +446,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier quatre fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar cuatro veces# revelará #[[1]]#. CustomMessage("They say that the #seventh or eighth game chest# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #siebente oder achte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #siebente oder achte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #septième ou huitième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el séptimo u octavo cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_KEY_5] = HintText(CustomMessage("They say that the #fifth locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #fünfte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #fünfte verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #cinquième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la quinta sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -455,12 +460,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier cinq fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar cinco veces# revelará #[[1]]#. CustomMessage("They say that the #ninth or tenth game chest# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #neunte oder zehnte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #neunte oder zehnte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #neuvième ou dixième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el noveno o décimo cofre del azar# revela #[[1]]#. hintTextTable[RHT_GF_HBA_1500_POINTS] = HintText(CustomMessage("They say that scoring 1500 in #horseback archery# grants #[[1]]#.", - /*german*/ "Man erzählt sich, daß das Erzielen von 1500 Punkten beim #Bogenschießen zu Pferde# #[[1]]# gewähre.", + /*german*/ "Man erzählt sich, daß das Erzielen von 1.500 Punkten beim #Bogenschießen zu Pferde# #[[1]]# gewähre.", /*french*/ "Selon moi, obtenir 1500 points dans l'#archerie équestre# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/conseguir 1500 puntos en el #tiro con arco a caballo# premia #[[1]]#. {}, @@ -470,17 +475,17 @@ void StaticData::HintTable_Init() { // /*spanish*/dominar el #tiro con arco a caballo# premia con #[[1]]#. hintTextTable[RHT_GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = HintText(CustomMessage("They say that playing #Sun's Song# in a grave spawns #[[1]]#.", - /*german*/ "Man erzählt sich, daß das Spielen der #Hymne der Sonne# in einem Grab, #[[1]]# erscheinen ließe.", + /*german*/ "Man erzählt sich, daß das Spielen der #Hymne der Sonne# in einem Grab #[[1]]# erscheinen ließe.", /*french*/ "Selon moi, jouer le #chant du soleil# dans un tombeau donne #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/#tocar la Canción del Sol# en una cripta conduce a #[[1]]#. hintTextTable[RHT_GC_MAZE_LEFT_CHEST] = HintText(CustomMessage("They say that in #Goron City# the hammer unlocks #[[1]]#.", - /*german*/ "Man erzählt sich, daß der Hammer in #Goronia# #[[1]]# freilege.", + /*german*/ "Man erzählt sich, daß der Stahlhammer in #Goronia# #[[1]]# freilege.", /*french*/ "Selon moi, dans le #village Goron#, le marteau donne accès à #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/en la #Ciudad Goron# el martillo desbloquea #[[1]]#. hintTextTable[RHT_GV_CHEST] = HintText(CustomMessage("They say that in #Gerudo Valley# the hammer unlocks #[[1]]#.", - /*german*/ "Man erzählt sich, daß der Hammer im #Gerudotal# #[[1]]# freilege.", + /*german*/ "Man erzählt sich, daß der Stahlhammer im #Gerudotal# #[[1]]# freilege.", /*french*/ "Selon moi, dans la #Vallée Gerudo#, le marteau donne accès à #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/en el #Valle Gerudo# el martillo desbloquea #[[1]]#. @@ -505,7 +510,7 @@ void StaticData::HintTable_Init() { // /*spanish*/una #Skulltula tras la telaraña# de una cueva otorga #[[1]]#. hintTextTable[RHT_HF_COW_GROTTO_COW] = HintText(CustomMessage("They say that a #cow behind webs# in a grotto gifts #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Kuh hinter Weben# in einer Grotte #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine #Kuh, hinter Weben# in einer Grotte, #[[1]]# hielte.", /*french*/ "Selon moi, la #vache derrière les toiles# d'une grotte donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/una #vaca tras la telaraña# de una cueva brinda #[[1]]#. {}, @@ -515,7 +520,7 @@ void StaticData::HintTable_Init() { // /*spanish*/una #vaca tras una telaraña# brinda #[[1]]#. hintTextTable[RHT_ZR_FROGS_OCARINA_GAME] = HintText(CustomMessage("They say that the final reward from the #Frogs of Zora's River# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß die letzte Belohnung der #Frösche des Zora-Flußes# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß die letzte Belohnung der #Frösche des Zora-Flußes# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la dernière récompense des #grenouilles de la Rivière Zora# est #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/la recompensa final de las #ranas del Río Zora# premia #[[1]]#. {}, @@ -538,7 +543,7 @@ void StaticData::HintTable_Init() { // /*spanish*/una Skulltula en lo #alto de las congeladas aguas# otorga #[[1]]#. hintTextTable[RHT_WASTELAND_CHEST] = HintText(CustomMessage("They say that #deep in the wasteland# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #tief im Ödland# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #tief im Ödland# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #loin dans le désert# gît #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/en lo #profundo del desierto encantado# yace #[[1]]#. @@ -548,12 +553,12 @@ void StaticData::HintTable_Init() { // /*spanish*/una #Skulltula del desierto encantado# otorga #[[1]]#. hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST] = HintText(CustomMessage("They say that #flames in the Composers' Grave# reveal #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Flammen im Grab des Komponisten# #[[1]]# enthüllen würde.", + /*german*/ "Man erzählt sich, daß die #Flammen im Grab des Komponisten# #[[1]]# enthüllen würden.", /*french*/ "Selon moi, #les flammes dans le tombeau des compositeurs# cachent #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/#las llamas del Panteón Real# revelan #[[1]]#. hintTextTable[RHT_ZF_BOTTOM_FREESTANDING_POH] = HintText(CustomMessage("They say that #under the icy waters# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #unter den eisigen Gewässern# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #unter den eisigen Gewässern# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #sous les eaux glacées# se cache #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/#bajo las congeladas aguas# yace #[[1]]#. @@ -578,7 +583,7 @@ void StaticData::HintTable_Init() { // /*spanish*/el #Rey Zora# otorga con prisa #[[1]]#. hintTextTable[RHT_DMC_DEKU_SCRUB] = HintText(CustomMessage("They say that a single #scrub in the crater# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein einzelner #Deku im Krater# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein einzelner #Deku-Händler im Krater# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo dans le cratère# vend #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/un solitario #deku del cráter# vende #[[1]]#. hintTextTable[RHT_DMC_GS_CRATE] = HintText(CustomMessage("They say that a spider under a #crate in the crater# holds #[[1]]#.", @@ -587,12 +592,12 @@ void StaticData::HintTable_Init() { // /*spanish*/una Skulltula bajo una #caja del cráter# otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST] = HintText(CustomMessage("They say that a #temporal stone within the Deku Tree# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #zeitlicher Stein innerhalb des Deku-Baums# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #zeitlicher Stein innerhalb des Deku-Baumes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #pierre temporelle dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/un #bloque temporal del Gran Árbol Deku# contiene #[[1]]#. {}, {CustomMessage("They say that a #temporal stone within a tree# contains #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #zeitlicher Stein innerhalb eines Baums# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #zeitlicher Stein innerhalb eines Baumes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #pierre bleue dans un arbre# mène à #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/un #bloque temporal de un árbol# contiene #[[1]]#. @@ -627,12 +632,12 @@ void StaticData::HintTable_Init() { // /*spanish*/unos de #stingers engullidos por cierta deidad# guardan #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM] = HintText(CustomMessage("They say that a spider surrounded by #shadows in Jabu-Jabu's Belly# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine von #Schatten in Jabu-Jabus Bauch# umgebene Spinne #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine von #Schatten umgebene Spinne in Jabu-Jabus Bauch# #[[1]]# hielte.", /*french*/ "Selon moi, la Skulltula entourée d'#ombres dans Jabu-Jabu# possède #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/una Skulltula rodeada de #sombras en la Tripa de Jabu-Jabu# otorga #[[1]]#. {}, {CustomMessage("They say that a spider surrounded by #shadows in the belly of a deity# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine von #Schatten im Bauch einer Gottheit# umgebene Spinne #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine von #Schatten umgebene Spinne im Bauche einer Gottheit#, #[[1]]# hielte.", /*french*/ "Selon moi, l'araignée entourée d'#ombres dans le ventre du gardien# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/una Skulltula rodeada de #sombras en la tripa de cierta diedad# otorga #[[1]]#. @@ -647,32 +652,32 @@ void StaticData::HintTable_Init() { // /*spanish*/una #vaca engullida por cierta deidad# brinda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_SCARECROW_CHEST] = HintText(CustomMessage("They say that #Pierre atop the Fire Temple# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Pierre auf der Spitze des Feuertempels# #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß #Pierre, an der Spitze des Feuertempels#, #[[1]]# verstecke.", /*french*/ "Selon moi, #Pierre au sommet du Temple du Feu# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#Pierre en lo alto del Templo del Fuego# esconde #[[1]]#. {}, {CustomMessage("They say that a #scarecrow atop the volcano# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Vogelscheuche auf der Spitze des Vulkans# #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß eine #Vogelscheuche, an der Spitze des Vulkans#, #[[1]]# verstecke.", /*french*/ "Selon moi, l'#épouvantail au sommet d'un volcan# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/un #espantapájaros en lo alto del volcán# esconde #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MEGATON_HAMMER_CHEST] = HintText(CustomMessage("They say that the #Flare Dancer atop the Fire Temple# guards a chest containing #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Flammenderwisch auf der Spitze des Feuertempels# eine Truhe bewache, welche #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #Flammenderwisch, an der Spitze des Feuertempels#, eine Truhe bewache welche #[[1]]# enthielte.", /*french*/ "Selon moi, le #Danse-Flamme au sommet du Temple du Feu# protège #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/el #Bailaguego en lo alto del Templo del Fuego# otorga #[[1]]#. {}, {CustomMessage("They say that the #Flare Dancer atop the volcano# guards a chest containing #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Flammenderwisch auf der Spitze des Vulkans# eine Truhe bewache, welche #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #Flammenderwisch, an der Spitze des Vulkans#, eine Truhe bewache welche #[[1]]# enthielte.", /*french*/ "Selon moi, le #danseur au sommet du volcan# protège #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #Bailafuego en lo alto del volcán# otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_CHEST_ON_FIRE] = HintText(CustomMessage("They say that the #Flare Dancer atop the Fire Temple# guards a chest containing #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Flammenderwisch auf der Spitze des Feuertempels# eine Truhe bewache, welche #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #Flammenderwisch, an der Spitze des Feuertempels#, eine Truhe bewache welche #[[1]]# enthielte.", /*french*/ "Selon moi, le #Danse-Flamme au sommet du Temple du Feu# protège #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/el #Bailafuego en lo alto del Templo del Fuego# otorga #[[1]]#. {}, {CustomMessage("They say that the #Flare Dancer atop the volcano# guards a chest containing #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Flammenderwisch auf der Spitze des Vulkans# eine Truhe bewache, welche #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß der #Flammenderwisch, an der Spitze des Vulkans#, eine Truhe bewache welche #[[1]]# enthielte.", /*french*/ "Selon moi, le #danseur au sommet du volcan# protège #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #Bailafuego en lo alto del volcán# otorga #[[1]]#. @@ -687,22 +692,22 @@ void StaticData::HintTable_Init() { // /*spanish*/una #Skulltula bajo el bloque de un volcán# otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_RIVER_CHEST] = HintText(CustomMessage("They say that beyond the #river in the Water Temple# waits #[[1]]#.", - /*german*/ "Man erzählt sich, daß jenseits des #Flußes im Wassertempel# #[[1]]# warte.", + /*german*/ "Man erzählt sich, daß jenseits des #Flußes im Wassertempel# #[[1]]# |warte|warten|.", /*french*/ "Selon moi, au delà de #la rivière dans le Temple de l'Eau# se cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/tras el #río del Templo del Agua# yace #[[1]]#. {}, {CustomMessage("They say that beyond the #river under the lake# waits #[[1]]#.", - /*german*/ "Man erzählt sich, daß jenseits des #Flußes unter dem See# #[[1]]# warte.", + /*german*/ "Man erzählt sich, daß jenseits des #Flußes unterhalb des Sees# #[[1]]# |warte|warten|.", /*french*/ "Selon moi, au delà de #la rivière sous le lac# se cache #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/tras el #río bajo el lago# yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that dodging #rolling boulders in the Water Temple# leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß das Ausweichen von #rollenden Felsen im Wassertempel# zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß das Ausweichen von #rollenden Felsen im Wassertempel# #[[1]]# einbrächte.", /*french*/ "Selon moi, éviter des #rochers roulants dans le Temple de l'Eau# mène à #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/esquivar #rocas rondantes del Templo del Agua# conduce a #[[1]]#. {}, {CustomMessage("They say that dodging #rolling boulders under the lake# leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß das Ausweichen von #rollenden Felsen unter einem See# zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß das Ausweichen von #rollenden Felsen unterhalb eines Sees# #[[1]]# einbrächte.", /*french*/ "Selon moi, éviter des #rochers roulants sous le lac# mène à #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/esquivar #rocas rodantes bajo el lago# conduce a #[[1]]#. @@ -712,27 +717,27 @@ void StaticData::HintTable_Init() { // /*spanish*/una Skulltula tras #una valla del Templo del Agua# otorga #[[1]]#. {}, {CustomMessage("They say that a spider behind a #gate under the lake# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine Spinne hinter einem #Tor unter dem See# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine Spinne hinter einem #Tor unterhalb des Sees# #[[1]]# hielte.", /*french*/ "Selon moi, l'araignée derrière une #barrière sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/una Skulltula tras #una valla bajo el lago# otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_FREESTANDING_KEY] = HintText(CustomMessage("They say that hidden in a #box in the Water Temple# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß versteckt in einem #Kasten im Wassertempel# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß versteckt in einem #Kasten im Wassertempel# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, dans une #boîte dans le Temple de l'Eau# gît #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/en una #caja del Templo del Agua# yace #[[1]]#. {}, {CustomMessage("They say that hidden in a #box under the lake# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß versteckt in einem #Kasten unter dem See# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß versteckt in einem #Kasten unterhalb des Sees# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, dans une #boîte sous le lac# gît #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/en una #caja bajo el lago# yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA] = HintText(CustomMessage("They say that the #locked spider in the Water Temple# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #eingeschlossene Spinne im Wassertempel# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine #eingeschloßene Spinne im Wassertempel# #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula emprisonnée dans le Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/la #Skulltula enjaulada del Templo del Agua# otorga #[[1]]#. {}, {CustomMessage("They say that the #locked spider under the lake# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #eingeschlossene Spinne unter dem See# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine #eingeschloßene Spinne unterhalb des Sees# #[[1]]# hielte.", /*french*/ "Selon moi, l'#araignée emprisonnée sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #Skulltula enjaulada bajo el lago# otorga #[[1]]#. @@ -742,7 +747,7 @@ void StaticData::HintTable_Init() { // /*spanish*/una Skulltula tras una #valla del Templo del Agua# #[[1]]#. {}, {CustomMessage("They say that a spider behind a #gate under the lake# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine Spinne hinter einem #Tor unter dem See# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine Spinne hinter einem #Tor unterhalb des Sees# #[[1]]# hielte.", /*french*/ "Selon moi, l'#araignée derrière une barrière sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/una Skulltula tras una #valla bajo el lago# otorga #[[1]]#. @@ -757,12 +762,12 @@ void StaticData::HintTable_Init() { // /*spanish*/aquellos que busquen las #rupias plateadas sumergidas# encontrarán #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST] = HintText(CustomMessage("They say that the final prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der letzte Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der letzte Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la récompense ultime de #l'épreuve des voleurs# est #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/la recompensa final de la #instrucción de las bandida# brinda #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST] = HintText(CustomMessage("They say that the final prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der letzte Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der letzte Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la récompense ultime de #l'épreuve des voleurs# est #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/el premio final de la #instrucción de las bandidas# brinda #[[1]]#. @@ -776,12 +781,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, la #terreur du Puits# cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/en las #profundidades del pozo# se esconde #[[1]]#. CustomMessage("They say that a #nether dweller in the well# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Unterweltbewohner im Brunnen# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß der #Unterweltbewohner des Brunnens# #[[1]]# hielte.", /*french*/ "Selon moi, le #spectre qui réside dans le Puits# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #temido morador del pozo# concede #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the well# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Hirnsauger im Brunnen# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß der #Hirnsauger des Brunnens# #[[1]]# hielte.", /*french*/ "Selon moi, le #Poigneur dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/la #Mano Muerta del pozo# concede #[[1]]#. {}, @@ -790,22 +795,22 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, la #terreur du Puits# cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/en las #profundidades del pozo# se esconde #[[1]]#. CustomMessage("They say that a #nether dweller in the well# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Unterweltbewohner im Brunnen# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß der #Unterweltbewohner des Brunnens# #[[1]]# hielte.", /*french*/ "Selon moi, le #spectre qui réside dans le Puits# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #temido morador del pozo# concede #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST] = HintText(CustomMessage("They say that upon the #Colossus's right hand# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf der #rechten Hand des Koloßes# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß auf der #rechten Hand des Kolosses# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, sur la #main droite du colosse# repose #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/en la #mano derecha del Coloso# yace #[[1]]#. {}, {CustomMessage("They say that the treasure #sought by Nabooru# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #von Naboru gesuchte Schatz# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der #von Naboru gesuchte Schatz# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le trésor que #recherche Nabooru# est #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #ansiado tesoro de Nabooru# brinda #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST] = HintText(CustomMessage("They say that upon the #Colossus's left hand# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf der #linken Hand des Koloßes# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß auf der #linken Hand des Kolosses# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, sur la #main gauche du colosse# repose #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/en la #mano izquierda del Coloso# yace #[[1]]#. @@ -815,27 +820,27 @@ void StaticData::HintTable_Init() { // /*spanish*/una #paradoja temporal del Coloso# conduce a #[[1]]#. {}, {CustomMessage("They say that a #temporal paradox in the Colossus# yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #zeitliches Paradox im Koloß# #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß ein #zeitliches Paradox im Koloss# #[[1]]# einbrächte.", /*french*/ "Selon moi, un #paradoxe temporel dans le colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/una #paradoja temporal del Coloso# conduce a #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST] = HintText(CustomMessage("They say that a #symphony in the Spirit Temple# yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Sinfonie im Geistertempel# #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß eine #Symphonie im Geistertempel# #[[1]]# einbrächte.", /*french*/ "Selon moi, les #cinq chansons du Temple de l'Esprit# révèlent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/una #sinfonía del Coloso# conduce a #[[1]]#. {}, {CustomMessage("They say that a #symphony in the Colossus# yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Sinfonie im Koloß# #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß eine #Symphonie im Koloss# #[[1]]# einbrächte.", /*french*/ "Selon moi, la #symphonie du colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/una #sinfonía del Coloso# conduce a #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM] = HintText(CustomMessage("They say that a #spider's symphony in the Spirit Temple# yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinnensinfonie im Geistertempel# #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß eine #Spinnensymphonie im Geistertempel# #[[1]]# einbrächte.", /*french*/ "Selon moi, la #mélodie de la Skulltula du Temple de l'Esprit# révèle #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/la #Skulltula de la sinfonía del Coloso# otorga #[[1]]#. {}, {CustomMessage("They say that a #spider's symphony in the Colossus# yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinnensinfonie im Koloß# #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß eine #Spinnensymphonie im Koloss# #[[1]]# einbrächte.", /*french*/ "Selon moi, la #mélodie de l'araignée du colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #Skulltula de la sinfonía del Coloso# otorga #[[1]]#. @@ -859,12 +864,12 @@ void StaticData::HintTable_Init() { // /*spanish*/levantar una #roca del desierto# revela #[[1]]#. hintTextTable[RHT_GV_GROTTO_LEDGE_TO_GV_OCTOROK_GROTTO] = HintText(CustomMessage("They say that a rock on #a ledge in the valley# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein Felsen auf #einem Vorsprung im Tal# #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß ein Felsen auf #einem Vorsprung des Tals# #[[1]]# verstecke.", /*french*/ "Selon moi, soulever une #roche dans la vallée# révèle #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/levantar una #roca al borde del valle# esconde #[[1]]#. hintTextTable[RHT_GC_GROTTO_PLATFORM_TO_GC_GROTTO] = HintText(CustomMessage("They say that a #pool of lava# in Goron City blocks the way to #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Lavateich# in Goronia den Weg zu #[[1]]# blockiere.", + /*german*/ "Man erzählt sich, daß ein #Lavateich# in Goronia #[[1]]# blockiere.", /*french*/ "Selon moi, l'#étang de lave# dans le village Goron renferme #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/un #estanque de lava# en la Ciudad Goron bloquea el paso a #[[1]]#. @@ -909,27 +914,27 @@ void StaticData::HintTable_Init() { // /*spanish*/una #tienda de campaña del valle# cubre #[[1]]#. hintTextTable[RHT_GRAVEYARD_WARP_PAD_REGION_TO_SHADOW_TEMPLE_ENTRYWAY] = HintText(CustomMessage("They say that at the #back of the Graveyard#, there is #[[1]]#.", - /*german*/ "Man erzählt sich, daß sich #hinter dem Friedhof, #[[1]]# befände.", + /*german*/ "Man erzählt sich, daß sich #hinter dem Friedhof# #[[1]]# |befände|befänden|.", /*french*/ "Selon moi, #derrière le Cimetière# gît #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/en la #parte trasera del cementerio# se halla #[[1]]#. hintTextTable[RHT_LAKE_HYLIA_TO_WATER_TEMPLE_LOBBY] = HintText(CustomMessage("They say that deep #under a vast lake#, one can find #[[1]]#.", - /*german*/ "Man erzählt sich, daß man tief #unter einem gewaltigen See#, #[[1]]# finden könne.", + /*german*/ "Man erzählt sich, daß man tief #unterhalb eines gewaltigen Sees# #[[1]]# finden könne.", /*french*/ "Selon moi, #sous le lac# gît #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/en las #profundidades de un lago inmenso# se halla #[[1]]#. hintTextTable[RHT_GERUDO_FORTRESS_TO_GERUDO_TRAINING_GROUND_LOBBY] = HintText(CustomMessage("They say that paying a #fee to the Gerudos# grants access to #[[1]]#.", - /*german*/ "Man erzählt sich, daß das Bezahlen einer #Gebühr an die Gerudos#, Zugang zu #[[1]]# gewähre.", + /*german*/ "Man erzählt sich, daß das Bezahlen einer #Gebühr an die Gerudos# #[[1]]# gewähre.", /*french*/ "Selon moi, l'#entrée payante des Gerudo# donne accès à #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/pagarle una #tasa a las gerudo# da acceso a #[[1]]#. hintTextTable[RHT_ZORAS_FOUNTAIN_TO_JABU_JABUS_BELLY_BEGINNING] = HintText(CustomMessage("They say that inside #Jabu-Jabu#, one can find #[[1]]#.", - /*german*/ "Man erzählt sich, daß man #in Jabu-Jabu#, #[[1]]# finden könne.", + /*german*/ "Man erzählt sich, daß man #in Jabu-Jabu# #[[1]]# finden könne.", /*french*/ "Selon moi, #dans Jabu-Jabu# se trouve #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/dentro de #Jabu-Jabu# se halla #[[1]]#. hintTextTable[RHT_KAKARIKO_VILLAGE_TO_BOTTOM_OF_THE_WELL] = HintText(CustomMessage("They say that a #village well# leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Dorfbrunnen# zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß man #in einem Dorfbrunnen# #[[1]]# finden könne.", /*french*/ "Selon moi, dans le fond du #Puits du village# gît #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/el #pozo de un pueblo# conduce a #[[1]]#. @@ -938,72 +943,72 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_LINKS_POCKET] = HintText(CustomMessage("Link's Pocket", - /*german*/ "Links Taschen", + /*german*/ "in Links Tasche", /*french*/ "les Poches de @")); // /*spanish*/el bolsillo de @ hintTextTable[RHT_KOKIRI_FOREST] = HintText(CustomMessage("Kokiri Forest", - /*german*/ "Kokiri-Wald", + /*german*/ "im Kokiri-Wald", /*french*/ "la Forêt Kokiri")); // /*spanish*/el Bosque Kokiri hintTextTable[RHT_THE_LOST_WOODS] = HintText(CustomMessage("the Lost Woods", - /*german*/ "Verlorene Wälder", + /*german*/ "in den Verlorenen Wäldern", /*french*/ "les Bois Perdus")); // /*spanish*/el Bosque Perdido - + hintTextTable[RHT_SACRED_FOREST_MEADOW] = HintText(CustomMessage("Sacred Forest Meadow", - /*german*/ "Heilige Lichtung", + /*german*/ "auf der Heiligen Lichtung", /*french*/ "le Bosquet Sacré")); // /*spanish*/la pradera sagrada del bosque hintTextTable[RHT_HYRULE_FIELD] = HintText(CustomMessage("Hyrule Field", - /*german*/ "Hylianische Steppe", + /*german*/ "in der Hylianischen Steppe", /*french*/ "la Plaine d'Hyrule")); // /*spanish*/la Llanura de Hyrule hintTextTable[RHT_LAKE_HYLIA] = HintText(CustomMessage("Lake Hylia", - /*german*/ "Hylia-See", + /*german*/ "am Hylia-See", /*french*/ "le Lac Hylia")); // /*spanish*/el Lago Hylia hintTextTable[RHT_GERUDO_VALLEY] = HintText(CustomMessage("Gerudo Valley", - /*german*/ "Gerudotal", + /*german*/ "im Gerudotal", /*french*/ "la Vallée Gerudo")); // /*spanish*/el Valle Gerudo hintTextTable[RHT_GERUDO_FORTRESS] = HintText(CustomMessage("Gerudo's Fortress", - /*german*/ "Gerudo-Festung", + /*german*/ "in der Gerudo-Festung", /*french*/ "le Repaire des Voleurs")); // /*spanish*/la Fortaleza Gerudo hintTextTable[RHT_HAUNTED_WASTELAND] = HintText(CustomMessage("Haunted Wasteland", - /*german*/ "Gespensterwüste", + /*german*/ "in der Gespensterwüste", /*french*/ "le Désert Hanté")); // /*spanish*/el desierto encantado hintTextTable[RHT_DESERT_COLOSSUS] = HintText(CustomMessage("Desert Colossus", - /*german*/ "Wüstenkoloß", + /*german*/ "am Wüstenkoloss", /*french*/ "le Colosse du Désert")); // /*spanish*/el Coloso del Desierto hintTextTable[RHT_THE_MARKET] = HintText(CustomMessage("the Market", - /*german*/ "Markt", + /*german*/ "auf dem Markt", /*french*/ "la Place du Marché")); // /*spanish*/la plaza del mercado hintTextTable[RHT_TEMPLE_OF_TIME] = HintText(CustomMessage("Temple of Time", - /*german*/ "Zitadelle der Zeit", + /*german*/ "in der Zitadelle der Zeit", /*french*/ "le Temple du Temps")); // /*spanish*/el Templo del Tiempo - + hintTextTable[RHT_CASTLE_GROUNDS] = HintText(CustomMessage("the Castle Grounds", - /*german*/ "Anlage von Schloß Hyrule", + /*german*/ "auf dem Schloßgelände", /*french*/ "le Château d'Hyrule")); // /*spanish*/ - + hintTextTable[RHT_HYRULE_CASTLE] = HintText(CustomMessage("Hyrule Castle", - /*german*/ "Schloß Hyrule", + /*german*/ "in Schloß Hyrule", /*french*/ "le Château d'Hyrule")); // /*spanish*/el Castillo de Hyrule @@ -1012,53 +1017,48 @@ void StaticData::HintTable_Init() { /*french*/ "les alentours du Château de Ganon")); // /*spanish*/el exterior del Castillo de Ganon - hintTextTable[RHT_CASTLE_GROUNDS] = HintText(CustomMessage("the Castle Grounds", - /*german*/ "Anlage von Schloß Hyrule", - /*french*/ "le Château d'Hyrule")); - // /*spanish*/ - hintTextTable[RHT_KAKARIKO_VILLAGE] = HintText(CustomMessage("Kakariko Village", - /*german*/ "Kakariko", + /*german*/ "in Kakariko", /*french*/ "le Village Cocorico")); // /*spanish*/Kakariko hintTextTable[RHT_THE_GRAVEYARD] = HintText(CustomMessage("the Graveyard", - /*german*/ "Friedhof", + /*german*/ "auf dem Friedhof", /*french*/ "le Cimetière")); // /*spanish*/el cementerio hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL] = HintText(CustomMessage("Death Mountain Trail", - /*german*/ "Gebirgspfad", + /*german*/ "auf dem Gebirgspfad", /*french*/ "le Chemin du Péril")); // /*spanish*/el sendero de la Montaña de la Muerte hintTextTable[RHT_GORON_CITY] = HintText(CustomMessage("Goron City", - /*german*/ "Goronia", + /*german*/ "in Goronia", /*french*/ "le Village Goron")); // /*spanish*/la Ciudad Goron hintTextTable[RHT_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("Death Mountain Crater", - /*german*/ "Todeskrater", + /*german*/ "im Todeskrater", /*french*/ "le Cratère du Péril")); // /*spanish*/el cráter de la Montaña de la Muerte hintTextTable[RHT_ZORAS_RIVER] = HintText(CustomMessage("Zora's River", - /*german*/ "Zoras Fluß", + /*german*/ "am Zora-Fluß", /*french*/ "la Rivière Zora")); // /*spanish*/el Río Zora hintTextTable[RHT_ZORAS_DOMAIN] = HintText(CustomMessage("Zora's Domain", - /*german*/ "Zoras Reich", + /*german*/ "in Zoras Reich", /*french*/ "le Domaine Zora")); // /*spanish*/la Región de los Zora hintTextTable[RHT_ZORAS_FOUNTAIN] = HintText(CustomMessage("Zora's Fountain", - /*german*/ "Zoras Quelle", + /*german*/ "an Zoras Quelle", /*french*/ "la Fontaine Zora")); // /*spanish*/la Fuente Zora - + hintTextTable[RHT_LON_LON_RANCH] = HintText(CustomMessage("Lon Lon Ranch", - /*german*/ "Lon Lon-Farm", + /*german*/ "auf der Lon Lon-Farm", /*french*/ "le Ranch Lon Lon")); // /*spanish*/el Rancho Lon Lon @@ -1067,387 +1067,387 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_KF_LINKS_HOUSE] = HintText(CustomMessage("Link's House", - /*german*/ "Links Haus", + /*german*/ "in #Links Haus#", /*french*/ "la #maison de @#")); // /*spanish*/la casa de @ hintTextTable[RHT_KF_MIDOS_HOUSE] = HintText(CustomMessage("Mido's house", - /*german*/ "Midos Haus", + /*german*/ "in #Midos Haus#", /*french*/ "la Cabane du Grand Mido")); // /*spanish*/la casa de Mido - + hintTextTable[RHT_KF_SARIAS_HOUSE] = HintText(CustomMessage("Saria's House", - /*german*/ "Salias Haus", + /*german*/ "in #Salias Haus#", /*french*/ "la Cabane de Saria")); // /*spanish*/la casa de Saria hintTextTable[RHT_KF_HOUSE_OF_TWINS] = HintText(CustomMessage("the #House of Twins#", - /*german*/ "das #Haus der Zwillinge#", + /*german*/ "im #Haus der Zwillinge#", /*french*/ "la Cabane des Jumelles")); // /*spanish*/la casa de las gemelas hintTextTable[RHT_KF_KNOW_IT_ALL_HOUSE] = HintText(CustomMessage("Know-It-All Brothers' House", - /*german*/ "das #Haus der allwissenden Brüder#", + /*german*/ "im #Haus der allwissenden Brüder#", /*french*/ "la Cabane des frères Je-Sais-Tout")); // /*spanish*/la casa de los hermanos Sabelotodo hintTextTable[RHT_KF_KOKIRI_SHOP] = HintText(CustomMessage("the #Kokiri Shop#", - /*german*/ "der #Kokiri-Laden#", + /*german*/ "im #Kokiri-Laden#", /*french*/ "le #Magasin Kokiri#")); // /*spanish*/la tienda kokiri - + hintTextTable[RHT_LH_LAB] = HintText(CustomMessage("the #Lakeside Laboratory#", - /*german*/ "das #Laboratorium des Sees#", + /*german*/ "im #Labor am See#", /*french*/ "le #Laboratoire du Lac#")); // /*spanish*/el laboratorio del lago hintTextTable[RHT_LH_FISHING_POND] = HintText(CustomMessage("the #Fishing Pond#", - /*german*/ "der #Angelteich#", + /*german*/ "am #Fischweiher#", /*french*/ "l'#Étang#")); // /*spanish*/el estanque hintTextTable[RHT_GV_CARPENTER_TENT] = HintText(CustomMessage("the #Carpenters' tent#", - /*german*/ "das #Zelt der Zimmerleute#", + /*german*/ "im #Zelt der Zimmerleute#", /*french*/ "la #Tente des charpentiers#")); // /*spanish*/la #tienda de campaña de los carpinteros# hintTextTable[RHT_MARKET_GUARD_HOUSE] = HintText(CustomMessage("the #Guard House#", - /*german*/ "das #Haus der Wachen#", + /*german*/ "im #Wachhaus#", /*french*/ "le #poste de garde#")); // /*spanish*/la caseta de guardia hintTextTable[RHT_MARKET_MASK_SHOP] = HintText(CustomMessage("the #Happy Mask Shop#", - /*german*/ "der #Fröhliche Maskenladen#", + /*german*/ "beim #Maskenhändler#", /*french*/ "la #Foire Aux Masques#")); // /*spanish*/la tienda de La Máscara Feliz hintTextTable[RHT_MARKET_BOMBCHU_BOWLING] = HintText(CustomMessage("the #Bombchu Bowling Alley#", - /*german*/ "die #Krabbelminenbowlingbahn", + /*german*/ "bei der #Minenbowlingbahn", /*french*/ "le #Bowling Teigneux#")); // /*spanish*/la Bolera Bombchu hintTextTable[RHT_MARKET_POTION_SHOP] = HintText(CustomMessage("the #Market Potion Shop#", - /*german*/ "der #Magie-Laden des Marktes#", + /*german*/ "im #Magie-Laden des Marktes#", /*french*/ "l'#apothicaire de la Place du Marché#")); // /*spanish*/la tienda de pociones de la plaza del mercado hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME] = HintText(CustomMessage("the #Treasure Chest Shop#", - /*german*/ "der #Schatztruhen-Laden#", + /*german*/ "in der #Truhenlotterie#", /*french*/ "la #Chasse-aux-Trésors#")); // /*spanish*/el Cofre del Tesoro hintTextTable[RHT_MARKET_BOMBCHU_SHOP] = HintText(CustomMessage("the #Bombchu Shop#", - /*german*/ "der #Krabbelminen-Laden#", + /*german*/ "im #Krabbelminen-Laden#", /*french*/ "le #Magasin de Missiles#")); // /*spanish*/la Tienda Bombchu hintTextTable[RHT_MARKET_MAN_IN_GREEN_HOUSE] = HintText(CustomMessage("Man in Green's House", - /*german*/ "das #Haus des Mannes in grün#", + /*german*/ "im #Haus des Mannes in grün#", /*french*/ "la #Maison de l'Homme en Vert#")); // /*spanish*/la casa del hombre de verde hintTextTable[RHT_KAK_WINDMILL] = HintText(CustomMessage("the #Windmill#", - /*german*/ "die #Windmühle#", + /*german*/ "in der #Windmühle#", /*french*/ "le #Moulin#")); // /*spanish*/el #molino# hintTextTable[RHT_KAK_CARPENTER_BOSS_HOUSE] = HintText(CustomMessage("the #Carpenters' Boss House#", - /*german*/ "das #Haus des Chefs der Zimmerleute#", + /*german*/ "im #Haus des Chefs der Zimmerleute#", /*french*/ "la #Maison du Chef des ouvriers#")); // /*spanish*/la casa del capataz de los carpinteros hintTextTable[RHT_KAK_HOUSE_OF_SKULLTULA] = HintText(CustomMessage("the #House of Skulltula#", - /*german*/ "das #Haus der Skulltula#", + /*german*/ "im #Haus der Skulltula#", /*french*/ "la #Maison des Skulltulas#")); // /*spanish*/la casa de las Skulltulas hintTextTable[RHT_KAK_IMPAS_HOUSE] = HintText(CustomMessage("Impa's House", - /*german*/ "das #Haus von Impa#", + /*german*/ "in #Impas Haus#", /*french*/ "la #Maison d'Impa#")); // /*spanish*/la casa de Impa hintTextTable[RHT_KAK_IMPAS_HOUSE_BACK] = HintText(CustomMessage("Impa's cow cage", - /*german*/ "der #Kuhkäfig von Impa#", + /*german*/ "in #Impas Kuhkäfig#", /*french*/ "la #cage à vache d'Impa#")); // /*spanish*/la jaula de la vaca de Impa hintTextTable[RHT_KAK_ODD_POTION_BUILDING] = HintText(CustomMessage("Granny's Potion Shop", - /*german*/ "Asas Hexenladen", + /*german*/ "in Asas Hexenladen", /*french*/ "la #maison bleue de Cocorico#")); // /*spanish*/la tienda de pociones de la abuela hintTextTable[RHT_GRAVEYARD_DAMPES_HOUSE] = HintText(CustomMessage("Dampé's Hut", - /*german*/ "die #Hütte von Boris#", + /*german*/ "in der #Hütte des Totengräbers#", /*french*/ "la #Cabane du Fossoyeur#")); // /*spanish*/la cabaña de Dampé hintTextTable[RHT_GC_SHOP] = HintText(CustomMessage("the #Goron Shop#", - /*german*/ "der #Goronen-Laden#", + /*german*/ "im #Goronen-Laden#", /*french*/ "la #Boutique Goron#")); // /*spanish*/la #tienda goron# hintTextTable[RHT_ZD_SHOP] = HintText(CustomMessage("the #Zora Shop#", - /*german*/ "der #Zora-Laden#", + /*german*/ "im #Zora-Laden#", /*french*/ "la #Boutique Zora#")); // /*spanish*/la #tienda zora# hintTextTable[RHT_LLR_TALONS_HOUSE] = HintText(CustomMessage("Talon's House", - /*german*/ "das #Haus von Talon#", + /*german*/ "im #Haus von Talon#", /*french*/ "la #Maison de Talon#")); // /*spanish*/la casa de Talon hintTextTable[RHT_LLR_STABLES] = HintText(CustomMessage("a #stable#", - /*german*/ "ein #Stall#", + /*german*/ "in den #Ställen#", /*french*/ "l'#Étable#")); // /*spanish*/el establo hintTextTable[RHT_LLR_TOWER] = HintText(CustomMessage("the #Lon Lon Tower#", - /*german*/ "der #Lon Lon-Turm#", + /*german*/ "im #Lon Lon-Turm#", /*french*/ "le #silo du Ranch Lon Lon#")); // /*spanish*/la torre Lon Lon hintTextTable[RHT_MARKET_BAZAAR] = HintText(CustomMessage("the #Market Bazaar#", - /*german*/ "der #Basar des Marktes#", + /*german*/ "im #Basar des Marktes#", /*french*/ "le #Bazar de la Place du Marché#")); // /*spanish*/el bazar de la plaza del mercado hintTextTable[RHT_MARKET_SHOOTING_GALLERY] = HintText(CustomMessage("a #Slingshot Shooting Gallery#", - /*german*/ "die #Schießbude des Marktes#", + /*german*/ "in der #Schießbude des Marktes#", /*french*/ "le #Jeu d'Adresse de la Place du Marché#")); // /*spanish*/el Tiro al Blanco con tirachinas hintTextTable[RHT_KAK_BAZAAR] = HintText(CustomMessage("the #Kakariko Bazaar#", - /*german*/ "der #Basar von Kakariko#", + /*german*/ "im #Basar von Kakariko#", /*french*/ "le #Bazar de Cocorico#")); // /*spanish*/el bazar de Kakariko hintTextTable[RHT_KAK_POTION_SHOP_FRONT] = HintText(CustomMessage("the #Kakariko Potion Shop#", - /*german*/ "der #Magie-Laden von Kakariko#", + /*german*/ "im #Magie-Laden von Kakariko#", /*french*/ "l'#apothicaire de Cocorico#")); // /*spanish*/la tienda de pociones de Kakariko hintTextTable[RHT_KAK_POTION_SHOP_BACK] = HintText(CustomMessage("the #Kakariko Potion Shop#", - /*german*/ "der #Magie-Laden von Kakariko#", + /*german*/ "im #Magie-Laden von Kakariko#", /*french*/ "l'#apothicaire de Cocorico#")); // /*spanish*/la tienda de pociones de Kakariko hintTextTable[RHT_KAK_SHOOTING_GALLERY] = HintText(CustomMessage("a #Bow Shooting Gallery#", - /*german*/ "eine #Schießbude von Kakariko#", + /*german*/ "in der #Schießbude von Kakariko#", /*french*/ "le #jeu d'adresse de Cocorico#")); // /*spanish*/el Tiro al Blanco con arco hintTextTable[RHT_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des Fées#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_HC_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des Fées#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_OGC_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des Fées#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_DMC_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des Fées#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_DMT_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des Fées#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_ZF_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des Fées#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_GRAVEYARD_SHIELD_GRAVE] = HintText(CustomMessage("a #grave with a free chest#", - /*german*/ "ein #Grab mit einer Gratistruhe#", + /*german*/ "in einem #Grab mit einer Gratistruhe#", /*french*/ "le #tombeau avec un trésor#")); // /*spanish*/la #tumba con un cofre# hintTextTable[RHT_GRAVEYARD_HEART_PIECE_GRAVE] = HintText(CustomMessage("a chest spawned by #Sun's Song#", - /*german*/ "eine von der #Hymne der Sonne# geschaffene Truhe", + /*german*/ "in einer von der #Hymne der Sonne# geschaffenen Truhe", /*french*/ "un #coffre apparaît avec le Chant du Soleil#")); // /*spanish*/la #tumba de la Canción del Sol# hintTextTable[RHT_GRAVEYARD_COMPOSERS_GRAVE] = HintText(CustomMessage("the #Composers' Grave#", - /*german*/ "das #Königsgrab#", + /*german*/ "im #Königsgrab#", /*french*/ "la #Tombe royale#")); // /*spanish*/el #Panteón Real# hintTextTable[RHT_GRAVEYARD_DAMPES_GRAVE] = HintText(CustomMessage("Dampé's Grave", - /*german*/ "das #Grab von Boris#", + /*german*/ "im #Grab des Totengräbers#", /*french*/ "la #Tombe d'Igor#")); // /*spanish*/la #tumba de Dampé# hintTextTable[RHT_DMT_COW_GROTTO] = HintText(CustomMessage("a solitary #Cow#", - /*german*/ "eine solitäre #Kuh#", + /*german*/ "bei einer einsamen #Kuh#", /*french*/ "la #grotte avec une vache#")); // /*spanish*/una #vaca# solitaria - + hintTextTable[RHT_HC_STORMS_GROTTO] = HintText(CustomMessage("a sandy grotto with #fragile walls#", - /*german*/ "eine sandige Grotte mit #fragilen Wänden#", + /*german*/ "in einer sandige Grotte mit #fragilen Wänden#", /*french*/ "la #grotte avec des murs fragiles#")); // /*spanish*/la arenosa gruta de #frágiles paredes# hintTextTable[RHT_HF_TEKTITE_GROTTO] = HintText(CustomMessage("a pool guarded by a #Tektite#", - /*german*/ "ein poolbewachender #Arachno#", + /*german*/ "in einem #Schwimmbecken mit einem Arachno#", /*french*/ "l'#étang sous-terrain avec un Araknon#")); // /*spanish*/un charco custodiado por un #Tektite# hintTextTable[RHT_HF_NEAR_KAK_GROTTO] = HintText(CustomMessage("a #Big Skulltula# guarding a Gold one", - /*german*/ "eine goldene Skulltula bewachende #große Skulltula#", + /*german*/ "bei #zwei unterirdischen Skulltulas#", /*french*/ "la #grotte d'araignées#")); // /*spanish*/una #gran Skulltula# custodiando una dorada hintTextTable[RHT_HF_COW_GROTTO] = HintText(CustomMessage("a grotto full of #spider webs#", - /*german*/ "eine mit #Spinnweben# gefüllte Grotte", + /*german*/ "in einer Grotte voller #Spinnweben#", /*french*/ "la #grotte couverte de toiles d'araignées#")); // /*spanish*/una gruta llena de #telarañas# hintTextTable[RHT_KAK_REDEAD_GROTTO] = HintText(CustomMessage("#ReDeads# guarding a chest", - /*german*/ "truhenbewachende #Remorts#", + /*german*/ "in einer Grotte mit #zwei Remorts#", /*french*/ "le tombeau de #deux morts#")); // /*spanish*/los #ReDeads# que custodian un cofre hintTextTable[RHT_SFM_WOLFOS_GROTTO] = HintText(CustomMessage("#Wolfos# guarding a chest", - /*german*/ "truhenbewachende #Wolfos#", + /*german*/ "in einer Grotte mit #zwei Wolfos#", /*french*/ "la #grotte iridescente#")); // /*spanish*/los #Wolfos# que custodian un cofre hintTextTable[RHT_GV_OCTOROK_GROTTO] = HintText(CustomMessage("an #Octorok# guarding a rich pool", - /*german*/ "ein poolbewachender #Oktorok#", + /*german*/ "in einem #Schwimmbecken mit einem Oktorok#", /*french*/ "un #étang sous-terrain avec un Octorok#")); // /*spanish*/un #Octorok# que custodia un lujoso charco hintTextTable[RHT_DEKU_THEATER] = HintText(CustomMessage("the #Lost Woods Stage#", - /*german*/ "die #Verlorenen Wälder#", + /*german*/ "auf der #Waldbühne#", /*french*/ "le #théâtre sylvestre#")); // /*spanish*/el #escenario del Bosque Perdido# hintTextTable[RHT_ZR_OPEN_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewöhnlichen Grotte#", /*french*/ "une #grotte avec un trésor#")); // /*spanish*/una #cueva genérica# - + hintTextTable[RHT_DMC_UPPER_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewöhnlichen Grotte#", /*french*/ "une #grotte avec un trésor#")); // /*spanish*/una #cueva genérica# hintTextTable[RHT_DMT_STORMS_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewöhnlichen Grotte#", /*french*/ "une #grotte avec un trésor#")); // /*spanish*/una #cueva genérica# hintTextTable[RHT_KAK_OPEN_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewöhnlichen Grotte#", /*french*/ "une #grotte avec un trésor#")); // /*spanish*/una #cueva genérica# hintTextTable[RHT_HF_NEAR_MARKET_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewöhnlichen Grotte#", /*french*/ "une #grotte avec un trésor#")); // /*spanish*/una #cueva genérica# hintTextTable[RHT_HF_OPEN_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewöhnlichen Grotte#", /*french*/ "une #grotte avec un trésor#")); // /*spanish*/una #cueva genérica# - + hintTextTable[RHT_HF_SOUTHEAST_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewöhnlichen Grotte#", /*french*/ "une #grotte avec un trésor#")); // /*spanish*/una #cueva genérica# hintTextTable[RHT_KF_STORMS_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewöhnlichen Grotte#", /*french*/ "une #grotte avec un trésor#")); // /*spanish*/una #cueva genérica# hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewöhnlichen Grotte#", /*french*/ "une #grotte avec un trésor#")); // /*spanish*/una #cueva genérica# hintTextTable[RHT_HF_INSIDE_FENCE_GROTTO] = HintText(CustomMessage("a #single Upgrade Deku Scrub#", - /*german*/ "ein #einzelner Upgrade-Deku#", + /*german*/ "bei einem #Deku-Händler mit guter Ware#", /*french*/ "une #grotte avec une peste Mojo#")); // /*spanish*/una cueva con un #solitario mercader deku# hintTextTable[RHT_LW_SCRUBS_GROTTO] = HintText(CustomMessage("#2 Deku Scrubs# including an Upgrade one", - /*german*/ "#zwei Dekus# inklusive einem Upgrade-Deku", + /*german*/ "bei #zwei Deku-Händlern mit guter Ware#", /*french*/ "une #grotte avec deux pestes Mojo#")); // /*spanish*/una cueva con #dos mercaderes deku# hintTextTable[RHT_COLOSSUS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", - /*german*/ "zwei Dekus", + /*german*/ "in einer Grotte mit #zwei Deku-Händlern#", /*french*/ "une #grotte avec deux pestes Mojo#")); // /*spanish*/una cueva con #dos mercaderes deku# hintTextTable[RHT_ZR_STORMS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", - /*german*/ "zwei Dekus", + /*german*/ "in einer Grotte mit #zwei Deku-Händlern#", /*french*/ "une #grotte avec deux pestes Mojo#")); // /*spanish*/una cueva con #dos mercaderes deku# hintTextTable[RHT_SFM_STORMS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", - /*german*/ "zwei Dekus", + /*german*/ "in einer Grotte mit #zwei Deku-Händlern#", /*french*/ "une #grotte avec deux pestes Mojo#")); // /*spanish*/una cueva con #dos mercaderes deku# hintTextTable[RHT_GV_STORMS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", - /*german*/ "zwei Dekus", + /*german*/ "in einer Grotte mit #zwei Deku-Händlern#", /*french*/ "une #grotte avec deux pestes Mojo#")); // /*spanish*/una cueva con #dos mercaderes deku# hintTextTable[RHT_LH_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", - /*german*/ "drei Dekus", + /*german*/ "in einer Grotte mit #drei Deku-Händlern#", /*french*/ "une #grotte avec trois pestes Mojo#")); // /*spanish*/una cueva con #tres mercaderes deku# hintTextTable[RHT_DMC_HAMMER_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", - /*german*/ "drei Dekus", + /*german*/ "in einer Grotte mit #drei Deku-Händlern#", /*french*/ "une #grotte avec trois pestes Mojo#")); // /*spanish*/una cueva con #tres mercaderes deku# hintTextTable[RHT_GC_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", - /*german*/ "drei Dekus", + /*german*/ "in einer Grotte mit #drei Deku-Händlern#", /*french*/ "une #grotte avec trois pestes Mojo#")); // /*spanish*/una cueva con #tres mercaderes deku# hintTextTable[RHT_LLR_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", - /*german*/ "drei Dekus", + /*german*/ "in einer Grotte mit #drei Deku-Händlern#", /*french*/ "une #grotte avec trois pestes Mojo#")); // /*spanish*/una cueva con #tres mercaderes deku# hintTextTable[RHT_ZR_FAIRY_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", - /*german*/ "ein kleiner #Feen-Brunnen#", + /*german*/ "in einem #Feen-Brunnen#", /*french*/ "une #fontaine de fées#")); // /*spanish*/una pequeña #fuente de hadas# hintTextTable[RHT_HF_FAIRY_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", - /*german*/ "ein kleiner #Feen-Brunnen#", + /*german*/ "in einem #Feen-Brunnen#", /*french*/ "une #fontaine de fées#")); // /*spanish*/una pequeña #fuente de hadas# hintTextTable[RHT_SFM_FAIRY_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", - /*german*/ "ein kleiner #Feen-Brunnen#", + /*german*/ "in einem #Feen-Brunnen#", /*french*/ "une #fontaine de fées#")); // /*spanish*/una pequeña #fuente de hadas# hintTextTable[RHT_ZD_STORMS_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", - /*german*/ "ein kleiner #Feen-Brunnen#", + /*german*/ "in einem #Feen-Brunnen#", /*french*/ "une #fontaine de fées#")); // /*spanish*/una pequeña #fuente de hadas# hintTextTable[RHT_GF_STORMS_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", - /*german*/ "ein kleiner #Feen-Brunnen#", + /*german*/ "in einem #Feen-Brunnen#", /*french*/ "une #fontaine de fées#")); // /*spanish*/una pequeña #fuente de hadas# @@ -1456,257 +1456,258 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_JUNK01] = HintText(CustomMessage("They say you must read the names of \"Special Deal\" shop items carefully.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß man die \"Sonderangebote\" in Läden sorgfältig lesen sollte!", /*french*/ "Selon moi, les \"Offres spéciales\" sont parfois trompeuses... Lisez les attentivement!")); hintTextTable[RHT_JUNK02] = HintText(CustomMessage("They say that Zelda is a poor leader.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Zelda eine schlechte Anführerin sei.", /*french*/ "Selon moi, Zelda ne ferait pas un bon monarque.")); hintTextTable[RHT_JUNK03] = HintText(CustomMessage("These hints can be quite useful. This is an exception.", - /*german*/ "", + /*german*/ "Die Hinweise von uns Mythensteinen können sehr nützlich sein. Dies ist eine Ausnahme.", /*french*/ "Ces indices sont très utiles, à l'exception de celui-ci.")); hintTextTable[RHT_JUNK04] = HintText(CustomMessage("They say that the Lizalfos in Dodongo's Cavern like to play in lava.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Echsalfos in Dodongos Höhle gerne in Lava spielen.", /*french*/ "Selon moi, les Lézalfos de la Caverne Dodongo aiment patauger dans la lave.")); hintTextTable[RHT_JUNK05] = HintText(CustomMessage("They say that all the Zora drowned in Wind Waker.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß alle Zoras in Wind Waker ertrunken wären.", /*french*/ "Selon moi, les Zoras se sont noyés dans Wind Waker.")); hintTextTable[RHT_JUNK06] = HintText(CustomMessage("If Gorons eat rocks, does that mean I'm in danger?", - /*german*/ "", + /*german*/ "Da Goronen Steine essen… heißt das, ich sollte mir Sorgen machen?", /*french*/ "Ne dis pas au Gorons que je suis ici. Ils mangent des roches, tu sais!")); hintTextTable[RHT_JUNK07] = HintText(CustomMessage("'Member when Ganon was a blue pig?^I 'member.", - /*german*/ "", + /*german*/ "Weißte noch als Ganon nur n' blaues Schwein war?^Damals war alles besser. Kein unnötiger Schnickschnack!", /*french*/ "Dans mon temps, Ganon était un cochon bleu...^Pff! Les jeunes de nos jours, et leur Ganondorf!")); hintTextTable[RHT_JUNK08] = HintText(CustomMessage("One who does not have Triforce can't go in.", - /*german*/ "", + /*german*/ "Jemand, der nicht im Besitz des Triforce ist, darf nicht eintreten!", /*french*/ "Ceux sans Triforce doivent rebrousser chemin.")); hintTextTable[RHT_JUNK09] = HintText(CustomMessage("Save your future, end the Happy Mask Salesman.", - /*german*/ "", + /*german*/ "Rette die Zukunft, stoppe den Maskenhändler solange Du noch kannst.", /*french*/ "Selon moi, tu t'éviteras des jours de malheur si tu vaincs le vendeur de masques...")); hintTextTable[RHT_JUNK10] = HintText(CustomMessage("Glitches are a pathway to many abilities some consider to be... Unnatural.", - /*german*/ "", + /*german*/ "Glitches ermöglichen viele Fähigkeiten, die manche als... unnatürlich betrachten würden.", /*french*/ "Les glitchs sont un moyen d'acquérir de nombreuses facultés considérées par certains comme... contraire ")); hintTextTable[RHT_JUNK11] = HintText(CustomMessage("I'm stoned. Get it?", - /*german*/ "", - /*french*/ "Allez, roche, papier, ciseau...&Roche.")); + /*german*/ "Ich bin stoned. Verstehst du?", + /*french*/ "J'ai été pétrifié.&Tu as compris?")); hintTextTable[RHT_JUNK12] = HintText(CustomMessage("Hoot! Hoot! Would you like me to repeat that?", - /*german*/ "", + /*german*/ "Uhuuu! Uhu! Soll ich mich noch einmal wiederholen?", /*french*/ "Hou hou! Veux-tu que je répète tout ça?")); hintTextTable[RHT_JUNK13] = HintText(CustomMessage("Gorons are stupid. They eat rocks.", - /*german*/ "", + /*german*/ "Goronen sind doof. Sie essen Felsen.", /*french*/ "Les Gorons sont des vraies têtes dures.")); hintTextTable[RHT_JUNK14] = HintText(CustomMessage("They say that Lon Lon Ranch prospered under Ingo.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Basil der Lon Lon-Farm zu neuem Glanz verholfen hat.", /*french*/ "Selon moi, le Ranch Lon Lon était plus prospère sous Ingo.")); hintTextTable[RHT_JUNK15] = HintText(CustomMessage("They say without the Lens of Truth, the Treasure Chest Mini-Game is a 1 out of 32 chance.^Good luck!", - /*german*/ "", - /*french*/ "Gagner la Chasse-aux-Trésors est 1 chance sur 32.^Bonne chance!")); + /*german*/ "Man erzählt sich, daß Du ohne das Auge der Wahrheit bei der Truhenlotterie nur eine 1-zu-32-Chance hast.^Na dann, viel Glück.", + /*french*/ "Selon moi, les chances de gagner la Chasse-aux-Trésors sans Monocle de Vérité est de 1 chance sur 32.^Bonne chance!")); hintTextTable[RHT_JUNK16] = HintText(CustomMessage("Use bombs wisely.", - /*german*/ "", + /*german*/ "Setze Bomben mit Bedacht ein.", /*french*/ "Utilise les bombes avec précaution.")); hintTextTable[RHT_JUNK17] = HintText(CustomMessage("They say that players who select the \"ON\" option for \"MOTION CONTROL\" are the real \"Zelda players!\"", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Spieler, die die Option \"BEWEGUNGSSTEUERUNG\" auf \"EIN\" stellen, die wahren \"Zelda-Spieler\" sind.", /*french*/ "Selon moi, ceux qui utilisent les contrôles gyroscopiques sont les VRAIS joueurs.")); hintTextTable[RHT_JUNK18] = HintText(CustomMessage("L2P @.", - /*german*/ "", + /*german*/ "Lern zu spielen, @.", /*french*/ "Arrête de lire les indices et joue comme un grand, @.")); hintTextTable[RHT_JUNK19] = HintText(CustomMessage("I bet you'd like to have more bombs.", - /*german*/ "", + /*german*/ "Möchtest Du zur Strafe mehr Bomben tragen können?", /*french*/ "Je parie que tu veux plus de bombes.")); hintTextTable[RHT_JUNK20] = HintText(CustomMessage("When all else fails, use Fire.", - /*german*/ "", + /*german*/ "Wenn alles andere scheitert, benutze Feuer.", /*french*/ "Quand rien ne marche, utilise le feu.")); hintTextTable[RHT_JUNK21] = HintText(CustomMessage("Here's a hint, @. Don't be bad.", - /*german*/ "", + /*german*/ "Hier ein Tipp, @: Sei nicht so schlecht.", /*french*/ "Selon moi, la #Triforce# n'est pas dans le jeu... Duh!")); hintTextTable[RHT_JUNK22] = HintText(CustomMessage("Game Over. Return of Ganon.", - /*german*/ "", + /*german*/ "Game Over. Ganons Rückkehr.", /*french*/ "Partie terminée. RETour de Ganon.")); hintTextTable[RHT_JUNK23] = HintText(CustomMessage("May the way of the Hero lead to the Triforce.", - /*german*/ "", + /*german*/ "Möge der Weg des Helden zum Triforce führen.", /*french*/ "Que le chemin du héros te mène à la Triforce.")); hintTextTable[RHT_JUNK24] = HintText(CustomMessage("Can't find an item? Scan an Amiibo.", - /*german*/ "", + /*german*/ "Du kannst einen Gegenstand nicht finden? Scanne ein Amiibo.", /*french*/ "Tu cherches de quoi? Utilise un Amiibo!")); hintTextTable[RHT_JUNK25] = HintText(CustomMessage("They say this game has just a few glitches.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß dieses Spiel nur ein paar Glitches hat.", /*french*/ "Selon moi, ce jeu est complètement exempt de glitchs.")); hintTextTable[RHT_JUNK26] = HintText(CustomMessage("BRRING BRRING This is Ulrira. Wrong number?", - /*german*/ "", + /*german*/ "TUUUUT! TUUUUT! Ja? Hier Ulrira! Muss sich wohl verwählt haben.", /*french*/ "DRING DRING!! Pépé le Ramollo à l'appareil... Quoi? Faux numéro?")); hintTextTable[RHT_JUNK27] = HintText(CustomMessage("Tingle Tingle Kooloo Limpah!", - /*german*/ "", + /*german*/ "Tingle Tingle Kuuluu-Limpah!", /*french*/ "Tingle! Tingle! Kooloolin... Pah!")); hintTextTable[RHT_JUNK28] = HintText(CustomMessage("L is real 2401", - /*german*/ "", + /*german*/ "L is real 2401", /*french*/ "L is real 2401")); hintTextTable[RHT_JUNK29] = HintText(CustomMessage("They say that Ganondorf will appear in the next Mario Tennis.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Ganondorf im nächsten Mario Tennis erscheinen wird.", /*french*/ "Selon moi, Ganondorf sera la nouvelle recrue dans Mario Tennis.")); hintTextTable[RHT_JUNK30] = HintText(CustomMessage("They say Medigoron sells the earliest Breath of the Wild demo.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Medigoron die früheste Breath of the Wild-Demo verkauft.", /*french*/ "Selon moi, Medigoron vend une démo de #Breath of the Wild#.")); hintTextTable[RHT_JUNK31] = HintText(CustomMessage("Can you move me? I don't get great service here.", - /*german*/ "", + /*german*/ "Kannst Du mich bewegen? Ich habe schlechten Empfang.", /*french*/ "Peux-tu me déplacer? J'ai pas une bonne réception ici.")); hintTextTable[RHT_JUNK32] = HintText(CustomMessage("They say if you use Strength on the truck, you can find Mew.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß man mit Stärke, unter dem Truck Mew finden kann.", /*french*/ "Selon moi, #Mew# se trouve dessous le camion... Duh!")); hintTextTable[RHT_JUNK33] = HintText(CustomMessage("I'm a helpful hint Gossip Stone!^See, I'm helping.", - /*german*/ "", + /*german*/ "Ich bin ein hilfreicher Mythenstein!^Siehst du? Ich helfe.", /*french*/ "Salut! Je suis une pierre de bons conseils!^Tiens, tu vois? J'aide bien, hein?")); hintTextTable[RHT_JUNK34] = HintText(CustomMessage("Dear @, please come to the castle. I've baked a cake for you.&Yours truly, Princess Zelda.", - /*german*/ "", + /*german*/ "Lieber @!&Komm mich doch einmal im Schloß besuchen! Der Kuchen steht bereit!&In Freundschaft, Prinzessin Zelda.", /*french*/ "Mon très cher @:&Viens vite au château, je t'ai préparé&un délicieux gâteau...^À bientôt, Princesse Zelda")); hintTextTable[RHT_JUNK35] = HintText(CustomMessage("They say all toasters toast toast.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß alle Toaster Toast toasten.", /*french*/ "Selon moi, les grille-pains grillent du pain.")); hintTextTable[RHT_JUNK36] = HintText(CustomMessage("You thought it would be a useful hint, but it was me, junk hint!", - /*german*/ "", + /*german*/ "Du dachtest dies wäre ein nützlicher Hinweis. Doch hier bin ich, der Müll-Hinweis!", /*french*/ "Tu t'attendais à un bon indice... Mais c'était moi, un mauvais indice!")); hintTextTable[RHT_JUNK37] = HintText(CustomMessage("They say that quest guidance can be found at a talking rock.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß man Quest-Hinweise bei einem sprechenden Stein finden kann.", /*french*/ "Selon moi, des #indices# se trouvent auprès d'une pierre parlante... Duh!")); hintTextTable[RHT_JUNK38] = HintText(CustomMessage("They say that the final item you're looking for can be found somewhere in Hyrule.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der letzte Gegenstand nachdem Du gerade suchst, irgendwo in Hyrule zu finden sei.", /*french*/ "Selon moi, le #dernier objet# se trouve quelque part dans Hyrule... Duh!")); hintTextTable[RHT_JUNK39] = HintText(CustomMessage("Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", - /*german*/ "", + /*german*/ "Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", /*french*/ "Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.")); hintTextTable[RHT_JUNK40] = HintText(CustomMessage("They say that Barinade fears Deku Nuts.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Barinade Angst vor Deku-Nüssen hat.", /*french*/ "Selon moi, Barinade a la frousse des noix Mojo.")); hintTextTable[RHT_JUNK41] = HintText(CustomMessage("They say that Flare Dancers do not fear Goron-crafted blades.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Flammenderwische keine Angst vor goronengeschmiedeten Klingen haben.", /*french*/ "Selon moi, le danse-flamme n'a pas peur des armes de Goron.")); hintTextTable[RHT_JUNK42] = HintText(CustomMessage("They say that Morpha is easily trapped in a corner.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß man Morpha ganz leicht in die Ecke drängen kann.", /*french*/ "Selon moi, Morpha est facilement coincé.")); hintTextTable[RHT_JUNK43] = HintText(CustomMessage("They say that Bongo Bongo really hates the cold.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Bongo Bongo die Kälte wirklich hasst.", /*french*/ "Selon moi, Bongo Bongo a facilement froid aux doigts.")); hintTextTable[RHT_JUNK44] = HintText(CustomMessage("They say that your sword is most powerful when you put it away.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Dein Schwert am mächtigsten ist, wenn Du es wegsteckst.", /*french*/ "Selon moi, ton épée est à pleine puissance quand tu la rengaines.")); hintTextTable[RHT_JUNK45] = HintText(CustomMessage("They say that bombing the hole Volvagia last flew into can be rewarding.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß es sich lohnt das Loch zu bombardieren, in das Volvagia zuletzt geflogen ist.", /*french*/ "Selon moi, le trou où se creuse Volvagia est vulnérable aux bombes.")); hintTextTable[RHT_JUNK46] = HintText(CustomMessage("They say that invisible ghosts can be exposed with Deku Nuts.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß unsichtbare Geister mit Deku-Nüssen sichtbar gemacht werden können.", /*french*/ "Selon moi, des fantômes invisibles apparaissent avec des noix Mojo.")); hintTextTable[RHT_JUNK47] = HintText(CustomMessage("They say that the real Phantom Ganon is bright and loud.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der wahre Phantom-Ganon durch Helligkeit und Lärm auffällt.", /*french*/ "Selon moi, le vrai spectre de Ganon est clair et bruyant.")); hintTextTable[RHT_JUNK48] = HintText(CustomMessage("They say that walking backwards is very fast.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß rückwärts laufen sehr schnell ist.", /*french*/ "Selon moi, tu fais marche arrière très rapidement pour un héros.")); hintTextTable[RHT_JUNK49] = HintText(CustomMessage("They say Ingo is not very good at planning ahead.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Basil nicht besonders gut darin ist vorauszuplanen.", /*french*/ "Selon moi, Ingo ne fait pas un très bon geôlier.")); hintTextTable[RHT_JUNK50] = HintText(CustomMessage("You found a spiritual Stone! By which I mean, I worship Nayru.", - /*german*/ "", + /*german*/ "Du hast einen Heiligen Stein gefunden!^Also... eigentlich heißt das nur, daß ich Nayru verehre.", /*french*/ "Vous avez trouvé une Pierre Ancestrale! En effet, je vénère la déesse Hylia.")); hintTextTable[RHT_JUNK51] = HintText(CustomMessage("Open your eyes.^Open your eyes.^Wake up, @.", - /*german*/ "", + /*german*/ "Öffne die Augen...^Öffne die Augen...^Wach auf, @.", /*french*/ "Réveille-toi...^Réveille-toi.^Ouvre les yeux, @.")); hintTextTable[RHT_JUNK52] = HintText(CustomMessage("They say that the Nocturne of Shadow can bring you very close to Ganon.", - /*german*/ "", - /*french*/ "Selon moi, le nocturne de l'ombre peut t'amener très près de Ganon.")); + /*german*/ "Man erzählt sich, daß die Nocturne des Schattens dich Ganon sehr nahe bringen kann.", + /*french*/ "Selon moi, le Nocturne de l'Ombre peut t'amener très près de Ganon.")); hintTextTable[RHT_JUNK53] = HintText(CustomMessage("They say that Twinrova always casts the same spell the first three times.", - /*german*/ "", - /*french*/ "Selon moi, Twinrova lance toujours les mêmes trois premiers sorts.")); + /*german*/ "Man erzählt sich, daß Twinrova die ersten drei Male immer denselben Zauber benutzt.", + /*french*/ "Selon moi, le Duo Maléfique lance toujours les mêmes trois premiers sorts.")); hintTextTable[RHT_JUNK54] = HintText(CustomMessage("They say that the nightly builds may be unstable.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die \"Nightly Builds\" instabil sein könnten.", /*french*/ "Selon moi, les \"nightly builds\" peuvent être instables.")); hintTextTable[RHT_JUNK55] = HintText(CustomMessage("You're playing a Randomizer. I'm randomized!^Here's a random number: #4#.&Enjoy your Randomizer!", - /*german*/ "", + /*german*/ "Du spielst einen Randomizer. Ich wurde zufällig generiert!^Hier ist eine zufällige Zahl: #4#.&Viel Spaß mit dem Randomizer!", /*french*/ "Tu joues à un randomizer. Je suis aléatoire!^Voici un nombre aléatoire: #4#.&Bonne partie!")); hintTextTable[RHT_JUNK56] = HintText(CustomMessage("They say Ganondorf's bolts can be reflected with glass or steel.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß man Ganondorfs Blitze mit Glas oder Stahl reflektieren kann.", /*french*/ "Selon moi, les éclairs de Ganon se reflètent sur l'acier et le verre.")); hintTextTable[RHT_JUNK57] = HintText(CustomMessage("They say Ganon's tail is vulnerable to nuts, arrows, swords, explosives, hammers...^...sticks, seeds, " "boomerangs...^...rods, shovels, iron balls, angry bees...", - /*german*/ "", + /*german*/ "Man erzählt sich, Ganons Schwanz sei verwundbar durch Nüsse, Pfeile, Schwerter...^...Explosives, Hämmer, " + "Stöcke...^...Kerne, Bumerangs, Schaufeln, Eisenkugeln, wütende Bienen...", /*french*/ "Selon moi, la queue de Ganon est vulnérable aux noix, flèches, épées, bombes, marteaux...^...bâtons, " "graines, boomerangs...^...baguettes, pelles, boulets de fer, abeilles enragées...")); hintTextTable[RHT_JUNK58] = HintText(CustomMessage("They say that you're wasting time reading this hint, but I disagree. Talk to me again!", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Du deine Zeit mit dem Lesen dieses Hinweises verschwendest, aber ich bin anderer Meinung. Sprich noch einmal mit mir.", /*french*/ "Selon moi... tu sais quoi? Parle-moi encore, et je te le dirai!")); hintTextTable[RHT_JUNK59] = HintText(CustomMessage("They say Ganondorf knows where to find the instrument of his doom.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Ganondorf weiß, wo man das Instrument seines Untergangs finden kann.", /*french*/ "Selon moi, Ganondorf sait où il a caché son point faible.")); hintTextTable[RHT_JUNK60] = HintText(CustomMessage("I heard @ is pretty good at Zelda.", - /*german*/ "", + /*german*/ "Ich habe gehört, daß @ ziemlich gut in Zelda Spielen ist.", /*french*/ "Apparemment, @ est super bon à Zelda.")); hintTextTable[RHT_JUNK61] = HintText(CustomMessage("Hi @, we've been trying to reach you about your car's extended warranty. ", - /*german*/ "", + /*german*/ "Hallo @, wir haben versucht, Dich wegen der erweiterten Garantie für Dein Auto zu erreichen.", /*french*/ "Bonjour, @. Vous avez une voiture? Vous savez, nous offrons des assurances abordables...")); hintTextTable[RHT_JUNK62] = HintText(CustomMessage("They say that it's actually possible to beat the running man.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß es tatsächlich möglich sei, den Marathon-Läufer zu besiegen.", /*french*/ "Selon moi, il est possible de battre le coureur.&Donc, tu prends ton arc, et...")); hintTextTable[RHT_JUNK63] = HintText(CustomMessage("They say this hint makes more sense in other languages.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß dieser Hinweis in anderen Sprachen mehr Sinn macht.", /*french*/ "Selon moi, ces indices auraient pu être mieux traduits... Duh!")); // ^ Junk hints above are from 3drando @@ -1715,163 +1716,160 @@ void StaticData::HintTable_Init() { // Please keep hints to stuff related to ship directly, or to Nintendo/Zelda related stuff. // And nothing that's super obscure that no one's going to understand. -#define HINT_TEXT_NEEDS_TRANSLATION_FR \ - "Erreur 0x69a504:&Traduction manquante^C'est de la faute à Purple Hato!&J'vous jure!" - hintTextTable[RHT_JUNK64] = HintText(CustomMessage("They say Greg is special.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ "Man erzählt sich, daß Greg etwas Besonderes ist.", + /*french*/ "Selon moi, Greg est spécial.")); hintTextTable[RHT_JUNK65] = HintText(CustomMessage("They say the longer the Goron's neck, the wiser they are.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ "Man erzählt sich, daß ein Gorone umso weiser wird, je länger sein Hals ist.", + /*french*/ "Selon moi, plus le cou des Gorons est long, plus ils sont sage." )); hintTextTable[RHT_JUNK66] = HintText(CustomMessage("They say this ship is what all true gamers strive for.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß dieses \"Ship\" das ist, wonach alle echten Gamer streben.", /*french*/ "Selon moi, cette version du port est ce pour quoi luttent tous les vrais gamers.")); - + hintTextTable[RHT_JUNK67] = HintText(CustomMessage("They say that Glowsticks can be found in the Raveyard.", - /*german*/ "", - /*french*/ "On peut trouver des Bâtons Lumineux sur le dancefloor du cimetière.")); + /*german*/ "Man erzählt sich, daß Leuchtstäbe auf dem Partyfriedhof zu finden wären.", + /*french*/ "Selon moi, on peut trouver des Bâtons Lumineux sur le dancefloor du cimetière.")); hintTextTable[RHT_JUNK68] = HintText(CustomMessage("They say @'s uncle works for Nintendo.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ "Man erzählt sich, daß @'s Onkel bei Nintendo arbeitet.", + /*french*/ "Selon moi, l'oncle de @ travaille chez Nintendo.")); hintTextTable[RHT_JUNK69] = HintText(CustomMessage("They say pulling all gravestones in the graveyard leads to something magical.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ "Man erzählt sich, daß das Ziehen aller Grabsteine auf dem Friedhof zu etwas Magischem führe.", + /*french*/ "Selon moi, tirer toutes les tombes du Cimetière déclanche un truc magique.")); hintTextTable[RHT_JUNK70] = HintText(CustomMessage("They say holding L while pausing makes you win the game.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ "Man erzählt sich, daß man das Spiel gewinnt, wenn man L gedrückt hält, während man pausiert.", + /*french*/ "Selon moi, maintenir L pendant que vous appuyez sur START vous permet de terminer le jeu.")); hintTextTable[RHT_JUNK71] = HintText(CustomMessage("They say @'s body is ready.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ "Man erzählt sich... nein weißt Du was, ich habe keine Lust mehr.", + /*french*/ "Selon moi, ce junk hint ne se traduirait pas bien en français.")); /*-------------------------- | DUNGEON HINT TEXT | ---------------------------*/ - + hintTextTable[RHT_DEKU_TREE] = HintText(CustomMessage("Deku Tree", - /*german*/ "Deku-Baum", + /*german*/ "im Deku-Baum", /*french*/ "l'Arbre Mojo"), // /*spanish*/el Gran Árbol Deku {}, {CustomMessage("an ancient tree", - /*german*/ "ein antiker Baum", + /*german*/ "in einem antiken Baum", /*french*/ "le vieil arbre")}); // /*spanish*/un ancestral árbol hintTextTable[RHT_DODONGOS_CAVERN] = HintText(CustomMessage("Dodongo's Cavern", - /*german*/ "Dodongos Kaverne", + /*german*/ "in Dodongos Höhle", /*french*/ "la Caverne Dodongo"), // /*spanish*/la Cueva de los Dodongos {}, {CustomMessage("an immense cavern", - /*german*/ "eine riesige Kaverne", + /*german*/ "in einer riesigen Kaverne", /*french*/ "l'immense caverne")}); // /*spanish*/una descomunal cueva hintTextTable[RHT_JABU_JABUS_BELLY] = HintText(CustomMessage("Jabu-Jabu's Belly", - /*german*/ "Jabu-Jabus Bauch", + /*german*/ "in Jabu-Jabus Bauch", /*french*/ "le Ventre de Jabu-Jabu"), // /*spanish*/tripa de Jabu-Jabu {}, {CustomMessage("the belly of a deity", - /*german*/ "der Bauch einer Gottheit", + /*german*/ "im Bauche einer Gottheit", /*french*/ "le ventre d'un gardien")}); // /*spanish*/la tripa de cierta deidad hintTextTable[RHT_FOREST_TEMPLE] = HintText(CustomMessage("Forest Temple", - /*german*/ "Waldtempel", + /*german*/ "im Waldtempel", /*french*/ "le Temple de la Forêt"), // /*spanish*/el Templo del Bosque {}, {CustomMessage("a deep forest", - /*german*/ "ein tiefer Wald", + /*german*/ "in dunklen Wäldern", /*french*/ "la profonde forêt")}); // /*spanish*/las profundidades del bosque hintTextTable[RHT_FIRE_TEMPLE] = HintText(CustomMessage("Fire Temple", - /*german*/ "Feuertempel", + /*german*/ "im Feuertempel", /*french*/ "le Temple du Feu"), // /*spanish*/el Templo del Fuego {}, {CustomMessage("a high mountain", - /*german*/ "ein hoher Berg", + /*german*/ "auf hohem Berge", /*french*/ "la grande montagne")}); // /*spanish*/una alta montaña hintTextTable[RHT_WATER_TEMPLE] = HintText(CustomMessage("Water Temple", - /*german*/ "Wassertempel", + /*german*/ "im Wassertempel", /*french*/ "le Temple de l'Eau"), // /*spanish*/el Templo del Agua {}, {CustomMessage("a vast lake", - /*german*/ "ein gewaltiger See", + /*german*/ "in einem riesigen See", /*french*/ "le vaste lac")}); // /*spanish*/un lago inmenso hintTextTable[RHT_SPIRIT_TEMPLE] = HintText(CustomMessage("Spirit Temple", - /*german*/ "Geistertempel", + /*german*/ "im Geistertempel", /*french*/ "le Temple de l'Esprit"), // /*spanish*/el Templo del Espíritu {}, {CustomMessage("the goddess of the sand", - /*german*/ "die Göttin des Sandes", + /*german*/ "innerhalb der Göttin des Sandes", /*french*/ "la déesse des sables")}); // /*spanish*/la diosa de las arenas hintTextTable[RHT_SHADOW_TEMPLE] = HintText(CustomMessage("Shadow Temple", - /*german*/ "Schattentempel", + /*german*/ "im Schattentempel", /*french*/ "le Temple de l'Ombre"), // /*spanish*/el Templo de las Sombras {}, {CustomMessage("the house of the dead", - /*german*/ "das Haus der Toten", + /*german*/ "an der Stätte der Toten", /*french*/ "la maison des morts")}); // /*spanish*/la casa de la muerte hintTextTable[RHT_ICE_CAVERN] = HintText(CustomMessage("Ice Cavern", - /*german*/ "Eishöhle", + /*german*/ "in der Eishöhle", /*french*/ "la caverne de glace"), // /*spanish*/la caverna de hielo {}, {CustomMessage("a frozen maze", - /*german*/ "ein gefrorenes Labyrinth", + /*german*/ "in einem gefrorenen Labyrinth", /*french*/ "le dédale glacé")}); // /*spanish*/un gélido laberinto hintTextTable[RHT_BOTTOM_OF_THE_WELL] = HintText(CustomMessage("Bottom of the Well", - /*german*/ "Grund des Brunnens", + /*german*/ "auf dem Grund des Brunnens", /*french*/ "le fonds du Puits"), // /*spanish*/el fondo del pozo {}, {CustomMessage("a shadow\'s prison", - /*german*/ "das Gefängnis eines Schattens", + /*german*/ "im Gefängnis eines Dämons", /*french*/ "la prison d'une ombre")}); // /*spanish*/la prisión de las sombras hintTextTable[RHT_GERUDO_TRAINING_GROUND] = HintText(CustomMessage("Gerudo Training Ground", - /*german*/ "Gerudo-Trainingsgelände", + /*german*/ "in der Gerudo-Trainingsarena", /*french*/ "le Gymnase Gerudo"), // /*spanish*/el Centro de Instrucción Gerudo {}, {CustomMessage("the test of thieves", - /*german*/ "die Prüfung der Diebe", + /*german*/ "bei der Prüfung der Diebe", /*french*/ "l'épreuve des voleurs")}); // /*spanish*/la prueba de las bandidas hintTextTable[RHT_GANONS_CASTLE] = HintText(CustomMessage("Inside Ganon's Castle", - /*german*/ "In Ganons Schloß", + /*german*/ "in Ganons Schloß", /*french*/ "l'intérieur du Château de Ganon"), // /*spanish*/el interior del Castillo de Ganon {}, {CustomMessage("a conquered citadel", - /*german*/ "eine eroberte Zitadelle", + /*german*/ "in einer gefallenen Zitadelle", /*french*/ "la citadelle assiégée")}); // /*spanish*/una conquistada ciudadela @@ -1885,7 +1883,7 @@ void StaticData::HintTable_Init() { // /*spanish*/la #Reina Goma# porta #[[1]]#. {}, {CustomMessage("They say that the #Parasitic Armored Arachnid# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #gepanzerte parasitäre Spinne# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß der #gepanzerte Spinnenparasit# #[[1]]# hielte.", /*french*/ "Selon moi, le #monstre insectoïde géant# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #arácnido parasitario acorazado# porta #[[1]]#. @@ -1895,7 +1893,7 @@ void StaticData::HintTable_Init() { // /*spanish*/el #Rey Dodongo# porta #[[1]]#. {}, {CustomMessage("They say that the #Infernal Dinosaur# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #infernalische Dinosaurier# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß der #Infernosaurus# #[[1]]# hielte.", /*french*/ "Selon moi, le #dinosaure infernal# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #dinosaurio infernal# porta #[[1]]#. @@ -1905,7 +1903,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Barinade# porta #[[1]]#. {}, {CustomMessage("They say that the #Bio-Electric Anemone# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #bioelektrische Anemone# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß der #elektroterrestrische Biotentakel# #[[1]]# hielte.", /*french*/ "Selon moi, l'#anémone bioélectrique# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #anémona bioeléctrica# porta #[[1]]#. @@ -1915,7 +1913,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Ganon Fantasma# porta #[[1]]#. {}, {CustomMessage("They say that the #Evil Spirit from Beyond# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #böse Geist aus dem Jenseits# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß das #reitende Unheil# #[[1]]# hielte.", /*french*/ "Selon moi, l'#esprit maléfique de l'au-delà# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #espíritu maligno de ultratumba# porta #[[1]]#. @@ -1925,7 +1923,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Volvagia# porta #[[1]]#. {}, {CustomMessage("They say that the #Subterranean Lava Dragon# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #subterrane Lavadrache# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß der #subterrane Lavadrachoid# #[[1]]# hielte.", /*french*/ "Selon moi, le #dragon des profondeurs# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #dragón de lava subterráneo# porta #[[1]]#. @@ -1935,7 +1933,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Morpha# porta #[[1]]#. {}, {CustomMessage("They say that the #Giant Aquatic Amoeba# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #gigantische aquatische Amöbe# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß der #aquamöbe Wassertentakel# #[[1]]# hielte.", /*french*/ "Selon moi, l'#amibe aquatique géante# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #ameba acuática gigante# porta #[[1]]#. @@ -1945,7 +1943,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Bongo Bongo# porta #[[1]]#. {}, {CustomMessage("They say that the #Phantom Shadow Beast# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Phantomschattenbiest# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß die #bestialische Schattenmonstrosität# #[[1]]# hielte.", /*french*/ "Selon moi, le #monstre de l'ombre# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #alimaña oscura espectral# porta #[[1]]#. @@ -1955,7 +1953,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Birova# porta #[[1]]#. {}, {CustomMessage("They say that the #Sorceress Sisters# hold #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Hexenschwestern# #[[1]]# hielten.", + /*german*/ "Man erzählt sich, daß die #höllische Hexenarmada# #[[1]]# hielte.", /*french*/ "Selon moi, #les sorcières jumelles# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/las #hermanas hechiceras# portan #[[1]]#. @@ -1979,47 +1977,49 @@ void StaticData::HintTable_Init() { hintTextTable[RHT_BRIDGE_VANILLA_HINT] = HintText(CustomMessage("$6The awakened ones require the #Shadow and Spirit Medallions# as well as the #Light Arrows#.^", - /*german*/ "$6Die Weisen werden darauf warten, daß der Held das #Amulett des Schattens, Amulett der Geister# und die #Licht-Pfeile# sammelt.^", + /*german*/ "$6Die Weisen, die darauf warten,&daß der Held das #Amulett des Schattens, Amulett der Geister#&und die #Licht-Pfeile# sammelt.^", /*french*/ "$6Les êtres de sagesse attendront le héros muni des #Médaillons de l'Ombre et l'Esprit# et des #Flèches de Lumière#.^", {QM_RED, QM_YELLOW})); // /*spanish*/$6Los sabios aguardarán a que el héroe obtenga tanto el #Medallón de las Sombras y el del Espíritu# junto // a la #flecha de luz#.^ hintTextTable[RHT_BRIDGE_STONES_HINT] = HintText(CustomMessage("$0The awakened ones will await for the Hero to collect #[[d]] Spiritual Stone||s|#.^", - /*german*/ "$0Die Weisen werden darauf warten, daß der Held #[[d]] |Heiligen Stein|Heilige Steine|# sammelt.^", + /*german*/ "$0Die Weisen werden darauf&warten, daß der Held&#[[d]] |Heiligen Stein|Heilige Steine|# sammelt.^", /*french*/ "$0Les êtres de sagesse attendront le héros muni de #[[d]] |Pierre Ancestrale|Pierres Ancestrales|#.^", {QM_BLUE})); // /*spanish*/$0Los sabios aguardarán a que el héroe&obtenga #[[d]] |piedra espiritual|piedras espirituales|#.^ hintTextTable[RHT_BRIDGE_MEDALLIONS_HINT] = HintText(CustomMessage("$8The awakened ones will await for the Hero to collect #[[d]] Medallion||s|#.^", - /*german*/ "$8Die Weisen werden darauf warten, daß der Held #[[d]] Amulett||e|# sammelt.^", + /*german*/ "$8Die Weisen werden darauf&warten, daß der Held&#[[d]] Amulett||e|# sammelt.^", /*french*/ "$8Les êtres de sagesse attendront le héros muni de #[[d]] Médaillon||s|#.^", {QM_RED})); // /*spanish*/$8Los sabios aguardarán a que el héroe&obtenga #[[d]] |medallón|medallones|#.^ hintTextTable[RHT_BRIDGE_REWARDS_HINT] = HintText(CustomMessage("$CThe awakened ones will await for the Hero to collect #[[d]]# |#Spiritual Stone# or #Medallion#|" - "#Spiritual Stones# and #Medallions#|.^", - /*german*/ "$CDie Weisen werden darauf warten, daß der Held #[[d]]# |#Heiligen Stein# oder #Amulett#|" - "#Heilige Steine# oder #Amulette#| sammelt.^", - /*french*/ "$CLes êtres de sagesse attendront le héros muni de #[[d]]# |#Pierre Ancestrale# ou #Médaillon#" - "|#Pierres Ancestrales# ou #Médaillons#|.^", - {QM_YELLOW, QM_BLUE, QM_RED})); - // /*spanish*/$CLos sabios aguardarán a que el héroe obtenga #[[d]]# |#piedra espiritual# o #medallón#| + "#Spiritual Stones# and #Medallions#|.^", + /*german*/ "$CDie Weisen werden darauf&warten, daß der Held&#[[d]]# |#Heiligen Stein# oder #Amulett#|" + "#Heilige Steine# oder #Amulette#| sammelt.^", + /*french*/ "$CLes êtres de sagesse attendront le héros muni de #[[d]]# |#Pierre Ancestrale# ou #Médaillon#" + "|#Pierres Ancestrales# ou #Médaillons#|.^", + {QM_YELLOW, QM_BLUE, QM_RED})); + // /*spanish*/$CLos sabios aguardarán a que el héroe obtenga #[[d]]# |#piedra espiritual# o #medallón#| //#piedras espirtuales# y #medallones#|.^ hintTextTable[RHT_BRIDGE_DUNGEONS_HINT] = HintText(CustomMessage("$mThe awakened ones will await for the Hero to conquer #[[d]] Dungeon||s|#.^", - /*german*/ "$mDie Weisen werden darauf warten, daß der Held #[[d]] Labyrinth||e|# abschließt.^", + /*german*/ "$mDie Weisen werden darauf&warten, daß der Held&#[[d]] Labyrinth||e|# abschließt.^", /*french*/ "$mLes êtres de sagesse attendront la conquête de #[[d]] Donjon||s|#.^", {QM_PINK})); // /*spanish*/$mLos sabios aguardarán a que el héroe complete #[[d]] mazmorra||s|#.^ hintTextTable[RHT_BRIDGE_TOKENS_HINT] = HintText(CustomMessage("$sThe awakened ones will await for the Hero to collect #[[d]] Gold Skulltula Token||s|#.^", - /*german*/ "$sDie Weisen werden darauf warten, daß der Held #[[d]] Skulltula-Symbol||e|# sammelt.^", + /*german*/ "$sDie Weisen werden darauf&warten, daß der Held&#[[d]] Skulltula-Symbol||e|# sammelt.^", /*french*/ "$sLes êtres de sagesse attendront le héros muni de #[[d]] Symbole||s| de Skulltula d'or#.^", {QM_YELLOW})); // /*spanish*/$sLos sabios aguardarán a que el héroe obtenga #[[d]] símbolo||s| de skulltula dorada#.^ hintTextTable[RHT_BRIDGE_GREG_HINT] = HintText(CustomMessage("$gThe awakened ones will await for the Hero to find #Greg#.^", + /*german*/ "$gDie Weisen werden darauf&warten, daß der Held&#Greg# findet.^", + /*french*/ "$gLes êtres de sagesse attendront le héros muni de #Greg#.^", {QM_GREEN})); @@ -2034,7 +2034,7 @@ void StaticData::HintTable_Init() { // /*spanish*/$bY obtendrás la llave del #señor del mal# desde el #inicio#.^ hintTextTable[RHT_GANON_BK_VANILLA_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be kept in a big chest #inside its tower#.^", - /*german*/ "$bUnd der #Schlüssel des Bösen#, wird in der großen Truhe #im Teufelsturm# zu finden sein.^", + /*german*/ "$bUnd der #Schlüssel des Bösen#,&wird in der großen Truhe&#im Teufelsturm# zu finden sein.^", /*french*/ "$bAussi, la #clé du Malin# sera encoffrée #dans sa tour#.^", {QM_PINK, QM_LBLUE})); // /*spanish*/$bY la llave del #señor del mal# aguardará en un gran cofre de #su torre#.^ @@ -2070,7 +2070,7 @@ void StaticData::HintTable_Init() { // /*spanish*/$bY el héroe recibirá la llave del #señor del mal# cuando haya completado la #Trifuerza#.^ hintTextTable[RHT_GANON_BK_SKULLTULA_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be provided by the cursed rich man once #100 Gold Skulltula Tokens# are retrieved.^", - /*german*/ "$bUnd der #Schlüssel des Bösen# wird von einem verfluchten reichen Mann verliehen, sobald #100 Goldene Skulltula-Symbole# wiedererlangt wurden.^", + /*german*/ "$bUnd der #Schlüssel des Bösen# wird von einem verfluchten reichen Mann verliehen, sobald #100 Skulltula-Symbole# gesammelt wurden.^", /*french*/ "$bAussi, la #clé du Malin# sera&donnée par l'homme maudit une fois que #100 Symboles de Skulltula d'or# auront été trouvés.^", {QM_PINK, QM_YELLOW})); // /*spanish*/$bY el rico maldito entregará la llave&del #señor de mal# tras obtener&100 símbolos de skulltula dorada#.^ @@ -2100,7 +2100,7 @@ void StaticData::HintTable_Init() { // /*spanish*/$bY #Zelda# entregará la llave del #señor del mal# tras obtener #[[d]]# piedra| espiritual o medallón|s espirituales o medallones|#.^ hintTextTable[RHT_LACS_DUNGEONS_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be provided by #Zelda# once #[[d]] Dungeon|# is|s# are| conquered.^", - /*german*/ "$bUnd der #Schlüssel des Bösen# wird von #Zelda# verliehen, sobald #[[d]] Labyrinth|# abgeschlossen wurde|e# abgeschlossen wurden|.^", + /*german*/ "$bUnd der #Schlüssel des Bösen# wird von #Zelda# verliehen, sobald #[[d]] Labyrinth|# abgeschloßen wurde|e# abgeschloßen wurden|.^", /*french*/ "$bAussi, la #clé du Malin# sera fournie par #Zelda# une fois qu|' #[[d]] donjon #sera conquis|e #[[d]] donjons# seront conquis|.^", {QM_PINK, QM_YELLOW, QM_PINK})); // /*spanish*/$bY #Zelda# entregará la llave del #señor del mal# tras completar #[[d]] mazmorra||s|#.^ @@ -2138,32 +2138,32 @@ void StaticData::HintTable_Init() { // /*spanish*/Según dicen, #[[1]]# protege la torre de Ganon hintTextTable[RHT_LIGHT_TRIAL] = HintText(CustomMessage("the Light Trial", - /*german*/ "die Prüfung des Lichts", + /*german*/ "das Licht-Siegel", /*french*/ "l'épreuve de la Lumière")); // /*spanish*/la prueba de la luz hintTextTable[RHT_FOREST_TRIAL] = HintText(CustomMessage("the Forest Trial", - /*german*/ "die Prüfung des Waldes", + /*german*/ "das Wald-Siegel", /*french*/ "l'épreuve de la Forêt")); // /*spanish*/la prueba del bosque hintTextTable[RHT_FIRE_TRIAL] = HintText(CustomMessage("the Fire Trial", - /*german*/ "die Prüfung des Feuers", + /*german*/ "das Feuer-Siegel", /*french*/ "l'épreuve du Feu")); // /*spanish*/la prueba del fuego hintTextTable[RHT_WATER_TRIAL] = HintText(CustomMessage("the Water Trial", - /*german*/ "die Prüfung des Wassers", + /*german*/ "das Wasser-Siegel", /*french*/ "l'épreuve de l'Eau")); // /*spanish*/la prueba del agua hintTextTable[RHT_SPIRIT_TRIAL] = HintText(CustomMessage("the Spirit Trial", - /*german*/ "die Prüfung der Geister", + /*german*/ "das Geister-Siegel", /*french*/ "l'épreuve de l'Esprit")); // /*spanish*/la prueba del espíritu hintTextTable[RHT_SHADOW_TRIAL] = HintText(CustomMessage("the Shadow Trial", - /*german*/ "die Prüfung des Schattens", + /*german*/ "das Schatten-Siegel", /*french*/ "l'épreuve de l'Ombre")); // /*spanish*/la prueba de las sombras @@ -2172,7 +2172,7 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_CHILD_ALTAR_STONES] = HintText(CustomMessage("3 Spiritual Stones found in Hyrule...^$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^", - /*german*/ "Drei Heilige Steine, zu finden in Hyrule...$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^", + /*german*/ "Drei Heilige Steine, zu finden in Hyrule...^$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^", /*french*/ "Les trois Pierres Ancestrales cachées&dans Hyrule...$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^", {QM_GREEN, QM_RED, QM_BLUE}, {true, true, true})); // /*spanish*/ Tres piedras espirituales halladas por Hyrule...$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^ @@ -2183,18 +2183,18 @@ void StaticData::HintTable_Init() { // /*spanish*/$oPara aquel que se convierta en el héroe...&La puerta al futuro está a su disposición... hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY] = HintText(CustomMessage("$cYe who may become a Hero...&Stand with the Ocarina and&play the Song of Time.", - /*german*/ "$cJener auf dem Weg des Helden...&Nehme er seine Okarina zur Hand und&spiele hier die Hymne der Zeit.", + /*german*/ "$cJener auf dem Weg des Helden...&Nehme er seine Okarina zur Hand und spiele hier die Hymne der Zeit.", /*french*/ "$cÀ celui qui a quête de devenir&héros...&Portez l'Ocarina et jouez&le chant du temps.")); // /*spanish*/$cPara aquel que se convierta en el héroe...&Tome la ocarina y&entone la Canción del Tiempo. - + hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED] = HintText(CustomMessage("$iYe who may become a Hero...&Offer the spiritual stones and&play the Song of Time.", - /*german*/ "$iJener mit den drei Heiligen Steinen&nehme seine Okarina zur Hand und&spiele hier die Hymne der Zeit.", + /*german*/ "$iJener mit den drei Heiligen Steinen nehme er seine Okarina zur Hand und spiele hier die Hymne der Zeit.", /*french*/ "$iÀ celui qui a quête de devenir&héros... Présentez les Pierres&Ancestrales et jouez&le chant du temps.")); // /*spanish*/$iPara aquel que se convierta en el héroe...&Tome las piedras espirituales y&entone la Canción del Tiempo. hintTextTable[RHT_ADULT_ALTAR_MEDALLIONS] = HintText(CustomMessage("An awakening voice from the Sacred Realm will call those destined to be Sages, who dwell in the #five temples#.^" "$8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^" , - /*german*/ "Beherrscht das Böse die Welt, weilen&jene Weisen, die von der Stimme des Heiligen Reiches erweckt werden, noch&in den #fünf Tempeln#.^" + /*german*/ "Beherrscht das Böse die Welt, verweilen die Weisen, erweckt von der Stimme des Heiligen Reiches, noch in den #fünf Tempeln#.^" "$8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^", /*french*/ "Quand le mal aura triomphé, une voix du Saint Royaume appellera ceux cachés dans les #cinq temples#, destinés^à être Sages.^" "$8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^", @@ -2203,7 +2203,7 @@ void StaticData::HintTable_Init() { // $8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^ hintTextTable[RHT_ADULT_ALTAR_TEXT_END] = HintText(CustomMessage("$kTogether with the Hero of Time, the awakened ones will return the light of peace to the world...", - /*german*/ "$kZusammen mit dem Auserwählten werden diese ihre Kräfte einsetzen, um der Welt den Frieden wiederzugeben.", + /*german*/ "$kZusammen mit dem Auserwählten werden diese ihre Kräfte&einsetzen, um der Welt den&Frieden wiederzugeben.", /*french*/ "$kEnsemble avec le Héros du Temps, ces Sages emprisonneront le mal et réinstaureront la lumière de paix dans le monde...")); // /*spanish*/Con el Héroe del Tiempo, aquellos&que despierten detendrán el mal y&volverán al mundo de luz la paz... @@ -2212,54 +2212,59 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_GANONDORF_HINT_LA_ONLY] = HintText(CustomMessage("Ha ha ha... You'll never beat me by reflecting my lightning bolts and unleashing the arrows from #[[1]]#!", - /*german*/ "", + /*german*/ "Ha ha ha... Du wirst mich niemals besiegen, indem Du meine Blitze zurückschlägst...^und die Pfeile entfesselst, die #[[1]]# zu finden sind!", /*french*/ "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans les flèches que j'ai cachées dans #[[1]]#!", {QM_RED})); // /*spanish*/Ja, ja, ja... Nunca me derrotarás reflejando mis esferas de energía y desplegando la flecha de luz de #[[1]]#! hintTextTable[RHT_GANONDORF_HINT_MS_ONLY] = HintText(CustomMessage("Ha ha ha... You'll never defeat me, drop a castle on me and finish me off with the sacred blade from #[[2]]#!", - /*german*/ "", - /*french*/ "", + /*german*/ "Ha ha ha... Du wirst mich niemals besiegen, ein Schloß auf mich werfen...^und mich mit der legendären Klinge niederstrecken, die #[[2]]# versteckt ist!", + /*french*/ "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans l'Épée de Légende cachée dans #[[2]]#!", {QM_RED})); hintTextTable[RHT_GANONDORF_HINT_LA_AND_MS] = HintText(CustomMessage("Ha ha ha... You'll never beat me by reflecting my lightning bolts and unleashing the arrows from #[[1]]#!" "^And even if you do, you'll never find the legendary blade hidden in #[[2]]#!", - /*german*/ "", + /*german*/ "Ha ha ha... Du wirst mich niemals besiegen, indem Du meine Blitze zurückschlägst...^und die Pfeile entfesselst, die #[[1]]# zu finden sind!" + "^Und selbst wenn Du es tust,&wirst Du niemals die legendäre&Klinge finden, die #[[2]]# versteckt ist!", /*french*/ "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans les flèches que j'ai cachées dans #[[1]]#!" - "^Et même si tu les trouves, tu ne touveras jamais l'épée de légende cachée dans #[[2]]#!", + "^Et même si tu les trouves, tu ne touveras jamais l'Épée de Légende cachée dans #[[2]]#!", {QM_RED, QM_RED})); // /*spanish*/Ja, ja, ja... Nunca me derrotarás reflejando mis esferas de energía y desplegando la flecha de luz de #[[1]]#! // ^E incluso si lo haces, nunca encontrarás la espada legendaria escondida en #[[2]]#! hintTextTable[RHT_SHEIK_HINT_LA_ONLY] = HintText(CustomMessage("I overheard Ganondorf say that he misplaced the #Light Arrows# in #[[1]]#.", - /*german*/ "", + /*german*/ "Ich habe Ganondorf sagen hören, daß er die #Licht-Pfeile# #[[1]]# verlegt hat.", /*french*/ "J'ai entendu dire que Ganondorf aurait caché les #Flèches de Lumière# dans #[[1]]#.", {QM_YELLOW, QM_RED})); hintTextTable[RHT_DAMPE_DIARY] = HintText(CustomMessage("Whoever reads this, please enter #[[1]]#. I will let you have my #stretching, shrinking keepsake#.^I'm waiting for you.&--Dampé", - /*german*/ "Wer immer dies liest, der möge folgenden Ort aufsuchen: #[[1]]#. Ihm gebe ich meinen #dehnenden, schrumpfenden Schatz#.^Ich warte!&Boris", //RANDOTODO color in whatever refers to the hookshot + /*german*/ "Wer immer dies liest, der möge #[[1]]# nach meinem #langen, kurzen Schatz# suchen.^Ich warte!&Boris", /*french*/ "Toi qui lit ce journal, rends-toi dans #[[1]]#. Et peut-être auras-tu droit à mon précieux #trésor#.^Je t'attends...&--Igor", {QM_RED, QM_RED})); hintTextTable[RHT_GREG_HINT] = HintText(CustomMessage("By the way, if you're interested, I saw the shiniest #Green Rupee# somewhere in #[[1]]#.^It's said to have #mysterious powers#...^But then, it could just be another regular rupee.&Oh well.", - /*german*/ "", - /*french*/ "Au fait, si ça t'intéresse, j'ai aperçu le plus éclatant des #Rubis Verts# quelque part à #[[1]]#. On dit qu'il possède des pouvoirs mystérieux... Mais bon, ça pourrait juste être un autre rubis ordinaire.",//RANDOTODO color in mysterious powers + /*german*/ "Übrigens, falls es Dich interessiert, ich habe #[[1]]# den glänzendsten #Grünen Rubin# gesehen.^Er soll #mysteriöse Kräfte# haben...^Aber naja, es könnte auch einfach nur ein normaler Rubin sein.", + /*french*/ "Au fait, si ça t'intéresse, j'ai aperçu le plus éclatant des #Rubis Verts# quelque part à #[[1]]#.^On dit qu'il possède des #pouvoirs mystérieux#...^Mais bon, ça pourrait juste être un autre rubis ordinaire.", {QM_GREEN, QM_RED, QM_RED})); hintTextTable[RHT_SARIA_TALK_HINT] = HintText(CustomMessage("Did you feel the #surge of magic# recently? A mysterious bird told me it came from #[[1]]#.^You should check that place out, @!", - /*german*/ "", - /*french*/ "As-tu récemment ressenti une vague de #puissance magique#? Un mystérieux hibou m'a dit qu'elle provenait du #[[1]]#. Tu devrais aller y jeter un coup d'oeil, @!", - {QM_GREEN, QM_RED})); + /*german*/ "Hast Du kürzlich den #Magieschub# gespürt? Ein geheimnisvoller Vogel meinte, daß er #[[1]]# am stärksten zu spüren war.^Du solltest Dir diesen Ort mal ansehen, @!", + /*french*/ "As-tu récemment ressenti une vague de #puissance magique#? Un mystérieux hibou m'a dit qu'elle provenait du #[[1]]#.^Tu devrais aller y jeter un coup d'oeil, @!", + {QM_GREEN, QM_RED})); hintTextTable[RHT_SARIA_SONG_HINT] = HintText(CustomMessage("Did you feel the #surge of magic# recently? A mysterious bird told me it came from #[[1]]#.^You should check that place out, @!\x0B", - /*german*/ "", - /*french*/ "As-tu récemment ressenti une vague de #puissance magique#? Un mystérieux hibou m'a dit qu'elle provenait du #[[1]]#. Tu devrais aller y jeter un coup d'oeil, @!\x0B", - {QM_GREEN, QM_RED}, {}, TEXTBOX_TYPE_BLUE)); + /*german*/ "Hast Du kürzlich den #Magieschub# gespürt? Ein geheimnisvoller Vogel meinte, daß er #[[1]]# am stärksten zu spüren war.^Du solltest Dir diesen Ort mal ansehen, @!\x0B", + /*french*/ "As-tu récemment ressenti une vague de #puissance magique#? Un mystérieux hibou m'a dit qu'elle provenait du #[[1]]#.^Tu devrais aller y jeter un coup d'oeil, @!\x0B", + {QM_GREEN, QM_RED}, {}, TEXTBOX_TYPE_BLUE)); hintTextTable[RHT_LOACH_HINT] = HintText(CustomMessage("What?^You wanna know about the&%rHyrule Loach%w?^It's a big fish, but it's so rare that I'll give my %g[[1]]%w to anyone who catches it. Seriously!", - {QM_RED})); + /*german*/ "Was?^Du willst etwas über die&%rhylianische Forelle%w wissen?&Es ist ein riesiger Fisch,&der unfassbar selten ist!^Wenn Du mir eine bringst, |springt|springen| für Dich&%g[[1]]%w dabei raus.&Ganz im Ernst!", + /*french*/ "Quoi?&Tu veux en savoir plus sur le&%rBrochet d'Hyrule%w?^C'est un gros poisson, mais il&est si rare que je donne&%g[[1]]%w&à celui qui l'attrape.^Ouais, j'suis sérieux!", + {QM_RED})); hintTextTable[RHT_FISHING_POLE_HINT] = HintText(CustomMessage("^If I remember correctly, I lost it somewhere in #[[1]]#...&Let me know if you find it!", + /*german*/ "Wenn ich mich recht erinnere,&habe ich sie irgendwo&#[[1]]#&verloren...&Sag mir Bescheid, wenn Du sie findest!", + /*french*/ "Si je me souviens bien, il me&semble que je l'ai perdue&quelque part dans&#[[1]]#...^Fais-moi signe si jamais&tu la trouves!", {QM_RED})); /*-------------------------- @@ -2267,52 +2272,90 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_WARP_SONG] = HintText(CustomMessage("Warp to&#[[1]]#?&" + TWO_WAY_CHOICE() + "#OK&No#", - /*german*/ "Zu&#[[1]]#?&" + TWO_WAY_CHOICE() + "#OK&No#", + /*german*/ "Das Ziel liegt&#[[1]]#!&" + TWO_WAY_CHOICE() + "#Ja!&Nein!#", /*french*/ "Se téléporter vers&#[[1]]#?&" + TWO_WAY_CHOICE() + "#OK!&Non#", {QM_RED, QM_GREEN})); - - /*-------------------------- + + /*-------------------------- | STATIC LOCATION HINTS | ---------------------------*/ hintTextTable[RHT_HBA_HINT_SIGN] = HintText(CustomMessage("#Horseback Archery# Range Prizes:&1000: #[[1]]#&1500: #[[2]]#^@'s Record: #" + CustomMessage::POINTS(HS_HORSE_ARCHERY) + "#", + /*german*/ "#Bogenschießen zu Pferde#&Schießstandpreise:&1000: #[[1]]#^1500: #[[2]]#^@'s Rekord: #" + CustomMessage::POINTS(HS_HORSE_ARCHERY) + "#", + /*french*/ "Récompenses de l'#Archerie Montée#:&1000: #[[1]]#&1500: #[[2]]#^Record de @: #" + CustomMessage::POINTS(HS_HORSE_ARCHERY) + "#", {QM_RED, QM_GREEN, QM_GREEN, QM_GREEN}, {}, TEXTBOX_TYPE_WOODEN)); - hintTextTable[RHT_HBA_HINT_NOT_ON_HORSE] = HintText(CustomMessage("Hey, rookie!&Come back on your #horse# and take on then #Horseback Archery# challenge!^" - "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for my #[[2]]#!", + hintTextTable[RHT_HBA_HINT_NOT_ON_HORSE] = HintText(CustomMessage("Hey, rookie!&Come back on your #horse# and take on the #Horseback Archery# challenge!^" + "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for #[[2]]#!", + /*german*/ "Hey, Kleiner! Das ist die %rArena für Bogenschießen zu Pferde%w.^" + "Wenn Du reiten kannst, beeindrucke mich mit #1.000 Punkten# und gewinne #[[1]]#!^Knackst Du #1.500 Punkte# gibt es #[[2]]#!", + /*french*/ "Hé, l'nouveau!&Reviens avec ton #cheval# et essaie notre #Terrain d'Archerie Montée#^" + "Impressionne-moi avec un score de 1000 pour gagner #[[1]]# ou atteins 1500 pour #[[2]]#!", {QM_RED, QM_RED, QM_GREEN, QM_GREEN})); hintTextTable[RHT_HBA_HINT_INITIAL] = HintText(CustomMessage("Hey, rookie!&Want to take on the #Horseback Archery# challenge?^" - "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for my #[[2]]#!\x0B", + "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for #[[2]]#!\x0B", + /*german*/ "Hey, Kleiner! Wie wäre es mit einer Runde %rBogenschießen zu Pferde%w!?^" + "Wenn Du mich mit #1.000 Punkten# beeindruckst, erhältst Du #[[1]]#!^Knackst Du #1.500 Punkte# gibt es #[[2]]#!\x0B", + /*french*/ "Hé, l'nouveau!&Tu veux essayer notre #Terrain d'Archerie Montée#^" + "Impressionne-moi avec un score de 1000 pour gagner #[[1]]# ou atteins 1500 pour #[[2]]#!\x0B", {QM_RED, QM_GREEN, QM_GREEN})); hintTextTable[RHT_HBA_HINT_HAVE_1000] = HintText(CustomMessage("Hey, newcomer!&Want to take on the #Horseback Archery# challenge?^" - "Prove yourself to be a horsemaster by scoring 1500 points to win my #[[1]]#!\x0B", + "Prove yourself to be a horsemaster by scoring 1500 points to win #[[2]]#!\x0B", + /*german*/ "Hey, Kleiner! Wie wäre es mit einer Runde %rBogenschießen zu Pferde%w!?^" + "Versuche doch jetzt, #1.500 Punkte# zu erreichen für #[[2]]#!\x0B", + /*french*/ "Hé, l'nouveau!&Tu veux essayer notre #Terrain d'Archerie Montée#^" + "Prouve que tu es un véritable cavalier en obtenant 1500 points pour gagner #[[2]]#!\x0B", {QM_RED, QM_GREEN})); hintTextTable[RHT_MALON_HINT_HOW_IS_EPONA] = HintText(CustomMessage("@! You should come back with Epona and try to beat my time on the #Obstacle Course#!^" "If you beat my time, I'll give you my favourite #cow# Elsie and her toy #[[1]]#!", + /*german*/ "@! Warum kommst Du nicht mit Epona zurück und versuchst Dich an dem #Hindernisparcours#?^" + "Gelingt es Dir den Rekord zu brechen, bekommst Du meine #Lieblingskuh# Elsie^und ihr Lieblingsspielzeug, #[[1]]#!", + /*french*/ "@! Tu devrais revenir avec Epona et essayer de battre mon temps sur le #Parcours d'Obstacles#!^" + "Si tu bats mon temps, je te donnerai ma vache préférée, Elsie, ainsi que son jouet #[[1]]#!", {QM_RED, QM_BLUE, QM_GREEN})); hintTextTable[RHT_MALON_HINT_OBSTICLE_COURSE] = HintText(CustomMessage("How about trying the #Obstacle Course?# If you beat my time I'll let you keep my favourite #cow# Elsie and her toy #[[1]]#!^" "Challenge the #Obstacle Course?#&\x1B&#Let's go&No thanks#", + /*german*/ "Warum versuchst Du Dich nicht mit Epona an dem #Hindernisparcours#?^" + "Gelingt es Dir den Rekord zu brechen, bekommst Du meine #Lieblingskuh# Elsie^und ihr Lieblingsspielzeug, #[[1]]#!^" + "Wie sieht's aus?&Möchtest Du es versuchen?\x1B&#Ja!&Nein!#", + /*french*/ "Que dirais-tu d'essayer le #Parcours d'Obstacles#? Si tu bats mon temps, je te donnerai ma vache préférée, Elsie, et son jouet #[[1]]#!^" + "Tenter le #Parcours d'Obstacles#?&\x1B&#Allons-y&Non merci#", {QM_RED, QM_BLUE, QM_GREEN, QM_RED, QM_GREEN})); hintTextTable[RHT_MALON_HINT_TURNING_EVIL] = HintText(CustomMessage("@? Is that you? ^If I ran the ranch, I'd build an #Obstacle Course#, and whoever gets the best time would win a #cow#!^" "Elsie loves sharing her #[[1]]# with new people, It'll be fun!^...But Ingo won't let me...", + /*german*/ "@? Bist Du das?^Wenn ich die Farm leiten würde, würde ich einen #Hindernisparcours# bauen, und wer die beste Zeit schafft, gewinnt eine #Kuh#!^" + "Elsie würde es lieben, #[[1]]# mit neuen Leuten zu teilen, es würde Spaß machen!^...Aber Basil läßt mich nicht...", + /*french*/ "@? C'est toi?^Si je dirigeais le ranch, je construirais un #Parcours d'Obstacles#, et celui qui obtiendrait le meilleur temps gagnerait une #vache#!^" + "Elsie adore partager son #[[1]]# avec de nouvelles personnes, ce serait amusant!^... Mais Ingo ne me laisse pas faire...", {QM_RED, QM_BLUE, QM_GREEN})); hintTextTable[RHT_MALON_HINT_INGO_TEMPTED] = HintText(CustomMessage("@! You should come back in the morning and try to beat my time on the #Obstacle Course#!^" "If you beat my time, I'll give you my favourite #cow# Elsie and her toy #[[1]]#!", + /*german*/ "@! Warum kommst Du nicht morgens wieder und versuchst Dich an dem #Hindernisparcours#?^" + "Gelingt es Dir den Rekord zu brechen, bekommst Du meine #Lieblingskuh# Elsie^und ihr Lieblingsspielzeug, #[[1]]#!", + /*french*/ "@! Tu devrais revenir le matin et essayer de battre mon temps sur le #Parcours d'Obstacles#!^" + "Si tu bats mon temps, je te donnerai ma vache préférée, Elsie, ainsi que son jouet #[[1]]#!", {QM_RED, QM_BLUE, QM_GREEN})); hintTextTable[RHT_CHICKENS_HINT] = HintText(CustomMessage("You! Please!&Bring my Cucco's back to my pen!&I'll give you my #[[1]]#!", + /*german*/ "Was soll ich nur tun?! Bitte!&Hilf mir, die Hühner wieder einzusammeln!^Ich gebe Dir auch #[[1]]#, wenn du mir hilfst!", + /*french*/ "Mes Cocottes sont perdues!&Dépose toutes les cocottes dans cet enclos!&Je te donnerai #[[1]]#!", {QM_GREEN})); hintTextTable[RHT_BIG_POES_HINT] = HintText(CustomMessage("You have #\x1E\x01 Poe Points#! Reach 1000 and you'll get a #[[1]]#!", + /*german*/ "Du hast nun #\x1E\x01 Punkte# auf dem Nachtschwärmer-Konto gut!^" + "Hast Du %y1.000 Punkte%w gesammelt dann |wartet|warten| #[[1]]# auf Dich! Hehehe...", + /*french*/ "Tu as #\x1E\x01 Points d'Âme#! Atteins 1000 et tu recevras #[[1]]#!", {QM_YELLOW, QM_GREEN})); hintTextTable[RHT_BIGGORON_HINT] = HintText(CustomMessage("Arrrrrre you here to claim my finest #[[1]]#? Shoooooow me your #Claim Check#.", + /*german*/ "Arrrrr, bist Du hier, um etwas von mir schmieden zu lassen? Zeig mir das #Zertifikat# und #[[1]]# |gehört|gehören| Dir!", + /*french*/ "Eeeeeees-tu ici pour réclaaaaaamer mon plus beau #[[1]]#? Moooooontre-moi ton #Certificat#.", {QM_GREEN, QM_RED})); hintTextTable[RHT_FROGS_HINT] = HintText(CustomMessage("Some frogs holding #[[1]]# are looking at you from underwater...", @@ -2321,15 +2364,22 @@ void StaticData::HintTable_Init() { {QM_GREEN})); hintTextTable[RHT_OOT_HINT] = HintText(CustomMessage("Bring the #Spiritual Stones# to the past so you can receive #[[1]]# from Zelda and learn #[[2]]#!", + /*german*/ "Bringe die #Heiligen Steine# in die Vergangenheit, damit Du #[[1]]# von...^" + "Prinzessin Zelda erhältst und #[[2]]# lernst, um Hyrule vor dem Untergang zu bewahren!", + /*french*/ "Amène les #Pierres Spirituelles# dans le passé et Zelda te donnera #[[1]]# et t'apprendra #[[2]]# !", {QM_BLUE, QM_GREEN, QM_GREEN})); hintTextTable[RHT_SKULLS_HINT] = HintText(CustomMessage("Yeaaarrgh! I'm cursed!!^Please save me by destroying #[[d]] Spiders of the Curse# and I will give you my #[[1]]#!", - /*german*/ "Yeaaarrgh! Ich bin verflucht!^Bitte rette mich, indem Du #[[d]] Skulltulas# zerstörst und ich werde Dir dafür #[[1]]# geben!", + /*german*/ "Aarrrgh! Ich bin verflucht!^Bitte rette mich, indem Du&#[[d]] Skulltulas# zerstörst und ich&werde Dir dafür #[[1]]# geben!", /*french*/ "Yeaaarrgh! Je suis maudit!^Détruit encore #[[d]] Araignées de la Malédiction# et j'aurai quelque chose à te donner! #([[1]])#", {QM_YELLOW, QM_GREEN})); hintTextTable[RHT_MASK_SHOP_HINT] = HintText(CustomMessage("Some young scrubs in the #Deku Theatre# love seeing Masks!^" "They'll give you #[[1]]# if you show them the #Skull Mask#, and #[[2]]# if you show them the #Mask of Truth#!", + /*german*/ "Ein paar junge Dekus in der #Waldbühne# lieben es, Masken anzuschauen!^" + "Sie geben Dir #[[1]]#, wenn Du ihnen die #Schädel-Maske# zeigst,^und #[[2]]#, wenn Du ihnen die #Maske des Wissens# zeigst!", + /*french*/ "De jeunes Pestes Mojo qui se trouvent dans le #Théâtre Mojo# adorent voir des masques !^" + "Elles te donneront #[[1]]# si tu leur montres le #Masque de Mort#, et #[[2]]# si tu leur montres le #Masque de Vérité#.", {QM_GREEN, QM_GREEN, QM_RED, QM_GREEN, QM_RED})); /*-------------------------- @@ -2337,33 +2387,34 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_GANON_JOKE01] = HintText(CustomMessage("Oh! It's @.&I was expecting someone called Sheik.&Do you know what happened to them?", - /*german*/ "", + /*german*/ "Oh! Du bist es @.&Ich habe eigentlich jemanden namens Shiek erwartet. Weißt Du, was mit ihm passiert ist?", /*french*/ "Ah, c'est @.&J'attendais un certain Sheik.&Tu sais ce qui lui est arrivé?")); // /*spanish*/¡Oh! Pero si es @.&Estaba esperando a alguien llamado Sheik. ¿Sabes qué puede haberle pasado? hintTextTable[RHT_GANON_JOKE02] = HintText(CustomMessage("I knew I shouldn't have put the key on the other side of my door.", - /*german*/ "", + /*german*/ "Ich wußte, ich hätte den Schlüssel nicht draußen liegen lassen sollen.", /*french*/ "J'aurais dû garder la clé ici. Hélas...")); // /*spanish*/Sabía que no tendría que haber dejado la llave al otro lado de la puerta. hintTextTable[RHT_GANON_JOKE03] = HintText(CustomMessage("Looks like it's time for a round of tennis.", - /*german*/ "", + /*german*/ "Sieht so aus, als wäre es Zeit für eine Runde Tennis.", /*french*/ "C'est l'heure de jouer au tennis.")); // /*spanish*/Parece que es hora de una pachanga de tenis. hintTextTable[RHT_GANON_JOKE04] = HintText(CustomMessage("You'll never deflect my bolts of energy with your sword, then shoot me with those Light Arrows you happen to have.", - /*german*/ "", + /*german*/ "Du wirst mich niemals besiegen, indem Du meine Blitze zurückschlägst und mich dann mit Licht-Pfeilen beschießt!", /*french*/ "Ne perds pas ton temps à frapper mes éclairs d'énergie avec ton épée et me tirer avec tes flèches de Lumière!")); // /*spanish*/Nunca reflejarás mis esferas de energía con tu espada, para después dispararme con las flechas de luz que tendrás. hintTextTable[RHT_GANON_JOKE05] = HintText(CustomMessage("Why did I leave my trident back in the desert?", - /*german*/ "", + /*german*/ "Verdammt... Warum habe ich meinen Dreizack in der Wüste gelassen?", /*french*/ "Sale bêtise... Et j'ai oublié mon trident dans le désert!")); // /*spanish*/Santa Hylia... ¿Por qué me habré dejado el tridente en el desierto? hintTextTable[RHT_GANON_JOKE06] = HintText(CustomMessage("Zelda is probably going to do something stupid, like send you back to your own timeline.^So this is " "quite meaningless. Do you really want to save this moron?", - /*german*/ "", + /*german*/ "Zelda wird wahrscheinlich wieder etwas Dummes tun, wie Dich in Deine eigene Zeit zurück zu schicken." + "^Ziemlich sinnlos wenn Du mich fragst. Willst Du diesen Schwachkopf wirklich retten?", /*french*/ "Même si je suis vaincu... Zelda te renverra dans ton ère, et je reviendrai conquérir!^Telle est la " "prophécie d'Hyrule Historia!")); // /*spanish*/Seguro que Zelda trata de hacer alguna tontería, como enviarte de vuelta a tu línea temporal.^No tiene @@ -2371,30 +2422,31 @@ void StaticData::HintTable_Init() { hintTextTable[RHT_GANON_JOKE07] = HintText(CustomMessage("What about Zelda makes you think&she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the " "hungry,&and my castle floats.", - /*german*/ "", + /*german*/ "Was an Zelda lässt Dich glauben, sie wäre eine bessere Herrscherin als ich?^" + "^Ich habe die Lon Lon-Farm gerettet, den Hungrigen etwas zu Essen gegeben, und mein Schloß schwebt!", /*french*/ "Zelda ne sera jamais un meilleur monarque que moi!^J'ai un château volant, mes sujets sont des belles " "amazones... et mes Moblins sont clairement plus puissants que jamais!")); // /*spanish*/¿Qué te hace pensar que Zelda gobierna mejor que yo?^Yo he salvado el Rancho Lon Lon,&he alimentado a // los hambrientos&y hasta hago que mi castillo flote. hintTextTable[RHT_GANON_JOKE08] = HintText(CustomMessage("I've learned this spell,&it's really neat,&I'll keep it later&for your treat!", - /*german*/ "", + /*german*/ "Zelda weint, das arme Kind, ihr Retter läuft herum wie blind!", /*french*/ "Gamin, ton destin achève,&sous mon sort tu périras!&Cette partie ne fut pas brève,&et cette mort, tu subiras!")); // /*spanish*/Veamos ahora que harás,&la batalla ha de comenzar,&te enviaré de una vez al más allá,&¿listo para // afrontar la verdad? hintTextTable[RHT_GANON_JOKE09] = HintText(CustomMessage("Many tricks are up my sleeve,&to save yourself&you'd better leave!", - /*german*/ "", + /*german*/ "Da hilft kein Flehen und kein Flennen, bald wird dieses Weltlein brennen!", /*french*/ "Sale petit garnement,&tu fais erreur!&C'est maintenant que marque&ta dernière heure!")); // /*spanish*/¿No osarás a mí enfrentarte?&Rimas aparte,&¡voy a matarte! hintTextTable[RHT_GANON_JOKE10] = HintText(CustomMessage("After what you did to Koholint Island, how can you call me the bad guy?", - /*german*/ "", + /*german*/ "Nach allem was Du auf Kokolint angerichtet hast, wie kannst Du mich den Bösewicht nennen?", /*french*/ "J'admire ce que tu as fait à l'Île Koholint... Toi et moi, nous devrions faire équipe!")); // /*spanish*/Después de lo que le hiciste a la Isla Koholint, ¿cómo te atreves a llamarme malvado? hintTextTable[RHT_GANON_JOKE11] = HintText(CustomMessage("Today, let's begin down&'The Hero is Defeated' timeline.", - /*german*/ "", + /*german*/ "Heute beginnen wir die&'Der Held wurde besiegt'-Zeitlinie.", /*french*/ "Si tu me vaincs, Hyrule sera englouti... mais si tu meurs, on aura A Link to the Past, le meilleur opus " "de la série!")); // /*spanish*/Hoy daremos lugar a la línea temporal del Héroe Derrotado.&¡Prepárate para el culmen de esta saga! @@ -2402,21 +2454,24 @@ void StaticData::HintTable_Init() { /*-------------------------- | Misc utilities | ---------------------------*/ - + hintTextTable[RHT_YOUR_POCKET] = HintText(CustomMessage("your pocket", - /*german*/ "deine Tasche", + /*german*/ "in deiner Tasche", /*french*/ "tes poches")); // /*spanish*/tu bolsillo - hintTextTable[RHT_ISOLATED_PLACE] = HintText(CustomMessage("an Isolated Place")); + hintTextTable[RHT_ISOLATED_PLACE] = HintText(CustomMessage("an Isolated Place", + /*german*/ "an einem abgelegenen Ort", + /*french*/ "un lieu isolé")); - hintTextTable[RHT_DUNGEON_ORDINARY] = HintText(CustomMessage(" It's ordinary.", - /*german*/ "&Sieht aus wie immer.", - /*french*/ "&Elle vous semble %rordinaire%w.")); + hintTextTable[RHT_DUNGEON_ORDINARY] = HintText(CustomMessage("&It's %gordinary%w.", + /*german*/ "&Man kann darauf die Worte&%gOcarina of Time%w entziffern...", + /*french*/ "&Elle vous semble %gordinaire%w.")); - hintTextTable[RHT_DUNGEON_MASTERFUL] = HintText(CustomMessage(" It's masterful!", - /*german*/ "&Man kann darauf die Worte&%r\"Master Quest\"%w entziffern...", - /*french*/ "&Étrange... les mots %r\"Master&Quest\"%w sont gravés dessus.")); + hintTextTable[RHT_DUNGEON_MASTERFUL] = HintText(CustomMessage("&It's %rmasterful%w!", + /*german*/ "&Man kann darauf die Worte&%rMaster Quest%w entziffern...", + /*french*/ "&Étrange... les mots %r\"Master_Quest\"%w sont gravés dessus.")); + // clang-format on } -} +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index ed447fe303..aa375716f6 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -4,66 +4,68 @@ namespace Rando { void StaticData::HintTable_Init_Exclude_Dungeon() { - /*-------------------------- - | DEKU TREE | - ---------------------------*/ - hintTextTable[RHT_DEKU_TREE_MAP_CHEST] = HintText(CustomMessage("They say that in the #center of the Deku Tree# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß im #Zentrum des Deku-Baums# #[[1]]# läge.", + // clang-format off + + /*-------------------------- + | DEKU TREE | + ---------------------------*/ + hintTextTable[RHT_DEKU_TREE_MAP_CHEST] = HintText(CustomMessage("They say that in the #center of the Deku Tree# lies #[[1]]#.", + /*german*/ "Man erzählt sich, daß im #Zentrum des Deku-Baumes# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #le centre de l'Arbre Mojo# recèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, al #centro del Gran Árbol Deku# yace #[[1]]#. hintTextTable[RHT_DEKU_TREE_SLINGSHOT_CHEST] = HintText(CustomMessage("They say that the #treasure guarded by a scrub# in the Deku Tree is #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #von einem Deku bewachter Schatz# im Deku-Baum #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß ein #von einem Deku bewachter Schatz# im Deku-Baum #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trésor protégé par une peste# dans l'Arbre Mojo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku del Gran Árbol Deku# esconde #[[1]]#. hintTextTable[RHT_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST] = HintText(CustomMessage("They say that the #treasure guarded by a scrub# in the Deku Tree is #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #von einem Deku bewachter Schatz# im Deku-Baum #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß ein #von einem Deku bewachter Schatz# im Deku-Baum #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trésor protégé par une peste# dans l'Arbre Mojo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku del Gran Árbol Deku# esconde #[[1]]#. hintTextTable[RHT_DEKU_TREE_COMPASS_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Säulen aus Holz# im Deku-Baum zu #[[1]]# führen würden.", + /*german*/ "Man erzählt sich, daß die #Säulen aus Holz# im Deku-Baum #[[1]]# versperren würden.", /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. hintTextTable[RHT_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Säulen aus Holz# im Deku-Baum zu #[[1]]# führen würden.", + /*german*/ "Man erzählt sich, daß die #Säulen aus Holz# im Deku-Baum #[[1]]# versperren würden.", /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. hintTextTable[RHT_DEKU_TREE_BASEMENT_CHEST] = HintText(CustomMessage("They say that #webs in the Deku Tree# hide #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Spinnweben im Deku-Baum# #[[1]]# verbergen würden.", + /*german*/ "Man erzählt sich, daß #Weben im Deku-Baum# #[[1]]# verbergen würden.", /*french*/ "Selon moi, les #toiles dans l'Arbre Mojo# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, entre #telarañas del Gran Árbol Deku# yace #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that in the #center of the Deku Tree# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß im #Zentrum des Deku-Baums# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß im #Zentrum des Deku-Baumes# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #le centre de l'Arbre Mojo# recèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, al #centro del Gran Árbol Deku# yace #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that a #treasure guarded by a large spider# in the Deku Tree is #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #von einer großen Spinne bewachter Schatz# im Deku-Baum #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß ein #von einer großen Spinne bewachter Schatz#, im Deku-Baum, #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trésor protégé par une grosse araignée# dans l'Arbre Mojo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #gran araña del Gran Árbol Deku# esconde #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_SLINGSHOT_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Säulen aus Holz# im Deku-Baum zu #[[1]]# führen würden.", + /*german*/ "Man erzählt sich, daß die #Säulen aus Holz# im Deku-Baum #[[1]]# versperren würden.", /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Säulen aus Holz# im Deku-Baum zu #[[1]]# führen würden.", + /*german*/ "Man erzählt sich, daß die #Säulen aus Holz# im Deku-Baum #[[1]]# versperren würden.", /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_BASEMENT_CHEST] = HintText(CustomMessage("They say that #webs in the Deku Tree# hide #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Spinnweben im Deku-Baum# #[[1]]# verbergen würden.", + /*german*/ "Man erzählt sich, daß #Weben im Deku-Baum# #[[1]]# verbergen würden.", /*french*/ "Selon moi, les #toiles dans l'Arbre Mojo# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, entre #telarañas del Gran Árbol Deku# yace #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = HintText(CustomMessage("They say that #magical fire in the Deku Tree# leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #magisches Feuer im Deku-Baum# zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß #magisches Feuer im Deku-Baum# #[[1]]# blockiere.", /*french*/ "Selon moi, le #feu magique dans l'Arbre Mojo# éclaire #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #fuego mágico en el Gran Árbol Deku# conduce a #[[1]]#. @@ -73,59 +75,67 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ Según dicen, la #Reina Goma# porta #[[1]]#. {}, { CustomMessage("They say that the #Parasitic Armored Arachnid# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #gepanzerte parasitäre Spinne# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß der #gepanzerte Spinnenparasit# #[[1]]# besäße.", /*french*/ "Selon moi, le #monstre insectoïde géant# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #arácnido parasitario acorazado# porta #[[1]]#. hintTextTable[RHT_DEKU_TREE_GS_BASEMENT_BACK_ROOM] = HintText(CustomMessage("They say that a #spider deep within the Deku Tree# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne tief innerhalb des Deku-Baums# #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß eine #Spinne tief im Inneren des Deku-Baumes# #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula au centre de l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en las profundidades del Árbol Deku# otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_GS_BASEMENT_GATE] = HintText(CustomMessage("They say that a #web protects a spider# within the Deku Tree holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #von einer Webe geschützte Spinne# innerhalb des Deku-Baums #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine #von Weben geschützte Spinne# innerhalb des Deku-Baumes #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula derrière une toile dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula protegida por su tela# del Árbol Deku otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_GS_BASEMENT_VINES] = HintText(CustomMessage("They say that a #web protects a spider# within the Deku Tree holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #von einer Webe geschützte Spinne# innerhalb des Deku-Baums #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine #von Weben geschützte Spinne# innerhalb des Deku-Baumes #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula derrière une toile dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula protegida por su tela# del Árbol Deku otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_GS_COMPASS_ROOM] = HintText(CustomMessage("They say that a #spider atop the Deku Tree# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne auf der Spitze des Deku-Baums# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine #Spinne an der Spitze des Deku-Baumes# #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula au sommet de l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en lo alto del Árbol Deku# otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_GS_LOBBY] = HintText(CustomMessage("They say that a #spider in a crate# within the Deku Tree hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne in einer Kiste# innerhalb des Deku-Baums #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß eine #Spinne in einer Kiste# innerhalb des Deku-Baumes #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula dans une boîte dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula bajo una caja# del Árbol Deku otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_GS_PAST_BOULDER_VINES] = HintText(CustomMessage("They say that a #wall of rock protects a spider# within the Deku Tree holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #von einer Steinwand geschützte Spinne# innerhalb des Deku-Baums #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine #von einer Steinwand geschützte Spinne# innerhalb des Deku-Baumes #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula derrière des rochers dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula protegida por una pared rocosa# del Árbol Deku otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM] = HintText(CustomMessage("They say that a #spider deep within the Deku Tree# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne tief innerhalb des Deku-Baums# #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß eine #Spinne tief im Inneren des Deku-Baumes# #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula au centre de l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en las profundidades del Árbol Deku# otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_DEKU_SCRUB] = HintText(CustomMessage("They say that a #scrub in the Deku Tree# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku im Deku-Baum# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler im Deku-Baum# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo dans l'Arbre Mojo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku del Gran Árbol Deku# vende #[[1]]#. hintTextTable[RHT_DEKU_TREE_HEART] = HintText(CustomMessage("They say that a #heart in the Deku Tree# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Deku-Baum# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_DEKU_TREE_GRASS] = HintText(CustomMessage("They say that some #grass in the Deku Tree# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß etwas #Gras im Deku-Baum# #[[1]]# verstecke.", + /*french*/ "Selon moi, de l'#herbe dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_DEKU_TREE] = HintText(CustomMessage("They say that a #crate in the Deku Tree# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste im Deku-Baum# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans l'Arbre Mojo# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | DODONGOS CAVERN | ---------------------------*/ -hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("They say that #above King Dodongo# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #auf König Dodongo# #[[1]]# läge.", + hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("They say that #above King Dodongo# lies #[[1]]#.", + /*german*/ "Man erzählt sich, daß #überhalb von König Dodongo# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #par dessus le Roi Dodongo# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #sobre el Rey Dodongo# yace #[[1]]#. @@ -140,17 +150,17 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, una #estatua de la Cueva de los Dodongos# esconde #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST] = HintText(CustomMessage("They say that above a #maze of stone# in Dodongo's Cavern lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf einem #Labyrinth aus Stein# in Dodongos Höhle #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß überhalb eines #Labyrinths aus Stein# in Dodongos Höhle #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, sur #un labyrinthe de pierre# dans la Caverne Dodongo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, entre un #laberinto de piedra# en la Cueva de los Dodongos yace #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_BOMB_BAG_CHEST] = HintText(CustomMessage("They say that the #second lizard cavern battle# yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #zweite Reptilienkampf der Höhle# #[[1]]# brächte.", + /*german*/ "Man erzählt sich, daß der #zweite Reptilienkampf der Kaverne# #[[1]]# einbrächte.", /*french*/ "Selon moi, le #deuxième duel de lézards de caverne# octroie #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #luchar dos veces contra reptiles en una cueva# conduce a #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST] = HintText(CustomMessage("They say that a #chest at the end of a bridge# yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Truhe am Ende der Brücke# #[[1]]# brächte.", + /*german*/ "Man erzählt sich, daß eine #Truhe am Ende einer Brücke# #[[1]]# einbrächte.", /*french*/ "Selon moi, le #trésor à l'extrémité d'un pont# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #cofre al final de un quebrado puente# contiene #[[1]]#. @@ -175,12 +185,12 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, unas #pequeñas larvas# en la Cueva de los Dodongos esconden #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST] = HintText(CustomMessage("They say that above a #maze of stone# in Dodongo's Cavern lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf einem #Labyrinth aus Stein# in Dodongos Höhle #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß überhalb eines #Labyrinths aus Stein# in Dodongos Höhle #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, sur #un labyrinthe de pierre# dans la Caverne Dodongo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, sobre un #laberinto de piedra# en la Cueva de los Dodongos yace #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST] = HintText(CustomMessage("They say that #beneath a headstone# in Dodongo's Cavern lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #unterhalb eines Grabsteins# in Dodongos Höhle #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #unterhalb eines Grabsteins# in Dodongos Höhle #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #sous une pierre tombale# dans la Caverne Dodongo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #bajo una lápida# en la Cueva de los Dodongos yace #[[1]]#. @@ -190,7 +200,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, el #Rey Dodongo# porta #[[1]]#. {}, { CustomMessage("They say that the #Infernal Dinosaur# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #infernalische Dinosaurier# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß der #Infernosaurus# #[[1]]# besäße.", /*french*/ "Selon moi, le #dinosaure infernal# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #dinosaurio infernal# porta #[[1]]#. @@ -240,61 +250,68 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, una #Skulltula entre lápidas# en la Cueva de los Dodongos otorga #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar in Dodongos Höhle# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler Paar in Dodongos Höhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = HintText(CustomMessage("They say that a #scrub guarded by Lizalfos# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #von Lizalfos bewachter Deku# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #von Lizalfos bewachter Deku-Händler# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo au coeur de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku custodiado por Lizalfos# vende #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar in Dodongos Höhle# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler Paar in Dodongos Höhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = HintText(CustomMessage("They say that a #scrub in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku in Dodongos Höhle# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler in Dodongos Höhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo dans l'entrée de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku en la Cueva de los Dodongos# vende #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar in Dodongos Höhle# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler Paar in Dodongos Höhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans l'entrée de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar in Dodongos Höhle# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler Paar in Dodongos Höhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans l'entrée de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = HintText(CustomMessage("They say that a #scrub in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar in Dodongos Höhle# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler Paar in Dodongos Höhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo au sommet des escaliers dans la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku en la Cueva de los Dodongos# vende #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = HintText(CustomMessage("They say that a #scrub guarded by Lizalfos# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #von Lizalfos bewachter Deku# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #von Lizalfos bewachter Deku-Händler# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo au coeur de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku custodiado por Lizalfos# vende #[[1]]#. hintTextTable[RHT_POT_DODONGOS_CAVERN] = HintText(CustomMessage("They say that a #pot in Dodongo's Cavern# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug in Dodongos Höhle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Caverne Dodongo# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_HEART] = HintText(CustomMessage("They say that a #heart in Dodongo's Cavern# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz in Dodongos Höhle# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur# dans la Caverne Dodongo# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein in Dodongos Höhle#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer un air pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, #jouer un air orageux pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein in Dodongos Höhle#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_DODONGOS_CAVERN_GRASS] = HintText(CustomMessage("They say that some #grass in Dodongo's Cavern# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß etwas #Gras in Dodongos Höhle# #[[1]]# verstecke.", + /*french*/ "Selon moi, de l'#herbe dans la Caverne Dodongo# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_DODONGOS_CAVERN] = HintText(CustomMessage("They say that a #crate in Dodongo's Cavern# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste in Dodongos Höhle# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans la Caverne Dodongo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | JABU JABUS BELLY | @@ -305,7 +322,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, un #tentáculo parasitario# protege #[[1]]#. {}, { CustomMessage("They say that #tentacle trouble# in a deity's belly guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Tentakel# im Bauch einer Gottheit #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #Tentakel# im Bauche einer Gottheit #[[1]]# bewachen würden.", /*french*/ "Selon moi, la #membrane# dans le ventre du gardien protège #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #problema tentaculoso# en la tripa de cierta deidad esconde #[[1]]#. @@ -315,7 +332,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, unas #burbujas# protegen #[[1]]#. {}, { CustomMessage("They say that #bubble trouble# in a deity's belly guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Blasen# im Bauch einer Gottheit #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #Blasen# im Bauche einer Gottheit #[[1]]# bewachen würden.", /*french*/ "Selon moi, un #horde de bulles# dans le ventre du gardien protègent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #problema burbujesco# en la tripa de cierta deidad esconde #[[1]]#. @@ -325,7 +342,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, #dispararle a una vaca# revela #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #boulder before cows# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Findling vor Kühen# #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß ein #Felsen vor Kühen# #[[1]]# verstecke.", /*french*/ "Selon moi, des #rochers près des vaches# cachent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, cierta #roca rodeada de vacas# esconde #[[1]]#. {}, { @@ -339,7 +356,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, un #paladar explosivo# esconde #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST] = HintText(CustomMessage("They say that near a #spiked elevator# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß in der Nähe eines #stachligen Aufzugs# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß in der Nähe eines #stachligen Aufzugs# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, près d'un #ascenseur visqueux# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, cerca de un #ascensor puntiagudo# yace #[[1]]#. @@ -349,7 +366,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, una #vaca sumergida# revela #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST] = HintText(CustomMessage("They say that #moving anatomy# creates a path to #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #sich bewegende Anatomie# einen Pfad zu #[[1]]# kreiere.", + /*german*/ "Man erzählt sich, daß hinter #sich bewegender Anatomie# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, un #organe descendant# mène à #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #ser movedizo entre paredes# conduce a #[[1]]#. @@ -364,12 +381,12 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, un #par de digeridas vacas# otorgan #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that the #final cows' reward# in a deity's belly is #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Belohnung der letzten Kuh# im Bauch einer Gottheit #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß die #Belohnung der letzten Kuh# im Bauche einer Gottheit #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #cadeau des dernières vaches# estomacales est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #vacas al final# de la tripa de cierta deidad otorgan #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST] = HintText(CustomMessage("They say that #cows protected by falling monsters# in a deity's belly guard hide #[[1]]#.", - /*german*/ "Man erzählt sich, daß #von fallenden Monstern bewachte Kühe# im Bauch einer Gottheit #[[1]]# verstecken würden.", + /*german*/ "Man erzählt sich, daß #von fallenden Monstern bewachte Kühe# im Bauche einer Gottheit #[[1]]# verstecken würden.", /*french*/ "Selon moi, des #vaches protégées par des monstres tombants# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unas #vacas custodiadas por monstruos del techo# de la tripa de cierta deidad otorgan #[[1]]#. @@ -399,7 +416,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, #Barinade# porta #[[1]]#. {}, { CustomMessage("They say that the #Bio-Electric Anemone# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #bioelektrische Anemone# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß der #elektroterrestrische Biotentakel# #[[1]]# besäße.", /*french*/ "Selon moi, l'#anémone bioélectrique# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, la #anémona bioeléctrica# porta #[[1]]#. @@ -434,38 +451,45 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, una #Skulltula protegida por unos stingers# en la Tripa de Jabu-Jabu otorga #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS] = HintText(CustomMessage("They say that a #spider in a web within Jabu-Jabu's Belly# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne innerhalb einer Webe in Jabu-Jabus Bauch# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß eine #Spinne in Weben innerhalb von Jabu-Jabus Bauch# #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula sur une toile dans le Ventre de Jabu-Jabu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre una red# en la Tripa de Jabu-Jabu otorga #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_DEKU_SCRUB] = HintText(CustomMessage("They say that a #scrub in a deity# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku in einer Gottheit #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler in einer Gottheit #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo dans le ventre du gardien# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku dentro de cierta deidad# vende #[[1]]#. hintTextTable[RHT_POT_JABU_JABUS_BELLY] = HintText(CustomMessage("They say that a #pot in Jabu Jabu's Belly# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug in Jabu-Jabus Bauch# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Ventre de Jabu-Jabu# contient #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_JABU_JABU_RUPEE] = HintText(CustomMessage("They say that #underwater in Jabu-Jabu's Belly# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unter Wasser in Jabu-Jabus Bauch# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #[[1]]# se trouve #sous l'eau dans le Ventre de Jabu Jabu#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_JABU_JABU_HEART] = HintText(CustomMessage("They say that near a #central lift in Jabu-Jabu's Belly# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß sich #nahe des zentralen Aufzugs in Jabu-Jabus Bauch# #[[1]]# |befände|befänden|.", /*french*/ "Selon moi, près d'un #ascenceur central dans le Ventre de Jabu-Jabu# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_JABU_JABUS_BELLY_GRASS] = HintText(CustomMessage("They say that some #grass in Jabu Jabu's Belly# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß etwas #Gras in Jabu-Jabus Bauch# #[[1]]# verstecke.", + /*french*/ "Selon moi, de l'#herbe dans le Ventre de Jabu-Jabu# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_JABU_JABU] = HintText(CustomMessage("They say that a #crate in Jabu Jabu's Belly# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste in Jabu-Jabus Bauch# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Ventre de Jabu-Jabu# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | FOREST TEMPLE | ---------------------------*/ - hintTextTable[RHT_FOREST_TEMPLE_FIRST_ROOM_CHEST] = HintText(CustomMessage("They say that a #tree in the Forest Temple# supports #[[1]]#.", + hintTextTable[RHT_FOREST_TEMPLE_FIRST_ROOM_CHEST] = HintText(CustomMessage("They say that a #tree in the Forest Temple# supports #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Baum im Waldtempel# #[[1]]# unterstütze.", /*french*/ "Selon moi, sur l'#arbre dans le Temple de la Forêt# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, sobre un #árbol del Templo del Bosque# yace #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_FIRST_STALFOS_CHEST] = HintText(CustomMessage("They say that #defeating enemies beneath a falling ceiling# in Forest Temple yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Besiegen von Gegnern unter einer fallenden Decke# im Waldtempel #[[1]]# brächte.", + /*german*/ "Man erzählt sich, daß das #Besiegen von Gegnern, unter einer fallenden Decke# im Waldtempel, #[[1]]# einbrächte.", /*french*/ "Selon moi, #deux squelettes# dans le Temple de la Forêt protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #derrotar enemigos caídos de lo alto# del Templo del Bosque revela #[[1]]#. @@ -480,12 +504,12 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, una #ardiente calavera# del Templo del Bosque esconde #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST] = HintText(CustomMessage("They say that a #chest on a small island# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine ##Truhe auf einer kleinen Insel# im Waldtempel #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß eine ##Truhe, auf einer kleinen Insel# im Waldtempel, #[[1]]# enthielte.", /*french*/ "Selon moi, le #coffre sur l'îlot# du Temple de la Forêt contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #cofre sobre una isla# del Templo del Bosque contiene #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST] = HintText(CustomMessage("They say that beneath a #checkerboard falling ceiling# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß unter einer #fallenden Schachbrettdecke# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß unter einer #fallenden Schachbrettdecke# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, sous #l'échiquier tombant# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras un #techo de ajedrez# yace #[[1]]#. @@ -505,7 +529,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, en una #sala con otro punto de vista# se esconde #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_FLOORMASTER_CHEST] = HintText(CustomMessage("They say that deep in the forest #shadows guard a chest# containing #[[1]]#.", - /*german*/ "Man erzählt sich, daß tief im Wald, #Schatten eine Truhe bewachen#, welche [[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß tief im Wald, #Schatten eine Truhe bewachen# welche [[1]]# enthielte.", /*french*/ "Selon moi, l'#ombre de la forêt# protège un coffre contenant #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en lo profundo del bosque #unas sombras# esconden #[[1]]#. @@ -515,7 +539,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, los #Stalfos en lo profundo del Templo del Bosque# guardan #[[1]]#. {}, { CustomMessage("They say that an #army of the dead# guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Armee der Toten# #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß eine #Armee der Toten# #[[1]]# bewachen würde.", /*french*/ "Selon moi, des #squelettes sylvestres# protègent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #ejército de soldados caídos# guarda #[[1]]#. @@ -525,7 +549,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, un #espectro rojo# guarda #[[1]]#. {}, { CustomMessage("They say that #Joelle# guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Joelle# #[[1]]# bewachen würde.", + /*german*/ "Man erzählt sich, daß #Hetti# #[[1]]# bewachen würde.", /*french*/ "Selon moi, #Joelle# protège #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #Joelle# guarda #[[1]]#. @@ -535,7 +559,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, un #espectro azul# guarda #[[1]]#. {}, { CustomMessage("They say that #Beth# guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Beth# #[[1]]# bewachen würde.", + /*german*/ "Man erzählt sich, daß #Netti# #[[1]]# bewachen würde.", /*french*/ "Selon moi, #Beth# protège #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #Beth# guarda #[[1]]#. @@ -550,7 +574,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, sobre un #árbol del Templo del Bosque# yace #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_WOLFOS_CHEST] = HintText(CustomMessage("They say that #defeating enemies beneath a falling ceiling# in Forest Temple yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Besiegen von Gegnern unter einer fallenden Decke# im Waldtempel #[[1]]# brächte.", + /*german*/ "Man erzählt sich, daß das #Besiegen von Gegnern, unter einer fallenden Decke# im Waldtempel, #[[1]]# einbrächte.", /*french*/ "Selon moi, #deux squelettes# dans le Temple de la Forêt protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #derrotar enemigos caídos de lo alto# del Templo del Bosque revela #[[1]]#. @@ -560,17 +584,17 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, los #Stalfos en lo profundo del Templo del Bosque# guardan #[[1]]#. {}, { CustomMessage("They say that an #army of the dead# guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Armee der Toten# #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß eine #Armee der Toten# #[[1]]# bewachen würde.", /*french*/ "Selon moi, des #squelettes sylvestres# protègent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #ejército de soldados caídos# guarda #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST] = HintText(CustomMessage("They say that a #chest on a small island# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine ##Truhe auf einer kleinen Insel# im Waldtempel #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß eine #Truhe, auf einer kleinen Insel# im Waldtempel, #[[1]]# enthielte.", /*french*/ "Selon moi, le #coffre sur l'îlot# du Temple de la Forêt contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #cofre sobre una isla# del Templo del Bosque contiene #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST] = HintText(CustomMessage("They say that #high in a courtyard# within the Forest Temple is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #hoch in einem Hof# innerhalb des Waldtempels #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #hoch in einem Hof# innerhalb des Waldtempels #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #haut perché dans le jardin# du Temple de la Forêt gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #cofre en lo alto de un patio# del Templo del Bosque contiene #[[1]]#. @@ -585,7 +609,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, un #fantasma rojo# guarda #[[1]]#. {}, { CustomMessage("They say that #Joelle# guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Joelle# #[[1]]# bewachen würde.", + /*german*/ "Man erzählt sich, daß #Hetti# #[[1]]# bewachen würde.", /*french*/ "Selon moi, #Joelle# protège #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #Joelle# guarda #[[1]]#. @@ -595,12 +619,12 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, un #fantasma azul# guarda #[[1]]#. {}, { CustomMessage("They say that #Beth# guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Beth# #[[1]]# bewachen würde.", + /*german*/ "Man erzählt sich, daß #Netti# #[[1]]# bewachen würde.", /*french*/ "Selon moi, #Beth# protège #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #Beth# guarda #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST] = HintText(CustomMessage("They say that beneath a #checkerboard falling ceiling# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß unter einer #fallenden Schachbrettdecke# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß unter einer #fallenden Schachbrettdecke# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, sous #l'échiquier tombant# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras un #techo de ajedrez# yace #[[1]]#. @@ -610,7 +634,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, las #paredes giratorias# del Templo del Bosque conceden #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_REDEAD_CHEST] = HintText(CustomMessage("They say that deep in the forest #undead guard a chest# containing #[[1]]#.", - /*german*/ "Man erzählt sich, daß tief im Wald #Untote eine Truhe bewachen#, welche #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß tief im Wald, #Untote eine Truhe bewachen#, welche #[[1]]# enthielte.", /*french*/ "Selon moi, des #revenants dans le Temple de la Forêt# protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en lo profundo del bosque #guardias del más allá# guardan #[[1]]#. @@ -625,17 +649,17 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, #Ganon Fantasma# porta #[[1]]#. {}, { CustomMessage("They say that the #Evil Spirit from Beyond# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß #böse Geist aus dem Jenseits# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß #das reitende Unheil# #[[1]]# besäße.", /*french*/ "Selon moi, l'#esprit maléfique de l'au-delà# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #espíritu maligno de ultratumba# porta #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on a small island# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne auf einer kleinen Insel# im Waldtempel #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne, auf einer kleinen Insel# im Waldtempel, #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur l'îlot du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre una pequeña isla# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_FIRST_ROOM] = HintText(CustomMessage("They say that a #spider high on a wall of vines# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne hoch auf einer Wand aus Reben# im Waldtempel #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne, hoch auf einer Wand aus Reben# im Waldtempel, #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur un mur de vignes du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en lo alto de una pared de cepas# del Templo del Bosque otorga #[[1]]#. @@ -650,7 +674,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, una #Skulltula rodeada de fantasmas# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_BASEMENT] = HintText(CustomMessage("They say that a #spider within revolving walls# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne inmitten drehender Wände# im Waldtempel #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne inmitten drehender Wände# innerhalb des Waldtempels #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière les murs pivotants du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula entre paredes giratorias# del Templo del Bosque otorga #[[1]]#. @@ -660,37 +684,41 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, una #Skulltula escondida entre cepas# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM] = HintText(CustomMessage("They say that a #spider in a hidden nook# within the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne in einem versteckten Winkel# im Waldtempel #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne in einem versteckten Winkel# innerhalb des Waldtempels #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un recoin caché du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en una esquina oculta# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on an arch# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne auf einem Bogen# im Waldtempel #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne, auf einem Bogen# im Waldtempel, #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une arche du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un arco# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on a ledge# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne auf einem Vorsprung# im Waldtempel #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne, auf einem Vorsprung# im Waldtempel, #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans le jardin du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en un borde# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_WELL] = HintText(CustomMessage("They say that #draining a well# in Forest Temple uncovers a spider with #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Entleeren eines Brunnens# im Waldtempel eine Spinne mit #[[1]]# enthülle.", + /*german*/ "Man erzählt sich, daß das #Entleeren eines Brunnens# im Waldtempel, eine Spinne enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au fond du Puits du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #vaciar el pozo# del Templo del Bosque desvela una Skulltula que otorga #[[1]]#. hintTextTable[RHT_POT_FOREST_TEMPLE] = HintText(CustomMessage("They say that a #pot in Forest Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug im Waldtempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de la Fôret# contient #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_FOREST_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Forest Temple# hides #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, un #coeur dans le Temple de la Fôret# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_FOREST_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Forest Temple# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß ein #Herz im Waldtempel# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #coeur dans le Temple de la Fôret# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_FOREST_TEMPLE] = HintText(CustomMessage("They say that a #crate in Forest Temple# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste im Waldtempel# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Temple de la Fôret# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | FIRE TEMPLE | ---------------------------*/ -hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #nahe eines Drachens# #[[1]]# sei.", + hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", + /*german*/ "Man erzählt sich, daß #nahe eines Drachens# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #près d'un dragon# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cerca de un dragón# yace #[[1]]#. @@ -710,7 +738,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, los #explosivos en un mar de llamas# revelan #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST] = HintText(CustomMessage("They say that a #Goron trapped near lava# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #nahe der Lava gefangene Gorone# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß ein #nahe der Lava gefangener Gorone# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron emprisonné près de la lave# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #goron atrapado cerca de un mar de llamas# guarda #[[1]]#. @@ -745,12 +773,12 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, un #cofre de un ardiente laberinto# contiene #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_HIGHEST_GORON_CHEST] = HintText(CustomMessage("They say that a #Goron atop the Fire Temple# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Gorone auf der Spitze des Feuertempels# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß ein #Gorone an der Spitze des Feuertempels# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron au sommet du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #goron en lo alto del Templo del Fuego# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #nahe eines Drachens# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #nahe eines Drachens# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #près d'un dragon# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cerca de un dragón# yace #[[1]]#. @@ -790,7 +818,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, usar el #martillo en lo profundo del Templo del Fuego# revela #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that #illuminating a lava pit# reveals the path to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Illumination einer Lavagrube# den Pfad zu #[[1]]# enthülle.", + /*german*/ "Man erzählt sich, daß die #Beleuchtung einer Lavagrube# einen Pfad offenbare, welcher #[[1]]# enthielte.", /*french*/ "Selon moi, #éclairer le lac de lave# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #iluminar un mar de llamas# revela #[[1]]#. @@ -805,7 +833,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, un #goron cerca de un laberinto# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_FREESTANDING_KEY] = HintText(CustomMessage("They say that hidden #beneath a block of stone# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß versteckt #unter einem Steinblock# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß versteckt #unter einem Steinblock# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, caché #derrière un bloc de pierre# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #bajo unos bloques de piedra# yace #[[1]]#. @@ -815,17 +843,17 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, #Volvagia# porta #[[1]]#. {}, { CustomMessage("They say that the #Subterranean Lava Dragon# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #subterrane Lavadrache# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß der #subterrane Lavadrachoid# #[[1]]# besäße.", /*french*/ "Selon moi, le #dragon des profondeurs# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #dragón de lava subterráneo# porta #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM] = HintText(CustomMessage("They say that #eight tiles of malice# guard a spider holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß #acht Kacheln der Arglist# eine Spinne bewachen würden, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß #acht Fliesen der Arglist# eine Spinne bewachen würden, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula protégée par huit tuiles dans le Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #ocho baldosas de maldad# custodian una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_BOSS_KEY_LOOP] = HintText(CustomMessage("They say that #five tiles of malice# guard a spider holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß #fünf Kacheln der Arglist# eine Spinne bewachen würden, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß #fünf Fliesen der Arglist# eine Spinne bewachen würden, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula protégée par cinq tuiles dans le Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cinco baldosas de maldad# custodian una Skulltula que otorga #[[1]]#. @@ -835,27 +863,27 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, los #explosivos en un laberinto# desvelan una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_SCARECROW_TOP] = HintText(CustomMessage("They say that a #spider-friendly scarecrow# atop the Fire Temple hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der Spitze des Feuertempels #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche#, an der Spitze des Feuertempels, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, un #espantapájaros del Templo del Fuego# custodia una Skulltula que otorga #[[1]]#. {}, { CustomMessage("They say that a #spider-friendly scarecrow# atop a volcano hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der Spitze eines Vulkans #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche#, an der Spitze eines Vulkans, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #espantapájaros en lo alto de un volcán# custodia una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_SCARECROW_CLIMB] = HintText(CustomMessage("They say that a #spider-friendly scarecrow# atop the Fire Temple hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der der Spitze des Feuertempels #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche#, an der der Spitze des Feuertempels, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, un #espantapájaros del Templo del Fuego# custodia una Skulltula que otorga #[[1]]#. {}, { CustomMessage("They say that a #spider-friendly scarecrow# atop a volcano hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der Spitze eines Vulkans #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche#, an der Spitze eines Vulkans, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #espantapájaros en lo alto de un volcán# custodia una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = HintText(CustomMessage("They say that a #spider above a fiery maze# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne oberhalb eines feurigen Labyrinths #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne, oberhalb eines feurigen Labyrinths#, #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus du labyrinthe enflammé du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un ardiente laberinto# otorga #[[1]]#. @@ -865,31 +893,35 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, una #Skulltula en el interior de un ardiente laberinto# otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = HintText(CustomMessage("They say that a #Goron trapped near lava# befriended a spider with #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #nahe der Lava gefangener Gorone# sich mit einer Spinne angefreundet hat, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß ein #nahe Lava gefangener Gorone# sich mit einer Spinne angefreundet hat, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula emprisonnée près du lac de lave du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula amiga de un Goron atrapado junto a la lava# otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = HintText(CustomMessage("They say that a #spider beside a fiery maze# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne neben einem feurigen Labyrinth# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne, neben einem feurigen Labyrinth#, #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près du labyrinthe enflammé du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula junto a un ardiente laberinto# otorga #[[1]]#. hintTextTable[RHT_POT_FIRE_TEMPLE] = HintText(CustomMessage("They say that a #pot in Fire Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug im Feuertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FIRE_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Fire Temple# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Feuertempel# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Temple du Feu# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a hot arena# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer heißen Arena# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une arène chaude# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun behind a knight's throne in a volcano# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne, hinter dem Thron eines Ritters in einem Vulkan#, #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil derrière le trône d’un chevalier dans un volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_FIRE_TEMPLE] = HintText(CustomMessage("They say that a #crate in Fire Temple# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste im Feuertempel# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | WATER TEMPLE | ---------------------------*/ @@ -909,22 +941,22 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, el #fuego en el Templo del Agua# revela #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_DRAGON_CHEST] = HintText(CustomMessage("They say that a #serpent's prize# in the Water Temple is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Preis einer Schlange# im Wassertempel #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der #Preis einer Schlange# im Wassertempel #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la #récompense du dragon submergé# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #escamado premio# del Templo del Agua se trata de #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST] = HintText(CustomMessage("They say that #blinding an eye# in the Water Temple leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Erblinden eines Auges# im Wassertempel zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß das #Erblinden eines Auges# im Wassertempel #[[1]]# enthülle.", /*french*/ "Selon moi, #l'oeil# du Temple de l'Eau voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar un ojo# del Templo del Agua conduce a #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_CENTRAL_PILLAR_CHEST] = HintText(CustomMessage("They say that in the #depths of the Water Temple# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß in den #Tiefen des Wassertempels# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß in den #Tiefen des Wassertempels# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, le #coeur du Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en las #profundidades del Templo del Agua# yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_CRACKED_WALL_CHEST] = HintText(CustomMessage("They say that #through a crack# in the Water Temple is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #in einem Spalt# im Wassertempel #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #hinter einem Spalt# im Wassertempel #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #mur fragile# du Temple de l'Eau cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras una #agrietada pared# del Templo del Agua yace #[[1]]#. @@ -943,17 +975,17 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, el #oscuro reflejo de ti mismo# guarda #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = HintText(CustomMessage("They say that in the #depths of the Water Temple# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß in den #Tiefen des Wassertempels# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß in den #Tiefen des Wassertempels# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, le #coeur du Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en las #profundidades del Templo del Agua# yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that fire in the Water Temple unlocks a #vast gate# revealing a chest with #[[1]]#.", - /*german*/ "Man erzählt sich, daß Feuer im Wassertempel ein #großes Tor# entschlüssele, welches eine Truhe mit #[[1]]# offenbare.", + /*german*/ "Man erzählt sich, daß Feuer im Wassertempel, ein #großes Tor# entriegele und #[[1]]# in einer Truhe offenbare.", /*french*/ "Selon moi, des #flammes au coeur du Temple de l'Eau# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el fuego en el Templo del Agua alza una #gran valla# con #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_LONGSHOT_CHEST] = HintText(CustomMessage("They say that #through a crack# in the Water Temple is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #in einem Spalt# im Wassertempel #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #hinter einem Spalt# im Wassertempel #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #mur fragile# du Temple de l'Eau cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras una #agrietada pared# del Templo del Agua yace #[[1]]#. @@ -973,12 +1005,12 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, #Morpha# porta #[[1]]#. {}, { CustomMessage("They say that the #Giant Aquatic Amoeba# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #gigantische aquatische Amöbe# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß der #aquamöbe Wassertentakel# #[[1]]# besäße.", /*french*/ "Selon moi, l'#amibe aquatique géante# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, la #ameba acuática gigante# porta #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM] = HintText(CustomMessage("They say that a #spider over a waterfall# in the Water Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne über einem Wasserfall# im Wassertempel #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne, über einem Wasserfall# im Wassertempel, #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus d'une cascade du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras una cascada# del Templo del Agua otorga #[[1]]#. @@ -988,17 +1020,17 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, una #Skulltula en el centro del Templo del Agua# otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a spider protected by #rolling boulders in the Water Temple# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine Spinne, welche von #rollenden Felsbrocken im Wassertempel# geschützt werde, #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß eine Spinne, welche von #rollenden Felsen im Wassertempel# geschützt werde, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula derrière les rochers roulants du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, una #Skulltula protegida por rocas rodantes# del Templo del Agua otorga #[[1]]#. {}, { CustomMessage("They say that a spider protected by #rolling boulders under the lake# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine Spinne, welche von #rollenden Felsbrocken unterhalb eines Flusses# geschützt werde, #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß eine Spinne, welche von #rollenden Felsen unterhalb eines Sees# geschützt werde, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula derrière les rochers roulants sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, una #Skulltula protegida por rocas rodantes# bajo el lago otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_GS_RIVER] = HintText(CustomMessage("They say that a #spider over a river# in the Water Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne über einem Fluß# im Wassertempel #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne, über einem Fluß# im Wassertempel, #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus de la rivière du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un río# del Templo del Agua otorga #[[1]]#. @@ -1013,35 +1045,39 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, unos #reptiles custodian una Skulltula# del Templo del Agua que otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_GS_RIVER] = HintText(CustomMessage("They say that a #spider over a river# in the Water Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne oberhalb eines Flusses# im Wassertempel #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne, über einem Fluß# im Wassertempel, #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus de la rivière du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un río# del Templo del Agua otorga #[[1]]#. hintTextTable[RHT_POT_WATER_TEMPLE] = HintText(CustomMessage("They say that a #pot in Water Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug im Wassertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Eau# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_HEART] = HintText(CustomMessage("They say that in a #river in the Water Temple# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß in einem #Fluß im Wassertempel# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, une #rivière dans le Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun atop a small pillar before a duel with one's shadow# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne auf einer kleinen Säule, vor einem Duell mit seinem Schatten#, #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil au sommet d’un petit pilier avant un duel avec son ombre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = HintText(CustomMessage("They say that #calling the rain before a duel with one's shadow# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens, vor einem Duell mit seinem Schatten#, #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie avant un duel avec son ombre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun before a duel with one's shadow# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne, vor einem Duell mit seinem Schatten#, #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil avant un duel avec son ombre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_WATER_TEMPLE] = HintText(CustomMessage("They say that a #crate in Water Temple# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste im Wassertempel# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Eau# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ - hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = HintText(CustomMessage("They say that a child conquers a #skull in green fire# in the Spirit Temple to reach #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein Kind einen #Schädel in grünem Feuer# im Geistertempel erobere, um #[[1]]# zu erreichen.", + hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = HintText(CustomMessage("They say that a child conquers a #skull in green fire# in the Spirit Temple to reach #[[1]]#.", + /*german*/ "Man erzählt sich, daß ein Kind einen #Schädel in grünem Feuer# im Geistertempel überwältige, um #[[1]]# zu erreichen.", /*french*/ "Selon moi, le #crâne au halo vert dans le colosse# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el joven que #baje el puente# del Templo del Espíritu encontrará #[[1]]#. @@ -1051,12 +1087,12 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, un joven puede encontrar un #cofre entre rejas# del Templo del Espíritu con #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that #across a pit of sand# in the Spirit Temple lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, le #trou sableux dans le colosse# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras un #pozo de arena# del Templo del Espíritu yace #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST] = HintText(CustomMessage("They say that #dodging boulders to collect silver rupees# in the Spirit Temple yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Ausweichen von Felsbrocken um silberne Rubine zu sammeln# im Geistertempel #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß das #Ausweichen von Felsen, um im Geistertempel silberne Rubine zu sammeln#, #[[1]]# einbrächte.", /*french*/ "Selon moi, les #pièces argentées entourées de rochers dans le colosse# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #esquivar rocas y conseguir plateadas rupias# en el Templo del Espíritu conduce a #[[1]]#. @@ -1071,7 +1107,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, un #círculo de reflectante luz# del Templo del Espíritu guarda #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that #before a giant statue# in the Spirit Temple lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #vor einer riesigen Statue# im Geistertempel #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #vor einer riesigen Statue# im Geistertempel #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #devant la statue# dans le colosse gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #ante una gran estatua# del Templo del Espíritu aguarda #[[1]]#. @@ -1096,7 +1132,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, una #estatua del Templo del Espíritu# esconde #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST] = HintText(CustomMessage("They say that on a #ledge by a statue# in the Spirit Temple rests #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf einem #Vorsprung einer Statue# im Geistertempel #[[1]]# ruhe.", + /*german*/ "Man erzählt sich, daß auf einem #Vorsprung, bei einer Statue# im Geistertempel, #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, #haut perché près de la statue# dans le colosse gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, al #borde de una estatua# del Templo del Espíritu yace #[[1]]#. @@ -1121,12 +1157,12 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, un #cofre rodeado de llamas# del Templo del Espíritu contiene #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_TOPMOST_CHEST] = HintText(CustomMessage("They say that those who #show the light above the Colossus# find #[[1]]#.", - /*german*/ "Man erzählt sich, daß jene, welche #das Licht auf dem Koloss# zeigen würden, #[[1]]# fänden.", + /*german*/ "Man erzählt sich, daß jene, welche #das Licht oberhalb des Kolosses# zeigen würden, #[[1]]# fänden.", /*french*/ "Selon moi, le #soleil au sommet du colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, aquellos que #iluminen en lo alto del Coloso# encontrarán #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = HintText(CustomMessage("They say that #lying unguarded# in the Spirit Temple is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #unbewacht liegend# im Geistertempel #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #unbewacht liegend# im Geistertempel #[[1]]# |sei|seien|.", /*french*/ "Selon moi, dans #l'entrée du colosse# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en la #entrada del Templo del Espíritu# yace #[[1]]#. @@ -1136,17 +1172,17 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, el #interruptor de un pilar# del Templo del Espíritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST] = HintText(CustomMessage("They say that #collecting rupees through a water jet# reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Sammeln von Rubin durch einen Wasserstrom# #[[1]]# enthüllen würde.", + /*german*/ "Man erzählt sich, daß das #Sammeln von Rubinen durch einen Wasserstrom# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, les #pièces argentées dans le jet d'eau# du colosse révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #hacerte con rupias tras un géiser# revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST] = HintText(CustomMessage("They say that an #eye blinded by stone# within the Spirit Temple conceals #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #durch einen Stein erblindetes Auge# im Geistertempel #[[1]]# verberge.", + /*german*/ "Man erzählt sich, daß ein, #durch einen Stein erblindetes, Auge# innerhalb des Geistertempels #[[1]]# verberge.", /*french*/ "Selon moi, #l'oeil derrière le rocher# dans le colosse voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar a un ojo# del Templo del Espíritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that surrounded by #fire and wrappings# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß umgeben von #Feuer umhüllt# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß umgeben von #Feuer und Bandagen# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, près des #pierres tombales dans le colosse# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, rodeado de #fuego y vendas# yace #[[1]]#. @@ -1161,7 +1197,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, una #explosiva luz solar# del Templo del Espíritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST] = HintText(CustomMessage("They say that #trapped by falling enemies# within the Spirit Temple is #[[1]]#.", - /*german*/ "Man erzählt sich, daß sich #gefangen von fallenden Feinden# im Geistertempel #[[1]]# befände.", + /*german*/ "Man erzählt sich, daß sich #gefangen von herabfallenden Feinden# innerhalb des Geistertempels #[[1]]# |befände|befänden|.", /*french*/ "Selon moi, des #ennemis tombants# dans le colosse protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #rodeado de enemigos del cielo# del Templo del Espíritu yace #[[1]]#. @@ -1176,7 +1212,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, la #melodía real que despierte al coloso# revelará #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# finds the colossus's hidden #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# des Kolosses verborgene #[[1]]# fände.", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit#, Verborgenes im Koloss enthülle und #[[1]]# offenbare.", /*french*/ "Selon moi, #l'oeil de vérité# verra dans le colosse #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Templo del Espíritu encontrará #[[1]]#. @@ -1191,12 +1227,12 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, la #luz solar de un ígneo laberinto# esconde #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST] = HintText(CustomMessage("They say that #across a pit of sand# in the Spirit Temple lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, le #trou sableux# dans le colosse a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #a través del pozo de arena# del Templo del Espíritu yace #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST] = HintText(CustomMessage("They say that where #temporal stone blocks the path# within the Spirit Temple lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß wo #zeitlicher Stein den Pfad blockiere# im Geistertempel #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß ein #zeitlicher Stein, der innerhalb des Geistertempels den Pfad blockiere#, #[[1]]# verstecke.", /*french*/ "Selon moi, les #pierres temporelles# dans le colosse cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, donde los #bloques temporales bloquean# en el Templo del Espíritu yace #[[1]]#. @@ -1206,12 +1242,12 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, un #cofre de doble uso# contiene #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #temporal stone blocks the light# leading to #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #zeitlicher Stein das Licht blockiere#, was zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß ein #zeitlicher Stein das Licht blockiere# und deshalb #[[1]]# verstecke.", /*french*/ "Selon moi, la #pierre temporelle# le colosse fait ombre sur #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #bloque temporal bloquea la luz# que conduce a #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST] = HintText(CustomMessage("They say that those who #show the light above the Colossus# find #[[1]]#.", - /*german*/ "Man erzählt sich, daß jene, welche #das Licht auf dem Koloss# zeigen würden, #[[1]]# fänden.", + /*german*/ "Man erzählt sich, daß jene, welche #das Licht oberhalb des Kolosses# zeigen würden, #[[1]]# fänden.", /*french*/ "Selon moi, le trésor invisible #au sommet du colosse# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, aquellos que #revelen la luz sobre el Coloso# encontrarán #[[1]]#. @@ -1221,7 +1257,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, #Birova# porta #[[1]]#. {}, { CustomMessage("They say that the #Sorceress Sisters# hold #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Hexenschwestern# #[[1]]# besäßen.", + /*german*/ "Man erzählt sich, daß die #höllische Hexenarmada# #[[1]]# besäße.", /*french*/ "Selon moi, #les sorcières jumelles# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, las #hermanas hechiceras# portan #[[1]]#. @@ -1231,7 +1267,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, una #Skulltula en el salón de un guerrero# otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_BOULDER_ROOM] = HintText(CustomMessage("They say that a #spider behind a temporal stone# in the Spirit Temple yields #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne hinter einem zeitlichen Stein# im Geistertempel #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß eine #Spinne, hinter einem zeitlichen Stein# im Geistertempel, #[[1]]# einbrächte.", /*french*/ "Selon moi, une #Skulltula derrière une pierre temporelle du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un bloque temporal# del Templo del Espíritu otorga #[[1]]#. @@ -1241,17 +1277,17 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, una #Skulltula junto a una estatua# del Templo del Espíritu otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM] = HintText(CustomMessage("They say that a #spider at the top of a deep shaft# in the Spirit Temple holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne auf der Spitze eines tiefen Stiels# im Geistertempel #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne, an der Spitze eines tiefen Schachts# im Geistertempel, #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près d'un mur d'escalade du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en lo alto de un gran hueco# del Templo del Espíritu otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_METAL_FENCE] = HintText(CustomMessage("They say that a child defeats a #spider among bats# in the Spirit Temple to gain #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein Kind #eine Spinne inmitten von Fledermäusen# im Geistertempel besiege und #[[1]]# erhielte.", + /*german*/ "Man erzählt sich, daß ein Kind, #eine Spinne inmitten von Fledermäusen# im Geistertempel, besiege und #[[1]]# erhielte.", /*french*/ "Selon moi, une #Skulltula sur le grillage du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el joven que derrote la #Skulltula entre murciélagos# del Templo del Espíritu hallará #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = HintText(CustomMessage("They say that #above a pit of sand# in the Spirit Temple hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß sich #oberhalb einer Sandgrube# im Geistertempel #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß sich #über einer Sandgrube# im Geistertempel #[[1]]# |verstecke|verstecken|.", /*french*/ "Selon moi, une #Skulltula au dessus du trou sableux du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre un pozo de arena# del Templo del Espíritu otorga #[[1]]#. @@ -1266,32 +1302,36 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, una #Skulltula en el salón de un guerrero# otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM] = HintText(CustomMessage("They say that #upon a web of glass# in the Spirit Temple sits a spider holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß #auf einer Webe aus Glas# im Geistertempel eine Spinne säße, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß #auf einem Weben aus Glas# im Geistertempel eine Spinne säße, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une paroi de verre du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #sobre una plataforma de cristal# yace una Skulltula que otorga #[[1]]#. hintTextTable[RHT_POT_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that a #pot in Spirit Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug im Geistertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Esprit# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SPIRIT_TEMPLE_HEART] = HintText(CustomMessage("They say that on a #small platform# in the Spirit Temple lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf einer #kleinen Plattform# im Geistertempel #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, sur une #petite plateforme# dans le Temple de l'Esprit repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SPIRIT_TEMPLE_MQ_HEART] = HintText(CustomMessage("They say that guarded by a #ring of flame# in the Spirit Temple is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß sich bewacht von einem #Ring der Flammen#, im Geistertempel #[[1]]# |befände|befänden|.", /*french*/ "Selon moi, protégé par un #cercle de flammes# dans le Temple de l'Esprit se trouve #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that a #crate in Spirit Temple# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste im Geistertempel# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Esprit# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ -hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", + hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# eine Halle der Gesichter durchdränge und #[[1]]# offenbaren würde.", /*french*/ "Selon moi, l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# descubrirá un pasillo de facetas con #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_HOVER_BOOTS_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the Shadow Temple# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #tote Hand im Schattentempel# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß der #Hirnsauger im Schattentempel# #[[1]]# hielte.", /*french*/ "Selon moi, le #Poigneur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #Mano Muerta del Templo de las Sombras# guarda #[[1]]#. {}, { @@ -1301,7 +1341,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, un #temido morador del Templo de las Sombras# guarda #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that #mummies revealed by the Eye of Truth# guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #durch das Auge der Wahrheit offenbarte Mumien# #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #vom Auge der Wahrheit offenbarte Mumien# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #Gibdos dans les couloirs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias reveladas por el Ojo de la Verdad# guardan #[[1]]#. @@ -1321,17 +1361,17 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, las #hojas invisibles# guardan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren würden.", + /*german*/ "Man erzählt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren würden.", + /*german*/ "Man erzählt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren würden.", + /*german*/ "Man erzählt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. @@ -1346,12 +1386,12 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, un #cofre invisible custodiado por los del más allá# contiene #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[1]]# verstecken würden.", + /*german*/ "Man erzählt sich, daß #Mumien die eine Fähre bewachen# #[[1]]# verstecken würden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[1]]# verstecken würden.", + /*german*/ "Man erzählt sich, daß #Mumien die eine Fähre bewachen# #[[1]]# verstecken würden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. @@ -1366,7 +1406,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FREESTANDING_KEY] = HintText(CustomMessage("They say that #inside a burning skull# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #innerhalb eines brennenden Schädels# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #innerhalb eines brennenden Schädels# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #dans un crâne enflammé# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en el #interior de una calavera en llamas# aguarda #[[1]]#. @@ -1376,12 +1416,12 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, el #Ojo de la Verdad# descubre un pasillo de facetas con #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the Shadow Temple# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #tote Hand im Schattentempel# #[[1]]# hielte.", + /*german*/ "Man erzählt sich, daß der #Hirnsauger im Schattentempel# #[[1]]# hielte.", /*french*/ "Selon moi, le #Poigneur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Mano Muerta del Templo de las Sombras# guarda #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST] = HintText(CustomMessage("They say that #mummies revealed by the Eye of Truth# guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #durch das Auge der Wahrheit offenbarte Mumien# #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #vom Auge der Wahrheit offenbarte Mumien# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #Gibdos dans les couloirs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias reveladas por el Ojo de la Verdad# guardan #[[1]]#. @@ -1396,17 +1436,17 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, hacerte con las #rupias en una gran caverna# del Templo de las Sombras revela #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren würden.", + /*german*/ "Man erzählt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren würden.", + /*german*/ "Man erzählt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren würden.", + /*german*/ "Man erzählt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. @@ -1426,7 +1466,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST] = HintText(CustomMessage("They say that near an #empty pedestal# within the Shadow Temple lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß nahe einem #leeren Sockel# im Schattentempel #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß nahe eines #leeren Podests# innerhalb des Schattentempels #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #près d'un pédestal vide du Temple de l'Ombre# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, cerca de un #vacío pedestal# del Templo de las Sombras yace #[[1]]#. @@ -1446,22 +1486,22 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, un #cofre invisible custodiado por los del más allá# contiene #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[1]]# verstecken würden.", + /*german*/ "Man erzählt sich, daß #Mumien die eine Fähre bewachen# #[[1]]# verstecken würden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[1]]# verstecken würden.", + /*german*/ "Man erzählt sich, daß #Mumien die eine Fähre bewachen# #[[1]]# verstecken würden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #caged near a ship# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #in der Nähe eines Schiffes eingesperrt# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #in der Nähe eines Schiffes eingesperrt# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #dans une cage près du traversier# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #entre rejas al lado de un navío# yace #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FREESTANDING_KEY] = HintText(CustomMessage("They say that #behind three burning skulls# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #hinter drei brennenden Schädeln# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #hinter drei brennenden Schädeln# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #derrière trois crânes enflammés# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras #tres ardientes calaveras# yace #[[1]]#. @@ -1471,7 +1511,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, #Bongo Bongo# porta #[[1]]#. {}, { CustomMessage("They say that the #Phantom Shadow Beast# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Phantomschattenbiest# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die #bestialische Schattenmonstrosität# #[[1]]# besäße.", /*french*/ "Selon moi, le #monstre de l'ombre# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, la #alimaña oscura espectral# porta #[[1]]#. @@ -1496,7 +1536,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula custodiada por hojas invisibles# otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_GS_NEAR_SHIP] = HintText(CustomMessage("They say that a spider near a #docked ship# hoards #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine Spinne nahe eines #geankerten Schiffs# #[[1]]# horte.", + /*german*/ "Man erzählt sich, daß eine Spinne nahe eines #geankerten Schiffes# #[[1]]# horte.", /*french*/ "Selon moi, une #Skulltula près du traversier du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula cercana a un navío# otorga #[[1]]#. @@ -1511,7 +1551,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula entre ventarrones# del Templo de las Sombras otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_AFTER_WIND] = HintText(CustomMessage("They say that a #spider beneath gruesome debris# in the Shadow Temple hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne unterhalb grauenvoller Trümmer# im Schattentempel #[[1]]# verstecke.", + /*german*/ "Man erzählt sich, daß eine #Spinne, unterhalb grauenvoller Trümmer# im Schattentempel, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula sous des débris du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula bajo unos horripilantes escombros# del Templo de las Sombras otorga #[[1]]#. @@ -1521,30 +1561,34 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #estatua caída# revelará una Skulltula que otorgue #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS] = HintText(CustomMessage("They say that a #suspended spider# guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #hängende Spinne# #[[1]]# bewache.", + /*german*/ "Man erzählt sich, daß eine #schwebende Spinne# #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula près du repère du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula flotante# del Templo de las Sombras otorga #[[1]]#. hintTextTable[RHT_POT_SHADOW_TEMPLE] = HintText(CustomMessage("They say that a #pot in Shadow Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug im Schattentempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Ombre# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Shadow Temple# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Schattentempel# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = HintText(CustomMessage("They say that an #calling the rain for a sentry guarding a house of the dead# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens, nahe eines Wachpostens des Hauses der Toten#, #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie pour une sentinelle gardant une maison des morts# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY] = HintText(CustomMessage("They say that an #calling the rain on a platform suspended above a bottomless pit# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens, auf einer Plattform, welche über einer bodenlosen Grube schwebt#, #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie sur une plateforme suspendue au-dessus d’un gouffre sans fond# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun near an invisible chest guarded by the dead# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne, nahe einer von Toten bewachten unsichtbaren Truhe#, #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil près d’un coffre invisible gardé par les morts# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_SHADOW_TEMPLE] = HintText(CustomMessage("They say that a #crate in Shadow Temple# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste im Schattentempel# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Ombre# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ @@ -1564,72 +1608,72 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, el #Ojo de la Verdad en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_COMPASS_CHEST] = HintText(CustomMessage("They say that a #hidden entrance to a cage# in the well leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #verborgener Eingang zu einem Käfig# im Brunnen zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß ein #verborgener Eingang zu einem Käfig# im Brunnen #[[1]]# verstecke.", /*french*/ "Selon moi, dans un #chemin caché dans le Puits# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #entrada oculta de una celda# del pozo conduce a #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST] = HintText(CustomMessage("They say that a #spider guarding a cage# in the well protects #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #einen Käfig schützende Spinne# im Brunnen #[[1]]# schütze.", + /*german*/ "Man erzählt sich, daß eine #Käfig schützende Spinne# im Brunnen #[[1]]# schütze.", /*french*/ "Selon moi, l'#araignée dans la cage du Puits# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #araña protegiendo una celda# del pozo guarda #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST] = HintText(CustomMessage("They say that #gruesome debris# in the well hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß #grauenvolle Trümmer# im Brunnen #[[1]]# verbergen würde.", + /*german*/ "Man erzählt sich, daß #grauenvolle Trümmer# im Brunnen #[[1]]# verbergen würden.", /*french*/ "Selon moi, des #débris dans le Puits# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #horripilantes escombros# del pozo esconden #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #Dead Hand's invisible secret# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #unsichtbare Geheimnis der toten Hand# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß das #unsichtbare Geheimnis des Hirnsaugers# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trésor invisible du Poigneur# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #secreto invisible de la Mano Muerta# esconde #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthüllen würde.", + /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthülle.", /*french*/ "Selon moi, la #mélodie royale révèle dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #melodía real en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthüllen würde.", + /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthülle.", /*french*/ "Selon moi, la #mélodie royale révèle dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #melodía real en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MAP_CHEST] = HintText(CustomMessage("They say that in the #depths of the well# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß in den #Tiefen des Brunnens# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß in den #Tiefen des Brunnens# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #dans le coeur du Puits# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en las #profundidades del pozo# yace #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = HintText(CustomMessage("They say that #perilous pits# in the well guard the path to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #gefährliche Gruben# im Brunnen den Pfad zu #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß der von #gefährlichen Gruben# bewachte Pfad im Brunnen #[[1]]# enthielte.", /*french*/ "Selon moi, #trois trous# dans le Puits protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #peligrosos fosos# del pozo conducen a #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = HintText(CustomMessage("They say that #locked in a cage# in the well lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #in einem Käfig eingeschlossen# im Brunnen #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #in einem Käfig eingeschlossen#, im Brunnen #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #dans une cage# du Puits gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #entre rejas# en el pozo yace #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = HintText(CustomMessage("They say that #inside a coffin# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß #in einem Sarg# #[[1]]# verborgen läge.", + /*german*/ "Man erzählt sich, daß #in einem Sarg# #[[1]]# verborgen |sei|seien|.", /*french*/ "Selon moi, dans #un cercueil# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en el #interior de un ataúd# yace #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthüllen würde.", + /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthülle.", /*french*/ "Selon moi, la #mélodie royale révèle dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #melodía real en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = HintText(CustomMessage("They say that an #army of the dead# in the well guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Armee der Toten# im Brunnen #[[1]]# bewachen würde.", + /*german*/ "Man erzählt sich, daß eine #Armee der Toten# im Brunnen #[[1]]# bewache.", /*french*/ "Selon moi, l'#armée des morts# dans le Puits protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #ejército del más allá# del pozo guarda #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY] = HintText(CustomMessage("They say that #Dead Hand's explosive secret# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #explosive Geheimnis der toten Hand# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß das #explosive Geheimnis des Hirnsaugers# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #secret explosif du Poigneur# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #explosivo secreto de la Mano Muerta# esconde #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = HintText(CustomMessage("They say that an #invisible path in the well# leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #unsichtbarer Pfad im Brunnen# zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß ein #unsichtbarer Pfad im Brunnen# #[[1]]# verschleiere.", /*french*/ "Selon moi, dans un #chemin caché dans le Puits# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #camino invisible del pozo# conduce a #[[1]]#. @@ -1639,12 +1683,12 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula enjaulada# del pozo otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM] = HintText(CustomMessage("They say that an #invisible path in the well# leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #unsichtbarer Pfad im Brunnen# zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß ein #unsichtbarer Pfad im Brunnen# #[[1]]# verschleiere.", /*french*/ "Selon moi, une #Skulltula dans le chemin invisible au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #camino invisible del pozo# conduce a una Skulltula que otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM] = HintText(CustomMessage("They say that a #spider locked in a crypt# within the well guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #in einer Krypta eingeschlossene Spinne# im Brunnen #[[1]]# bewache.", + /*german*/ "Man erzählt sich, daß eine #in einer Krypta eingeschlossene Spinne# innerhalb des Brunnens #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula embarrée dans la crypte au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. @@ -1659,34 +1703,38 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula junto a los muertos# del pozo otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM] = HintText(CustomMessage("They say that a #spider locked in a crypt# within the well guards #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #in einer Krypta eingeschlossene Spinne# im Brunnen #[[1]]# bewache.", + /*german*/ "Man erzählt sich, daß eine #in einer Krypta eingeschlossene Spinne# innerhalb des Brunnens #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula embarrée dans la crypte au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. hintTextTable[RHT_POT_BOTTOM_OF_THE_WELL] = HintText(CustomMessage("They say that a #pot in Bottom of the Well# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug auf dem Grund des Brunnens# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Puits# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_HEART] = HintText(CustomMessage("They say that a #heart within the well# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz innerhalb des Brunnens# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_RUPEE] = HintText(CustomMessage("They say that a #hidden path through the floor# in the well leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #im Boden versteckter Pfad# im Brunnen #[[1]]# enthielte.", /*french*/ "Selon moi, un #passage caché sous le sol# dans le puits mène à #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer Sackgasse# innerhalb des Brunnens #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une impasse# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun in an empty cell# within the well reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer leeren Zelle# innerhalb des Brunnens #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une cellule vide# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer Sackgasse# innerhalb des Brunnens #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une impasse# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_GRASS] = HintText(CustomMessage("They say that some #grass in the Bottom of the Well# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß etwas #Gras auf dem Grund des Brunnens# #[[1]]# verstecke.", + /*french*/ "Selon moi, de l'#herbe dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | ICE CAVERN | @@ -1752,7 +1800,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula sobre gélidos vacíos# otorga #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_GS_ICE_BLOCK] = HintText(CustomMessage("They say that a #web of ice# surrounds a spider with #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Webe aus Eis# eine Spinne umgebe, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß ein #Weben aus Eis# eine Spinne umgebe, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula protégée d'une toile glacée# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #gélida red# rodea a una Skulltula que otorga #[[1]]#. @@ -1762,19 +1810,19 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. hintTextTable[RHT_POT_ICE_CAVERN] = HintText(CustomMessage("They say that a #pot in Ice Cavern# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug in der Eishöhle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Caverne Polaire# contient #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_ICE_CAVERN_HEART] = HintText(CustomMessage("They say that atop on a #frozen pillar# lies #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, ", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß auf einer #gefrorenen Säule# #[[1]]# |läge|lägen|.", + /*french*/ "Selon moi, le dessus d'un #pilier de glace# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ICE_CAVERN_RUPEE] = HintText(CustomMessage("They say that a #rupee in a frozen cavern# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Rubin in einer gefrorenen Kaverne# #[[1]]# verstecke.", /*french*/ "Selon moi, un #rubis dans la Caverne Polaire# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to a frozen cave# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens in der Nähe des Eingangs einer gefrorenen Höhle# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie près de l’entrée d’une grotte gelée# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. @@ -1792,7 +1840,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, #cegar un ojo en el Centro de Instrucción Gerudo# revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_STALFOS_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #auf Treibsand laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen #[[1]]#. @@ -1807,27 +1855,27 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST] = HintText(CustomMessage("They say that the first prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der erste Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der erste Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #premier trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el primer premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST] = HintText(CustomMessage("They say that the second prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #deuxième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el segundo premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST] = HintText(CustomMessage("They say that the third prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #troisième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el tercer premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena #[[1]]# gewähre.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena #[[1]]# gewähre.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. @@ -1837,7 +1885,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST] = HintText(CustomMessage("They say that #engulfed in flame# where thieves train lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, le #trésor enflammé# du Gymnase Gerudo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, donde entrenan las bandidas #entre llamas# yace #[[1]]#. @@ -1852,56 +1900,56 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, las bandidas #ciegan cuatro bustos# para hallar #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that #before a block of silver# thieves can find #[[1]]#.", - /*german*/ "Man erzählt sich, daß #vor einem Block aus Silber# Diebe #[[1]]# finden könnten.", + /*german*/ "Man erzählt sich, daß Diebe #vor einem Block aus Silber# #[[1]]# finden könnten.", /*french*/ "Selon moi, #près d'un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #ante un plateado bloque# las bandidas hallan #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", + /*german*/ "Man erzählt sich, daß Diebe durch einen #Kraftakt# #[[1]]# plündern könnten.", /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", + /*german*/ "Man erzählt sich, daß Diebe durch einen #Kraftakt# #[[1]]# plündern könnten.", /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", + /*german*/ "Man erzählt sich, daß Diebe durch einen #Kraftakt# #[[1]]# plündern könnten.", /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", + /*german*/ "Man erzählt sich, daß Diebe durch einen #Kraftakt# #[[1]]# plündern könnten.", /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. - hintTextTable[RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to the Gerudo Training Grounds# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to the Gerudo Training Ground# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens in der Nähe des Eingangs der Gerudo-Trainingsarena #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie près de l’entrée du Gymnase Gerudo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena #[[1]]# gewähre.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST] = HintText(CustomMessage("They say that #thieves prepare for training# with #[[1]]#.", - /*german*/ "Man erzählt sich, daß sich #Diebe auf das Training vorbereiteten# mit #[[1]]#.", + /*german*/ "Man erzählt sich, daß #Diebe sich auf das Training vorbereiteten# und #[[1]]# ergattern.", /*french*/ "Selon moi, dans #l'entrée du Gymnase Gerudo# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #bandidas se instruyen# con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST] = HintText(CustomMessage("They say that #thieves prepare for training# with #[[1]]#.", - /*german*/ "Man erzählt sich, daß sich #Diebe auf das Training vorbereiteten# mit #[[1]]#.", + /*german*/ "Man erzählt sich, daß #Diebe sich auf das Training vorbereiteten# und #[[1]]# ergattern.", /*french*/ "Selon moi, dans #l'entrée du Gymnase Gerudo# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #bandidas se instruyen# con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #auf Treibsand laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that #before a block of silver# thieves can find #[[1]]#.", - /*german*/ "Man erzählt sich, daß #vor einem Block aus Silber# Diebe #[[1]]# finden könnten.", + /*german*/ "Man erzählt sich, daß Diebe #vor einem Block aus Silber# #[[1]]# finden könnten.", /*french*/ "Selon moi, #près d'un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #ante un plateado bloque# las bandidas hallan #[[1]]#. @@ -1911,7 +1959,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, las bandidas #ciegan cuatro bustos# para hallar #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST] = HintText(CustomMessage("They say that #engulfed in flame# where thieves train lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, le #trésor enflammé# du Gymnase Gerudo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, donde entrenan las bandidas #entre llamas# yace #[[1]]#. @@ -1926,27 +1974,27 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, #unos escamosos guerreros# del Centro de Instrucción Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST] = HintText(CustomMessage("They say that a #path of fire# leads thieves to #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Pfad des Feuers# Diebe zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß Diebe den #Pfad des Feuers# beschreiten und #[[1]]# finden würden.", /*french*/ "Selon moi, dans le #chemin enflammé# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #camino de fuego# conduce a las bandidas a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST] = HintText(CustomMessage("They say that the first prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der erste Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der erste Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #premier trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el primer premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST] = HintText(CustomMessage("They say that a #path of fire# leads thieves to #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Pfad des Feuers# Diebe zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß Diebe den #Pfad des Feuers# beschreiten und #[[1]]# finden würden.", /*french*/ "Selon moi, dans le #chemin enflammé# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #camino de fuego# conduce a las bandidas a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST] = HintText(CustomMessage("They say that the third prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #troisième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el tercer premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST] = HintText(CustomMessage("They say that the second prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #deuxième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el segundo premio de la #instrucción bandida# se trata de #[[1]]#. @@ -1956,19 +2004,23 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", + /*german*/ "Man erzählt sich, daß Diebe durch einen #Kraftakt# #[[1]]# plündern könnten.", /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. - hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_HEART] = HintText(CustomMessage("They say that a watching a #trial with Dinalfos# is #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, dans #une épreuve avec un Dinalfos# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_HEART] = HintText(CustomMessage("They say that a watching a #trial with Dinolfos# is #[[1]]#.", + /*german*/ "Man erzählt sich, daß einer #Prüfung mit Dinodorus# zuzuschauen #[[1]]# enthülle.", + /*french*/ "Selon moi, dans #une épreuve avec un Dinolfos# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_GERUDO_TRAINING_GROUND] = HintText(CustomMessage("They say that a #crate in Gerudo Training Ground# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste in der Gerudo-Trainingsarena# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Gymnase Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | GANONS CASTLE | ---------------------------*/ hintTextTable[RHT_GANONS_TOWER_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that the #Evil King# hoards #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #böse König# #[[1]]# horte.", + /*german*/ "Man erzählt sich, daß der #Großmeister des Bösen# #[[1]]# horte.", /*french*/ "Selon moi, le #Roi du Mal# possède #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Rey del Mal# acapara #[[1]]#. @@ -1988,7 +2040,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, la #prueba del mar# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST] = HintText(CustomMessage("They say that #music in the test of darkness# unveils #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Musik in der Prüfung des Dunkelheit# #[[1]]# enthüllen würde.", + /*german*/ "Man erzählt sich, daß #Musik in der Prüfung der Dunkelheit# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #musique dans l'épreuve des ténèbres# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #música en la prueba de la oscuridad# revela #[[1]]#. @@ -2008,51 +2060,51 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, la #prueba de las arenas# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #Prüfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #Prüfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #Prüfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #Prüfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #Prüfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #Prüfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß die #Prüfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = HintText(CustomMessage("They say that #music in the test of radiance# reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Musik in der Prüfung des Glanzes# #[[1]]# enthüllen würde.", + /*german*/ "Man erzählt sich, daß #Musik in der Prüfung der Strahlen# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #musique dans l'épreuve du ciel# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #música en la prueba del resplandor# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun for a sentry in the test of the sands# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne, für einen Wachposten in der Prüfung der Sande#, #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil pour une sentinelle dans l’épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_SCRUBS_FAIRY] = HintText(CustomMessage("They say that within a #sanctuary before the final trial# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb eines #Heiligtums vor der finalen Prüfung# #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, #dans un sanctuaire avant l’épreuve finale# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", @@ -2071,7 +2123,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST] = HintText(CustomMessage("They say that #music in the test of radiance# reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Musik in der Prüfung des Glanzes# #[[1]]# enthüllen würde.", + /*german*/ "Man erzählt sich, daß #Musik in der Prüfung der Strahlen# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #musique dans l'épreuve du ciel# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #música en la prueba del resplandor# revela #[[1]]#. @@ -2121,57 +2173,58 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", + /*german*/ "Man erzählt sich, daß #Deku-Händler in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", + /*german*/ "Man erzählt sich, daß #Deku-Händler in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", + /*german*/ "Man erzählt sich, daß #Deku-Händler in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", + /*german*/ "Man erzählt sich, daß #Deku-Händler in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", + /*german*/ "Man erzählt sich, daß #Deku-Händler in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", + /*german*/ "Man erzählt sich, daß #Deku-Händler in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", + /*german*/ "Man erzählt sich, daß #Deku-Händler in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", + /*german*/ "Man erzählt sich, daß #Deku-Händler in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen würden.", + /*german*/ "Man erzählt sich, daß #Deku-Händler in Ganons Schloß# #[[1]]# verkaufen würden.", /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_POT_GANONS_CASTLE] = HintText(CustomMessage("They say that a #pot in Ganon's Castle# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug in Ganons Schloß# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Château de Ganon# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_HEART] = HintText(CustomMessage("They say that a #heart in Ganon's Castle# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz in Ganons Schloß# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Château de Ganon# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // clang-format on } -} +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index a6c6b99f39..a8afd7cb2b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -4,14 +4,15 @@ namespace Rando { void StaticData::HintTable_Init_Exclude_Overworld() { + // clang-format off - hintTextTable[RHT_KF_KOKIRI_SWORD_CHEST] = HintText(CustomMessage("They say that the #hidden treasure of the Kokiri# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #versteckte Schatz der Kokiri# #[[1]]# sei.", + hintTextTable[RHT_KF_KOKIRI_SWORD_CHEST] = HintText(CustomMessage("They say that the #hidden treasure of the Kokiri# is #[[1]]#.", + /*german*/ "Man erzählt sich, daß der #versteckte Schatz der Kokiri# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trésor des Kokiri# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #tesoro oculto de los Kokiri# esconde #[[1]]#. hintTextTable[RHT_KF_MIDOS_TOP_LEFT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #in Midos Haus# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #in Midos Haus# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #dans la maison de Mido# gît #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, en la #casa de Mido# yace #[[1]]#. {}, { @@ -21,7 +22,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, el #líder de los Kokiri# esconde #[[1]]#. hintTextTable[RHT_KF_MIDOS_TOP_RIGHT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #in Midos Haus# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #in Midos Haus# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #dans la maison de Mido# gît #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, en la #casa de Mido# yace #[[1]]#. {}, { @@ -31,7 +32,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, el #líder de los Kokiri# esconde #[[1]]#. hintTextTable[RHT_KF_MIDOS_BOTTOM_LEFT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #in Midos Haus# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #in Midos Haus# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #dans la maison de Mido# gît #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, en la #casa de Mido# yace #[[1]]#. {}, { @@ -41,7 +42,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, el #líder de los Kokiri# esconde #[[1]]#. hintTextTable[RHT_KF_MIDOS_BOTTOM_RIGHT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #in Midos Haus# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #in Midos Haus# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #dans la maison de Mido# gît #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, en la #casa de Mido# yace #[[1]]#. {}, { @@ -51,22 +52,22 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, el #líder de los Kokiri# esconde #[[1]]#. hintTextTable[RHT_GRAVEYARD_SHIELD_GRAVE_CHEST] = HintText(CustomMessage("They say that the #treasure of a fallen soldier# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Schatz eines gefallenen Soldaten# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der #Schatz eines gefallenen Soldaten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trésor du soldat mort# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #tesoro de un soldado caído# esconde #[[1]]#. hintTextTable[RHT_DMT_CHEST] = HintText(CustomMessage("They say that hidden behind a wall on a #mountain trail# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß hinter einer Wand des #Gebirgspfads# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß hinter einer Wand eines #Gebirgspfades# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, derrière une façade du #chemin montagneux# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras una pared del #sendero de la montaña# yace #[[1]]#. hintTextTable[RHT_GC_MAZE_RIGHT_CHEST] = HintText(CustomMessage("They say that in #Goron City# explosives unlock #[[1]]#.", - /*german*/ "Man erzählt sich, daß in #Goronia# Explosionen #[[1]]# freischalten würden.", + /*german*/ "Man erzählt sich, daß Explosionen in #Goronia# #[[1]]# freilegen würden.", /*french*/ "Selon moi, des explosions dans le #village Goron# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en la #Ciudad Goron# unos explosivos desbloquean #[[1]]#. hintTextTable[RHT_GC_MAZE_CENTER_CHEST] = HintText(CustomMessage("They say that in #Goron City# explosives unlock #[[1]]#.", - /*german*/ "Man erzählt sich, daß in #Goronia# Explosionen #[[1]]# freischalten würden.", + /*german*/ "Man erzählt sich, daß Explosionen in #Goronia# #[[1]]# freilegen würden.", /*french*/ "Selon moi, des explosions dans le #village Goron# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en la #Ciudad Goron# unos explosivos desbloquean #[[1]]#. @@ -76,7 +77,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, las #llamas tras una una cascada# revelan #[[1]]#. hintTextTable[RHT_GRAVEYARD_HOOKSHOT_CHEST] = HintText(CustomMessage("They say that #dead Dampé's first prize# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Igors erster Preis# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #Boris' erster Preis# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la #première course d'Igor# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, el primer premio de #la carrera de Dampé# se trata de #[[1]]#. {}, { @@ -86,136 +87,136 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un cofre custodiado por un #espectro veloz# contiene #[[1]]#. hintTextTable[RHT_GF_CHEST] = HintText(CustomMessage("They say that on a #rooftop in the desert# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf einem #Dach in der Wüste# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß auf einem #Dach in der Wüste# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, sur un #toit du désert# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en una #azotea del desierto# yace #[[1]]#. hintTextTable[RHT_KAK_REDEAD_GROTTO_CHEST] = HintText(CustomMessage("They say that #zombies beneath the earth# guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Untoten unter der Erde# #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #Untote unter der Erde# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #revenants sous terre# protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #zombis subterráneos# esconden #[[1]]#. hintTextTable[RHT_SFM_WOLFOS_GROTTO_CHEST] = HintText(CustomMessage("They say that #wolves beneath the earth# guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Wölfe unter der Erde# #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #Wölfe unter der Erde# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #loups sous terre# protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #lobos subterráneos# esconden #[[1]]#. hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a field near a drawbridge# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Loch in einem Feld nahe der Zugbrücke# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Erdloch nahe der Zugbrücke in einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte près d'un pont# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo de una llanura cercano a un puente# yace #[[1]]#. hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a field near a drawbridge# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Fisch in einem Loch in einem Feld nahe der Zugbrücke# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem Erdloch nahe der Zugbrücke einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte près d'un pont# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo de una llanura cercano a un puente# yace #[[1]]#. hintTextTable[RHT_HF_SOUTHEAST_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole amongst trees in a field# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Loch inmitten der Bäume in einem Feld# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Erdloch inmitten von Bäumen einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte près des arbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo de una llanura rodeado de árboles# yace #[[1]]#. hintTextTable[RHT_HF_SOUTHEAST_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole amongst trees in a field# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Fisch in einem Loch inmitten von Bäumen in einem Feld# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem Erdloch inmitten von Bäumen einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte près des arbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo de una llanura rodeado de árboles# yace #[[1]]#. hintTextTable[RHT_HF_OPEN_GROTTO_CHEST] = HintText(CustomMessage("They say that an #open hole in a field# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #offenes Loch in einem Feld# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #offenes Erdloch einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans les plaines# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo descubierto de una llanura# yace #[[1]]#. hintTextTable[RHT_HF_OPEN_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in an open hole in a field# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Fisch in einem offenen Loch auf einem Feld# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem offenen Erdloch einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans les plaines# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo descubierto de una llanura# yace #[[1]]#. hintTextTable[RHT_KAK_OPEN_GROTTO_CHEST] = HintText(CustomMessage("They say that an #open hole in a town# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #offenes Loch in einer Stadt# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #offenes Erdloch eines Dorfes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le village# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo descubierto de un pueblo# yace #[[1]]#. hintTextTable[RHT_KAK_OPEN_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in an open hole in a town# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Fisch in einem Loch in einer Stadt# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem offenen Erdloch eines Dorfes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le village# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo descubierto de un pueblo# yace #[[1]]#. hintTextTable[RHT_ZR_OPEN_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole along a river# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Loch entlang eines Flusses# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Erdloch nahe eines Flußes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte près du fleuve# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo un #hoyo junto a un río# yace #[[1]]#. hintTextTable[RHT_ZR_OPEN_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole along a river# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Fisch in einem Loch entlang eines Flusses# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem Erdloch nahe eines Flußes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte près du fleuve# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo un #hoyo junto a un río# yace #[[1]]#. hintTextTable[RHT_KF_STORMS_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a forest village# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Loch in einem Dorf des Waldes# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Erdloch eines Dorfes im Wald# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte inondée de pluie dans le Village Kokiri# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo de una tribu del bosque# yace #[[1]]#. hintTextTable[RHT_KF_STORMS_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a forest village# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Fisch in einem Loch in einem Dorf des Waldes# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem Erdloch eines Dorfes im Wald# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte inondée de pluie dans le Village Kokiri# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo de una tribu del bosque# yace #[[1]]#. hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a wooded maze# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Loch in einem hölzernen Labyrinth# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Erdloch eines hölzernen Labyrinths# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le labyrinthe sylvestre# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo un #hoyo de un laberinto forestal# yace #[[1]]#. hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a wooded maze# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Fisch in einem Loch in einem hölzernen Labyrinth# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem Erdloch eines hölzernen Labyrinths# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le labyrinthe sylvestre# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo un #hoyo de un laberinto forestal# yace #[[1]]#. hintTextTable[RHT_DMT_STORMS_GROTTO_CHEST] = HintText(CustomMessage("They say that #hole flooded with rain on a mountain# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #durch Regen geflutetes Loch auf einem Berg# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #durch Regen geflutetes Erdloch eines Berges# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte inondée de pluie sur la montagne# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo un #hoyo de una montaña inundado de lluvia# yace #[[1]]#. hintTextTable[RHT_DMT_STORMS_GROTTO_FISH] = HintText(CustomMessage("They say that #fish in a hole flooded with rain on a mountain# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Fisch in einem durch Regen geflutetes Loch auf einem Berg# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem durch Regen geflutetem Erdloch eines Berges# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte inondée de pluie sur la montagne# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo un #hoyo de una montaña inundado de lluvia# yace #[[1]]#. hintTextTable[RHT_DMC_UPPER_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a volcano# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Loch in einem Vulkan# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Erdloch eines Vulkans# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le volcan# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo de un volcán# yace #[[1]]#. hintTextTable[RHT_DMC_UPPER_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a volcano# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Fisch in einem Loch in einem Vulkan# #[[1]]# enthielte.", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem Erdloch eines Vulkans# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le volcan# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo el #hoyo de un volcán# yace #[[1]]#. hintTextTable[RHT_TOT_MASTER_SWORD] = HintText(CustomMessage("They say that a #pedestal in a temple# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß sich auf einem #Podest in einem Tempel# #[[1]]# befände.", + /*german*/ "Man erzählt sich, daß sich auf einem #Podest eines Tempels# #[[1]]# |befände|befänden|.", /*french*/ "Selon moi, un #piédestal dans un temple# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #pedestal en un templo# sostiene #[[1]]#. hintTextTable[RHT_TOT_LIGHT_ARROWS_CUTSCENE] = HintText(CustomMessage("They say that the #final gift of a princess# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #letzte Geschenk einer Prinzessin# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß das #letzte Geschenk einer Prinzessin# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #cadeau d'adieu de la princesse# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #obsequio final de la princesa# se trata de #[[1]]#. hintTextTable[RHT_LW_GIFT_FROM_SARIA] = HintText(CustomMessage("They say that #Saria's Gift# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Salias Geschenk# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #Salias Geschenk# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #cadeau de Saria# est #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, el #regalo de Saria# se trata de #[[1]]#. {}, { CustomMessage("They say that a #potato hoarder# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Kartoffelhortender# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß ein #Kartoffelhorter# #[[1]]# besäße.", /*french*/ "Selon moi, le #panini mélodieux# est en fait #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, cierta #jovencita verde# concede #[[1]]#. CustomMessage("They say that a rooty tooty #flutey cutey# gifts #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #musikalische Kartoffel# #[[1]]# schenke.", + /*german*/ "Man erzählt sich, daß die #musikalische Kartoffel# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la #patate musicale# est en fait #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, una #gran amiga# concede #[[1]]#. hintTextTable[RHT_ZF_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of winds# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Fee der Winde# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die #Fee des Sturmes# #[[1]]# besäße.", /*french*/ "Selon moi, la #fée du vent# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #hada del viento# brinda #[[1]]#. @@ -230,17 +231,17 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, el #hada del amor# brinda #[[1]]#. hintTextTable[RHT_DMT_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that a #magical fairy# gifts #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #magische Fee# #[[1]]# schenke.", + /*german*/ "Man erzählt sich, daß die #Fee der Fähigkeiten# #[[1]]# schenke.", /*french*/ "Selon moi, la #fée de la magie# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #hada mágica# brinda #[[1]]#. hintTextTable[RHT_DMC_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that a #magical fairy# gifts #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #magische Fee# #[[1]]# schenke.", + /*german*/ "Man erzählt sich, daß die #Fee der Weisheit# #[[1]]# schenke.", /*french*/ "Selon moi, la #fée de la magie# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #hada mágica# brinda #[[1]]#. hintTextTable[RHT_OGC_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of strength# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Fee der Stärke# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die #Fee des Mutes# #[[1]]# besäße.", /*french*/ "Selon moi, la #fée de la force# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #hada de la fuerza# brinda #[[1]]#. @@ -250,7 +251,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, en el #jardín del castillo Impa enseña# #[[1]]#. hintTextTable[RHT_SONG_FROM_MALON] = HintText(CustomMessage("They say that #a farm girl# sings #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Mädchen des Landes# #[[1]]# singe.", + /*german*/ "Man erzählt sich, daß ein #Mädchen vom Lande# #[[1]]# singe.", /*french*/ "Selon moi, la #fillette de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #chica rupestre# canta #[[1]]#. @@ -260,17 +261,17 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, al #fondo del bosque# Saria enseña #[[1]]#. hintTextTable[RHT_SONG_FROM_WINDMILL] = HintText(CustomMessage("They say that a man #in a windmill# is obsessed with #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein Mann #in einer Windmühle# von #[[1]]# besessen sei.", + /*german*/ "Man erzählt sich, daß ein besessener Mann #in einer Windmühle# #[[1]]# lehre.", /*french*/ "Selon moi, l'#homme du moulin# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #hombre del molino# está obsesionado con #[[1]]#. hintTextTable[RHT_HC_MALON_EGG] = HintText(CustomMessage("They say that a #girl looking for her father# gives #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #nach ihrem Vater suchenden Mädchen# #[[1]]# gäbe.", + /*german*/ "Man erzählt sich, daß ein #nach ihrem Vater suchendes Mädchen# #[[1]]# gäbe.", /*french*/ "Selon moi, la #fillette qui cherche son père# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #chica en busca de su padre# otorga #[[1]]#. hintTextTable[RHT_HC_ZELDAS_LETTER] = HintText(CustomMessage("They say that a #princess in a castle# gifts #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Prinzessin in einem Schloß# #[[1]]# schenke.", + /*german*/ "Man erzählt sich, daß eine #Prinzessin eines Schloßes# #[[1]]# schenke.", /*french*/ "Selon moi, la #princesse dans le château# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #princesa de un castillo# otorga #[[1]]#. @@ -285,7 +286,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #mal modelo de negocio# premia con #[[1]]#. hintTextTable[RHT_LH_CHILD_FISHING] = HintText(CustomMessage("They say that #fishing in youth# bestows #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Fischen in der Jugend# #[[1]]# verleihe.", + /*german*/ "Man erzählt sich, daß das #Fischen der Jugend# #[[1]]# verleihe.", /*french*/ "Selon moi, #pêcher dans sa jeunesse# promet #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #pescar en la juventud# conduce a #[[1]]#. @@ -294,7 +295,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, #aller à l'étang# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_HYRULE_LOACH] = HintText(CustomMessage("They say that #fishing the hyrule loach# will give you #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Fischen der hylianischen Schmerle# #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß das #Fischen der hylianischen Forelle# #[[1]]# einbrächte.", /*french*/ "Selon moi, #pêcher le brochet Hylien# vous donnera #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, si #pescas a la Locha de Hyrule# encontrarás #[[1]]#. {}, { @@ -304,12 +305,12 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, #pescar a la leyenda# conduce a #[[1]]#. hintTextTable[RHT_LH_ADULT_FISHING] = HintText(CustomMessage("They say that #fishing in maturity# bestows #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Fischen im Alter# #[[1]]# verleihe.", + /*german*/ "Man erzählt sich, daß das #Fischen des Alters# #[[1]]# verleihe.", /*french*/ "Selon moi, #pêcher dans sa maturité# promet #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #pescar en la madurez# conduce a #[[1]]#. hintTextTable[RHT_LH_LAB_DIVE] = HintText(CustomMessage("They say that a #diving experiment# is rewarded with #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Tauchexperiment# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß ein #Tauchexperiment# #[[1]]# einbrächte.", /*french*/ "Selon moi, l'#expérience de plongée# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #bucear para un experimento# se premia con #[[1]]#. // RANDOTODO: needs translation @@ -318,29 +319,29 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #[[1]]#. - + hintTextTable[RHT_GC_ROLLING_GORON_AS_ADULT] = HintText(CustomMessage("They say that #reassuring a young Goron# is rewarded with #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Beruhigen eines jungen Goronen# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß das #Beruhigen eines jungen Goronen# #[[1]]# einbrächte.", /*french*/ "Selon moi, #rassurer un jeune Goron# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #calmar a un joven Goron# otorga #[[1]]#. {}, { CustomMessage("They say that #comforting yourself# provides #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Ermutigung von einem Selbst# #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß #sich selbst zu trösten# #[[1]]# einbrächte.", /*french*/ "Selon moi, se #réconforter soi-même# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #confrontarte a ti mismo# otorga #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = HintText(CustomMessage("They say that the #first explosive prize# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #erste explosive Preis# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der #erste explosive Preis# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #premier prix explosif# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #primer premio explosivo# se trata de #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = HintText(CustomMessage("They say that the #second explosive prize# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #zweite explosive Preis# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der #zweite explosive Preis# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #deuxième prix explosif# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #segundo premio explosivo# se trata de #[[1]]#. hintTextTable[RHT_MARKET_LOST_DOG] = HintText(CustomMessage("They say that #rescuing Richard the Dog# is rewarded with #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Rettung des Hundes Richard# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß die #Rettung des Hundes Richard# #[[1]]# einbrächte.", /*french*/ "Selon moi, #retrouver Kiki le chien# promet #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #rescatar al perrito Ricardo# conduce a #[[1]]#. {}, { @@ -350,12 +351,12 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, los #amantes caninos# encontrarán #[[1]]#. hintTextTable[RHT_LW_OCARINA_MEMORY_GAME] = HintText(CustomMessage("They say that #playing an Ocarina in Lost Woods# is rewarded with #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Spielen der Okarina in den verlorenen Wäldern# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß das #Spielen der Okarina in den verlorenen Wäldern# #[[1]]# gewähre.", /*french*/ "Selon moi, #jouer l'ocarina dans les Bois Perdus# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #tocar la ocarina en el Bosque Perdido# otorga #[[1]]#. {}, { CustomMessage("They say that the prize for a #game of Simon Says# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der Preis für eine Partie #Simon sagt# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der Preis für eine Partie #Simon sagt# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la #récompense de Jean Dit# est #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #repetir ciertas melodías# otorga #[[1]]#. CustomMessage("They say that a #child sing-a-long# holds #[[1]]#.", @@ -364,12 +365,12 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, #tocar junto a otros# otorga #[[1]]#. hintTextTable[RHT_KAK_10_GOLD_SKULLTULA_REWARD] = HintText(CustomMessage("They say that slaying #10 Gold Skulltulas# reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß das Besiegen von #10 Goldenen Skulltulas# #[[1]]# enthüllen würde.", + /*german*/ "Man erzählt sich, daß das Vernichten von #10 Goldenen Skulltulas# #[[1]]# enthülle.", /*french*/ "Selon moi, détruire #10 Skulltulas d'or# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #exterminar 10 skulltulas doradas# revela #[[1]]#. {}, { CustomMessage("They say that #10 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzählt sich, daß #10 Käferabzeichen# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß die Belohnung für #10 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #10 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #10 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #10 spider souls# yields #[[1]]#.", @@ -377,7 +378,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, #10 âmes# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #10 almas de araña# otorgan #[[1]]#. CustomMessage("They say that #10 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzählt sich, daß #10 goldhaltige Arachniden# zu #[[1]]# führen würden.", + /*german*/ "Man erzählt sich, daß #10 goldhaltige Arachniden# #[[1]]# gewähren.", /*french*/ "Selon moi, #10 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #10 arácnidos auríferos# otorgan #[[1]]#. @@ -387,7 +388,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, #alguien sobre un tejado# otorga #[[1]]#. hintTextTable[RHT_ZR_MAGIC_BEAN_SALESMAN] = HintText(CustomMessage("They say that a #bean seller# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Bohnenverkäufer# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß ein #Erbsenverkäufer# #[[1]]# offeriere.", /*french*/ "Selon moi, le #marchand de haricots magiques# vend en fait #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, el #vendedor de judías# ofrece #[[1]]#. {}, { @@ -402,7 +403,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, las #ancas bajo la tormenta# otorgan #[[1]]#. hintTextTable[RHT_ZR_FROGS_ZELDAS_LULLABY] = HintText(CustomMessage("They say that after hearing #Zelda's Lullaby, the frogs# gift #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören von Zeldas Wiegenlied# #[[1]]# schenken würden.", + /*german*/ "Man erzählt sich, daß #Frösche die Zeldas Wiegenlied# hören #[[1]]# schenken würden.", /*french*/ "Selon moi, à l'écoute de #la berceuse de Zelda, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, después de escuchar #la Nana de Zelda, las ranas# regalan #[[1]]#. {}, { @@ -416,7 +417,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, el #Sapo Tenore al fondo, a la izquierda#, regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_EPONAS_SONG] = HintText(CustomMessage("They say that after hearing #Epona's Song, the frogs# gift #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören von Eponas Lied# #[[1]]# schenken würden.", + /*german*/ "Man erzählt sich, daß #Frösche die Eponas Lied# hören #[[1]]# schenken würden.", /*french*/ "Selon moi, à l'écoute du #chant d'Epona, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, después de escuchar #la Canción de Epona, las ranas# regalan #[[1]]#. {}, { @@ -430,7 +431,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, el #Sapo Tenore al fondo, a la derecha#, regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_SARIAS_SONG] = HintText(CustomMessage("They say that after hearing #Saria's Song, the frogs# gift #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören von Salias Lied# #[[1]]# schenken würden.", + /*german*/ "Man erzählt sich, daß #Frösche die Salias Lied# hören #[[1]]# schenken würden.", /*french*/ "Selon moi, à l'écoute du #chant de Saria, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, después de escuchar #la Canción de Saria, las ranas# regalan #[[1]]#. {}, { @@ -444,7 +445,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, el #Sapo Tenore en el centro# regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_SUNS_SONG] = HintText(CustomMessage("They say that after hearing #the Sun's Song, the frogs# gift #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören der Hymne der Sonne# #[[1]]# schenken würden.", + /*german*/ "Man erzählt sich, daß #Frösche die die Hymne der Sonne# hören #[[1]]# schenken würden.", /*french*/ "Selon moi, à l'écoute du #chant du soleil, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, después de escuchar #la Canción del Sol, las ranas# regalan #[[1]]#. {}, { @@ -458,7 +459,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, el #Sapo Tenore al frente, a la izquierda#, regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_SONG_OF_TIME] = HintText(CustomMessage("They say that after hearing #the Song of Time, the frogs# gift #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören der Hymne der Zeit# #[[1]]# schenken würden.", + /*german*/ "Man erzählt sich, daß #Frösche die die Hymne der Zeit# hören #[[1]]# schenken würden.", /*french*/ "Selon moi, à l'écoute du #chant du temps, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, después de escuchar #la Canción del tiempo, las ranas# regalan #[[1]]#. {}, { @@ -472,17 +473,17 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, el #Sapo Tenore al frente, a la derecha#, regala #[[1]]#. hintTextTable[RHT_GF_HBA_1000_POINTS] = HintText(CustomMessage("They say that scoring 1000 in #horseback archery# grants #[[1]]#.", - /*german*/ "Man erzählt sich, daß das Erzielen von 1000 Punkten beim #Pferdebogenschießen# #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß das Erzielen von 1.000 Punkten beim #Bogenschießen zu Pferde# #[[1]]# gewähre.", /*french*/ "Selon moi, obtenir 1000 points dans l'#archerie équestre# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, conseguir 1000 puntos en el #tiro con arco a caballo# premia #[[1]]#. hintTextTable[RHT_MARKET_SHOOTING_GALLERY_REWARD] = HintText(CustomMessage("They say that #shooting in youth# grants #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Schießen in der Jugend# #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß das #Schießen der Jugend# #[[1]]# einbrächte.", /*french*/ "Selon moi, #faire du tir dans sa jeunesse# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #disparar en la juventud# otorga #[[1]]#. hintTextTable[RHT_KAK_SHOOTING_GALLERY_REWARD] = HintText(CustomMessage("They say that #shooting in maturity# grants #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Schießen im Alter# #[[1]]# einbrächte.", + /*german*/ "Man erzählt sich, daß das #Schießen des Alters# #[[1]]# einbrächte.", /*french*/ "Selon moi, #faire du tir dans sa maturité# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #disparar en la madurez# otorga #[[1]]#. @@ -497,27 +498,27 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, una #cuidadora de emplumados# le ofrece a los mayores #[[1]]#. hintTextTable[RHT_LLR_TALONS_CHICKENS] = HintText(CustomMessage("They say that #finding Super Cuccos# is rewarded with #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Finden von Superhühnchen# mit #[[1]]# belohnt würde.", + /*german*/ "Man erzählt sich, daß das #Finden von Super-Hühnern# #[[1]]# einbrächte.", /*french*/ "Selon moi, #trouver des Super Cocottes# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #hallar los supercucos# conduce a #[[1]]#. hintTextTable[RHT_GC_ROLLING_GORON_AS_CHILD] = HintText(CustomMessage("They say that the prize offered by a #large rolling Goron# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der angebotene Preis eines #großen rollenden Goronen# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der angebotene Preis eines #großen rollenden Goronen# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la récompense d'un #gros Goron roulant# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #gran Goron rodante# otorga #[[1]]#. hintTextTable[RHT_LH_UNDERWATER_ITEM] = HintText(CustomMessage("They say that the #sunken treasure in a lake# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #versunkene Schatz in einem See# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der #versunkene Schatz eines Sees# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trésor au fond du lac# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #tesoro hundido del lago# se trata de #[[1]]#. - hintTextTable[RHT_GF_GERUDO_MEMBERSHIP_CARD] = HintText(CustomMessage("They say that #rescuing captured carpenters# is rewarded with #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Retten gefangener Zimmerleute# mit #[[1]]# belohnt würde.", - /*french*/ "Selon moi, #secourir les charpentiers capturés# assure #[[1]]#.", {QM_RED, QM_GREEN})); - // /*spanish*/ Según dicen, #rescatar los apresados carpinteros# se premia con #[[1]]#. + hintTextTable[RHT_TH_FREED_CARPENTERS] = HintText(CustomMessage("They say that #rescuing captured carpenters# is rewarded with #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Retten gefangener Zimmerleute# #[[1]]# einbrächte.", + /*french*/ "Selon moi, #secourir les charpentiers capturés# assure #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #rescatar los apresados carpinteros# se premia con #[[1]]#. hintTextTable[RHT_WASTELAND_BOMBCHU_SALESMAN] = HintText(CustomMessage("They say that a #carpet guru# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Teppichguru# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #fliegender Einsiedler# #[[1]]# verkaufe.", /*french*/ "Selon moi, #un marchand du désert# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #genio de una alfombra# vende #[[1]]#. @@ -532,32 +533,32 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, la #señora de la tienda de pociones# vende #[[1]]#. hintTextTable[RHT_KAK_IMPAS_HOUSE_FREESTANDING_POH] = HintText(CustomMessage("They say that #imprisoned in a house# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß #eingesperrt in einem Haus# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß #eingesperrt in einem Haus# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #encagé dans une maison# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #en una casa entre rejas# yace #[[1]]#. hintTextTable[RHT_HF_TEKTITE_GROTTO_FREESTANDING_POH] = HintText(CustomMessage("They say that #deep underwater in a hole# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #tief unter Wasser in einem Loch# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß #tief unter Wasser in einem Erdloch# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #dans les profondeurs d'une grotte# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #en lo hondo bajo un hoyo# yace #[[1]]#. hintTextTable[RHT_KAK_WINDMILL_FREESTANDING_POH] = HintText(CustomMessage("They say that on a #windmill ledge# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf einem #Vorsprung in einer Windmühle# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß auf einem #Vorsprung einer Windmühle# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #haut perché dans le moulin# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, al #borde de un molino# yace #[[1]]#. hintTextTable[RHT_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = HintText(CustomMessage("They say that #dead Dampe's second# prize is #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #zweite Preis des toten Boris# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß der #zweite Preis des toten Boris# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la #deuxième course d'Igor# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, el segundo premio de #la carrera de Dampé# se trata de #[[1]]#. {}, { CustomMessage("They say that #racing a ghost# leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Rennen gegen einen Geist# zu #[[1]]# führen würde.", + /*german*/ "Man erzählt sich, daß der #Wettlauf gegen einen Geist# #[[1]]# gewähre.", /*french*/ "Selon moi, le défi du #revenant rapide# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #perseguir a un fantasma# conduce a #[[1]]#. hintTextTable[RHT_LLR_FREESTANDING_POH] = HintText(CustomMessage("They say that in a #ranch silo# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß in einem #ländlichen Silo# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß in einem #Farmsilo# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #dans l'entrepôt de la ferme# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en un #granero rupestre# yace #[[1]]#. @@ -572,27 +573,27 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, cierto #sepultero desentierra# #[[1]]#. hintTextTable[RHT_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = HintText(CustomMessage("They say that on top of a #pillar in a river# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf der Spitze einer #Säule in einem Fluß# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß auf einer #Säule in einem Fluß# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #sur un pilier au dessus du fleuve# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en lo alto del #pilar de un río# yace #[[1]]#. hintTextTable[RHT_ZR_NEAR_DOMAIN_FREESTANDING_POH] = HintText(CustomMessage("They say that on a #river ledge by a waterfall# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf einem #Vorsprung von einem Fluß nahe eines Wasserfalls# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß auf einem #Vorsprung eines Flußes nahe eines Wasserfalls# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #sur la falaise au dessus du fleuve# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, al borde de #la entrada a una cascada# yace #[[1]]#. hintTextTable[RHT_LH_FREESTANDING_POH] = HintText(CustomMessage("They say that high on a #lab rooftop# one can find #[[1]]#.", - /*german*/ "Man erzählt sich, daß man auf dem #Dach eines Laboratoriums# #[[1]]# finden könne.", + /*german*/ "Man erzählt sich, daß man auf dem #Dach eines Labors# #[[1]]# finden könne.", /*french*/ "Selon moi, #la tour d'observation du lac# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en lo #alto de un laboratorio# yace #[[1]]#. hintTextTable[RHT_ZF_ICEBERG_FREESTANDING_POH] = HintText(CustomMessage("They say that #floating on ice# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß sich schwebend auf Eis #[[1]]# befände.", + /*german*/ "Man erzählt sich, daß sich auf einer Eisscholle #[[1]]# |befände|befänden|.", /*french*/ "Selon moi, #gisant sur la glace# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #flotando sobre hielo# yace #[[1]]#. hintTextTable[RHT_GV_WATERFALL_FREESTANDING_POH] = HintText(CustomMessage("They say that behind a #valley waterfall# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß hinter einem #Wasserfall in einem Tal# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß hinter einem #Wasserfall eines Tals# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #derrière la cascade du désert# se cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, tras una #desierta cascada# yace #[[1]]#. @@ -602,47 +603,47 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, bajo la #caja de un valle# yace #[[1]]#. hintTextTable[RHT_COLOSSUS_FREESTANDING_POH] = HintText(CustomMessage("They say that on top of an #arch of stone# lies #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf der Spitze eines #Steinbogens# #[[1]]# läge.", + /*german*/ "Man erzählt sich, daß auf einem #Steinbogen# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, #gisant sur une arche de pierre# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en lo alto de un #arco de piedra# yace #[[1]]#. hintTextTable[RHT_DMT_FREESTANDING_POH] = HintText(CustomMessage("They say that above a #mountain cavern entrance# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß oberhalb eines #Berghöhleneingangs# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß oberhalb eines #Berghöhleneingangs# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, gisant #au dessus de la caverne montagneuse# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en lo alto de la #entrada de una cueva en la montaña# yace #[[1]]#. hintTextTable[RHT_DMC_WALL_FREESTANDING_POH] = HintText(CustomMessage("They say that nestled in a #volcanic wall# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß in einem #vulkanischen Alkoven# #[[1]]# sei.", + /*german*/ "Man erzählt sich, daß in einer #vulkanischen Wand# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, dans une #alcove volcanique# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, entre unas #murallas volcánicas# yace #[[1]]#. hintTextTable[RHT_DMC_VOLCANO_FREESTANDING_POH] = HintText(CustomMessage("They say that obscured by #volcanic ash# is #[[1]]#.", - /*german*/ "Man erzählt sich, daß #[[1]]# von #Vulkanasche# verdeckt sei.", + /*german*/ "Man erzählt sich, daß #Vulkanasche# #[[1]]# verdecke.", /*french*/ "Selon moi, #recouvert de cendres volcaniques# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo la #ceniza volcánica# yace #[[1]]#. - hintTextTable[RHT_GF_NORTH_F1_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.", - /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_TH_1_TORCH_CARPENTER] = HintText(CustomMessage("They say that #defeating the Gerudo in a room with 1 torch# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.",//TODO_TRANSLATE update to match + /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE update to match // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. - hintTextTable[RHT_GF_NORTH_F2_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.", - /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_TH_DEAD_END_CARPENTER] = HintText(CustomMessage("They say that #defeating the Gerudo in a Dead End# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.",//TODO_TRANSLATE update to match + /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE update to match // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. - hintTextTable[RHT_GF_SOUTH_F1_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.", - /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); - // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. + hintTextTable[RHT_TH_DOUBLE_CELL_CARPENTER] = HintText(CustomMessage("They say that #defeating the Gerudo in a large jail# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.",//TODO_TRANSLATE update to match + /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE update to match + // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. - hintTextTable[RHT_GF_SOUTH_F2_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.", - /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); - // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. + hintTextTable[RHT_TH_STEEP_SLOPE_CARPENTER] = HintText(CustomMessage("They say that #defeating the Gerudo between steep slopes# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthüllen würde.",//TODO_TRANSLATE update to match + /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE update to match + // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. hintTextTable[RHT_HF_GS_NEAR_KAK_GROTTO] = HintText(CustomMessage("They say that a #spider-guarded spider in a hole# hoards #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #spinnenbewachte Spinne in einem Loch #[[1]]# horte.", + /*german*/ "Man erzählt sich, daß eine #spinnenbewachte Spinne in einem Erdloch #[[1]]# horte.", /*french*/ "Selon moi, une #Skulltula dans un trou d'arachnides# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula custodiada por otra# de un hoyo otorga #[[1]]#. @@ -697,17 +698,17 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, la noche revela una #Skulltula del laberinto forestal# que otorga #[[1]]#. hintTextTable[RHT_SFM_GS] = HintText(CustomMessage("They say that night reveals a #spider in a forest meadow# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einer Waldwiese# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einer Waldlichtung# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans le sanctuaire des bois# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula de la pradera del bosque# que otorga #[[1]]#. hintTextTable[RHT_OGC_GS] = HintText(CustomMessage("They say that a #spider outside a tyrant's tower# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Spinne außerhalb eines Turms eines Tyrannen# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #Spinne außerhalb eines Turmes eines Tyrannen# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula parmi les ruines du château# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula a las afueras de la torre de un tirano# otorga #[[1]]#. hintTextTable[RHT_HC_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #tree outside of a castle# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine in einem #Baum außerhalb von einem Schloß befindliche Spinne# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine in einem #Baum außerhalb eines Schloßes befindliche Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans l'arbre près du château# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol de las afueras de un castillo# otorga #[[1]]#. @@ -717,17 +718,17 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, una #Skulltula bajo una custodiada caja# otorga #[[1]]#. hintTextTable[RHT_DMC_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a volcano# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #in einem Vulkan begrabene Spinne# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #in einem Vulkan vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée dans un volcan# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en un volcán# otorga #[[1]]#. hintTextTable[RHT_DMT_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried outside a cavern# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #außerhalb einer Höhle begrabene Spinne# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #außerhalb einer Höhle vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée près d'une caverne# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada a la entrada de una cueva# otorga #[[1]]#. hintTextTable[RHT_DMT_GS_NEAR_KAK] = HintText(CustomMessage("They say that a #spider hidden in a mountain nook# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #in einem Bergwinkel versteckte Spinne# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #in einer Bergnische versteckte Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula cachée dans le flanc d'une montagne# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula oculta en el rincón de la montaña# otorga #[[1]]#. @@ -752,32 +753,32 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, una #Skulltula bajo una caja# de la Ciudad Goron otorga #[[1]]#. hintTextTable[RHT_KAK_GS_HOUSE_UNDER_CONSTRUCTION] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Dorf# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans le chantier de construction# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_SKULLTULA_HOUSE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Dorf# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une maison maudite# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_GUARDS_HOUSE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Dorf# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une maison de village# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_TREE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Dorf# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un arbre de village# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_WATCHTOWER] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Dorf# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une échelle dans un village# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_ABOVE_IMPAS_HOUSE] = HintText(CustomMessage("They say that night in the future reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einer Stadt# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einem Dorf# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus d'une grande maison# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del pueblo# que otorga #[[1]]#. @@ -787,32 +788,32 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, la noche revela una #Skulltula del cementerio# que otorga #[[1]]#. hintTextTable[RHT_GRAVEYARD_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a graveyard# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #auf einem Friedhof begrabene Spinne# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #auf einem Friedhof vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée dans le Cimetière# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en el cementerio# otorga #[[1]]#. hintTextTable[RHT_ZR_GS_LADDER] = HintText(CustomMessage("They say that night in the past reveals a #spider in a river# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Fluß# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne an einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une échelle près d'une cascade# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del río# que otorga #[[1]]#. hintTextTable[RHT_ZR_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #tree by a river# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine in einem #Baum bei einem Fluß# versteckte Spinne #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine in einem #Baum an einem Fluß# versteckte Spinne #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un arbre près du fleuve# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol de un río# otorga #[[1]]#. hintTextTable[RHT_ZR_GS_ABOVE_BRIDGE] = HintText(CustomMessage("They say that night in the future reveals a #spider in a river# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einem Fluß# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne an einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une façade près d'une cascade# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del río# que otorga #[[1]]#. hintTextTable[RHT_ZR_GS_NEAR_RAISED_GROTTOS] = HintText(CustomMessage("They say that night in the future reveals a #spider in a river# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einem Fluß# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne an einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une façade près d'une grotte du fleuve# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del río# que otorga #[[1]]#. hintTextTable[RHT_ZD_GS_FROZEN_WATERFALL] = HintText(CustomMessage("They say that night reveals a #spider by a frozen waterfall# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne bei einem gefrorenen Wasserfall# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne an einem gefrorenen Wasserfall# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près d'une cascade gelée# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a una congelada cascada# que otorga #[[1]]#. @@ -827,32 +828,32 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol junto a cierta deidad# otorga #[[1]]#. hintTextTable[RHT_LH_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried by a lake# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #bei einem Fluß begrabene Spinne# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #an einem Fluß vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée près d'un lac# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada junto a un lago# otorga #[[1]]#. hintTextTable[RHT_LH_GS_SMALL_ISLAND] = HintText(CustomMessage("They say that night reveals a #spider by a lake# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne bei einem Fluß# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne an einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur un îlot du lac# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a un lago# que otorga #[[1]]#. hintTextTable[RHT_LH_GS_LAB_WALL] = HintText(CustomMessage("They say that night reveals a #spider by a lake# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne bei einem Fluß# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne an einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur le mur d'un centre de recherche# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a un lago# que otorga #[[1]]#. hintTextTable[RHT_LH_GS_LAB_CRATE] = HintText(CustomMessage("They say that a spider deed underwater in a #lab crate# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß einer Spinne in einer #Laborkiste# unter Wasser #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine Spinne in einer #Laborkiste# unter Wasser #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans une boîte au fond d'une cuve d'eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula bajo la sumergida caja de un laboratorio# otorga #[[1]]#. hintTextTable[RHT_LH_GS_TREE] = HintText(CustomMessage("They say that night reveals a #spider by a lake high in a tree# holding #[[1]]#.", - /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne in einem Baum bei einem Fluß# enthülle, welche #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne in einem Baum an einem Fluß# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un grand arbre du lac# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela #una Skulltula del lago sobre un árbol# que otorga #[[1]]#. hintTextTable[RHT_GV_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a valley# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #in einem Tal begrabene Spinne# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #in einem Tal vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterré dans une vallée# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en un valle# otorga #[[1]]#. @@ -882,7 +883,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, la noche revela una #Skulltula de una fortaleza# que otorga #[[1]]#. hintTextTable[RHT_COLOSSUS_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in the desert# holds #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #in der Wüste begrabene Spinne# #[[1]]# besäße.", + /*german*/ "Man erzählt sich, daß eine #in der Wüste vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée au pied du colosse# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en el desierto# otorga #[[1]]#. @@ -897,47 +898,47 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, la noche revela una #Skulltula en las profundidades del desierto# que otorga #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_1] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -947,7 +948,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_2] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -957,7 +958,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_3] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -967,7 +968,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_4] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -977,7 +978,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_5] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -987,7 +988,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_6] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -997,7 +998,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_7] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -1007,7 +1008,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_8] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -1057,7 +1058,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_1] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1067,7 +1068,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_2] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1077,7 +1078,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_3] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1087,7 +1088,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_4] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1097,7 +1098,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_5] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1107,7 +1108,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_6] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1117,7 +1118,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_7] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1127,7 +1128,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_8] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1137,82 +1138,82 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_1] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_2] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_3] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_4] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_5] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_6] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_7] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_8] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_1] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_2] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_3] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_4] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_5] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_6] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_7] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_8] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", + /*german*/ "Man erzählt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |würde|würden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. @@ -1297,132 +1298,132 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_HF_DEKU_SCRUB_GROTTO] = HintText(CustomMessage("They say that a lonely #scrub in a hole# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #einsamer Deku in einem Loch# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #einsamer Deku-Händler in einem Erdloch# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo dans une grotte de la plaine# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #singular deku bajo un hoyo# de la llanura vende #[[1]]#. hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo à la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de una granja venden #[[1]]#. hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo à la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de una granja venden #[[1]]#. hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo à la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de una granja venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = HintText(CustomMessage("They say that a pair of #scrubs in the woods# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar in den Wäldern# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar in den Wäldern# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près du théâtre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un par de #dekus del bosque# venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = HintText(CustomMessage("They say that a pair of #scrubs in the woods# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar in den Wäldern# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar in den Wäldern# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près du théâtre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un par de #dekus del bosque# venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_BRIDGE] = HintText(CustomMessage("They say that a #scrub by a bridge# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku bei einer Brücke# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler an einer Brücke# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo près du pont dans les bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #deku bajo un puente# del bosque venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans les sous-bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del bosque venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans les sous-bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del bosque venden #[[1]]#. hintTextTable[RHT_SFM_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", - /*french*/ "Selon moi, le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar im Untergrund# #[[1]]# verkaufe.", + /*french*/ "Selon moi, le #duo de peste Mojo au coeur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# de la pradera sagrada venden #[[1]]#. hintTextTable[RHT_SFM_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", - /*french*/ "Selon moi, le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar im Untergrund# #[[1]]# verkaufe.", + /*french*/ "Selon moi, le #duo de peste Mojo au coeur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# de la pradera sagrada venden #[[1]]#. hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de la Ciudad Goron venden #[[1]]#. hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de la Ciudad Goron venden #[[1]]#. hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# de la Ciudad Goron venden #[[1]]#. hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del volcán venden #[[1]]#. hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del volcán venden #[[1]]#. hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del volcán venden #[[1]]#. hintTextTable[RHT_ZR_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près du fleuve# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del río venden #[[1]]#. hintTextTable[RHT_ZR_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près du fleuve# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del río venden #[[1]]#. hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo près du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del lago venden #[[1]]#. hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo près du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del lago venden #[[1]]#. hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo près du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #trío de dekus# del lago venden #[[1]]#. hintTextTable[RHT_GV_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près de la vallée# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del valle venden #[[1]]#. hintTextTable[RHT_GV_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo près de la vallée# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del valle venden #[[1]]#. hintTextTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans le désert# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del desierto venden #[[1]]#. hintTextTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzählt sich, daß ein #Deku-Händler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans le désert# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# del desierto venden #[[1]]#. @@ -1437,12 +1438,12 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, una #vaca del establo# brinda #[[1]]#. hintTextTable[RHT_LLR_TOWER_RIGHT_COW] = HintText(CustomMessage("They say that a #cow in a ranch silo# gifts #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Kuh in einem Silo# #[[1]]# schenke.", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem Farmsilo# #[[1]]# schenke.", /*french*/ "Selon moi, la #vache dans le silo de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #vaca del granero# brinda #[[1]]#. hintTextTable[RHT_LLR_TOWER_LEFT_COW] = HintText(CustomMessage("They say that a #cow in a ranch silo# gifts #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Kuh in einem Silo# #[[1]]# schenke.", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem Farmsilo# #[[1]]# schenke.", /*french*/ "Selon moi, la #vache dans le silo de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #vaca del granero# brinda #[[1]]#. @@ -1452,507 +1453,634 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, una #vaca enjaulada de una casa# brinda #[[1]]#. hintTextTable[RHT_DMT_COW_GROTTO_COW] = HintText(CustomMessage("They say that a #cow in a luxurious hole# offers #[[1]]#.", - /*german*/ "Man erzählt sich, daß eine #Kuh in einem luxuriösen Loch# #[[1]]# offeriere.", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem luxuriösen Erdloch# #[[1]]# offeriere.", /*french*/ "Selon moi, la #vache dans une grotte luxueuse# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #vaca de un lujoso hoyo# brinda #[[1]]#. hintTextTable[RHT_BEEHIVE_CHEST_GROTTO] = HintText(CustomMessage("They say that a #beehive above a chest# hides #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb einer Truhe# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, une #ruche au dessus d'un coffre# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un cofre# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_LONELY_SCRUB_GROTTO] = HintText(CustomMessage("They say that a #beehive above a lonely scrub# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines einsamen Deku# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines einsamen Deku-Händlers# #[[1]]# verberge.", + /*french*/ "Selon moi, une #ruche au dessus d'une Peste Mojo solitaire# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un deku solitario# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_SCRUB_PAIR_GROTTO] = HintText(CustomMessage("They say that a #beehive above a pair of scrubs# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines Deku-Paars# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines Deku-Händler-Paars# #[[1]]# verberge.", + /*french*/ "Selon moi, une #ruche au dessus d'un duo de Pestes Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un par de dekus# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_SCRUB_TRIO_GROTTO] = HintText(CustomMessage("They say that a #beehive above a trio of scrubs# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines Deku-Trios# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines Deku-Händler-Trios# #[[1]]# verberge.", + /*french*/ "Selon moi, une #ruche au dessus d'un trio de Pestes Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un trío de dekus# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_COW_GROTTO] = HintText(CustomMessage("They say that a #beehive above a cow# hides #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb einer Kuh# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, une #ruche au dessus d'une vache# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre una vaca# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA] = HintText(CustomMessage("They say that a #beehive in front of the king of the zoras# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Bienenstock vor dem Zora-König# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß ein #Bienenstock vor dem König der Zoras# #[[1]]# verberge.", + /*french*/ "Selon moi, une #ruche devant le Roi des Zoras# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena delante del rey de los zoras# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_BEHIND_KING_ZORA] = HintText(CustomMessage("They say that a #beehive behind the king of the zoras# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Bienenstock hinter dem Zora-König# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß ein #Bienenstock hinter dem König der Zoras# #[[1]]# verberge.", + /*french*/ "Selon moi, une #rucheau derrière le Roi des Zoras# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena detrás del rey de los zoras# esconde #[[1]]#. hintTextTable[RHT_POT_KOKIRI_FOREST] = HintText(CustomMessage("They say that a #pot in Kokiri Forest# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug im Kokiri-Wald# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Fôret Kokiri# contient #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_POT_GERUDO_FORTRESS] = HintText(CustomMessage("They say that a #pot in Gerudo Fortress# contains #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, une #jarre dans la Forteresse Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_TH_BREAK_ROOM_FRONT_POT] = HintText(CustomMessage("They say that the #front pot watched by resting thieves# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_BREAK_ROOM_BACK_POT] = HintText(CustomMessage("They say that the #back pot watched by resting thieves# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_KITCHEN_POT_1] = HintText(CustomMessage("They say that a #Hideout's Kitchen pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_KITCHEN_POT_2] = HintText(CustomMessage("They say that a #Hideout's Kitchen pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_1_TORCH_CELL_RIGHT_POT] = HintText(CustomMessage("They say that the #thieve's right pot, watched by a single torch# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_1_TORCH_CELL_MID_POT] = HintText(CustomMessage("They say that the #thieve's middle pot, watched by a single torch# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_1_TORCH_CELL_LEFT_POT] = HintText(CustomMessage("They say that the #thieve's left pot, watched by a single torch# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_STEEP_SLOPE_RIGHT_POT] = HintText(CustomMessage("They say that a #Gerudo pot, on the right of a sloped corner# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_STEEP_SLOPE_LEFT_POT] = HintText(CustomMessage("They say that a #Gerudo pot, on the left of a sloped corner# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_NEAR_DOUBLE_CELL_RIGHT_POT] = HintText(CustomMessage("They say that the #right pot near 2 jail cells# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_NEAR_DOUBLE_CELL_MID_POT] = HintText(CustomMessage("They say that the #mid pot near 2 jail cells# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_NEAR_DOUBLE_CELL_LEFT_POT] = HintText(CustomMessage("They say that the #left pot near 2 jail cells# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_RIGHTMOST_JAILED_POT] = HintText(CustomMessage("They say that the #rightmost jailed pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_RIGHT_MIDDLE_JAILED_POT] = HintText(CustomMessage("They say that the #right middle jailed pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_LEFT_MIDDLE_JAILED_POT] = HintText(CustomMessage("They say that the #left middle jailed pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_LEFTMOST_JAILED_POT] = HintText(CustomMessage("They say that the #leftmost jailed pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE hintTextTable[RHT_POT_WASTELAND] = HintText(CustomMessage("They say that a #pot in Haunted Wasteland# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug in der Gespensterwüste# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Désert Hanté# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_MARKET] = HintText(CustomMessage("They say that a #pot in Market# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug auf dem Markt# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Place du Marché# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_KAKARIKO] = HintText(CustomMessage("They say that a #pot in Kakariko Village# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug in Kakariko# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Village de Cocorico# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_GRAVEYARD] = HintText(CustomMessage("They say that a #pot in Graveyard# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug auf dem Friedhof# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Cimetière# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_GORON_CITY] = HintText(CustomMessage("They say that a #pot in Goron City# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug in Goronia# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Village Goron# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("They say that a #pot in Death Mountain Crater# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug im Todeskrater# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre sur le Mont du Péril# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_ZORAS_DOMAIN] = HintText(CustomMessage("They say that a #pot in Zora's Domain# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug in Zoras Reich# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Domaine Zora# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_ZORAS_FOUNTAIN] = HintText(CustomMessage("They say that a #pot in Zora's Fountain# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug in Zoras Quelle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Fontaine Zora# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_LON_LON_RANCH] = HintText(CustomMessage("They say that a #pot in Lon Lon Ranch# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug auf der Lon Lon-Farm# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Ranch Lon Lon# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_HYRULE_FIELD] = HintText(CustomMessage("They say that a #pot in Hyrule Field# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug in der Hylianischen Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Plaine d'Hyrule# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_HYRULE_CASTLE] = HintText(CustomMessage("They say that a #pot in Hyrule Castle# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krug in Schloß Hyrule# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Château d'Hyrule# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_KOKIRI_FOREST_RUPEE] = HintText(CustomMessage("They say that a rupee in a #tranquil forest# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Rubin in einem #ruhigen Wald# #[[1]]# verstecke.", /*french*/ "Selon moi, un rubis dans une #forêt tranquille# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_KOKIRI_FOREST_HEART] = HintText(CustomMessage("They say that a heart in a #tranquil forest# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Herz in einem #ruhigen Wald# #[[1]]# verstecke.", /*french*/ "Selon moi, un cœur dans une #forêt tranquille# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_SARIAS_HOUSE_HEART] = HintText(CustomMessage("They say that a heart in a #dear friend's home# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Herz #im Heim eines lieben Freundes# #[[1]]# verstecke.", /*french*/ "Selon moi, un cœur dans la #maison d'une amie chère# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LOST_WOODS_RUPEE] = HintText(CustomMessage("They say that under a #boulder in the woods# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß unter einem #Felsen in den Wäldern# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, sous un #rocher dans les bois# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LOST_WOODS_SHORTCUT_RUPEE] = HintText(CustomMessage("They say that in a #pool of water in the woods# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß in einem #Wasserbecken in den Wäldern# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, dans une #mare d'eau dans les bois# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LAKE_HYLIA_RUPEE] = HintText(CustomMessage("They say that just off the #coast of a lake# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß vor dem #Ufer eines Sees# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, juste au large de la #côte d'un lac# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LABORATORY_RUPEE] = HintText(CustomMessage("They say that at the #bottom of a tank# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Grund eines Reservoirs# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, au #fond d'un réservoir# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DAMPES_GRAVE_RUPEE] = HintText(CustomMessage("They say that within a #quick-footed spirit's grave# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß innerhalb eines #Grabes eines leichtfüßigen Geistes# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, dans la #tombe d'un esprit à pieds rapides# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_GERUDO_VALLEY_GROTTO_RUPEE] = HintText(CustomMessage("They say that an Octarok in an #underground spring# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Oktorok in einer #untergründigen Quelle# #[[1]]# bewache.", /*french*/ "Selon moi, un Octrocher dans une #source souterraine# garde #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_RUPEE] = HintText(CustomMessage("They say that beneath a boulder on a #mountain's cliffside# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß unterhalb eines Felsens an der #Klippe eines Berges# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, sous un rocher sur la #falaise d'une montagne# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART] = HintText(CustomMessage("They say that accompanying a #cow in a small cave# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß neben einer #Kuh in einer kleinen Höhle# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, accompagner une #vache dans une petite grotte# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE] = HintText(CustomMessage("They say that accompanying a #cow in a small cave# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß neben einer #Kuh in einer kleinen Höhle# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, accompagner une #vache dans une petite grotte# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_CRATER_RUPEE] = HintText(CustomMessage("They say that on a #small platform suspended above lava# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf einer #auf Lava schwimmenden kleinen Plattform# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, sur une #petite plateforme suspendue au-dessus de la lave# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_ZORAS_RIVER_WATERFALL_RUPEE] = HintText(CustomMessage("They say that beneath a #waterfall feeding a narrow river# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß unterhalb eines #Wasserfalls der einen schmalen Fluß nähre# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, sous une #cascade alimentant une rivière étroite# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_ZORAS_FOUNTAIN_RUPEE] = HintText(CustomMessage("They say that at the bottom of a #partially-frozen spring# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem Grund einer #teilweise gefrorenen Quelle# #[[1]]# |läge|lägen|.", /*french*/ "Selon moi, au fond d'une #source partiellement gelée# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_SFM_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a forest meadow# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens unter einer Waldlichtung# #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine sous un bosquet forestier# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a river# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens unter einem Fluß# #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine sous une rivière# repose #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_HF_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a a few trees bordering a wide field# rests #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_HF_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a few trees bordering a wide field# rests #[[1]]#.", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens, unter Bäumen auf einer weiten Steppe#, #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine sous quelques arbres bordant un vaste champ# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZD_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath the home of the Zoras# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens unter der Heimat der Zoras# #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine sous la maison des Zora# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GF_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath the home of thieves# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens unter der Heimat der Diebe# #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine sous la maison des voleurs# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY] = HintText(CustomMessage("They say that within #a fountain behind a wall within a grave# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens, hinter einer Mauer eines Grabes#, #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine derrière un mur dans une tombe# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_COLOSSUS_OASIS_FAIRY] = HintText(CustomMessage("They say that #restoring water to a dried oasis# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß eine #ausgetrockneten Oase wieder aufzufüllen# #[[1]]# enthülle.", /*french*/ "Selon moi, #restaurer l'eau dans un oasis asséché# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the riverside# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sproßes am Flußufer# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse au bord de la rivière# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near a forest shop# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sproßes nahe des Kokiri-Ladens# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse près d'un magasin forestier# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near the entrance to the forest# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sproßes nahe des Waldeingangs# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse près de l'entrée de la forêt# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout above a sylvan theatre# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sproßes oberhalb eines waldigen Theaters# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse au-dessus d'un théâtre sylvestre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the lakeside# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sproßes am Seeufer# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse au bord du lac# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GV_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the side of a canyon# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sproßes an der Seite einer Schlucht# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse sur le côté d'un canyon# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_COLOSSUS_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near a temple of the sand# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sproßes nahe eines Tempels des Sandes# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse près d'un temple du sable# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout within a graveyard# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sproßes auf einem Friedhof# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse dans un cimetière# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout within a volcano# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sproßes innerhalb eines Vulkans# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse dans un volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_DMT_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the moutainside# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_DMT_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the mountainside# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sproßes an einem Berghang# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse sur le flanc d'une montagne# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the ouskirts of the market# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the outskirts of the market# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein am Rand des Marktes#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange en périphérie du marché# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the ouskirts of the market# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the outskirts of the market# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein am Rand des Marktes#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange en périphérie du marché# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a volcano# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein innerhalb eines Vulkans#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange dans un volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a volcano# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein innerhalb eines Vulkans#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange dans un volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone on a mountain cliff face# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein an einer Bergklippe#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sur une falaise de montagne# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone on a mountain cliff face# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein an einer Bergklippe#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sur une falaise de montagne# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near the temple of the sane# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near the temple of the sand# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein nahe des Tempels des Sandes#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange près du temple du sable# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near the temple of the sane# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near the temple of the sand# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein nahe des Tempels des Sandes#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange près du temple du sable# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GV_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a canyon waterfall# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein nahe eines Wasserfalls in einer Schlucht#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange près d'une cascade de canyon# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GV_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a canyon waterfall# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein nahe eines Wasserfalls in einer Schlucht#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange près d'une cascade de canyon# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MAZE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone behind a maze of rock# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein hinter einem Felslabyrinth#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange derrière un labyrinthe de roches# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone behind a maze of rock# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein hinter einem Felslabyrinth#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange derrière un labyrinthe de roches# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a blacksmith# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein nahe eines Schmiedes#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange près d'un forgeron# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a blacksmith# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein nahe eines Schmiedes#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange près d'un forgeron# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the graveyard# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein, welcher den Friedhof überblickt#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant le cimetière# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the graveyard# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein, welcher den Friedhof überblickt#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant le cimetière# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_MALON_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the path to the castle# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein, welcher den Pfad zum Schloß überblickt#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant le chemin du château# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the path to the castle# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein, welcher den Pfad zum Schloß überblickt#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant le chemin du château# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a secret path to the castle# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein nahe eines geheimen Pfades zum Schloß#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange près d'un chemin secret vers le château# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a secret path to the castle# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein nahe eines geheimen Pfades zum Schloß#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange près d'un chemin secret vers le château# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the castle# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein unterhalb des Schloßes#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous le château# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the castle# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous le château révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein unterhalb des Schloßes#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous le château# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near an ancient tree# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange près d'un arbre ancien révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein nahe eines antiken Baumes#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange près d'un arbre ancien# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near an ancient tree# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange près d'un arbre ancien révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein nahe eines antiken Baumes#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange près d'un arbre ancien# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking a forest village# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surplombant un village forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein, welcher ein Dorf im Wald überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant un village forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking a forest village# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surplombant un village forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein, welcher ein Dorf im Wald überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant un village forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a forest village# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous un village forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein unterhalb eines Dorfes im Wald#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous un village forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a forest village# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous un village forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein unterhalb eines Dorfes im Wald#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous un village forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_LAB_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the river feeding a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surplombant la rivière qui alimente un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein, welcher einen See nährenden Fluß überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant la rivière qui alimente un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the river feeding a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surplombant la rivière qui alimente un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein, welcher einen See nährenden Fluß überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant la rivière qui alimente un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange au fond d'un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein am Rücken eines Sees#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange au fond d'un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange au fond d'un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein am Rücken eines Sees#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange au fond d'un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange au fond d'un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein am Rücken eines Sees#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange au fond d'un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange au fond d'un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein am Rücken eines Sees#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange au fond d'un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a perplexing wood# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange dans un bois déroutant révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein innerhalb eines verwirrenden Waldes#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange dans un bois déroutant# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a perplexing wood# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange dans un bois déroutant révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein innerhalb eines verwirrenden Waldes#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange dans un bois déroutant# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_MAZE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking a forest maze# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surplombant un labyrinthe forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein, welcher ein Waldlabyrinth überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant un labyrinthe forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking a forest maze# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surplombant un labyrinthe forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein, welcher ein Waldlabyrinth überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant un labyrinthe forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_SARIA_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone watching a hiding place in the woods# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surveillant une cachette dans les bois révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein, welcher ein Versteck im Wald überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surveillant une cachette dans les bois# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone watching a hiding place in the woods# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surveillant une cachette dans les bois révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein, welcher ein Versteck im Wald überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surveillant une cachette dans les bois# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZD_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone listening to an aquatic king# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange écoutant un roi aquatique révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein, welcher einem aquatischen König zuhört#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange écoutant un roi aquatique# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZD_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone listening to an aquatic king# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange écoutant un roi aquatique révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein, welcher einem aquatischen König zuhört#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange écoutant un roi aquatique# révèle [[1]].", {QM_RED, QM_GREEN})); - hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the ouskirts of a deap fountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange en périphérie d'une profonde fontaine révèle [[1]].", {QM_RED, QM_GREEN})); + hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the outskirts of a deep fountain# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein am Rand eines tiefen Brunnens#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange en périphérie d'une profonde fontaine# révèle [[1]].", {QM_RED, QM_GREEN})); - hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the ouskirts of a deap fountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange en périphérie d'une profonde fontaine révèle [[1]].", {QM_RED, QM_GREEN})); + hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the outskirts of a deep fountain# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein am Rand eines tiefen Brunnens#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange en périphérie d'une profonde fontaine# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZF_JABU_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone watching a guardian of the sea# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surveillant un gardien de la mer révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein, welcher einen Wächter des Meeres beobachtet#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surveillant un gardien de la mer# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone watching a guardian of the sea# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surveillant un gardien de la mer révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein, welcher einen Wächter des Meeres beobachtet#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surveillant un gardien de la mer# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overwatching a river# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surplombant une rivière révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein, welcher einen Fluß überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant une rivière# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overwatching a river# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surplombant une rivière révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein, welcher einen Fluß überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant une rivière# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a waterfall# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous une cascade révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein unterhalb eines Wasserfalls#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous une cascade# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a waterfall# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous une cascade révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein unterhalb eines Wasserfalls#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous une cascade# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone hiding near a cow# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange cachée près d'une vache révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein, welcher sich nahe einer Kuh versteckt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange cachée près d'une vache# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone hiding near a cow# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange cachée près d'une vache révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein, welcher sich nahe einer Kuh versteckt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange cachée près d'une vache# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the entrance to the market# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous l'entrée du marché révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein unterhalb des Eingangs zum Markt# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous l'entrée du marché# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the entrance to the market# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous l'entrée du marché révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein unterhalb des Eingangs zum Markt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous l'entrée du marché# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath trees guarded by a Peahat# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous des arbres gardés par un Peahat révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein unterhalb von Killeranas bewachten Bäumen#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous des arbres gardés par un Peahat# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath trees guarded by a Peahat# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous des arbres gardés par un Peahat révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein unterhalb von Killeranas bewachten Bäumen#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous des arbres gardés par un Peahat# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a village at the base of a mountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous un village au pied d'une montagne révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein unterhalb eines Dorfes am Fuße eines Berges#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous un village au pied d'une montagne# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a village at the base of a mountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous un village au pied d'une montagne révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein unterhalb eines Dorfes am Fuße eines Berges#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous un village au pied d'une montagne# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a plateau by a river# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange dans un plateau près d'une rivière révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein auf einem Plateau an einem Fluß#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange dans un plateau près d'une rivière# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a plateau by a river# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange dans un plateau près d'une rivière révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein auf einem Plateau an einem Fluß#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange dans un plateau près d'une rivière# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath an escape from the forest# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous une issue de la forêt révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein unterhalb eines Auswegs des Waldes#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous une issue de la forêt# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath an escape from the forest# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous une issue de la forêt révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein unterhalb eines Auswegs des Waldes#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous une issue de la forêt# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the entrance to a village within a mountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous l'entrée d'un village dans une montagne révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein unterhalb eines Eingangs zu einem Dorf innerhalb eines Berges#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous l'entrée d'un village dans une montagne# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the entrance to a village within a mountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous l'entrée d'un village dans une montagne révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein unterhalb eines Eingangs zu einem Dorf innerhalb eines Berges#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous l'entrée d'un village dans une montagne# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within the side of a crater# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange dans le côté d'un cratère révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie, für einen seltsamen Stein innerhalb der Seite eines Kraters#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange dans le côté d'un cratère# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within the side of a crater# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange dans le côté d'un cratère révèle [[1]].", {QM_RED, QM_GREEN})); - - hintTextTable[RHT_LH_ISLAND_SUN_FAIRY] = HintText(CustomMessage("They say that #summoning the sun on the lake's island# calls #[[1]]#.", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie, für einen seltsamen Stein innerhalb der Seite eines Kraters#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange dans le côté d'un cratère# révèle [[1]].", {QM_RED, QM_GREEN})); - hintTextTable[RHT_HF_POND_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling rain to the field's pond# summons #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_LH_ISLAND_SUN_FAIRY] = HintText(CustomMessage("They say that #summoning the sun on the lake's island# calls #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Beschwören der Sonne auf der Insel eines Sees# #[[1]]# anrufe.", + /*french*/ "Selon moi, #appeler le soleil sur l'île du lac # révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_HF_FENCE_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in a scrub's cave# wakes #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_HF_POND_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling rain to the field's pond# summons #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens für den Tümpel einer Steppe# #[[1]]# beschwöre.", + /*french*/ "Selon moi, #jouer une mélodie orageuse dans l'étang d'une plaine# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_DMT_FLAG_SUN_FAIRY] = HintText(CustomMessage("They say that #changing the time in front of the trail's flag# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_HF_FENCE_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in a scrub's cave# wakes #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Machen von Regen in der Höhle eines Deku-Händlers# #[[1]]# erwecke.", + /*french*/ "Selon moi, #jouer une mélodie orageuse dans la grotte d'une Peste Mojo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_DMT_COW_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling a storm for a lonely cow# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_DMT_FLAG_SUN_FAIRY] = HintText(CustomMessage("They say that #changing the time in front of the trail's flag# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Verändern der Zeit im Angesicht der Flagge eines Pfades# #[[1]]# enthülle.", + /*french*/ "Selon moi, #appeler le soleil devant un drapeau du Mont du Péril # révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_LW_SHORTCUT_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in the Lost Woods# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_DMT_COW_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling a storm for a lonely cow# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen eines Sturms für eine einsame Kuh# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une vache solitaire# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_GF_KITCHEN_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a guarded kitchen# exposes #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_LW_SHORTCUT_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in the Lost Woods# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Machen von Regen in den verlorenen Wäldern# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse dans les Bois Perdus# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun for scrubs in the Lost Woods# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_TH_KITCHEN_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a guarded kitchen# exposes #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer bewachten Küche# #[[1]]# freilege.", + /*french*/ "Selon moi, #appeler le soleil dans une cuisine gardée# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a royal tomb# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun for scrubs in the Lost Woods# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne für Deku-Händler in den verlorenen Wäldern# #[[1]]# enthülle.", + /*french*/ "Selon moi, #appeler le soleil pour les Pestes dans les Bois Perdus # révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a royal tomb# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer königlichen Gruft# #[[1]]# enthülle.", + /*french*/ "Selon moi, #appeler le soleil dans une tombe royale# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KF_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a forest# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Mähen von Gras in einem Wald# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans un fôret# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LW_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the woods# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Mähen von Gras in den Wäldern# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans des bois# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_MARKET_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the market# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Mähen von Gras auf dem Markt# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans un marché# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HC_GRASS] = HintText(CustomMessage("They say that #cutting some grass near the castle# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Mähen von Gras in der Nähe des Schloßes# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe près du château# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_KAK_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a village# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Mähen von Gras in einem Dorf# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans un village# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GY_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a graveyard# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Mähen von Gras auf einem Friedhof# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans un cimetère# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a lake# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Mähen von Gras nahe eines Sees# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe près d'un lac# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_GRASS] = HintText(CustomMessage("They say that #cutting some grass on a field# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Mähen von Gras auf einer Steppe# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans une plaine# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZR_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a river# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Mähen von Gras in der Nähe eines Flußes# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe près d'une rivière# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GROTTO_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a grotto# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Mähen von Gras in einer Grotte# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe# cache #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_GERUDO_VALLEY] = HintText(CustomMessage("They say that a #crate in Gerudo Valley# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste im Gerudotal# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans une vallée# a #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_GERUDOS_FORTRESS] = HintText(CustomMessage("They say that a #crate in Gerudo Fortress# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste in der Gerudo-Festung# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans la Forteresse Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_WASTELAND] = HintText(CustomMessage("They say that a #crate in Haunted Wasteland# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste in der Gespensterwüste# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Désert Hanté# contient #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_MARKET] = HintText(CustomMessage("They say that a #crate in the Market# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste auf dem Markt# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans la Place du Marché# contient #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_KAKARIKO_VILLAGE] = HintText(CustomMessage("They say that a #crate in Kakariko Village# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste in Kakariko# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Village de Cocorico# contient #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_GRAVEYARD] = HintText(CustomMessage("They say that a #crate in the Graveyard# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste auf dem Friedhof# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Cimetière# contient #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_GORON_CITY] = HintText(CustomMessage("They say that a #crate in Goron City# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste in Goronia# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Village Goron# contient #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("They say that a #crate in Death Mountain Crater# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste im Todeskrater# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse sur le Mont du Péril# contient #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_LON_LON_RANCH] = HintText(CustomMessage("They say that a #crate in Lon Lon Ranch# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste auf der Lon Lon-Farm# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Ranch Lon Lon# contient #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_LAKESIDE_LABORATORY] = HintText(CustomMessage("They say that a #crate in the Laboratory# contains #[[1]]#.", + /*german*/ "Man erzählt sich, daß eine #Kiste im Labor am See# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans un laboratoire# contient #[[1]]#.", {QM_RED, QM_GREEN})); + + // clang-format on } -} +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp index 867da2b2cd..f5195c91d2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp @@ -5,7 +5,8 @@ namespace Rando { void StaticData::HintTable_Init_Item() { - + // clang-format off + hintTextTable[RHT_KOKIRI_SWORD] = HintText(CustomMessage("the Kokiri Sword", /*german*/"das Kokiri-Schwert", /*french*/"l'Épée Kokiri"), // /*spanish*/la Espada Kokiri { @@ -14,9 +15,9 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a butter knife", /*german*/"ein Buttermesser", /*french*/"un couteau à beurre"), // /*spanish*/un ágil puñal - CustomMessage("a starter slasher", /*german*/"ein Anfängerschwert", /*french*/"une arme de débutant"), + CustomMessage("a starter slasher", /*german*/"ein Schlitzer für Anfänger", /*french*/"une arme de débutant"), // /*spanish*/una hoja de principiantes - CustomMessage("a switchblade", /*german*/"ein Stellmesser", /*french*/"un canif")}); + CustomMessage("a switchblade", /*german*/"ein Taschenmesser", /*french*/"un canif")}); // /*spanish*/una navaja hintTextTable[RHT_MASTER_SWORD] = HintText(CustomMessage("the Master Sword", /*german*/"das Master-Schwert", /*french*/"l'Épée de Légende"), @@ -25,7 +26,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a sword", /*german*/"ein Schwert", /*french*/"une épée") // /*spanish*/una espada }, { - CustomMessage("evil's bane", /*german*/"der böse Fluch", /*french*/"le fléau du mal"), + CustomMessage("evil's bane", /*german*/"der Ruin des Bösen", /*french*/"le fléau du mal"), // /*spanish*/la destructora del mal CustomMessage("a seven year limbo", /*german*/"eine siebenjährige Erwartung", /*french*/"une stase de sept ans")}); // /*spanish*/unos siete años de espera @@ -36,7 +37,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a sword", /*german*/"ein Schwert", /*french*/"une épée") // /*spanish*/una espada }, { - CustomMessage("a fragile blade", /*german*/"ein fragiles Schwert", /*french*/"une lame fragile"), + CustomMessage("a fragile blade", /*german*/"eine fragile Klinge", /*french*/"une lame fragile"), // /*spanish*/una frágil hoja CustomMessage("a breakable cleaver", /*german*/"ein brüchiger Spalter", /*french*/"un espadon de verre")}); // /*spanish*/un rompible acero @@ -47,7 +48,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a sword", /*german*/"ein Schwert", /*french*/"une épée") // /*spanish*/una espada }, { - CustomMessage("the biggest blade", /*german*/"das größte Schwert", /*french*/"une lame gigantesque"), + CustomMessage("the biggest blade", /*german*/"die größte Klinge", /*french*/"une lame gigantesque"), // /*spanish*/el mayor mandoble CustomMessage("a colossal cleaver", /*german*/"ein kolossaler Spalter", /*french*/"un espadon colossal")}); // /*spanish*/un estoque colosal @@ -58,7 +59,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a shield", /*german*/"ein Schild", /*french*/"un bouclier") // /*spanish*/un escudo }, { - CustomMessage("a wooden ward", /*german*/"eine hölzerne Abwehr", /*french*/"un écu d'écorce"), + CustomMessage("a wooden ward", /*german*/"ein hölzerner Schutz", /*french*/"un écu d'écorce"), // /*spanish*/una protección del bosque CustomMessage("a burnable barrier", /*german*/"eine brennbare Barriere", /*french*/"une protection inflammable")}); // /*spanish*/una barrera quemable @@ -74,7 +75,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("Like Like's metal meal", /*german*/"Raubschleims Metallmahlzeit", /*french*/"un amuse-gueule de Pudding")}); // /*spanish*/un alimento de Like Like - hintTextTable[RHT_MIRROR_SHIELD] = HintText(CustomMessage("the Mirror Shield", /*german*/"das Spiegelschild", /*french*/"le Bouclier Miroir"), + hintTextTable[RHT_MIRROR_SHIELD] = HintText(CustomMessage("the Mirror Shield", /*german*/"der Spiegel-Schild", /*french*/"le Bouclier Miroir"), // /*spanish*/el escudo espejo { CustomMessage("a shield", /*german*/"ein Schild", /*french*/"un bouclier") @@ -87,23 +88,23 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a silvered surface", /*german*/"eine silberne Oberfläche", /*french*/"une surface argentée")}); // /*spanish*/una superficie plateada - hintTextTable[RHT_GORON_TUNIC] = HintText(CustomMessage("a Goron Tunic", /*german*/"eine Goronen-Tunika", /*french*/"une Tunique Goron"), + hintTextTable[RHT_GORON_TUNIC] = HintText(CustomMessage("a Goron Tunic", /*german*/"eine Goronen-Rüstung", /*french*/"une Tunique Goron"), // /*spanish*/un sayo goron { - CustomMessage("a tunic", /*german*/"eine Tunika", /*french*/"une tunique") + CustomMessage("a tunic", /*german*/"eine Rüstung", /*french*/"une tunique") // /*spanish*/un sayo }, { - CustomMessage("ruby robes", /*german*/"Rubinroben", /*french*/"un pigment rouge"), + CustomMessage("ruby robes", /*german*/"Rubinroben€", /*french*/"un pigment rouge"), // /*spanish*/una vestimenta rubí CustomMessage("fireproof fabric", /*german*/"feuerfestes Gewebe", /*french*/"un trésor anti-flamme"), // /*spanish*/una ignífuga prenda - CustomMessage("cooking clothes", /*german*/"Kochschürze", /*french*/"une tenue de cuisine")}); + CustomMessage("cooking clothes", /*german*/"eine Kochschürze", /*french*/"une tenue de cuisine")}); // /*spanish*/unos abrasantes ropajes - hintTextTable[RHT_ZORA_TUNIC] = HintText(CustomMessage("a Zora Tunic", /*german*/"eine Zora-Tunika", /*french*/"une Tunique Zora"), + hintTextTable[RHT_ZORA_TUNIC] = HintText(CustomMessage("a Zora Tunic", /*german*/"eine Zora-Rüstung", /*french*/"une Tunique Zora"), // /*spanish*/un sayo zora { - CustomMessage("a tunic", /*german*/"eine Tunika", /*french*/"une tunique"), + CustomMessage("a tunic", /*german*/"eine Rüstung", /*french*/"une tunique"), // /*spanish*/un sayo CustomMessage("something expensive", /*german*/"etwas Teures", /*french*/"une chose dispendieuse") // /*spanish*/algo caro @@ -115,42 +116,42 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a swimsuit", /*german*/"ein Badeanzug", /*french*/"un costume de baignade")}); // /*spanish*/unos ropajes sumergibles - hintTextTable[RHT_IRON_BOOTS] = HintText(CustomMessage("the Iron Boots", /*german*/"die Eisenstiefel", /*french*/"une paire de Bottes de plomb"), + hintTextTable[RHT_IRON_BOOTS] = HintText(CustomMessage("the Iron Boots", /*german*/"die Eisenstiefel€", /*french*/"une paire de Bottes de plomb"), // /*spanish*/las botas de hierro { - CustomMessage("some boots", /*german*/"ein paar Stiefel", /*french*/"une paire de bottes"), + CustomMessage("some boots", /*german*/"ein Paar Stiefel€", /*french*/"une paire de bottes"), // /*spanish*/un par de botas CustomMessage("a feature of the Water Temple", /*german*/"ein Merkmal des Wassertempels", /*french*/"une particularité du Temple de l'Eau"), // /*spanish*/algo particular del Templo del Agua CustomMessage("something heavy", /*german*/"etwas Schweres", /*french*/"une chose pesante") // /*spanish*/algo de lo más pesado }, { - CustomMessage("sink shoes", /*german*/"Sinkschuhe", /*french*/"un boulet de fer"), + CustomMessage("sink shoes", /*german*/"Sinkschuhe€", /*french*/"un boulet de fer"), // /*spanish*/un calzado de las profundidades - CustomMessage("clank cleats", /*german*/"klirrende Knacken", /*french*/"une paire de talons bruyants")}); + CustomMessage("clank cleats", /*german*/"scheppernde Stollen€", /*french*/"une paire de talons bruyants")}); // /*spanish*/unas suelas férreas - hintTextTable[RHT_HOVER_BOOTS] = HintText(CustomMessage("the Hover Boots", /*german*/"die Gleitstiefel", /*french*/"une paire de Bottes des airs"), + hintTextTable[RHT_HOVER_BOOTS] = HintText(CustomMessage("the Hover Boots", /*german*/"die Gleitstiefel€", /*french*/"une paire de Bottes des airs"), // /*spanish*/las botas voladoras { - CustomMessage("some boots", /*german*/"ein paar Stiefel", /*french*/"une paire de bottes") + CustomMessage("some boots", /*german*/"ein Paar Stiefel€", /*french*/"une paire de bottes") // /*spanish*/un par de botas }, { - CustomMessage("butter boots", /*german*/"Butterstiefel", /*french*/"une paire de patins de beurre"), + CustomMessage("butter boots", /*german*/"Butterstiefel€", /*french*/"une paire de patins de beurre"), // /*spanish*/unas suelas resvaladizas - CustomMessage("sacred slippers", /*german*/"heilige Pantoffeln", /*french*/"une paire de pantoufles sacrées"), + CustomMessage("sacred slippers", /*german*/"heilige Pantoffeln€", /*french*/"une paire de pantoufles sacrées"), // /*spanish*/unos escurridizos botines - CustomMessage("spacewalkers", /*german*/"Weltraumstiefel", /*french*/"une paire de bottes spatiales")}); + CustomMessage("spacewalkers", /*german*/"Weltraumstiefel€", /*french*/"une paire de bottes spatiales")}); // /*spanish*/un calzado antigravitatorio hintTextTable[RHT_ZELDAS_LETTER] = HintText(CustomMessage("Zelda's Letter", /*german*/"Zeldas Brief", /*french*/"la Lettre de Zelda"), // /*spanish*/la carta de Zelda {}, { - CustomMessage("an autograph", /*german*/"ein Autograph", /*french*/"un autographe"), + CustomMessage("an autograph", /*german*/"ein Autogramm", /*french*/"un autographe"), // /*spanish*/un autógrafo - CustomMessage("royal stationery", /*german*/"royales Briefpapier", /*french*/"du papier royal"), + CustomMessage("royal stationery", /*german*/"königliches Briefpapier", /*french*/"du papier royal"), // /*spanish*/un escrito real - CustomMessage("royal snail mail", /*german*/"ein royaler Umschlag", /*french*/"une enveloppe royale")}); + CustomMessage("royal snail mail", /*german*/"königliche Schneckenpost", /*french*/"une enveloppe royale")}); // /*spanish*/correo de la realeza hintTextTable[RHT_WEIRD_EGG] = HintText(CustomMessage("the Weird Egg", /*german*/"ein seltsames Ei", /*french*/"l'Oeuf Curieux"), @@ -162,17 +163,17 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a chicken dilemma", /*german*/"ein Hühnerdilemma", /*french*/"un drôle d'ovale")}); // /*spanish*/el dilema de la gallina - hintTextTable[RHT_BOOMERANG] = HintText(CustomMessage("the Boomerang", /*german*/"ein Bumerang", /*french*/"le Boomerang"), + hintTextTable[RHT_BOOMERANG] = HintText(CustomMessage("the Boomerang", /*german*/"der Bumerang", /*french*/"le Boomerang"), // /*spanish*/el bumerán { - CustomMessage("something that can grab things", /*german*/"etwas, das Dinge greifen kann", /*french*/"une chose qui peut attraper"), + CustomMessage("something that can grab things", /*german*/"etwas zum Greifen", /*french*/"une chose qui peut attraper"), // /*spanish*/algo que pueda agarrar cosas - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum Betäuben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { CustomMessage("a banana", /*german*/"eine Banane", /*french*/"une banane"), // /*spanish*/un plátano - CustomMessage("a stun stick", /*german*/"ein paralysierender Stab", /*french*/"un bâton étourdissant"), + CustomMessage("a stun stick", /*german*/"ein Betäubungswerkzeug", /*french*/"un bâton étourdissant"), // /*spanish*/un palo aturdidor CustomMessage("a yellow angle", /*german*/"ein gelber Winkel", /*french*/"un angle jaune")}); // /*spanish*/un ángulo amarillo @@ -195,10 +196,10 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_MEGATON_HAMMER] = HintText(CustomMessage("the Megaton Hammer", /*german*/"der Stahlhammer", /*french*/"la Masse des Titans"), // /*spanish*/el martillo Megatón { - CustomMessage("something that can remove boulders", /*german*/"etwas, das Geröll entfernen kann", /*french*/"une chose qui enlève les rochers") + CustomMessage("something that can remove boulders", /*german*/"etwas zum Geröll entfernen", /*french*/"une chose qui enlève les rochers") // /*spanish*/algo que pueda quitar rocas }, { - CustomMessage("the dragon smasher", /*german*/"ein Drachenschläger", /*french*/"le tueur de dragons"), + CustomMessage("the dragon smasher", /*german*/"der Drachenschläger", /*french*/"le tueur de dragons"), // /*spanish*/un destructor de dragones CustomMessage("the metal mallet", /*german*/"ein stählerner Schlägel", /*french*/"un outil de construction"), // /*spanish*/un mazo de metal @@ -215,7 +216,7 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("the shake stone", /*german*/"der Schüttelstein", /*french*/"le fragment vibrant"), // /*spanish*/el fragmento tintineante - CustomMessage("a gray alarm", /*german*/"der graue Alarm", /*french*/"une alerte bleue")}); + CustomMessage("a gray alarm", /*german*/"ein grauer Alarm", /*french*/"une alerte bleue")}); // /*spanish*/una azul alarma hintTextTable[RHT_DINS_FIRE] = HintText(CustomMessage("Din's Fire", /*german*/"Dins Feuerinferno", /*french*/"le Feu de Din"), @@ -257,47 +258,47 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a blue barrier", /*german*/"eine blaue Barriere", /*french*/"une toison bleu")}); // /*spanish*/una barrera azul - hintTextTable[RHT_FIRE_ARROWS] = HintText(CustomMessage("the Fire Arrows", /*german*/"die Feuerpfeile", /*french*/"les Flèches de Feu"), + hintTextTable[RHT_FIRE_ARROWS] = HintText(CustomMessage("the Fire Arrows", /*german*/"die Feuer-Pfeile€", /*french*/"les Flèches de Feu"), // /*spanish*/la flecha de fuego { - CustomMessage("a magic arrow", /*german*/"ein magischer Pfeil", /*french*/"une flèche magique") + CustomMessage("a magic arrow", /*german*/"magische Pfeile€", /*french*/"une flèche magique") // /*spanish*/una flecha mágica }, { CustomMessage("the furnace firearm", /*german*/"die Ofenwaffe", /*french*/"une fusée solaire"), // /*spanish*/el ardiente aguijón - CustomMessage("the burning bolts", /*german*/"die Brennstifte", /*french*/"un obus enflammé"), + CustomMessage("the burning bolts", /*german*/"die Brennstifte€", /*french*/"un obus enflammé"), // /*spanish*/las puntas ígneas CustomMessage("a magma missile", /*german*/"eine vulkanische Rakete", /*french*/"un missile volcanique")}); // /*spanish*/el misil abrasador - hintTextTable[RHT_ICE_ARROWS] = HintText(CustomMessage("the Ice Arrows", /*german*/"die Eispfeile", /*french*/"les Flèches de Glace"), + hintTextTable[RHT_ICE_ARROWS] = HintText(CustomMessage("the Ice Arrows", /*german*/"die Eis-Pfeile€", /*french*/"les Flèches de Glace"), // /*spanish*/la flecha de hielo { - CustomMessage("a magic arrow", /*german*/"ein magischer Pfeil", /*french*/"une flèche magique"), + CustomMessage("a magic arrow", /*german*/"magische Pfeile€", /*french*/"une flèche magique"), // /*spanish*/una flecha mágica - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum Betäuben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("the refrigerator rocket", /*german*/"die Kühlschrankrakete", /*french*/"un missile pétrifiant"), + CustomMessage("the refrigerator rocket", /*german*/"die Kühlschrankraketen€", /*french*/"un missile pétrifiant"), // /*spanish*/el misil congelador - CustomMessage("the frostbite bolts", /*german*/"die Froststifte", /*french*/"un froid mordant"), + CustomMessage("the frostbite bolts", /*german*/"die Froststifte€", /*french*/"un froid mordant"), // /*spanish*/las puntas gélidas CustomMessage("an iceberg maker", /*german*/"ein Eisbergmacher", /*french*/"une aiguille glaciale")}); // /*spanish*/el control de escarcha - hintTextTable[RHT_LIGHT_ARROWS] = HintText(CustomMessage("the Light Arrows", /*german*/"die Lichtpfeile", /*french*/"les Flèches de Lumière"), + hintTextTable[RHT_LIGHT_ARROWS] = HintText(CustomMessage("the Light Arrows", /*german*/"die Licht-Pfeile€", /*french*/"les Flèches de Lumière"), // /*spanish*/la flecha de luz { - CustomMessage("a magic arrow", /*german*/"ein magischer Pfeil", /*french*/"une flèche magique") + CustomMessage("a magic arrow", /*german*/"magische Pfeile€", /*french*/"une flèche magique") // /*spanish*/una flecha mágica }, { CustomMessage("the shining shot", /*german*/"der strahlende Schuss", /*french*/"l'arme brillante"), // /*spanish*/el haz de luz - CustomMessage("the luminous launcher", /*german*/"der leuchtende Werfer", /*french*/"un jet de lumière"), + CustomMessage("the luminous launcher", /*german*/"die Scheinwerfer€", /*french*/"un jet de lumière"), // /*spanish*/el disparo luminoso CustomMessage("Ganondorf's bane", /*german*/"Ganondorfs Verderben", /*french*/"le fléau de Ganondorf"), // /*spanish*/la perdición de Ganondorf - CustomMessage("the lighting bolts", /*german*/"die Lichtstifte", /*french*/"l'éclair sacré")}); + CustomMessage("the lighting bolts", /*german*/"die Lichtstifte€", /*french*/"l'éclair sacré")}); // /*spanish*/las puntas resplandecientes hintTextTable[RHT_GERUDO_MEMBERSHIP_CARD] = HintText(CustomMessage("the Gerudo Membership Card", /*german*/"der Gerudo-Pass", /*french*/"la Carte Gerudo"), @@ -314,16 +315,16 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_MAGIC_BEAN] = HintText(CustomMessage("a Magic Bean", /*german*/"eine Wundererbse", /*french*/"un Haricot Magique"), // /*spanish*/una judía mágica { - CustomMessage("something sometimes buried", /*german*/"etwas, das manchmal begraben ist", /*french*/"une chose parfois enterrée") + CustomMessage("something sometimes buried", /*german*/"etwas gelegentlich Vergrabenes", /*french*/"une chose parfois enterrée") // /*spanish*/algo a veces enterrado }, { CustomMessage("a wizardly legume", /*german*/"eine zauberhafte Hülse", /*french*/"un légume ensorcelé")}); // /*spanish*/una legumbre hechizada - hintTextTable[RHT_MAGIC_BEAN_PACK] = HintText(CustomMessage("Magic Beans", /*german*/"Wundererbsen", /*french*/"un Paquet de Haricots Magiques"), + hintTextTable[RHT_MAGIC_BEAN_PACK] = HintText(CustomMessage("Magic Beans", /*german*/"Wundererbsen-Packung", /*french*/"un Paquet de Haricots Magiques"), // /*spanish*/unas judías mágicas { - CustomMessage("something sometimes buried", /*german*/"etwas, das manchmal begraben ist", /*french*/"une chose parfois enterrée") + CustomMessage("something sometimes buried", /*german*/"etwas gelegentlich Vergrabenes", /*french*/"une chose parfois enterrée") // /*spanish*/algo a veces enterrado }, { CustomMessage("wizardly legumes", /*german*/"zauberhafte Hülsen", /*french*/"un paquet de légumes ensorcelés")}); @@ -344,27 +345,27 @@ void StaticData::HintTable_Init_Item() { CustomMessage("strengthened love", /*german*/"gestärkte Liebe", /*french*/"un amour coriace")}); // /*spanish*/un amor fortalecido - hintTextTable[RHT_GOLD_SKULLTULA_TOKEN] = HintText(CustomMessage("a Gold Skulltula Token", /*german*/"ein goldenes Skulltula-Symbol", /*french*/"un Symbole de Skulltula d'or"), + hintTextTable[RHT_GOLD_SKULLTULA_TOKEN] = HintText(CustomMessage("a Gold Skulltula Token", /*german*/"ein Skulltula-Symbol", /*french*/"un Symbole de Skulltula d'or"), // /*spanish*/un símbolo de skulltula dorada { CustomMessage("a token of recognition", /*german*/"ein Zeichen der Anerkennung", /*french*/"une preuve de reconnaissance"), // /*spanish*/una prueba de reconocimiento - CustomMessage("something sometimes buried", /*german*/"etwas, das manchmal begraben ist", /*french*/"une chose parfois enterrée") + CustomMessage("something sometimes buried", /*german*/"etwas gelegentlich Vergrabenes", /*french*/"une chose parfois enterrée") // /*spanish*/algo a veces enterrado }, { CustomMessage("proof of destruction", /*german*/"Nachweis der Zerstörung", /*french*/"un certificat d'élimination"), // /*spanish*/una prueba de la destrucción CustomMessage("an arachnid chip", /*german*/"ein spinnenartiges Symbol", /*french*/"un symbole cranien"), // /*spanish*/una figura arácnida - CustomMessage("spider remains", /*german*/"Spinnenüberreste", /*french*/"une dépouille dorée"), + CustomMessage("spider remains", /*german*/"Spinnenüberreste€", /*french*/"une dépouille dorée"), // /*spanish*/unos restos dorados - CustomMessage("one percent of a curse", /*german*/"ein Prozent eines Fluchs", /*french*/"un centième de malédiction")}); + CustomMessage("one percent of a curse", /*german*/"ein Prozent eines Fluches", /*french*/"un centième de malédiction")}); // /*spanish*/una centésima de una maldición hintTextTable[RHT_POCKET_EGG] = HintText(CustomMessage("the Pocket Egg", /*german*/"das Ei", /*french*/"l'Oeuf de Poche"), // /*spanish*/el huevo de bolsillo { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quête d'échanges"), + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quête d'échanges"), // /*spanish*/un objeto de una misión secundaria CustomMessage("an egg", /*german*/"ein Ei", /*french*/"un oeuf") // /*spanish*/un huevo @@ -379,7 +380,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_POCKET_CUCCO] = HintText(CustomMessage("the Pocket Cucco", /*german*/"Kiki", /*french*/"la Cocotte de Poche"), // /*spanish*/el cuco de bolsillo { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quête d'échanges") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quête d'échanges") // /*spanish*/un objeto de una misión secundaria }, { CustomMessage("a little clucker", /*german*/"ein kleiner Gackerer", /*french*/"un petit glousseur")}); @@ -388,38 +389,38 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_COJIRO] = HintText(CustomMessage("Cojiro", /*german*/"Henni", /*french*/"le p'tit poulet"), // /*spanish*/a Cojiro { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quête d'échanges") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quête d'échanges") // /*spanish*/un objeto de una misión secundaria }, { - CustomMessage("a cerulean capon", /*german*/"ein coelinblaues Kapaun", /*french*/"un paon azur")}); + CustomMessage("a cerulean capon", /*german*/"ein himmelsblauer Hahn", /*french*/"un paon azur")}); // /*spanish*/un cerúleo capón hintTextTable[RHT_ODD_MUSHROOM] = HintText(CustomMessage("an Odd Mushroom", /*german*/"ein Schimmelpilz", /*french*/"un Champignon Suspect"), // /*spanish*/un champiñón extraño { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quête d'échanges") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quête d'échanges") // /*spanish*/un objeto de una misión secundaria }, { - CustomMessage("a powder ingredient", /*german*/"eine Puderingredienz", /*french*/"un ingrédient à poudre")}); + CustomMessage("a powder ingredient", /*german*/"eine Puderzutat", /*french*/"un ingrédient à poudre")}); // /*spanish*/un oloroso ingrediente hintTextTable[RHT_ODD_POTION] = HintText(CustomMessage("an Odd Potion", /*german*/"ein Modertrank", /*french*/"une Mixture Suspecte"), // /*spanish*/una medicina rara { - CustomMessage("something that contains medicine", /*german*/"etwas, das Medizin enthält", /*french*/"une chose médicamenteuse"), + CustomMessage("something that contains medicine", /*german*/"etwas das Medizin enthält", /*french*/"une chose médicamenteuse"), // /*spanish*/algo que contenga medicina - CustomMessage("something with a strange smell", /*german*/"etwas, das streng riecht", /*french*/"une chose qui sent bizarre"), + CustomMessage("something with a strange smell", /*german*/"etwas seltsam Riechendes", /*french*/"une chose qui sent bizarre"), // /*spanish*/algo con un olor extraño - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quête d'échanges") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quête d'échanges") // /*spanish*/un objeto de una misión secundaria }, { - CustomMessage("Granny's goodies", /*german*/"Omas Zuckerwerk", /*french*/"la confiserie de mamie")}); + CustomMessage("Granny's goodies", /*german*/"Omas Leckereien€", /*french*/"la confiserie de mamie")}); // /*spanish*/la especialidad de la abuela hintTextTable[RHT_POACHERS_SAW] = HintText(CustomMessage("the Poacher's Saw", /*german*/"eine Säge", /*french*/"la Scie du Chasseur"), // /*spanish*/la sierra del furtivo { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quête d'échanges") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quête d'échanges") // /*spanish*/un objeto de una misión secundaria }, { CustomMessage("a tree killer", /*german*/"ein Baumtöter", /*french*/"un coupeur d'arbres")}); @@ -428,7 +429,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_BROKEN_SWORD] = HintText(CustomMessage("the Broken Goron's Sword", /*german*/"das zerbrochene Goronen-Schwert", /*french*/"l'Épée Brisée de Goron"), // /*spanish*/la espada goron rota { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quête d'échanges"), + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quête d'échanges"), // /*spanish*/un objeto de una misión secundaria CustomMessage("a sword", /*german*/"ein Schwert", /*french*/"une épée") // /*spanish*/una espada @@ -439,27 +440,27 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_PRESCRIPTION] = HintText(CustomMessage("the Prescription", /*german*/"ein Rezept", /*french*/"une Ordonnance"), // /*spanish*/la receta { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quête d'échanges") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quête d'échanges") // /*spanish*/un objeto de una misión secundaria }, { - CustomMessage("a pill pamphlet", /*german*/"ein Pillenpamphlet", /*french*/"un document urgent"), + CustomMessage("a pill pamphlet", /*german*/"eine Pillenbroschüre", /*french*/"un document urgent"), // /*spanish*/un instructivo medicinal - CustomMessage("a doctor's note", /*german*/"eine Notiz eines Doktors", /*french*/"un papier médical")}); + CustomMessage("a doctor's note", /*german*/"ein ärztliches Attest", /*french*/"un papier médical")}); // /*spanish*/unas notas del doctor - hintTextTable[RHT_EYEBALL_FROG] = HintText(CustomMessage("the Eyeball Frog", /*german*/"der Glotzfrosch", /*french*/"le Crapaud-qui-louche"), + hintTextTable[RHT_EYEBALL_FROG] = HintText(CustomMessage("the Eyeball Frog", /*german*/"ein Glotzfrosch", /*french*/"le Crapaud-qui-louche"), // /*spanish*/la rana de ojos saltones { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quête d'échanges") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quête d'échanges") // /*spanish*/un objeto de una misión secundaria }, { CustomMessage("a perceiving polliwog", /*german*/"eine wahrnehmende Kaulquappe", /*french*/"un amphibien")}); // /*spanish*/un variopinto batracio - hintTextTable[RHT_EYEDROPS] = HintText(CustomMessage("the Eyedrops", /*german*/"die Augentropfen", /*french*/"une phiole de Super-Gouttes"), + hintTextTable[RHT_EYEDROPS] = HintText(CustomMessage("the Eyedrops", /*german*/"Augentropfen", /*french*/"une phiole de Super-Gouttes"), // /*spanish*/las supergotas oculares { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quête d'échanges") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quête d'échanges") // /*spanish*/un objeto de una misión secundaria }, { CustomMessage("a vision vial", /*german*/"eine Sichtphiole", /*french*/"une solution oculaire")}); @@ -468,46 +469,46 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_CLAIM_CHECK] = HintText(CustomMessage("the Claim Check", /*german*/"ein Zertifikat", /*french*/"un Certificat"), // /*spanish*/el recibo { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quête d'échanges") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quête d'échanges") // /*spanish*/un objeto de una misión secundaria }, { CustomMessage("a three day wait", /*german*/"eine dreitägige Erwartung", /*french*/"un rendez-vous dans trois jours")}); // /*spanish*/unos tres días de espera - hintTextTable[RHT_PROGRESSIVE_HOOKSHOT] = HintText(CustomMessage("a Hookshot", /*german*/"ein Enterhaken", /*french*/"un Grappin"), + hintTextTable[RHT_PROGRESSIVE_HOOKSHOT] = HintText(CustomMessage("a Hookshot", /*german*/"ein Fanghaken", /*french*/"un Grappin"), // /*spanish*/un gancho { - CustomMessage("something that can grab things", /*german*/"etwas, das Dinge greifen kann", /*french*/"une chose qui peut attraper"), + CustomMessage("something that can grab things", /*german*/"etwas zum Greifen", /*french*/"une chose qui peut attraper"), // /*spanish*/algo que pueda agarrar cosas - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum Betäuben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("Dampé's keepsake", /*german*/"Dampés Andenken", /*french*/"l'héritage d'Igor"), + CustomMessage("Dampé's keepsake", /*german*/"Boris' Andenken", /*french*/"l'héritage d'Igor"), // /*spanish*/un recuerdo de Dampé - CustomMessage("the Grapple Beam", /*german*/"der Greifstrahl", /*french*/"le rayon grippeur"), + CustomMessage("the Grapple Beam", /*german*/"der Grapple Beam", /*french*/"le rayon grippeur"), // /*spanish*/una garra metálica - CustomMessage("the RHT_BOING! chain", /*german*/"die Kette des RHT_BOING!", /*french*/"la chaîne de RHT_BOING!")}); + CustomMessage("the BOING! chain", /*german*/"die BOING!-Kette", /*french*/"la chaîne de BOING!")}); // /*spanish*/una cadena retráctil - hintTextTable[RHT_PROGRESSIVE_STRENGTH] = HintText(CustomMessage("a Strength Upgrade", /*german*/"eine Stärkeverbesserung", /*french*/"une Amélioration de Force"), + hintTextTable[RHT_PROGRESSIVE_STRENGTH] = HintText(CustomMessage("a Strength Upgrade", /*german*/"eine Kraftsteigerung", /*french*/"une Amélioration de Force"), // /*spanish*/un aumento de fuerza { - CustomMessage("something that can remove boulders", /*german*/"etwas, das Geröll entfernen kann", /*french*/"une chose qui enlève les rochers") + CustomMessage("something that can remove boulders", /*german*/"etwas zum Geröll entfernen", /*french*/"une chose qui enlève les rochers") // /*spanish*/algo que pueda quitar rocas }, { - CustomMessage("power gloves", /*german*/"Krafthandschuhe", /*french*/"une paire de gants de travail"), + CustomMessage("power gloves", /*german*/"Krafthandschuhe€", /*french*/"une paire de gants de travail"), // /*spanish*/unos poderosos guanteletes - CustomMessage("metal mittens", /*german*/"Metallfäustlinge", /*french*/"une paire de mitaines"), + CustomMessage("metal mittens", /*german*/"Metall-Fäustlinge€", /*french*/"une paire de mitaines"), // /*spanish*/unas manoplas metálicas CustomMessage("the heavy lifty", /*german*/"der Schwerlastheber", /*french*/"la puissance de dix hommes")}); // /*spanish*/un levantamiento pesado - hintTextTable[RHT_PROGRESSIVE_BOMB_BAG] = HintText(CustomMessage("a Bomb Bag", /*german*/"ein Bombenbeutel", /*french*/"un Sac de Bombes"), + hintTextTable[RHT_PROGRESSIVE_BOMB_BAG] = HintText(CustomMessage("a Bomb Bag", /*german*/"eine Bombentasche", /*french*/"un Sac de Bombes"), // /*spanish*/un saco de bombas { - CustomMessage("explosives", /*german*/"ein Explosivpaket", /*french*/"un paquet d'explosifs"), + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs"), // /*spanish*/un montón de explosivos - CustomMessage("something that can remove boulders", /*german*/"etwas, das Geröll entfernen kann", /*french*/"une chose qui enlève les rochers") + CustomMessage("something that can remove boulders", /*german*/"etwas zum Geröll entfernen", /*french*/"une chose qui enlève les rochers") // /*spanish*/algo que pueda quitar rocas }, { CustomMessage("an explosive container", /*german*/"ein Explosivbehälter", /*french*/"un porte-grenade"), @@ -526,20 +527,20 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a danger dart launcher", /*german*/"ein Pfeilwerfer", /*french*/"un tire-fléchette")}); // /*spanish*/un peligroso lanzadardos - hintTextTable[RHT_PROGRESSIVE_SLINGSHOT] = HintText(CustomMessage("a Slingshot", /*german*/"eine Schleuder", /*french*/"un Lance-Pierre"), + hintTextTable[RHT_PROGRESSIVE_SLINGSHOT] = HintText(CustomMessage("a Slingshot", /*german*/"eine Feen-Schleuder", /*french*/"un Lance-Pierre"), // /*spanish*/una resortera de las hadas { CustomMessage("a projectile shooter", /*german*/"ein Projektilwerfer", /*french*/"un tire-projectile") // /*spanish*/un arma de proyectil }, { - CustomMessage("a seed shooter", /*german*/"ein Nusswerfer", /*french*/"un lance-noix"), + CustomMessage("a seed shooter", /*german*/"ein Kernwerfer", /*french*/"un lance-noix"), // /*spanish*/un lanzasemillas CustomMessage("a rubberband", /*german*/"ein Gummiband", /*french*/"un élastique"), // /*spanish*/un tirachinas CustomMessage("a child's catapult", /*german*/"ein Kinderkatapult", /*french*/"un jouet d'enfant")}); // /*spanish*/una catapulta infantil - hintTextTable[RHT_PROGRESSIVE_WALLET] = HintText(CustomMessage("a Wallet", /*german*/"eine Börse", /*french*/"une Bourse"), + hintTextTable[RHT_PROGRESSIVE_WALLET] = HintText(CustomMessage("a Wallet", /*german*/"eine Geldbörse", /*french*/"une Bourse"), // /*spanish*/una bolsa de rupias { CustomMessage("a prize of the House of Skulltulas", /*german*/"ein Preis des Skulltula-Hauses", /*french*/"un prix de la maison des Skulltulas") @@ -568,10 +569,10 @@ void StaticData::HintTable_Init_Item() { { CustomMessage("some Deku munitions", /*german*/"etwas Deku-Munition", /*french*/"un paquet de munitions Mojo"), // /*spanish*/un montón de municiones Deku - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum Betäuben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("more nuts", /*german*/"mehr Nüsse", /*french*/"encore plus de noix"), + CustomMessage("more nuts", /*german*/"mehr Nüsse€", /*french*/"encore plus de noix"), // /*spanish*/más semillas de nogal CustomMessage("flashbang storage", /*german*/"Blendgranatenvorrat", /*french*/"un sac à noix")}); // /*spanish*/más frutos aturdidores @@ -582,12 +583,12 @@ void StaticData::HintTable_Init_Item() { CustomMessage("some Deku munitions", /*german*/"etwas Deku-Munition", /*french*/"un paquet de munitions Mojo") // /*spanish*/un montón de municiones Deku }, { - CustomMessage("lumber racks", /*german*/"Holzgestelle", /*french*/"un paquet de bois"), + CustomMessage("lumber racks", /*german*/"Holzgestelle€", /*french*/"un paquet de bois"), // /*spanish*/más bastones CustomMessage("more flammable twigs", /*german*/"mehr entflammbare Zweige", /*french*/"beaucoup de branches")}); // /*spanish*/más varas - hintTextTable[RHT_PROGRESSIVE_MAGIC_METER] = HintText(CustomMessage("a Magic Meter", /*german*/"ein Magieabmaß", /*french*/"une Jauge de Magie"), + hintTextTable[RHT_PROGRESSIVE_MAGIC_METER] = HintText(CustomMessage("a Magic Meter", /*german*/"Magische Kraft", /*french*/"une Jauge de Magie"), // /*spanish*/un aumento de poder mágico { CustomMessage("a Great Fairy's power", /*german*/"eine Kraft einer großen Fee", /*french*/"le pouvoir d'une grande fée") @@ -605,7 +606,7 @@ void StaticData::HintTable_Init_Item() { { CustomMessage("something given by Saria", /*german*/"ein Geschenk von Salia", /*french*/"un cadeau de Saria"), // /*spanish*/un obsequio de Saria - CustomMessage("something kept by the royal family", /*german*/"etwas, das von der royalen Familie bewahrt wird", /*french*/"une chose qui paralyse") + CustomMessage("something kept by the royal family", /*german*/"etwas aus dem Besitz der Königsfamilie", /*french*/"une chose qui paralyse") // /*spanish*/algo guardado por la familia real }, { CustomMessage("a flute", /*german*/"eine Flöte", /*french*/"un bec musical"), @@ -613,21 +614,21 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a music maker", /*german*/"ein Musikmacher", /*french*/"un porteur de chansons")}); // /*spanish*/un instrumento - hintTextTable[RHT_PROGRESSIVE_BOMBCHUS] = HintText(CustomMessage("Bombchus", /*german*/"Krabbelminen", /*french*/"un paquet de Missiles"), + hintTextTable[RHT_PROGRESSIVE_BOMBCHUS] = HintText(CustomMessage("Bombchus", /*german*/"Krabbelminen€", /*french*/"un paquet de Missiles"), // /*spanish*/unos bombchus { CustomMessage("a prize of the House of Skulltulas", /*german*/"ein Preis des Skulltula-Hauses", /*french*/"un prix de la maison des Skulltulas"), // /*spanish*/un obsequio de la Casa Skulltula - CustomMessage("explosives", /*german*/"ein Explosivpaket", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montón de explosivos }, { - CustomMessage("mice bombs", /*german*/"Mäusebomben", /*french*/"un adorable explosif"), + CustomMessage("mice bombs", /*german*/"Mäusebomben€", /*french*/"un adorable explosif"), // /*spanish*/unas bombas roedoras - CustomMessage("proximity mice", /*german*/"Näherungsmäuse", /*french*/"une mine anti-rongeur"), + CustomMessage("proximity mice", /*german*/"Näherungsmäuse€", /*french*/"une mine anti-rongeur"), // /*spanish*/unos explosivos ratoncitos - CustomMessage("wall crawlers", /*german*/"Wandkrabbler", /*french*/"un rapide grimpeur"), + CustomMessage("wall crawlers", /*german*/"Wandkrabbler€", /*french*/"un rapide grimpeur"), // /*spanish*/unos trepaparedes - CustomMessage("trail blazers", /*german*/"Vorreiter", /*french*/"un zigzag éclatant")}); + CustomMessage("trail blazers", /*german*/"Vorreiter€", /*french*/"un zigzag éclatant")}); // /*spanish*/unas ratas propulsadas hintTextTable[RHT_PROGRESSIVE_GORONSWORD] = HintText(CustomMessage("a Goron Sword", /*german*/"ein Goronen-Schwert", /*french*/"une épée Goron"), @@ -641,7 +642,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a Goron weapon", /*german*/"eine Goronenwaffe", /*french*/"une arme Goron")}); // /*spanish*/un arma goron - hintTextTable[RHT_EMPTY_BOTTLE] = HintText(CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon vide"), + hintTextTable[RHT_EMPTY_BOTTLE] = HintText(CustomMessage("a bottle", /*german*/"eine leere Flasche", /*french*/"un flacon vide"), // /*spanish*/una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") @@ -649,12 +650,12 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a glass container", /*german*/"ein Glasbehälter", /*french*/"un cylindre de cristal"), // /*spanish*/un recipiente de cristal - CustomMessage("an empty jar", /*german*/"ein leerer Krug", /*french*/"une jarre incassable"), + CustomMessage("an empty jar", /*german*/"ein leeres Gefäß", /*french*/"une jarre incassable"), // /*spanish*/un frasco vacío CustomMessage("encased air", /*german*/"eingeschlossene Luft", /*french*/"un bocal d'air")}); // /*spanish*/aire a presión - hintTextTable[RHT_BOTTLE_WITH_MILK] = HintText(CustomMessage("a Milk Bottle", /*german*/"eine Milchflasche", /*french*/"un flacon de lait"), + hintTextTable[RHT_BOTTLE_WITH_MILK] = HintText(CustomMessage("a Milk Bottle", /*german*/"eine Flasche mit Milch", /*french*/"un flacon de lait"), // /*spanish*/una botella de leche { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") @@ -695,12 +696,12 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") // /*spanish*/una botella }, { - CustomMessage("an ailment antidote", /*german*/"ein Krankheitsantidot", /*french*/"l'élixir ultime"), + CustomMessage("an ailment antidote", /*german*/"ein Allheilmittel", /*french*/"l'élixir ultime"), // /*spanish*/un antídoto para el dolor CustomMessage("a blue liquid", /*german*/"eine blaue Flüssigkeit", /*french*/"un liquide bleu")}); // /*spanish*/un remedio índigo - hintTextTable[RHT_BOTTLE_WITH_FAIRY] = HintText(CustomMessage("a Fairy Bottle", /*german*/"eine Feenflasche", /*french*/"une fée en flacon"), + hintTextTable[RHT_BOTTLE_WITH_FAIRY] = HintText(CustomMessage("a Fairy Bottle", /*german*/"eine Flasche mit Fee", /*french*/"une fée en flacon"), // /*spanish*/un hada en una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") @@ -710,10 +711,10 @@ void StaticData::HintTable_Init_Item() { // /*spanish*/un hada atrapada CustomMessage("an extra life", /*german*/"ein Extraleben", /*french*/"une vie de rechange"), // /*spanish*/una oportunidad más - CustomMessage("Navi's cousin", /*german*/"Navis Vetter", /*french*/"le cousin de Navi")}); + CustomMessage("Navi's cousin", /*german*/"Navis Cousine", /*french*/"le cousin de Navi")}); // /*spanish*/una prima de Navi - hintTextTable[RHT_BOTTLE_WITH_FISH] = HintText(CustomMessage("a Fish Bottle", /*german*/"eine Fischflasche", /*french*/"un poisson en flacon"), + hintTextTable[RHT_BOTTLE_WITH_FISH] = HintText(CustomMessage("a Fish Bottle", /*german*/"eine Flasche mit Fisch", /*french*/"un poisson en flacon"), // /*spanish*/un pez en una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") @@ -721,7 +722,7 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("an aquarium", /*german*/"ein Aquarium", /*french*/"un aquarium"), // /*spanish*/un escamado ser - CustomMessage("a deity's snack", /*german*/"ein Gottheitssnack", /*french*/"le repas d'un dieu marin")}); + CustomMessage("a deity's snack", /*german*/"ein göttlicher Snack", /*french*/"le repas d'un dieu marin")}); // /*spanish*/un tentempié de cierta deidad hintTextTable[RHT_BOTTLE_WITH_BLUE_FIRE] = HintText(CustomMessage("a Blue Fire Bottle", /*german*/"eine Flasche mit blauem Feuer", /*french*/"une flamme bleue en flacon"), @@ -732,10 +733,10 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a conflagration canteen", /*german*/"eine Brandfeldflasche", /*french*/"une mystérieuse flamme"), // /*spanish*/un incendio retenido - CustomMessage("an icemelt jar", /*german*/"ein eisschmelzender Krug", /*french*/"un brasier glacial")}); + CustomMessage("an icemelt jar", /*german*/"ein eisschmelzendes Gefäß", /*french*/"un brasier glacial")}); // /*spanish*/unas brasas enfrascadas - hintTextTable[RHT_BOTTLE_WITH_BUGS] = HintText(CustomMessage("a Bug Bottle", /*german*/"eine Wanzenflasche", /*french*/"un insecte en flacon"), + hintTextTable[RHT_BOTTLE_WITH_BUGS] = HintText(CustomMessage("a Bug Bottle", /*german*/"eine Flasche mit Käfern", /*french*/"un insecte en flacon"), // /*spanish*/unos insectos en una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") @@ -746,24 +747,24 @@ void StaticData::HintTable_Init_Item() { CustomMessage("Skulltula finders", /*german*/"Skulltula-Finder", /*french*/"une poignée de trouve-Skulltula")}); // /*spanish*/unos rastreadores de skulltulas - hintTextTable[RHT_BOTTLE_WITH_POE] = HintText(CustomMessage("a Poe Bottle", /*german*/"eine Irrlichtflasche", /*french*/"un Esprit en flacon"), + hintTextTable[RHT_BOTTLE_WITH_POE] = HintText(CustomMessage("a Poe Bottle", /*german*/"eine Flasche mit Irrlicht", /*french*/"un Esprit en flacon"), // /*spanish*/un Poe en una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") // /*spanish*/una botella }, { - CustomMessage("a spooky ghost", /*german*/"ein spukhafter Geist", /*french*/"un effroyable fantôme"), + CustomMessage("a spooky ghost", /*german*/"ein gruseliger Geist", /*french*/"un effroyable fantôme"), // /*spanish*/un espantoso espectro - CustomMessage("a face in the jar", /*german*/"ein Gesicht im Krug", /*french*/"un visage dans un bocal")}); + CustomMessage("a face in the jar", /*german*/"ein Gesicht im Gefäß", /*french*/"un visage dans un bocal")}); // /*spanish*/una expresión enfrascada - hintTextTable[RHT_BOTTLE_WITH_BIG_POE] = HintText(CustomMessage("a Big Poe Bottle", /*german*/"eine Nachtschwärmerflasche", /*french*/"une Ame en flacon"), + hintTextTable[RHT_BOTTLE_WITH_BIG_POE] = HintText(CustomMessage("a Big Poe Bottle", /*german*/"eine Flasche mit Nachtschwärmer", /*french*/"une Ame en flacon"), // /*spanish*/un Gran Poe en una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") // /*spanish*/una botella }, { - CustomMessage("the spookiest ghost", /*german*/"der spukhafteste Geist", /*french*/"un épouvantable spectre"), + CustomMessage("the spookiest ghost", /*german*/"der gruseligste Geist", /*french*/"un épouvantable spectre"), // /*spanish*/el espectro más espeluznante CustomMessage("a sidequest spirit", /*german*/"ein Nebenmissionsgeist", /*french*/"un précieux esprit")}); // /*spanish*/un buen valorado espíritu @@ -778,28 +779,28 @@ void StaticData::HintTable_Init_Item() { // /*spanish*/una llamada de auxilio CustomMessage("the note that Mweeps", /*german*/"eine Notiz, die Mweeps", /*french*/"un message qui fait mwip"), // /*spanish*/un escrito mweep - CustomMessage("an RHT_SOS call", /*german*/"ein RHT_SOS Signal", /*french*/"un signal RHT_SOS"), + CustomMessage("an SOS call", /*german*/"ein Notrufsignal", /*french*/"un signal SOS"), // /*spanish*/una nota de socorro - CustomMessage("a fishy stationery", /*german*/"ein nasses Papier", /*french*/"un papier mouillé")}); + CustomMessage("a fishy stationery", /*german*/"fischiges Briefpapier", /*french*/"un papier mouillé")}); // /*spanish*/un mensaje de ayuda hintTextTable[RHT_ZELDAS_LULLABY] = HintText(CustomMessage("Zelda's Lullaby", /*german*/"Zeldas Wiegenlied", /*french*/"la berceuse de Zelda"), // /*spanish*/la Nana de Zelda { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale"), + CustomMessage("a regular song", /*german*/"ein gewöhnliches Lied", /*french*/"une chanson normale"), // /*spanish*/una cancion normal - CustomMessage("something kept by the royal family", /*german*/"etwas, das von der royalen Familie bewahrt wird", /*french*/"une chose qui paralyse") + CustomMessage("something kept by the royal family", /*german*/"etwas aus dem Besitz der Königsfamilie", /*french*/"une chose qui paralyse") // /*spanish*/algo guardado por la familia real }, { - CustomMessage("a song of royal slumber", /*german*/"ein royales Lied", /*french*/"une chanson royale"), + CustomMessage("a song of royal slumber", /*german*/"ein königliches Schlaflied", /*french*/"une chanson royale"), // /*spanish*/la canción real - CustomMessage("a triforce tune", /*german*/"eine heilige Musik", /*french*/"la musique sacrée")}); + CustomMessage("a triforce tune", /*german*/"die Melodie des Triforce", /*french*/"la musique sacrée")}); // /*spanish*/la melodía de la trifuerza hintTextTable[RHT_EPONAS_SONG] = HintText(CustomMessage("Epona's Song", /*german*/"Eponas Lied", /*french*/"le chant d'Epona"), // /*spanish*/la Canción de Epona { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale") + CustomMessage("a regular song", /*german*/"ein gewöhnliches Lied", /*french*/"une chanson normale") // /*spanish*/una cancion normal }, { CustomMessage("an equestrian etude", /*german*/"eine Reiterhymne", /*french*/"une hymne équestre"), @@ -812,7 +813,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_SARIAS_SONG] = HintText(CustomMessage("Saria's Song", /*german*/"Salias Lied", /*french*/"le chant de Saria"), // /*spanish*/la Canción de Saria { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale"), + CustomMessage("a regular song", /*german*/"ein gewöhnliches Lied", /*french*/"une chanson normale"), // /*spanish*/una cancion normal CustomMessage("something given by Saria", /*german*/"ein Geschenk von Salia", /*french*/"un cadeau de Saria") // /*spanish*/un obsequio de Saria @@ -822,236 +823,236 @@ void StaticData::HintTable_Init_Item() { CustomMessage("Saria's phone number", /*german*/"Salias Telefonnummer", /*french*/"le téléphone d'une amie")}); // /*spanish*/una consulta de asistencia - hintTextTable[RHT_SUNS_SONG] = HintText(CustomMessage("the Sun's Song", /*german*/"Hymne der Sonne", /*french*/"le chant du soleil"), + hintTextTable[RHT_SUNS_SONG] = HintText(CustomMessage("the Sun's Song", /*german*/"die Hymne der Sonne", /*french*/"le chant du soleil"), // /*spanish*/la Canción del Sol { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale"), + CustomMessage("a regular song", /*german*/"ein gewöhnliches Lied", /*french*/"une chanson normale"), // /*spanish*/una cancion normal - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum Betäuben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("Sunny Day", /*german*/"sonniger Tag", /*french*/"Zénith"), + CustomMessage("Sunny Day", /*german*/"ein sonniger Tag", /*french*/"Zénith"), // /*spanish*/un día soleado CustomMessage("the ReDead's bane", /*german*/"das Verderben der Remorts", /*french*/"le fléau des Éffrois"), // /*spanish*/la destructora de Redeads CustomMessage("the Gibdo's bane", /*german*/"das Verderben der Gibdos", /*french*/"le fléau des Gibdo")}); // /*spanish*/la destructora de Gibdos - hintTextTable[RHT_SONG_OF_TIME] = HintText(CustomMessage("the Song of Time", /*german*/"Hymne der Zeit", /*french*/"le chant du temps"), + hintTextTable[RHT_SONG_OF_TIME] = HintText(CustomMessage("the Song of Time", /*german*/"die Hymne der Zeit", /*french*/"le chant du temps"), // /*spanish*/la Canción del tiempo { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale") + CustomMessage("a regular song", /*german*/"ein gewöhnliches Lied", /*french*/"une chanson normale") // /*spanish*/una cancion normal }, { CustomMessage("a song 7 years long", /*german*/"ein sieben Jahre langes Lied", /*french*/"le flot du temps"), // /*spanish*/la setenada canción - CustomMessage("the tune of ages", /*german*/"Hymne des Äons", /*french*/"le Chant des Âges")}); + CustomMessage("the tune of ages", /*german*/"die Melodie der Äonen", /*french*/"le Chant des Âges")}); // /*spanish*/la melodía eónica - hintTextTable[RHT_SONG_OF_STORMS] = HintText(CustomMessage("the Song of Storms", /*german*/"Hymne des Sturms", /*french*/"le chant des tempêtes"), + hintTextTable[RHT_SONG_OF_STORMS] = HintText(CustomMessage("the Song of Storms", /*german*/"die Hymne des Sturms", /*french*/"le chant des tempêtes"), // /*spanish*/la Canción de la Tormenta { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale") + CustomMessage("a regular song", /*german*/"ein gewöhnliches Lied", /*french*/"une chanson normale") // /*spanish*/una cancion normal }, { - CustomMessage("Rain Dance", /*german*/"Regentanz", /*french*/"Danse Pluie"), + CustomMessage("Rain Dance", /*german*/"ein Regentanz", /*french*/"Danse Pluie"), // /*spanish*/la danza de la lluvia - CustomMessage("a thunderstorm tune", /*german*/"eine Gewitterhymne", /*french*/"une hymne foudroyante"), + CustomMessage("a thunderstorm tune", /*german*/"die Melodie des Gewitters", /*french*/"une hymne foudroyante"), // /*spanish*/una sonata tormentosa - CustomMessage("windmill acceleration", /*german*/"Windmühlenbeschleunigung", /*french*/"l'accélérateur de moulins")}); + CustomMessage("windmill acceleration", /*german*/"eine Windmühlenbeschleunigung", /*french*/"l'accélérateur de moulins")}); // /*spanish*/el arranque de molinos - hintTextTable[RHT_MINUET_OF_FOREST] = HintText(CustomMessage("the Minuet of Forest", /*german*/"Menuett des Waldes", /*french*/"le menuet de la forêt"), + hintTextTable[RHT_MINUET_OF_FOREST] = HintText(CustomMessage("the Minuet of Forest", /*german*/"das Menuett des Waldes", /*french*/"le menuet de la forêt"), // /*spanish*/el Minueto del bosque { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de téléportation") // /*spanish*/una canción de teletransportación }, { - CustomMessage("the song of tall trees", /*german*/"Lied der großen Bäume", /*french*/"le bruit des arbres"), + CustomMessage("the song of tall trees", /*german*/"das Lied der großen Bäume", /*french*/"le bruit des arbres"), // /*spanish*/la canción de las copas CustomMessage("an arboreal anthem", /*german*/"eine baumartige Hymne", /*french*/"l'hymne sylvestre"), // /*spanish*/el himno forestal - CustomMessage("a green spark trail", /*german*/"ein grüner Komet", /*french*/"une comète verte")}); + CustomMessage("a green spark trail", /*german*/"grüne Funken€", /*french*/"une comète verte")}); // /*spanish*/el sendero esmeralda - hintTextTable[RHT_BOLERO_OF_FIRE] = HintText(CustomMessage("the Bolero of Fire", /*german*/"Bolero des Feuers", /*french*/"le boléro du feu"), + hintTextTable[RHT_BOLERO_OF_FIRE] = HintText(CustomMessage("the Bolero of Fire", /*german*/"der Bolero des Feuers", /*french*/"le boléro du feu"), // /*spanish*/el Bolero del fuego { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de téléportation") // /*spanish*/una canción de teletransportación }, { - CustomMessage("a song of lethal lava", /*german*/"Lied der tödlichen Lava", /*french*/"une musique enflammée"), + CustomMessage("a song of lethal lava", /*german*/"das Lied der tödlichen Lava", /*french*/"une musique enflammée"), // /*spanish*/la canción de la lava - CustomMessage("a red spark trail", /*german*/"ein roter Komet", /*french*/"une comète rouge"), + CustomMessage("a red spark trail", /*german*/"rote Funken€", /*french*/"une comète rouge"), // /*spanish*/el sendero rubí CustomMessage("a volcanic verse", /*german*/"ein vulkanischer Vers", /*french*/"le souffle du volcan")}); // /*spanish*/el verso volcánico - hintTextTable[RHT_SERENADE_OF_WATER] = HintText(CustomMessage("the Serenade of Water", /*german*/"Serenade des Wassers", /*french*/"la sérénade de l'eau"), + hintTextTable[RHT_SERENADE_OF_WATER] = HintText(CustomMessage("the Serenade of Water", /*german*/"die Serenade des Wassers", /*french*/"la sérénade de l'eau"), // /*spanish*/la Serenata del agua { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de téléportation") // /*spanish*/una canción de teletransportación }, { - CustomMessage("a song of a damp ditch", /*german*/"die Stille des Wassers", /*french*/"le calme de l'eau"), + CustomMessage("a song of a damp ditch", /*german*/"ein Lied der Gewässer", /*french*/"le calme de l'eau"), // /*spanish*/la canción del estanque - CustomMessage("a blue spark trail", /*german*/"ein blauer Komet", /*french*/"une comète bleue"), + CustomMessage("a blue spark trail", /*german*/"blaue Funken€", /*french*/"une comète bleue"), // /*spanish*/el sendero zafiro CustomMessage("the lake's lyric", /*german*/"die Lyrik des Sees", /*french*/"la voix du lac")}); // /*spanish*/la letra del lago - hintTextTable[RHT_REQUIEM_OF_SPIRIT] = HintText(CustomMessage("the Requiem of Spirit", /*german*/"Requiem der Geister", /*french*/"le requiem des esprits"), + hintTextTable[RHT_REQUIEM_OF_SPIRIT] = HintText(CustomMessage("the Requiem of Spirit", /*german*/"das Requiem der Geister", /*french*/"le requiem des esprits"), // /*spanish*/el Réquiem del espíritu { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de téléportation") // /*spanish*/una canción de teletransportación }, { - CustomMessage("a song of sandy statues", /*german*/"Lied der sandigen Statuen", /*french*/"la mélodie d'une grande statue"), + CustomMessage("a song of sandy statues", /*german*/"ein Lied der sandigen Statuen", /*french*/"la mélodie d'une grande statue"), // /*spanish*/la canción de la gran estatua - CustomMessage("an orange spark trail", /*german*/"ein oranger Komet", /*french*/"une comète orange"), + CustomMessage("an orange spark trail", /*german*/"orangene Funken€", /*french*/"une comète orange"), // /*spanish*/el sendero ámbar CustomMessage("the desert ditty", /*german*/"der Wind der Wüste", /*french*/"le vent du désert")}); // /*spanish*/la estrofa del desierto - hintTextTable[RHT_NOCTURNE_OF_SHADOW] = HintText(CustomMessage("the Nocturne of Shadow", /*german*/"Nocturne des Schattens", /*french*/"le nocturne de l'ombre"), + hintTextTable[RHT_NOCTURNE_OF_SHADOW] = HintText(CustomMessage("the Nocturne of Shadow", /*german*/"die Nocturne des Schattens", /*french*/"le nocturne de l'ombre"), // /*spanish*/el Nocturno de la sombra { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de téléportation") // /*spanish*/una canción de teletransportación }, { - CustomMessage("a song of spooky spirits", /*german*/"Lied der spukhaften Geister", /*french*/"une hymne de chair de poule"), + CustomMessage("a song of spooky spirits", /*german*/"das Lied der spukenden Geister", /*french*/"une hymne de chair de poule"), // /*spanish*/la canción de los espectros CustomMessage("a graveyard boogie", /*german*/"ein Friedhofsboogie", /*french*/"un boogie de fantômes"), // /*spanish*/una honra fúnebre - CustomMessage("a haunted hymn", /*german*/"eine Spukhymne", /*french*/"une chanson lugubre"), + CustomMessage("a haunted hymn", /*german*/"eine heimgesuchte Hymne", /*french*/"une chanson lugubre"), // /*spanish*/una estrofa encantada - CustomMessage("a purple spark trail", /*german*/"ein violetter Komet", /*french*/"une comète mauve")}); + CustomMessage("a purple spark trail", /*german*/"violette Funken€", /*french*/"une comète mauve")}); // /*spanish*/el sendero malva - hintTextTable[RHT_PRELUDE_OF_LIGHT] = HintText(CustomMessage("the Prelude of Light", /*german*/"Kantate des Lichts", /*french*/"le prélude de la lumière"), + hintTextTable[RHT_PRELUDE_OF_LIGHT] = HintText(CustomMessage("the Prelude of Light", /*german*/"die Kantate des Lichts", /*french*/"le prélude de la lumière"), // /*spanish*/el Preludio de la luz { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de téléportation") // /*spanish*/una canción de teletransportación }, { - CustomMessage("a luminous prologue melody", /*german*/"eine leuchtende Melodie", /*french*/"une matine illuminée"), + CustomMessage("a luminous prologue melody", /*german*/"der leuchtende Prolog", /*french*/"une matine illuminée"), // /*spanish*/la melodía refulgente - CustomMessage("a yellow spark trail", /*german*/"ein gelber Komet", /*french*/"une comète jaune"), + CustomMessage("a yellow spark trail", /*german*/"gelbe Funken€", /*french*/"une comète jaune"), // /*spanish*/el sendero resplandeciente CustomMessage("the temple traveler", /*german*/"ein Tempelreisender", /*french*/"un chant de sanctuaire")}); // /*spanish*/la ruta del templo - hintTextTable[RHT_DEKU_TREE_MAP] = HintText(CustomMessage("the Deku Tree Map", /*german*/"die Karte des Deku-Baums", /*french*/"la carte de l'Arbre Mojo"), + hintTextTable[RHT_DEKU_TREE_MAP] = HintText(CustomMessage("the Deku Tree Map", /*german*/"die Labyrinth-Karte des Deku-Baumes", /*french*/"la carte de l'Arbre Mojo"), // /*spanish*/el mapa del Gran Árbol Deku { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a mossy atlas", /*german*/"ein moosiger Atlas", /*french*/"un atlas boisé"), // /*spanish*/un atlas musgoso - CustomMessage("some mossy blueprints", /*german*/"einige moosige Blaupausen", /*french*/"un plan boisé")}); + CustomMessage("some mossy blueprints", /*german*/"moosige Baupläne€", /*french*/"un plan boisé")}); // /*spanish*/unos planos musgosos - hintTextTable[RHT_DODONGOS_CAVERN_MAP] = HintText(CustomMessage("the Dodongo's Cavern Map", /*german*/"die Karte der Dodongo-Höhle", /*french*/"la carte de la Caverne Dodongo"), + hintTextTable[RHT_DODONGOS_CAVERN_MAP] = HintText(CustomMessage("the Dodongo's Cavern Map", /*german*/"die Labyrinth-Karte von Dodongos Höhle", /*french*/"la carte de la Caverne Dodongo"), // /*spanish*/el mapa de la Cueva de los Dodongos { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a rocky atlas", /*german*/"eine felsiger Atlas", /*french*/"un atlas rocheux"), // /*spanish*/un atlas rocoso - CustomMessage("some rocky blueprints", /*german*/"einige felsige Blaupausen", /*french*/"un plan rocheux")}); + CustomMessage("some rocky blueprints", /*german*/"felsige Baupläne€", /*french*/"un plan rocheux")}); // /*spanish*/unos planos rocosos - hintTextTable[RHT_JABU_JABUS_BELLY_MAP] = HintText(CustomMessage("the Jabu-Jabu's Belly Map", /*german*/"die Karte des Jabu-Jabu-Bauchs", /*french*/"la carte de Jabu-Jabu"), + hintTextTable[RHT_JABU_JABUS_BELLY_MAP] = HintText(CustomMessage("the Jabu-Jabu's Belly Map", /*german*/"die Labyrinth-Karte von Jabu-Jabus Bauch", /*french*/"la carte de Jabu-Jabu"), // /*spanish*/el mapa de la Tripa de Jabu-Jabu { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a fishy atlas", /*german*/"ein fischiger Atlas", /*french*/"un atlas digéré"), // /*spanish*/un atlas digesto - CustomMessage("some fishy blueprints", /*german*/"einige fischige Blaupausen", /*french*/"un plan digéré")}); + CustomMessage("some fishy blueprints", /*german*/"fischige Baupläne€", /*french*/"un plan digéré")}); // /*spanish*/unos planos digestos - hintTextTable[RHT_FOREST_TEMPLE_MAP] = HintText(CustomMessage("the Forest Temple Map", /*german*/"die Karte des Waldtempels", /*french*/"la carte du Temple de la Forêt"), + hintTextTable[RHT_FOREST_TEMPLE_MAP] = HintText(CustomMessage("the Forest Temple Map", /*german*/"die Labyrinth-Karte des Waldtempels", /*french*/"la carte du Temple de la Forêt"), // /*spanish*/el mapa del Templo del Bosque { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a sylvan atlas", /*german*/"ein waldiger Atlas", /*french*/"un atlas sylvestre"), // /*spanish*/un atlas enselvado - CustomMessage("some sylvan blueprints", /*german*/"einige waldige Blaupausen", /*french*/"un plan sylvestre")}); + CustomMessage("some sylvan blueprints", /*german*/"waldige Baupläne€", /*french*/"un plan sylvestre")}); // /*spanish*/unos planos enselvados - hintTextTable[RHT_FIRE_TEMPLE_MAP] = HintText(CustomMessage("the Fire Temple Map", /*german*/"die Karte des Feuertempels", /*french*/"la carte du Temple du Feu"), + hintTextTable[RHT_FIRE_TEMPLE_MAP] = HintText(CustomMessage("the Fire Temple Map", /*german*/"die Labyrinth-Karte des Feuertempels", /*french*/"la carte du Temple du Feu"), // /*spanish*/el mapa del Templo del Fuego { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a molten atlas", /*german*/"ein geschmolzener Atlas", /*french*/"un atlas fondu"), // /*spanish*/un atlas fundido - CustomMessage("some molten blueprints", /*german*/"einige geschmolzene Blaupausen", /*french*/"un plan fondu")}); + CustomMessage("some molten blueprints", /*german*/"geschmolzene Baupläne€", /*french*/"un plan fondu")}); // /*spanish*/unos planos fundidos - hintTextTable[RHT_WATER_TEMPLE_MAP] = HintText(CustomMessage("the Water Temple Map", /*german*/"die Karte des Wassertempels", /*french*/"la carte du Temple de l'Eau"), + hintTextTable[RHT_WATER_TEMPLE_MAP] = HintText(CustomMessage("the Water Temple Map", /*german*/"die Labyrinth-Karte des Wassertempels", /*french*/"la carte du Temple de l'Eau"), // /*spanish*/el mapa del Templo del Agua { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a wet atlas", /*german*/"ein nasser Atlas", /*french*/"un atlas humide"), // /*spanish*/un atlas mojado - CustomMessage("some wet blueprints", /*german*/"einige nasse Blaupausen", /*french*/"un plan humide")}); + CustomMessage("some wet blueprints", /*german*/"nasse Baupläne€", /*french*/"un plan humide")}); // /*spanish*/unos planos mojados - hintTextTable[RHT_SPIRIT_TEMPLE_MAP] = HintText(CustomMessage("the Spirit Temple Map", /*german*/"die Karte des Geistertempels", /*french*/"la carte du Temple de l'Esprit"), + hintTextTable[RHT_SPIRIT_TEMPLE_MAP] = HintText(CustomMessage("the Spirit Temple Map", /*german*/"die Labyrinth-Karte des Geistertempels", /*french*/"la carte du Temple de l'Esprit"), // /*spanish*/el mapa del Templo del Espíritu { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a sandy atlas", /*german*/"ein sandiger Atlas", /*french*/"un atlas sableux"), // /*spanish*/un atlas arenoso - CustomMessage("some sandy blueprints", /*german*/"einige sandige Blaupausen", /*french*/"un plan sableux")}); + CustomMessage("some sandy blueprints", /*german*/"sandige Baupläne€", /*french*/"un plan sableux")}); // /*spanish*/unos planos arenosos - hintTextTable[RHT_SHADOW_TEMPLE_MAP] = HintText(CustomMessage("the Shadow Temple Map", /*german*/"die Karte des Schattentempels", /*french*/"la carte du Temple de l'Ombre"), + hintTextTable[RHT_SHADOW_TEMPLE_MAP] = HintText(CustomMessage("the Shadow Temple Map", /*german*/"die Labyrinth-Karte des Schattentempels", /*french*/"la carte du Temple de l'Ombre"), // /*spanish*/el mapa del Templo de las Sombras { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a creepy atlas", /*german*/"eine gruseliger Atlas", /*french*/"un atlas sinistre"), // /*spanish*/un atlas siniestra - CustomMessage("some creepy blueprints", /*german*/"einige gruselige Blaupausen", /*french*/"un plan sinistre")}); + CustomMessage("some creepy blueprints", /*german*/"gruselige Baupläne€", /*french*/"un plan sinistre")}); // /*spanish*/unos planos siniestras - hintTextTable[RHT_BOTTOM_OF_THE_WELL_MAP] = HintText(CustomMessage("the Bottom of the Well Map", /*german*/"die Karte des Grund des Brunnens", /*french*/"la carte du fond du Puits"), + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MAP] = HintText(CustomMessage("the Bottom of the Well Map", /*german*/"die Labyrinth-Karte vom Grund des Brunnens", /*french*/"la carte du fond du Puits"), // /*spanish*/el mapa del Fondo del pozo { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a moldy atlas", /*german*/"ein schimmeliger Atlas", /*french*/"un atlas moisi"), // /*spanish*/un atlas mohoso - CustomMessage("some moldy blueprints", /*german*/"einige schimmelige Blaupausen", /*french*/"un plan moisi")}); + CustomMessage("some moldy blueprints", /*german*/"schimmelige Baupläne€", /*french*/"un plan moisi")}); // /*spanish*/unos planos mohosos - hintTextTable[RHT_ICE_CAVERN_MAP] = HintText(CustomMessage("the Ice Cavern Map", /*german*/"die Karte der Eishöhle", /*french*/"la carte de la Caverne Polaire"), + hintTextTable[RHT_ICE_CAVERN_MAP] = HintText(CustomMessage("the Ice Cavern Map", /*german*/"die Labyrinth-Karte der Eishöhle", /*french*/"la carte de la Caverne Polaire"), // /*spanish*/el mapa de la Caverna de hielo { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a polar atlas", /*german*/"ein polarer Atlas", /*french*/"un atlas polaire"), // /*spanish*/un atlas polar - CustomMessage("some polar blueprints", /*german*/"einige polare Blaupausen", /*french*/"un plan polaire")}); + CustomMessage("some polar blueprints", /*german*/"polare Baupläne€", /*french*/"un plan polaire")}); // /*spanish*/unos planos polars - hintTextTable[RHT_DEKU_TREE_COMPASS] = HintText(CustomMessage("the Deku Tree Compass", /*german*/"der Kompaß des Deku-Baums", /*french*/"la boussole de l'Arbre Mojo"), + hintTextTable[RHT_DEKU_TREE_COMPASS] = HintText(CustomMessage("the Deku Tree Compass", /*german*/"der Kompaß des Deku-Baumes", /*french*/"la boussole de l'Arbre Mojo"), // /*spanish*/la brújula del Gran Árbol Deku { CustomMessage("a compass", /*german*/"ein Kompaß", /*french*/"une boussole") @@ -1062,7 +1063,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a mossy magnetic needle", /*german*/"eine moosige Magnetnadel", /*french*/"une aimant boisée")}); // /*spanish*/un imán musgoso - hintTextTable[RHT_DODONGOS_CAVERN_COMPASS] = HintText(CustomMessage("the Dodongo's Cavern Compass", /*german*/"der Kompaß der Dodongo-Höhle", /*french*/"la boussole de la Caverne Dodongo"), + hintTextTable[RHT_DODONGOS_CAVERN_COMPASS] = HintText(CustomMessage("the Dodongo's Cavern Compass", /*german*/"der Kompaß von Dodongos Höhle", /*french*/"la boussole de la Caverne Dodongo"), // /*spanish*/la brújula de la Cueva de los Dodongos { CustomMessage("a compass", /*german*/"ein Kompaß", /*french*/"une boussole") @@ -1073,7 +1074,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a rocky magnetic needle", /*german*/"eine felsige Magnetnadel", /*french*/"une aimant rocheux")}); // /*spanish*/un imán rocoso - hintTextTable[RHT_JABU_JABUS_BELLY_COMPASS] = HintText(CustomMessage("the Jabu-Jabu's Belly Compass", /*german*/"der Kompaß des Jabu-Jabu-Bauchs", /*french*/"la boussole de Jabu-Jabu"), + hintTextTable[RHT_JABU_JABUS_BELLY_COMPASS] = HintText(CustomMessage("the Jabu-Jabu's Belly Compass", /*german*/"der Kompaß von Jabu-Jabus Bauch", /*french*/"la boussole de Jabu-Jabu"), // /*spanish*/la brújula de la Tripa de Jabu-Jabu { CustomMessage("a compass", /*german*/"ein Kompaß", /*french*/"une boussole") @@ -1139,15 +1140,15 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a creepy magnetic needle", /*german*/"eine gruselige Magnetnadel", /*french*/"une aimant sinistre")}); // /*spanish*/un imán siniestra - hintTextTable[RHT_BOTTOM_OF_THE_WELL_COMPASS] = HintText(CustomMessage("the Bottom of the Well Compass", /*german*/"der Kompaß des Grund des Brunnens", /*french*/"la boussole du fond du Puits"), + hintTextTable[RHT_BOTTOM_OF_THE_WELL_COMPASS] = HintText(CustomMessage("the Bottom of the Well Compass", /*german*/"der Kompaß vom Grund des Brunnens", /*french*/"la boussole du fond du Puits"), // /*spanish*/la brújula del Fondo del pozo { CustomMessage("a compass", /*german*/"ein Kompaß", /*french*/"une boussole") // /*spanish*/una brújula }, { - CustomMessage("a dank treasure tracker", /*german*/"ein feuchter Schatzfinder", /*french*/"un cherche-trésor moisi"), + CustomMessage("a dank treasure tracker", /*german*/"ein schimmeliger Schatzfinder", /*french*/"un cherche-trésor moisi"), // /*spanish*/un zahorí mohoso - CustomMessage("a dank magnetic needle", /*german*/"eine feuchte Magnetnadel", /*french*/"une aimant moisi")}); + CustomMessage("a dank magnetic needle", /*german*/"eine schimmelige Magnetnadel", /*french*/"une aimant moisi")}); // /*spanish*/un imán mohoso hintTextTable[RHT_ICE_CAVERN_COMPASS] = HintText(CustomMessage("the Ice Cavern Compass", /*german*/"der Kompaß der Eishöhle", /*french*/"la Boussole de la Caverne Polaire"), @@ -1161,207 +1162,208 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a polar magnetic needle", /*german*/"eine polare Magnetnadel", /*french*/"une aimant polaire")}); // /*spanish*/un imán polar - hintTextTable[RHT_FOREST_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Forest Temple Boss Key", /*german*/"der Waldtempel-Master-Schlüssel", /*french*/"la Clé d'Or du Temple de la Forêt"), + hintTextTable[RHT_FOREST_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Forest Temple Boss Key", /*german*/"der Master-Schlüssel des Waldtempels", /*french*/"la Clé d'Or du Temple de la Forêt"), // /*spanish*/la gran llave del Templo del Bosque { CustomMessage("a boss key", /*german*/"ein Master-Schlüssel", /*french*/"une Clé d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a sylvan master of unlocking", /*german*/"ein waldiger Meister des Entschlüsselns", /*french*/"un anti-grosse porte sylvestre"), + CustomMessage("a sylvan master of unlocking", /*german*/"ein waldiger Meister der Entriegelung", /*french*/"un anti-grosse porte sylvestre"), // /*spanish*/la clave enselvada de un jefe - CustomMessage("a sylvan dungeon's master pass", /*german*/"ein waldiger Dungeon-Meisterpass", /*french*/"une clé maléfique sylvestre")}); + CustomMessage("a sylvan dungeon's master pass", /*german*/"ein waldiger Labyrinth-Meisterpass", /*french*/"une clé maléfique sylvestre")}); // /*spanish*/el pase maestro enselvado - hintTextTable[RHT_FIRE_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Fire Temple Boss Key", /*german*/"der Feuertempel-Master-Schlüssel", /*french*/"la Clé d'Or du Temple du Feu"), + hintTextTable[RHT_FIRE_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Fire Temple Boss Key", /*german*/"der Master-Schlüssel des Feuertempels", /*french*/"la Clé d'Or du Temple du Feu"), // /*spanish*/la gran llave del Templo del Fuego { CustomMessage("a boss key", /*german*/"ein Master-Schlüssel", /*french*/"une Clé d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a molten master of unlocking", /*german*/"ein geschmolzener Meister des Entschlüsselns", /*french*/"un anti-grosse porte fondu"), + CustomMessage("a molten master of unlocking", /*german*/"ein geschmolzener Meister der Entriegelung", /*french*/"un anti-grosse porte fondu"), // /*spanish*/la clave fundido de un jefe - CustomMessage("a molten dungeon's master pass", /*german*/"ein geschmolzener Dungeon-Meisterpass", /*french*/"une clé maléfique fondu")}); + CustomMessage("a molten dungeon's master pass", /*german*/"ein geschmolzener Labyrinth-Meisterpass", /*french*/"une clé maléfique fondu")}); // /*spanish*/el pase maestro fundido - hintTextTable[RHT_WATER_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Water Temple Boss Key", /*german*/"der Wassertempel-Master-Schlüssel", /*french*/"la Clé d'Or du Temple de l'Eau"), + hintTextTable[RHT_WATER_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Water Temple Boss Key", /*german*/"der Master-Schlüssel des Wassertempels", /*french*/"la Clé d'Or du Temple de l'Eau"), // /*spanish*/la gran llave del Templo del Agua { CustomMessage("a boss key", /*german*/"ein Master-Schlüssel", /*french*/"une Clé d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a wet master of unlocking", /*german*/"ein nasser Meister des Entschlüsselns", /*french*/"un anti-grosse porte humide"), + CustomMessage("a wet master of unlocking", /*german*/"ein nasser Meister der Entriegelung", /*french*/"un anti-grosse porte humide"), // /*spanish*/la clave mojado de un jefe - CustomMessage("a wet dungeon's master pass", /*german*/"ein nasser Dungeon-Meisterpass", /*french*/"une clé maléfique humide")}); + CustomMessage("a wet dungeon's master pass", /*german*/"ein nasser Labyrinth-Meisterpass", /*french*/"une clé maléfique humide")}); // /*spanish*/el pase maestro mojado - hintTextTable[RHT_SPIRIT_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Spirit Temple Boss Key", /*german*/"der Geistertempel-Master-Schlüssel", /*french*/"la Clé d'Or du Temple de l'Esprit"), + hintTextTable[RHT_SPIRIT_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Spirit Temple Boss Key", /*german*/"der Master-Schlüssel des Geistertempels", /*french*/"la Clé d'Or du Temple de l'Esprit"), // /*spanish*/la gran llave del Templo del Espíritu { CustomMessage("a boss key", /*german*/"ein Master-Schlüssel", /*french*/"une Clé d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a sandy master of unlocking", /*german*/"ein sandiger Meister des Entschlüsselns", /*french*/"un anti-grosse porte sableux"), + CustomMessage("a sandy master of unlocking", /*german*/"ein sandiger Meister der Entriegelung", /*french*/"un anti-grosse porte sableux"), // /*spanish*/la clave arenoso de un jefe - CustomMessage("a sandy dungeon's master pass", /*german*/"ein sandiger Dungeon-Meisterpass", /*french*/"une clé maléfique sableux")}); + CustomMessage("a sandy dungeon's master pass", /*german*/"ein sandiger Labyrinth-Meisterpass", /*french*/"une clé maléfique sableux")}); // /*spanish*/el pase maestro arenoso - hintTextTable[RHT_SHADOW_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Shadow Temple Boss Key", /*german*/"der Schattentempel-Master-Schlüssel", /*french*/"la Clé d'Or du Temple de l'Ombre"), + hintTextTable[RHT_SHADOW_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Shadow Temple Boss Key", /*german*/"der Master-Schlüssel des Schattentempels", /*french*/"la Clé d'Or du Temple de l'Ombre"), // /*spanish*/la gran llave del Templo de las Sombras { CustomMessage("a boss key", /*german*/"ein Master-Schlüssel", /*french*/"une Clé d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a creepy master of unlocking", /*german*/"ein gruseliger Meister des Entschlüsselns", /*french*/"un anti-grosse porte sinistre"), + CustomMessage("a creepy master of unlocking", /*german*/"ein gruseliger Meister der Entriegelung", /*french*/"un anti-grosse porte sinistre"), // /*spanish*/la clave siniestra de un jefe - CustomMessage("a creepy dungeon's master pass", /*german*/"ein gruseliger Dungeon-Meisterpass", /*french*/"une clé maléfique sinistre")}); + CustomMessage("a creepy dungeon's master pass", /*german*/"ein gruseliger Labyrinth-Meisterpass", /*french*/"une clé maléfique sinistre")}); // /*spanish*/el pase maestro siniestra - hintTextTable[RHT_GANONS_CASTLE_BOSS_KEY] = HintText(CustomMessage("the Ganon's Castle Boss Key", /*german*/"der Master-Schlüssel für Ganons Schloß", /*french*/"la Clé d'Or du Château de Ganon"), + hintTextTable[RHT_GANONS_CASTLE_BOSS_KEY] = HintText(CustomMessage("the Ganon's Castle Boss Key", /*german*/"der Master-Schlüssel von Ganons Schloß", /*french*/"la Clé d'Or du Château de Ganon"), // /*spanish*/la gran llave del Castillo de Ganon { CustomMessage("a boss key", /*german*/"ein Master-Schlüssel", /*french*/"une Clé d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a final master of unlocking", /*german*/"ein finaler Meister des Entschlüsselns", /*french*/"un anti-grosse porte final"), + CustomMessage("a final master of unlocking", /*german*/"ein finaler Meister der Entriegelung", /*french*/"un anti-grosse porte final"), // /*spanish*/la clave final de un jefe - CustomMessage("a final dungeon's master pass", /*german*/"ein finaler Dungeon-Meisterpass", /*french*/"une clé maléfique final")}); + CustomMessage("a final dungeon's master pass", /*german*/"ein finaler Labyrinth-Meisterpass", /*french*/"une clé maléfique final")}); // /*spanish*/el pase maestro final - hintTextTable[RHT_FOREST_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Forest Temple Small Key", /*german*/"ein kleiner Waldtempel-Schlüssel", /*french*/"une petite clé du Temple de la Forêt"), + hintTextTable[RHT_FOREST_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Forest Temple Small Key", /*german*/"ein kleiner Schlüssel des Waldtempels", /*french*/"une petite clé du Temple de la Forêt"), // /*spanish*/una llave pequeña del Templo del Bosque { CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") // /*spanish*/una llave pequeña }, { - CustomMessage("a sylvan tool for unlocking", /*german*/"ein waldiges Werkzeug zur Entschlüsselung", /*french*/"un anti-porte sylvestre"), + CustomMessage("a sylvan tool for unlocking", /*german*/"ein waldiges Werkzeug zur Entriegelung", /*french*/"un anti-porte sylvestre"), // /*spanish*/una clave de una entrada enselvada - CustomMessage("a sylvan dungeon pass", /*german*/"ein waldiger Dungeon-Pass", /*french*/"le rêve sylvestre d'un prisonnier"), + CustomMessage("a sylvan dungeon pass", /*german*/"ein waldiger Labyrinth-Pass", /*french*/"le rêve sylvestre d'un prisonnier"), // /*spanish*/un pase de una mazmorra enselvada CustomMessage("a sylvan lock remover", /*german*/"ein waldiger Schlossentferner", /*french*/"un efface-serrure sylvestre"), // /*spanish*/un destructor de cerraduras enselvada CustomMessage("a sylvan lockpick", /*german*/"ein waldiger Dietrich", /*french*/"un crochet à porte sylvestre")}); // /*spanish*/una apertura portentosa enselvada - hintTextTable[RHT_FIRE_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Fire Temple Small Key", /*german*/"ein kleiner Feuertempel-Schlüssel", /*french*/"une petite clé du Temple du Feu"), + hintTextTable[RHT_FIRE_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Fire Temple Small Key", /*german*/"ein kleiner Schlüssel des Feuertempels", /*french*/"une petite clé du Temple du Feu"), // /*spanish*/una llave pequeña del Templo del Fuego { CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") // /*spanish*/una llave pequeña }, { - CustomMessage("a molten tool for unlocking", /*german*/"ein geschmolzenes Werkzeug zur Entschlüsselung", /*french*/"un anti-porte fondu"), + CustomMessage("a molten tool for unlocking", /*german*/"ein geschmolzenes Werkzeug zur Entriegelung", /*french*/"un anti-porte fondu"), // /*spanish*/una clave de una entrada fundida - CustomMessage("a molten dungeon pass", /*german*/"ein geschmolzener Dungeon-Pass", /*french*/"le rêve fondu d'un prisonnier"), + CustomMessage("a molten dungeon pass", /*german*/"ein geschmolzener Labyrinth-Pass", /*french*/"le rêve fondu d'un prisonnier"), // /*spanish*/un pase de una mazmorra fundida CustomMessage("a molten lock remover", /*german*/"ein geschmolzener Schlossentferner", /*french*/"un efface-serrure fondu"), // /*spanish*/un destructor de cerraduras fundida CustomMessage("a molten lockpick", /*german*/"ein geschmolzener Dietrich", /*french*/"un crochet à porte fondu")}); // /*spanish*/una apertura portentosa fundida - hintTextTable[RHT_WATER_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Water Temple Small Key", /*german*/"ein kleiner Wassertempel-Schlüssel", /*french*/"une petite clé du Temple de l'Eau"), + hintTextTable[RHT_WATER_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Water Temple Small Key", /*german*/"ein kleiner Schlüssel des Wassertempels", /*french*/"une petite clé du Temple de l'Eau"), // /*spanish*/una llave pequeña del Templo del Agua { CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") // /*spanish*/una llave pequeña }, { - CustomMessage("a wet tool for unlocking", /*german*/"ein nasses Werkzeug zur Entschlüsselung", /*french*/"un anti-porte humide"), + CustomMessage("a wet tool for unlocking", /*german*/"ein nasses Werkzeug zur Entriegelung", /*french*/"un anti-porte humide"), // /*spanish*/una clave de una entrada mojada - CustomMessage("a wet dungeon pass", /*german*/"ein nasser Dungeon-Pass", /*french*/"le rêve humide d'un prisonnier"), + CustomMessage("a wet dungeon pass", /*german*/"ein nasser Labyrinth-Pass", /*french*/"le rêve humide d'un prisonnier"), // /*spanish*/un pase de una mazmorra mojada CustomMessage("a wet lock remover", /*german*/"ein nasser Schlossentferner", /*french*/"un efface-serrure humide"), // /*spanish*/un destructor de cerraduras mojada CustomMessage("a wet lockpick", /*german*/"ein nasser Dietrich", /*french*/"un crochet à porte humide")}); // /*spanish*/una apertura portentosa mojada - hintTextTable[RHT_SPIRIT_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Spirit Temple Small Key", /*german*/"ein kleiner Geistertempel-Schlüssel", /*french*/"une petite clé du Temple de l'Esprit"), + hintTextTable[RHT_SPIRIT_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Spirit Temple Small Key", /*german*/"ein kleiner Schlüssel des Geistertempels", /*french*/"une petite clé du Temple de l'Esprit"), // /*spanish*/una llave pequeña del Templo del Espíritu { CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") // /*spanish*/una llave pequeña }, { - CustomMessage("a sandy tool for unlocking", /*german*/"ein sandiges Werkzeug zur Entschlüsselung", /*french*/"un anti-porte sableux"), + CustomMessage("a sandy tool for unlocking", /*german*/"ein sandiges Werkzeug zur Entriegelung", /*french*/"un anti-porte sableux"), // /*spanish*/una clave de una entrada arenosa - CustomMessage("a sandy dungeon pass", /*german*/"ein sandiger Dungeon-Pass", /*french*/"le rêve sableux d'un prisonnier"), + CustomMessage("a sandy dungeon pass", /*german*/"ein sandiger Labyrinth-Pass", /*french*/"le rêve sableux d'un prisonnier"), // /*spanish*/un pase de una mazmorra arenosa CustomMessage("a sandy lock remover", /*german*/"ein sandiger Schlossentferner", /*french*/"un efface-serrure sableux"), // /*spanish*/un destructor de cerraduras arenosa CustomMessage("a sandy lockpick", /*german*/"ein sandiger Dietrich", /*french*/"un crochet à porte sableux")}); // /*spanish*/una apertura portentosa arenosa - hintTextTable[RHT_SHADOW_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Shadow Temple Small Key", /*german*/"ein kleiner Schattentempel-Schlüssel", /*french*/"une petite clé du Temple de l'Ombre"), + hintTextTable[RHT_SHADOW_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Shadow Temple Small Key", /*german*/"ein kleiner Schlüssel des Schattentempels", /*french*/"une petite clé du Temple de l'Ombre"), // /*spanish*/una llave pequeña del Templo de las Sombras { CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") // /*spanish*/una llave pequeña }, { - CustomMessage("a creepy tool for unlocking", /*german*/"ein gruseliges Werkzeug zur Entschlüsselung", /*french*/"un anti-porte sinistre"), + CustomMessage("a creepy tool for unlocking", /*german*/"ein gruseliges Werkzeug zur Entriegelung", /*french*/"un anti-porte sinistre"), // /*spanish*/una clave de una entrada siniestra:a - CustomMessage("a creepy dungeon pass", /*german*/"ein gruseliger Dungeon-Pass", /*french*/"le rêve sinistre d'un prisonnier"), + CustomMessage("a creepy dungeon pass", /*german*/"ein gruseliger Labyrinth-Pass", /*french*/"le rêve sinistre d'un prisonnier"), // /*spanish*/un pase de una mazmorra siniestra:a CustomMessage("a creepy lock remover", /*german*/"ein gruseliger Schlossentferner", /*french*/"un efface-serrure sinistre"), // /*spanish*/un destructor de cerraduras siniestra:a CustomMessage("a creepy lockpick", /*german*/"ein gruseliger Dietrich", /*french*/"un crochet à porte sinistre")}); // /*spanish*/una apertura portentosa siniestra:a - hintTextTable[RHT_GERUDO_TRAINING_GROUND_SMALL_KEY] = HintText(CustomMessage("a Gerudo Training Ground Small Key", /*german*/"ein kleiner Schlüssel des Gerudo-Trainingsgeländes", /*french*/"une petite clé du Gymnase Gerudo"), + hintTextTable[RHT_GERUDO_TRAINING_GROUND_SMALL_KEY] = HintText(CustomMessage("a Gerudo Training Ground Small Key", /*german*/"ein kleiner Schlüssel der Gerudo-Trainingsarena", /*french*/"une petite clé du Gymnase Gerudo"), // /*spanish*/una llave pequeña del Centro de Instrucción Gerudo { CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") // /*spanish*/una llave pequeña }, { - CustomMessage("a labyrinthian tool for unlocking", /*german*/"ein labyrinthisches Werkzeug zur Entschlüsselung", /*french*/"un anti-porte labyrinthique"), + CustomMessage("a labyrinthian tool for unlocking", /*german*/"ein verwirrendes Werkzeug zur Entriegelung", /*french*/"un anti-porte labyrinthique"), // /*spanish*/una clave de una entrada laberíntica - CustomMessage("a labyrinthian dungeon pass", /*german*/"ein labyrinthischer Dungeon-Pass", /*french*/"le rêve labyrinthique d'un prisonnier"), + CustomMessage("a labyrinthian dungeon pass", /*german*/"ein verwirrender Labyrinth-Pass", /*french*/"le rêve labyrinthique d'un prisonnier"), // /*spanish*/un pase de una mazmorra laberíntica - CustomMessage("a labyrinthian lock remover", /*german*/"ein labyrinthischer Schlossentferner", /*french*/"un efface-serrure labyrinthique"), + CustomMessage("a labyrinthian lock remover", /*german*/"ein verwirrender Schlossentferner", /*french*/"un efface-serrure labyrinthique"), // /*spanish*/un destructor de cerraduras laberíntica - CustomMessage("a labyrinthian lockpick", /*german*/"ein labyrinthischer Dietrich", /*french*/"un crochet à porte labyrinthique")}); + CustomMessage("a labyrinthian lockpick", /*german*/"ein verwirrender Dietrich", /*french*/"un crochet à porte labyrinthique")}); // /*spanish*/una apertura portentosa laberíntica - hintTextTable[RHT_GERUDO_FORTRESS_SMALL_KEY] = HintText(CustomMessage("a Gerudo Fortress Small Key", /*german*/"ein kleiner Schlüssel für die Gerudo-Festung", /*french*/"une petite clé de la Repaire des Voleurs"), + hintTextTable[RHT_GERUDO_FORTRESS_SMALL_KEY] = HintText(CustomMessage("a Gerudo Fortress Small Key", /*german*/"ein kleiner Schlüssel des Diebesverstecks", /*french*/"une petite clé de la Repaire des Voleurs"), // /*spanish*/una llave pequeña de la Fortaleza Gerudo { CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") // /*spanish*/una llave pequeña }, { - CustomMessage("an imprisoned tool for unlocking", /*german*/"ein gefangenes Werkzeug zur Entschlüsselung", /*french*/"un anti-porte emprisonné"), + CustomMessage("an imprisoned tool for unlocking", /*german*/"ein gefangenes Werkzeug zur Entriegelung", /*french*/"un anti-porte emprisonné"), // /*spanish*/una clave de una entrada encarcelada - CustomMessage("an imprisoned dungeon pass", /*german*/"ein gefangener Dungeon-Pass", /*french*/"le rêve emprisonné d'un prisonnier"), + CustomMessage("an imprisoned dungeon pass", /*german*/"ein gefangener Labyrinth-Pass", /*french*/"le rêve emprisonné d'un prisonnier"), // /*spanish*/un pase de una mazmorra encarcelada CustomMessage("an imprisoned lock remover", /*german*/"ein gefangener Schlossentferner", /*french*/"un efface-serrure emprisonné"), // /*spanish*/un destructor de cerraduras encarcelada CustomMessage("an imprisoned lockpick", /*german*/"ein gefangener Dietrich", /*french*/"un crochet à porte emprisonné")}); // /*spanish*/una apertura portentosa encarcelada - hintTextTable[RHT_BOTTOM_OF_THE_WELL_SMALL_KEY] = HintText(CustomMessage("a Bottom of the Well Small Key", /*german*/"ein kleiner Schlüssel des Grund des Brunnens", /*french*/"une petite clé du fond du Puits"), + hintTextTable[RHT_BOTTOM_OF_THE_WELL_SMALL_KEY] = HintText(CustomMessage("a Bottom of the Well Small Key", /*german*/"ein kleiner Schlüssel vom Grund des Brunnens", /*french*/"une petite clé du fond du Puits"), // /*spanish*/una llave pequeña del Fondo del pozo { CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") // /*spanish*/una llave pequeña }, { - CustomMessage("a moldy tool for unlocking", /*german*/"ein schimmeliges Werkzeug zur Entschlüsselung", /*french*/"un anti-porte moisi"), + CustomMessage("a moldy tool for unlocking", /*german*/"ein schimmeliges Werkzeug zur Entriegelung", /*french*/"un anti-porte moisi"), // /*spanish*/una clave de una entrada mohosa - CustomMessage("a moldy dungeon pass", /*german*/"ein schimmeliger Dungeon-Pass", /*french*/"le rêve moisi d'un prisonnier"), + CustomMessage("a moldy dungeon pass", /*german*/"ein schimmeliger Labyrinth-Pass", /*french*/"le rêve moisi d'un prisonnier"), // /*spanish*/un pase de una mazmorra mohosa CustomMessage("a moldy lock remover", /*german*/"ein schimmeliger Schlossentferner", /*french*/"un efface-serrure moisi"), // /*spanish*/un destructor de cerraduras mohosa CustomMessage("a moldy lockpick", /*german*/"ein schimmeliger Dietrich", /*french*/"un crochet à porte moisi")}); // /*spanish*/una apertura portentosa mohosa - hintTextTable[RHT_GANONS_CASTLE_SMALL_KEY] = HintText(CustomMessage("a Ganon's Castle Small Key", /*german*/"ein kleiner Schlüssel für Ganons Schloß", /*french*/"une petite clé du Château de Ganon"), + hintTextTable[RHT_GANONS_CASTLE_SMALL_KEY] = HintText(CustomMessage("a Ganon's Castle Small Key", /*german*/"ein kleiner Schlüssel von Ganons Schloß", /*french*/"une petite clé du Château de Ganon"), // /*spanish*/una llave pequeña del Castillo de Ganon { CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") // /*spanish*/una llave pequeña }, { - CustomMessage("a final tool for unlocking", /*german*/"ein finales Werkzeug zur Entschlüsselung", /*french*/"un anti-porte final"), + CustomMessage("a final tool for unlocking", /*german*/"ein finales Werkzeug zur Entriegelung", /*french*/"un anti-porte final"), // /*spanish*/una clave de una entrada final - CustomMessage("a final dungeon pass", /*german*/"ein finaler Dungeon-Pass", /*french*/"le rêve final d'un prisonnier"), + CustomMessage("a final dungeon pass", /*german*/"ein finaler Labyrinth-Pass", /*french*/"le rêve final d'un prisonnier"), // /*spanish*/un pase de una mazmorra final CustomMessage("a final lock remover", /*german*/"ein finaler Schlossentferner", /*french*/"un efface-serrure final"), // /*spanish*/un destructor de cerraduras final CustomMessage("a final lockpick", /*german*/"ein finaler Dietrich", /*french*/"un crochet à porte final")}); // /*spanish*/una apertura portentosa final - hintTextTable[RHT_OVERWORLD_KEY] = HintText(CustomMessage("an Overworld Key", /*german*/"ein Überwelt-Schlüssel", /*french*/"une clé de l'Overworld"), + + hintTextTable[RHT_OVERWORLD_KEY] = HintText(CustomMessage("an Overworld Key", /*german*/"ein Schlüssel der Oberwelt", /*french*/"une clé de l'Overworld"), // /*spanish*/una llave del mundo exterior { CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") @@ -1373,170 +1375,171 @@ void StaticData::HintTable_Init_Item() { // /*spanish*/una llave al reino CustomMessage("a key to the universe", /*german*/"ein Schlüssel zum Universum", /*french*/"une clé de l'univers")}); // /*spanish*/una llave al universo - hintTextTable[RHT_FOREST_TEMPLE_KEY_RING] = HintText(CustomMessage("a Forest Temple Key Ring", /*german*/"ein Schlüsselbund des Waldtempels", /*french*/"un trousseau de clés du Temple de la Forêt"), + + hintTextTable[RHT_FOREST_TEMPLE_KEY_RING] = HintText(CustomMessage("a Forest Temple Key Ring", /*german*/"das Schlüsselbund des Waldtempels", /*french*/"un trousseau de clés du Temple de la Forêt"), // /*spanish*/un llavero del Templo del Bosque { CustomMessage("a key ring", /*german*/"ein Schlüsselbund", /*french*/"un trousseau de clés") // /*spanish*/un llavero }, { - CustomMessage("a sylvan toolbox for unlocking", /*german*/"eine waldige Werkzeugkiste zur Entschlüsselung", /*french*/"des anti-portes sylvestres"), + CustomMessage("a sylvan toolbox for unlocking", /*german*/"eine waldige Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes sylvestres"), // /*spanish*/un conjunto silvestre de cerrajero - CustomMessage("a sylvan dungeon season pass", /*german*/"ein waldiger Dungeon-Season-Pass", /*french*/"les rêves sylvestres d'un prisonnier"), + CustomMessage("a sylvan dungeon season pass", /*german*/"ein waldiger Labyrinth-Season-Pass", /*french*/"les rêves sylvestres d'un prisonnier"), // /*spanish*/un pase vip de mazmorras silvestre CustomMessage("a sylvan jingling ring", /*german*/"ein waldiger Multifunktionsschlüssel", /*french*/"des efface-serrures sylvestres"), // /*spanish*/una cadena multiusos silvestre CustomMessage("a sylvan skeleton key", /*german*/"ein waldiger Skelettschlüssel", /*french*/"des crochets à porte sylvestres")}); // /*spanish*/un anillo silvestre contra cerrojos - hintTextTable[RHT_FIRE_TEMPLE_KEY_RING] = HintText(CustomMessage("a Fire Temple Key Ring", /*german*/"ein Schlüsselbund des Feuertempels", /*french*/"un trousseau de clés du Temple du Feu"), + hintTextTable[RHT_FIRE_TEMPLE_KEY_RING] = HintText(CustomMessage("a Fire Temple Key Ring", /*german*/"das Schlüsselbund des Feuertempels", /*french*/"un trousseau de clés du Temple du Feu"), // /*spanish*/un llavero del Templo del Fuego { CustomMessage("a key ring", /*german*/"ein Schlüsselbund", /*french*/"un trousseau de clés") // /*spanish*/un llavero }, { - CustomMessage("a molten toolbox for unlocking", /*german*/"eine geschmolzene Werkzeugkiste zur Entschlüsselung", /*french*/"des anti-portes fondus"), + CustomMessage("a molten toolbox for unlocking", /*german*/"eine geschmolzene Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes fondus"), // /*spanish*/un conjunto fundido de cerrajero - CustomMessage("a molten dungeon season pass", /*german*/"ein geschmolzener Dungeon-Season-Pass", /*french*/"les rêves fondus d'un prisonnier"), + CustomMessage("a molten dungeon season pass", /*german*/"ein geschmolzener Labyrinth-Season-Pass", /*french*/"les rêves fondus d'un prisonnier"), // /*spanish*/un pase vip de mazmorras fundido CustomMessage("a molten jingling ring", /*german*/"ein geschmolzener Multifunktionsschlüssel", /*french*/"des efface-serrures fondus"), // /*spanish*/una cadena multiusos fundida CustomMessage("a molten skeleton key", /*german*/"ein geschmolzener Skelettschlüssel", /*french*/"des crochets à porte fondus")}); // /*spanish*/un anillo fundido contra cerrojos - hintTextTable[RHT_WATER_TEMPLE_KEY_RING] = HintText(CustomMessage("a Water Temple Key Ring", /*german*/"ein Schlüsselbund des Wassertempels", /*french*/"un trousseau de clés du Temple de l'Eau"), + hintTextTable[RHT_WATER_TEMPLE_KEY_RING] = HintText(CustomMessage("a Water Temple Key Ring", /*german*/"das Schlüsselbund des Wassertempels", /*french*/"un trousseau de clés du Temple de l'Eau"), // /*spanish*/un llavero del Templo del Agua { CustomMessage("a key ring", /*german*/"ein Schlüsselbund", /*french*/"un trousseau de clés") // /*spanish*/un llavero }, { - CustomMessage("a wet toolbox for unlocking", /*german*/"eine nasse Werkzeugkiste zur Entschlüsselung", /*french*/"des anti-portes humides"), + CustomMessage("a wet toolbox for unlocking", /*german*/"eine nasse Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes humides"), // /*spanish*/un conjunto abisal de cerrajero - CustomMessage("a wet dungeon season pass", /*german*/"ein nasser Dungeon-Season-Pass", /*french*/"les rêves humides d'un prisonnier"), + CustomMessage("a wet dungeon season pass", /*german*/"ein nasser Labyrinth-Season-Pass", /*french*/"les rêves humides d'un prisonnier"), // /*spanish*/un pase vip de mazmorras abisal CustomMessage("a wet jingling ring", /*german*/"ein nasser Multifunktionsschlüssel", /*french*/"des efface-serrures humides"), // /*spanish*/una cadena multiusos abisal CustomMessage("a wet skeleton key", /*german*/"ein nasser Skelettschlüssel", /*french*/"des crochets à porte humides")}); // /*spanish*/un anillo abisal contra cerrojos - hintTextTable[RHT_SPIRIT_TEMPLE_KEY_RING] = HintText(CustomMessage("a Spirit Temple Key Ring", /*german*/"ein Schlüsselbund des Geistertempels", /*french*/"un trousseau de clés du Temple de l'Esprit"), + hintTextTable[RHT_SPIRIT_TEMPLE_KEY_RING] = HintText(CustomMessage("a Spirit Temple Key Ring", /*german*/"das Schlüsselbund des Geistertempels", /*french*/"un trousseau de clés du Temple de l'Esprit"), // /*spanish*/un llavero del Templo del Espíritu { CustomMessage("a key ring", /*german*/"ein Schlüsselbund", /*french*/"un trousseau de clés") // /*spanish*/un llavero }, { - CustomMessage("a sandy toolbox for unlocking", /*german*/"eine sandige Werkzeugkiste zur Entschlüsselung", /*french*/"des anti-portes sableux"), + CustomMessage("a sandy toolbox for unlocking", /*german*/"eine sandige Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes sableux"), // /*spanish*/un conjunto arenoso de cerrajero - CustomMessage("a sandy dungeon season pass", /*german*/"ein sandiger Dungeon-Season-Pass", /*french*/"les rêves sableux d'un prisonnier"), + CustomMessage("a sandy dungeon season pass", /*german*/"ein sandiger Labyrinth-Season-Pass", /*french*/"les rêves sableux d'un prisonnier"), // /*spanish*/un pase vip de mazmorras arenoso CustomMessage("a sandy jingling ring", /*german*/"ein sandiger Multifunktionsschlüssel", /*french*/"des efface-serrures sableux"), // /*spanish*/una cadena multiusos arenosa CustomMessage("a sandy skeleton key", /*german*/"ein sandiger Skelettschlüssel", /*french*/"des crochets à porte sableux")}); // /*spanish*/un anillo arenoso contra cerrojos - hintTextTable[RHT_SHADOW_TEMPLE_KEY_RING] = HintText(CustomMessage("a Shadow Temple Key Ring", /*german*/"ein Schlüsselbund des Schattentempels", /*french*/"un trousseau de clés du Temple de l'Ombre"), + hintTextTable[RHT_SHADOW_TEMPLE_KEY_RING] = HintText(CustomMessage("a Shadow Temple Key Ring", /*german*/"das Schlüsselbund des Schattentempels", /*french*/"un trousseau de clés du Temple de l'Ombre"), // /*spanish*/un llavero del Templo de las Sombras { CustomMessage("a key ring", /*german*/"ein Schlüsselbund", /*french*/"un trousseau de clés") // /*spanish*/un llavero }, { - CustomMessage("a creepy toolbox for unlocking", /*german*/"eine gruselige Werkzeugkiste zur Entschlüsselung", /*french*/"des anti-portes sinistres"), + CustomMessage("a creepy toolbox for unlocking", /*german*/"eine gruselige Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes sinistres"), // /*spanish*/un conjunto tenebroso de cerrajero - CustomMessage("a creepy dungeon season pass", /*german*/"ein gruseliger Dungeon-Season-Pass", /*french*/"les rêves sinistres d'un prisonnier"), + CustomMessage("a creepy dungeon season pass", /*german*/"ein gruseliger Labyrinth-Season-Pass", /*french*/"les rêves sinistres d'un prisonnier"), // /*spanish*/un pase vip de mazmorras tenebroso CustomMessage("a creepy jingling ring", /*german*/"ein gruseliger Multifunktionsschlüssel", /*french*/"des efface-serrures sinistres"), // /*spanish*/una cadena multiusos tenebrosa CustomMessage("a creepy skeleton key", /*german*/"ein gruseliger Skelettschlüssel", /*french*/"des crochets à porte sinistres")}); // /*spanish*/un anillo tenebroso contra cerrojos - hintTextTable[RHT_GERUDO_TRAINING_GROUND_KEY_RING] = HintText(CustomMessage("a Gerudo Training Ground Key Ring", /*german*/"ein Schlüsselbund des Gerudo-Trainingsgeländes", /*french*/"un trousseau de clés du Gymnase Gerudo"), + hintTextTable[RHT_GERUDO_TRAINING_GROUND_KEY_RING] = HintText(CustomMessage("a Gerudo Training Ground Key Ring", /*german*/"das Schlüsselbund der Gerudo-Trainingsarena", /*french*/"un trousseau de clés du Gymnase Gerudo"), // /*spanish*/un llavero del Centro de Instrucción Gerudo { CustomMessage("a key ring", /*german*/"ein Schlüsselbund", /*french*/"un trousseau de clés") // /*spanish*/un llavero }, { - CustomMessage("a labyrinthian toolbox for unlocking", /*german*/"eine labyrinthische Werkzeugkiste zur Entschlüsselung", /*french*/"des anti-portes labyrinthiques"), + CustomMessage("a labyrinthian toolbox for unlocking", /*german*/"eine verwirrende Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes labyrinthiques"), // /*spanish*/un conjunto laberíntico de cerrajero - CustomMessage("a labyrinthian dungeon season pass", /*german*/"ein labyrinthischer Dungeon-Season-Pass", /*french*/"les rêves labyrinthiques d'un prisonnier"), + CustomMessage("a labyrinthian dungeon season pass", /*german*/"ein verwirrender Labyrinth-Season-Pass", /*french*/"les rêves labyrinthiques d'un prisonnier"), // /*spanish*/un pase vip de mazmorras laberíntico - CustomMessage("a labyrinthian jingling ring", /*german*/"ein labyrinthischer Multifunktionsschlüssel", /*french*/"des efface-serrures labyrinthiques"), + CustomMessage("a labyrinthian jingling ring", /*german*/"ein verwirrender Multifunktionsschlüssel", /*french*/"des efface-serrures labyrinthiques"), // /*spanish*/una cadena multiusos laberíntica - CustomMessage("a labyrinthian skeleton key", /*german*/"ein labyrinthischer Skelettschlüssel", /*french*/"des crochets à porte labyrinthiques")}); + CustomMessage("a labyrinthian skeleton key", /*german*/"ein verwirrender Skelettschlüssel", /*french*/"des crochets à porte labyrinthiques")}); // /*spanish*/un anillo laberíntico contra cerrojos - hintTextTable[RHT_GERUDO_FORTRESS_KEY_RING] = HintText(CustomMessage("a Gerudo Fortress Key Ring", /*german*/"ein Schlüsselbund der Gerudo-Festung", /*french*/"un trousseau de clés de la Repaire des Voleurs"), + hintTextTable[RHT_GERUDO_FORTRESS_KEY_RING] = HintText(CustomMessage("a Gerudo Fortress Key Ring", /*german*/"das Schlüsselbund des Diebesverstecks", /*french*/"un trousseau de clés de la Repaire des Voleurs"), // /*spanish*/un llavero de la Fortaleza Gerudo { CustomMessage("a key ring", /*german*/"ein Schlüsselbund", /*french*/"un trousseau de clés") // /*spanish*/un llavero }, { - CustomMessage("an imprisoned toolbox for unlocking", /*german*/"eine gefangene Werkzeugkiste zur Entschlüsselung", /*french*/"des anti-portes emprisonnés"), + CustomMessage("an imprisoned toolbox for unlocking", /*german*/"eine gefangene Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes emprisonnés"), // /*spanish*/un conjunto enjaulado de cerrajero - CustomMessage("an imprisoned dungeon season pass", /*german*/"ein gefangener Dungeon-Season-Pass", /*french*/"les rêves emprisonnés d'un prisonnier"), + CustomMessage("an imprisoned dungeon season pass", /*german*/"ein gefangener Labyrinth-Season-Pass", /*french*/"les rêves emprisonnés d'un prisonnier"), // /*spanish*/un pase vip de una mazmorra enjaulado CustomMessage("an imprisoned jingling ring", /*german*/"ein gefangener Multifunktionsschlüssel", /*french*/"des efface-serrures emprisonnés"), // /*spanish*/una cadena multiusos enjaulada CustomMessage("an imprisoned skeleton key", /*german*/"ein gefangener Skelettschlüssel", /*french*/"des crochets à porte emprisonnés")}); // /*spanish*/un anillo enjaulado contra cerrojos - hintTextTable[RHT_BOTTOM_OF_THE_WELL_KEY_RING] = HintText(CustomMessage("a Bottom of the Well Key Ring", /*german*/"ein Schlüsselbund des Grund des Brunnens", /*french*/"un trousseau de clés du fond du Puits"), + hintTextTable[RHT_BOTTOM_OF_THE_WELL_KEY_RING] = HintText(CustomMessage("a Bottom of the Well Key Ring", /*german*/"das Schlüsselbund vom Grund des Brunnens", /*french*/"un trousseau de clés du fond du Puits"), // /*spanish*/un llavero del Fondo del pozo { CustomMessage("a key ring", /*german*/"ein Schlüsselbund", /*french*/"un trousseau de clés") // /*spanish*/un llavero }, { - CustomMessage("a moldy toolbox for unlocking", /*german*/"eine schimmelige Werkzeugkiste zur Entschlüsselung", /*french*/"des anti-portes moisis"), + CustomMessage("a moldy toolbox for unlocking", /*german*/"eine schimmelige Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes moisis"), // /*spanish*/un conjunto subterráneo de cerrajero - CustomMessage("a moldy dungeon season pass", /*german*/"ein schimmeliger Dungeon-Season-Pass", /*french*/"les rêves moisis d'un prisonnier"), + CustomMessage("a moldy dungeon season pass", /*german*/"ein schimmeliger Labyrinth-Season-Pass", /*french*/"les rêves moisis d'un prisonnier"), // /*spanish*/un pase vip de una mazmorra subterráneo CustomMessage("a moldy jingling ring", /*german*/"ein schimmeliger Multifunktionsschlüssel", /*french*/"des efface-serrures moisis"), // /*spanish*/una cadena multiusos subterránea CustomMessage("a moldy skeleton key", /*german*/"ein schimmeliger Skelettschlüssel", /*french*/"des crochets à porte moisis")}); // /*spanish*/un anillo subterráneo contra cerrojos - hintTextTable[RHT_GANONS_CASTLE_KEY_RING] = HintText(CustomMessage("a Ganon's Castle Key Ring", /*german*/"ein Schlüsselbund von Ganons Schloß", /*french*/"un trousseau de clés du Château de Ganon"), + hintTextTable[RHT_GANONS_CASTLE_KEY_RING] = HintText(CustomMessage("a Ganon's Castle Key Ring", /*german*/"das Schlüsselbund von Ganons Schloß", /*french*/"un trousseau de clés du Château de Ganon"), // /*spanish*/un llavero del Castillo de Ganon { CustomMessage("a key ring", /*german*/"ein Schlüsselbund", /*french*/"un trousseau de clés") // /*spanish*/un llavero }, { - CustomMessage("a final toolbox for unlocking", /*german*/"eine finale Werkzeugkiste zur Entschlüsselung", /*french*/"des anti-portes finaux"), + CustomMessage("a final toolbox for unlocking", /*german*/"eine finale Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes finaux"), // /*spanish*/un conjunto decisivo de cerrajero - CustomMessage("a final dungeon season pass", /*german*/"ein finaler Dungeon-Season-Pass", /*french*/"les rêves finaux d'un prisonnier"), + CustomMessage("a final dungeon season pass", /*german*/"ein finaler Labyrinth-Season-Pass", /*french*/"les rêves finaux d'un prisonnier"), // /*spanish*/un pase vip de una mazmorra decisivo CustomMessage("a final jingling ring", /*german*/"ein finaler Multifunktionsschlüssel", /*french*/"des efface-serrures finaux"), // /*spanish*/una cadena multiusos decisiva CustomMessage("a final skeleton key", /*german*/"ein finaler Skelettschlüssel", /*french*/"des crochets à porte finaux")}); // /*spanish*/un anillo decisivo multiusos - hintTextTable[RHT_TREASURE_GAME_SMALL_KEY] = HintText(CustomMessage("a Treasure Chest Shop Small Key", /*german*/"ein kleiner Schlüssel des Schatztruhenladens", /*french*/"une petite clé de la chasse aux trésors"), + hintTextTable[RHT_TREASURE_GAME_SMALL_KEY] = HintText(CustomMessage("a Treasure Chest Shop Small Key", /*german*/"ein kleiner Schlüssel der Truhenlotterie", /*french*/"une petite clé de la chasse aux trésors"), // /*spanish*/una llave pequeña del Cofre del Tesoro { CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") // /*spanish*/una llave pequeña }, { - CustomMessage("a gambler's tool for unlocking", /*german*/"ein Spieler-Werkzeug zur Entschlüsselung", /*french*/"un anti-porte de parieur"), + CustomMessage("a gambler's tool for unlocking", /*german*/"ein Zocker-Werkzeug zur Entriegelung", /*french*/"un anti-porte de parieur"), // /*spanish*/una clave de un juego de azar - CustomMessage("a gambler's dungeon pass", /*german*/"ein Spieler-Dungeon-Pass", /*french*/"le rêve d'un prisonnier parieur"), + CustomMessage("a gambler's dungeon pass", /*german*/"ein Zocker-Labyrinth-Pass", /*french*/"le rêve d'un prisonnier parieur"), // /*spanish*/un pase de un juego de azar - CustomMessage("a gambler's lock remover", /*german*/"ein Spieler-Schlossentferner", /*french*/"un efface-serrure de parieur"), + CustomMessage("a gambler's lock remover", /*german*/"ein Zocker-Schlossentferner", /*french*/"un efface-serrure de parieur"), // /*spanish*/un destructor de cerraduras del juego de azar - CustomMessage("a gambler's lockpick", /*german*/"ein Spieler-Dietrich", /*french*/"un crochet à serrure de parieur")}); + CustomMessage("a gambler's lockpick", /*german*/"ein Zocker-Dietrich", /*french*/"un crochet à serrure de parieur")}); // /*spanish*/una apertura portentosa del juego de azar - hintTextTable[RHT_TREASURE_GAME_KEY_RING] = HintText(CustomMessage("a Chest Game Key Ring"), + hintTextTable[RHT_TREASURE_GAME_KEY_RING] = HintText(CustomMessage("a Chest Game Key Ring", /*german*/ "das Schlüsselbund der Truhenlotterie", /*french*/ "TRANSLATE THIS"), { CustomMessage("a key ring", /*german*/"ein Schlüsselbund", /*french*/"un trousseau de clés") // /*spanish*/un llavero }, { - CustomMessage("a gambler's toolbox for unlocking"), - CustomMessage("a gambler's season pass"), - CustomMessage("a gambler's jingling ring"), - CustomMessage("a gambler's skeleton key")}); + CustomMessage("a gambler's toolbox for unlocking", /*german*/ "eine Zocker-Werkzeugkiste zur Entriegelung", /*french*/ "TRANSLATE THIS"), + CustomMessage("a gambler's season pass", /*german*/ "ein Zocker-Labyrinth-Season-Pass", /*french*/ "TRANSLATE THIS"), + CustomMessage("a gambler's jingling ring", /*german*/ "ein Zocker-Multifunktionsschlüssel", /*french*/ "TRANSLATE THIS"), + CustomMessage("a gambler's skeleton key", /*german*/ "ein Zocker-Skelettschlüssel", /*french*/ "TRANSLATE THIS")}); hintTextTable[RHT_KOKIRI_EMERALD] = HintText(CustomMessage("the Kokiri Emerald", /*german*/"der Kokiri-Smaragd", /*french*/"l'Émeraude Kokiri"), // /*spanish*/la Esmeralda de los Kokiri { - CustomMessage("a spiritual stone", /*german*/"ein spiritueller Stein", /*french*/"une Pierre Ancestrale") + CustomMessage("a spiritual stone", /*german*/"ein Heiliger Stein", /*french*/"une Pierre Ancestrale") // /*spanish*/una piedra espiritual }, { CustomMessage("a green stone", /*german*/"ein grüner Stein", /*french*/"une pierre verte"), @@ -1547,18 +1550,18 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_GORON_RUBY] = HintText(CustomMessage("the Goron Ruby", /*german*/"der Goronen-Rubin", /*french*/"le Rubis Goron"), // /*spanish*/el Rubí de los Goron { - CustomMessage("a spiritual stone", /*german*/"ein spiritueller Stein", /*french*/"une Pierre Ancestrale") + CustomMessage("a spiritual stone", /*german*/"ein Heiliger Stein", /*french*/"une Pierre Ancestrale") // /*spanish*/una piedra espiritual }, { CustomMessage("a red stone", /*german*/"ein roter Stein", /*french*/"une pierre rouge"), // /*spanish*/una piedra carmín - CustomMessage("sworn brotherhood", /*german*/"verschworene Bruderschaft", /*french*/"un serment de fraternité")}); + CustomMessage("sworn brotherhood", /*german*/"die geschworene Bruderschaft", /*french*/"un serment de fraternité")}); // /*spanish*/el juramento de hermanos de sangre hintTextTable[RHT_ZORA_SAPPHIRE] = HintText(CustomMessage("the Zora Sapphire", /*german*/"der Zora-Saphir", /*french*/"le Saphir Zora"), // /*spanish*/el Zafiro de los Zora { - CustomMessage("a spiritual stone", /*german*/"ein spiritueller Stein", /*french*/"une Pierre Ancestrale") + CustomMessage("a spiritual stone", /*german*/"ein Heiliger Stein", /*french*/"une Pierre Ancestrale") // /*spanish*/una piedra espiritual }, { CustomMessage("a blue stone", /*german*/"ein blauer Stein", /*french*/"une pierre bleue"), @@ -1566,7 +1569,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("an engagement gift", /*german*/"ein Verlobungsgeschenk", /*french*/"un cadeau de mariage")}); // /*spanish*/un regalo de compromiso - hintTextTable[RHT_FOREST_MEDALLION] = HintText(CustomMessage("the Forest Medallion", /*german*/"Amulett des Waldes", /*french*/"le Médaillon de la Forêt"), + hintTextTable[RHT_FOREST_MEDALLION] = HintText(CustomMessage("the Forest Medallion", /*german*/"das Amulett des Waldes", /*french*/"le Médaillon de la Forêt"), // /*spanish*/el Medallón del Bosque { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un médaillon") @@ -1577,7 +1580,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("Saria's friendship", /*german*/"Salias Freundschaft", /*french*/"l'amitié de Saria")}); // /*spanish*/la amistad de Saria - hintTextTable[RHT_FIRE_MEDALLION] = HintText(CustomMessage("the Fire Medallion", /*german*/"Amulett des Feuers", /*french*/"le Médaillon du Feu"), + hintTextTable[RHT_FIRE_MEDALLION] = HintText(CustomMessage("the Fire Medallion", /*german*/"das Amulett des Feuers", /*french*/"le Médaillon du Feu"), // /*spanish*/el Medallón del Fuego { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un médaillon") @@ -1588,7 +1591,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("Darunia's power", /*german*/"Darunias Kraft", /*french*/"la fraternité de Darunia")}); // /*spanish*/la fraternidad de Darunia - hintTextTable[RHT_WATER_MEDALLION] = HintText(CustomMessage("the Water Medallion", /*german*/"Amulett des Wassers", /*french*/"le Médaillon de l'Eau"), + hintTextTable[RHT_WATER_MEDALLION] = HintText(CustomMessage("the Water Medallion", /*german*/"das Amulett des Wassers", /*french*/"le Médaillon de l'Eau"), // /*spanish*/el Medallón del Agua { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un médaillon") @@ -1596,21 +1599,21 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a blue coin", /*german*/"eine blaue Münze", /*french*/"une pièce bleue"), // /*spanish*/una moneda zafiro - CustomMessage("Ruto's power", /*german*/"Rutos Macht", /*french*/"l'amour de Ruto")}); + CustomMessage("Ruto's power", /*german*/"Rutos Liebe", /*french*/"l'amour de Ruto")}); // /*spanish*/el amor de Ruto - hintTextTable[RHT_SPIRIT_MEDALLION] = HintText(CustomMessage("the Spirit Medallion", /*german*/"Amulett der Geister", /*french*/"le Médaillon de l'Esprit"), + hintTextTable[RHT_SPIRIT_MEDALLION] = HintText(CustomMessage("the Spirit Medallion", /*german*/"das Amulett der Geister", /*french*/"le Médaillon de l'Esprit"), // /*spanish*/el Medallón del Espíritu { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un médaillon") // /*spanish*/un medallón }, { - CustomMessage("an orange coin", /*german*/"eine orange Münze", /*french*/"une pièce orange"), + CustomMessage("an orange coin", /*german*/"eine orangene Münze", /*french*/"une pièce orange"), // /*spanish*/una moneda ámbar - CustomMessage("Nabooru's power", /*german*/"Naborus Macht", /*french*/"le respect de Nabooru")}); + CustomMessage("Nabooru's power", /*german*/"Naborus Respekt", /*french*/"le respect de Nabooru")}); // /*spanish*/el respeto de Nabooru - hintTextTable[RHT_SHADOW_MEDALLION] = HintText(CustomMessage("the Shadow Medallion", /*german*/"Amulett des Schattens", /*french*/"le Médaillon de l'Ombre"), + hintTextTable[RHT_SHADOW_MEDALLION] = HintText(CustomMessage("the Shadow Medallion", /*german*/"das Amulett des Schattens", /*french*/"le Médaillon de l'Ombre"), // /*spanish*/el Medallón de la Sombra { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un médaillon") @@ -1618,10 +1621,10 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a purple coin", /*german*/"eine violette Münze", /*french*/"une pièce pourpre"), // /*spanish*/una moneda malva - CustomMessage("Impa's power", /*german*/"Impas Macht", /*french*/"la confiance d'Impa")}); + CustomMessage("Impa's power", /*german*/"Impas Vertrauen", /*french*/"la confiance d'Impa")}); // /*spanish*/la confianza de Impa - hintTextTable[RHT_LIGHT_MEDALLION] = HintText(CustomMessage("the Light Medallion", /*german*/"Amulett des Lichts", /*french*/"le Médaillon de la Lumière"), + hintTextTable[RHT_LIGHT_MEDALLION] = HintText(CustomMessage("the Light Medallion", /*german*/"das Amulett des Lichts", /*french*/"le Médaillon de la Lumière"), // /*spanish*/el Medallón de la Luz { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un médaillon") @@ -1629,7 +1632,7 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a yellow coin", /*german*/"eine gelbe Münze", /*french*/"une pièce jaune"), // /*spanish*/una moneda resplandeciente - CustomMessage("Rauru's power", /*german*/"Raurus Macht", /*french*/"la foi de Rauru")}); + CustomMessage("Rauru's power", /*german*/"Raurus Glaube", /*french*/"la foi de Rauru")}); // /*spanish*/la fe de Rauru hintTextTable[RHT_RECOVERY_HEART] = HintText(CustomMessage("a Recovery Heart", /*german*/"ein Herz", /*french*/"un coeur de vie"), @@ -1648,7 +1651,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_GREEN_RUPEE] = HintText(CustomMessage("a Green Rupee", /*german*/"ein grüner Rubin", /*french*/"un rubis vert"), // /*spanish*/una rupia verde { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantité de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantité de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("a unique coin", /*german*/"eine einzigartige Münze", /*french*/"un rubis bien mérité"), @@ -1672,7 +1675,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_BLUE_RUPEE] = HintText(CustomMessage("a Blue Rupee", /*german*/"ein blauer Rubin", /*french*/"un rubis bleu"), // /*spanish*/una rupia azul { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantité de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantité de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("a common coin", /*german*/"eine gewöhnliche Münze", /*french*/"quelques sous"), @@ -1683,7 +1686,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_RED_RUPEE] = HintText(CustomMessage("a Red Rupee", /*german*/"ein roter Rubin", /*french*/"un rubis rouge"), // /*spanish*/una rupia roja { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantité de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantité de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("couch cash", /*german*/"ein wenig Zaster", /*french*/"un peu de fric"), @@ -1694,7 +1697,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_PURPLE_RUPEE] = HintText(CustomMessage("a Purple Rupee", /*german*/"ein violetter Rubin", /*french*/"un rubis pourpre"), // /*spanish*/una rupia morada { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantité de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantité de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("big bucks", /*german*/"ordentlich Zaster", /*french*/"plein de fric"), @@ -1704,19 +1707,19 @@ void StaticData::HintTable_Init_Item() { CustomMessage("wealth", /*german*/"Wohlstand", /*french*/"la richesse")}); // /*spanish*/una buena riqueza - hintTextTable[RHT_HUGE_RUPEE] = HintText(CustomMessage("a Huge Rupee", /*german*/"ein riesiger Rubin", /*french*/"un énorme rubis"), + hintTextTable[RHT_HUGE_RUPEE] = HintText(CustomMessage("a Huge Rupee", /*german*/"ein goldener Rubin", /*french*/"un énorme rubis"), // /*spanish*/una rupia gigante { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantité de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantité de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("a juicy jackpot", /*german*/"ein saftiger Jackpot", /*french*/"le jackpot"), // /*spanish*/el premio gordo - CustomMessage("a yellow gem", /*german*/"ein gelber Edelstein", /*french*/"un joyau doré"), + CustomMessage("a yellow gem", /*german*/"ein goldener Edelstein", /*french*/"un joyau doré"), // /*spanish*/una gema amarilla CustomMessage("a giant gem", /*german*/"ein riesiger Edelstein", /*french*/"un gros joyau"), // /*spanish*/una gema descomunal - CustomMessage("great wealth", /*german*/"großer Wohlstand", /*french*/"l'aisance financière")}); + CustomMessage("great wealth", /*german*/"Reichtum", /*french*/"l'aisance financière")}); // /*spanish*/dinero a caudales hintTextTable[RHT_PIECE_OF_HEART] = HintText(CustomMessage("a Piece of Heart", /*german*/"ein Herzteil", /*french*/"un Quart de Coeur"), @@ -1748,170 +1751,170 @@ void StaticData::HintTable_Init_Item() { { CustomMessage("a Great Fairy's power", /*german*/"eine Kraft einer großen Fee", /*french*/"le pouvoir d'une grande fée"), // /*spanish*/el poder de una Gran Hada - CustomMessage("a magic arrow", /*german*/"ein magischer Pfeil", /*french*/"une flèche magique"), + CustomMessage("a magic arrow", /*german*/"magische Pfeile€", /*french*/"une flèche magique"), // /*spanish*/una flecha mágica CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un médaillon"), // /*spanish*/un medallón - CustomMessage("a spiritual stone", /*german*/"ein spiritueller Stein", /*french*/"une Pierre Ancestrale"), + CustomMessage("a spiritual stone", /*german*/"ein Heiliger Stein", /*french*/"une Pierre Ancestrale"), // /*spanish*/una piedra espiritual - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum Betäuben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("a gift from Ganon", /*german*/"ein Geschenk von Ganon", /*french*/"un cadeau de Ganon"), + CustomMessage("a gift from Ganon", /*german*/"ein Geschenk Ganons", /*french*/"un cadeau de Ganon"), // /*spanish*/un regalo de Ganon - CustomMessage("a chilling discovery", /*german*/"eine fröstelnde Entdeckung", /*french*/"une frissonante découverte"), + CustomMessage("a chilling discovery", /*german*/"eine kühle Entdeckung", /*french*/"une frissonante découverte"), // /*spanish*/un escalofriante hallazgo CustomMessage("frosty fun", /*german*/"frostiger Spaß", /*french*/"une engelure")}); // /*spanish*/una gélida diversión - hintTextTable[RHT_BOMBS_5] = HintText(CustomMessage("Bombs (5 pieces)", /*german*/"Bomben (5 Stück)", /*french*/"une demi-dizaine de bombes"), + hintTextTable[RHT_BOMBS_5] = HintText(CustomMessage("Bombs (5 pieces)", /*german*/"Bomben (5 Stück)€", /*french*/"une demi-dizaine de bombes"), // /*spanish*/unas (5) bombas { - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montón de explosivos }, { - CustomMessage("a few explosives", /*german*/"ein paar Explosivbehälter", /*french*/"une poignée de pétards"), + CustomMessage("a few explosives", /*german*/"wenig Explosives", /*french*/"une poignée de pétards"), // /*spanish*/un par de explosivos - CustomMessage("a few blast balls", /*german*/"ein paar Explosionsbälle", /*french*/"une poignée de boules bleues")}); + CustomMessage("a few blast balls", /*german*/"ein paar Explosionskugeln€", /*french*/"une poignée de boules bleues")}); // /*spanish*/un par de estallidos - hintTextTable[RHT_BOMBS_10] = HintText(CustomMessage("Bombs (10 pieces)", /*german*/"Bomben (10 Stück)", /*french*/"une dizaine de bombes"), + hintTextTable[RHT_BOMBS_10] = HintText(CustomMessage("Bombs (10 pieces)", /*german*/"Bomben (10 Stück)€", /*french*/"une dizaine de bombes"), // /*spanish*/unas (10) bombas { - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montón de explosivos }, { - CustomMessage("some explosives", /*german*/"einige Explosivbehälter", /*french*/"un paquet de pétards"), + CustomMessage("some explosives", /*german*/"etwas Explosives", /*french*/"un paquet de pétards"), // /*spanish*/unos cuantos explosivos - CustomMessage("some blast balls", /*german*/"einige Explosionsbälle", /*french*/"un paquet de boules bleues")}); + CustomMessage("some blast balls", /*german*/"einige Explosionskugeln€", /*french*/"un paquet de boules bleues")}); // /*spanish*/unos cuantos estallidos - hintTextTable[RHT_BOMBS_20] = HintText(CustomMessage("Bombs (20 pieces)", /*german*/"Bomben (20 Stück)", /*french*/"une vingtaine de bombes"), + hintTextTable[RHT_BOMBS_20] = HintText(CustomMessage("Bombs (20 pieces)", /*german*/"Bomben (20 Stück)€", /*french*/"une vingtaine de bombes"), // /*spanish*/unas (20) bombas { - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montón de explosivos }, { - CustomMessage("lots-o-explosives", /*german*/"viele Explosivbehälter", /*french*/"une abondance de pétards"), + CustomMessage("lots-o-explosives", /*german*/"viel Explosives", /*french*/"une abondance de pétards"), // /*spanish*/un puñado de explosivos - CustomMessage("plenty of blast balls", /*german*/"viele Explosionsbälle", /*french*/"une abondance de boules bleues")}); + CustomMessage("plenty of blast balls", /*german*/"viele Explosionskugeln€", /*french*/"une abondance de boules bleues")}); // /*spanish*/bastantes estallidos - hintTextTable[RHT_BOMBCHUS_5] = HintText(CustomMessage("Bombchus (5 pieces)", /*german*/"Krabbelminen (5 Stück)", /*french*/"une demi-dizaine de Missiles"), + hintTextTable[RHT_BOMBCHUS_5] = HintText(CustomMessage("Bombchus (5 pieces)", /*german*/"Krabbelminen (5 Stück)€", /*french*/"une demi-dizaine de Missiles"), // /*spanish*/unos (5) bombchus { CustomMessage("a prize of the House of Skulltulas", /*german*/"ein Preis des Skulltula-Hauses", /*french*/"un prix de la maison des Skulltulas"), // /*spanish*/un obsequio de la Casa Skulltula - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montón de explosivos }, { - CustomMessage("a few mice bombs", /*german*/"ein paar Mäusebomben", /*french*/"une poignée de mignons explosifs"), + CustomMessage("a few mice bombs", /*german*/"ein paar Mäusebomben€", /*french*/"une poignée de mignons explosifs"), // /*spanish*/un par de bombas roedoras - CustomMessage("a few proximity mice", /*german*/"ein paar Näherungsmäuse", /*french*/"une poignée de jouets à remonter"), + CustomMessage("a few proximity mice", /*german*/"ein paar Näherungsmäuse€", /*french*/"une poignée de jouets à remonter"), // /*spanish*/un par de explosivos ratoncitos - CustomMessage("a few wall crawlers", /*german*/"ein paar Wandkrabbler", /*french*/"une poignée de rapides grimpeurs"), + CustomMessage("a few wall crawlers", /*german*/"ein paar Wandkrabbler€", /*french*/"une poignée de rapides grimpeurs"), // /*spanish*/un par de trepaparedes - CustomMessage("a few trail blazers", /*german*/"ein paar Vorreiter", /*french*/"une poignée de zigzags éclatants")}); + CustomMessage("a few trail blazers", /*german*/"ein paar Vorreiter€", /*french*/"une poignée de zigzags éclatants")}); // /*spanish*/un par de ratas propulsadas - hintTextTable[RHT_BOMBCHUS_10] = HintText(CustomMessage("Bombchus (10 pieces)", /*german*/"Krabbelminen (10 Stück)", /*french*/"une dizaine de Missiles"), + hintTextTable[RHT_BOMBCHUS_10] = HintText(CustomMessage("Bombchus (10 pieces)", /*german*/"Krabbelminen (10 Stück)€", /*french*/"une dizaine de Missiles"), // /*spanish*/unos (10) bombchus { CustomMessage("a prize of the House of Skulltulas", /*german*/"ein Preis des Skulltula-Hauses", /*french*/"un prix de la maison des Skulltulas"), // /*spanish*/un obsequio de la Casa Skulltula - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montón de explosivos }, { - CustomMessage("some mice bombs", /*german*/"einige Mäusebomben", /*french*/"un paquet de mignons explosifs"), + CustomMessage("some mice bombs", /*german*/"einige Mäusebomben€", /*french*/"un paquet de mignons explosifs"), // /*spanish*/unas cuantas bombas roedoras - CustomMessage("some proximity mice", /*german*/"einige Näherungsmäuse", /*french*/"un paquet de jouets à remonter"), + CustomMessage("some proximity mice", /*german*/"einige Näherungsmäuse€", /*french*/"un paquet de jouets à remonter"), // /*spanish*/unos cuantos explosivos ratoncitos - CustomMessage("some wall crawlers", /*german*/"einige Wandkrabbler", /*french*/"un paquet de rapides grimpeurs"), + CustomMessage("some wall crawlers", /*german*/"einige Wandkrabbler€", /*french*/"un paquet de rapides grimpeurs"), // /*spanish*/unos cuantos trepaparedes - CustomMessage("some trail blazers", /*german*/"einige Vorreiter", /*french*/"un paquet de zigzags éclatants")}); + CustomMessage("some trail blazers", /*german*/"einige Vorreiter€", /*french*/"un paquet de zigzags éclatants")}); // /*spanish*/unas cuantas ratas propulsadas - hintTextTable[RHT_BOMBCHUS_20] = HintText(CustomMessage("Bombchus (20 pieces)", /*german*/"Krabbelminen (20 Stück)", /*french*/"une vingtaine de Missiles"), + hintTextTable[RHT_BOMBCHUS_20] = HintText(CustomMessage("Bombchus (20 pieces)", /*german*/"Krabbelminen (20 Stück)€", /*french*/"une vingtaine de Missiles"), // /*spanish*/unos (20) bombchus { CustomMessage("a prize of the House of Skulltulas", /*german*/"ein Preis des Skulltula-Hauses", /*french*/"un prix de la maison des Skulltulas"), // /*spanish*/un obsequio de la Casa Skulltula - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montón de explosivos }, { - CustomMessage("plenty of mice bombs", /*german*/"viele Mäusebomben", /*french*/"une abondance de mignons explosifs"), + CustomMessage("plenty of mice bombs", /*german*/"viele Mäusebomben€", /*french*/"une abondance de mignons explosifs"), // /*spanish*/bastantes bombas roedoras - CustomMessage("plenty of proximity mice", /*german*/"viele Näherungsmäuse", /*french*/"une abondance de jouets à remonter"), + CustomMessage("plenty of proximity mice", /*german*/"viele Näherungsmäuse€", /*french*/"une abondance de jouets à remonter"), // /*spanish*/bastantes explosivos ratoncitos - CustomMessage("plenty of wall crawlers", /*german*/"viele Wandkrabbler", /*french*/"une abondance de rapides grimpeurs"), + CustomMessage("plenty of wall crawlers", /*german*/"viele Wandkrabbler€", /*french*/"une abondance de rapides grimpeurs"), // /*spanish*/bastantes trepaparedes - CustomMessage("plenty of trail blazers", /*german*/"viele Vorreiter", /*french*/"une abondance de zigzags éclatants")}); + CustomMessage("plenty of trail blazers", /*german*/"viele Vorreiter€", /*french*/"une abondance de zigzags éclatants")}); // /*spanish*/bastantes ratas propulsadas - hintTextTable[RHT_ARROWS_5] = HintText(CustomMessage("Arrows (5 pieces)", /*german*/"Pfeile (5 Stück)", /*french*/"une demi-dizaine de flèches"), + hintTextTable[RHT_ARROWS_5] = HintText(CustomMessage("Arrows (5 pieces)", /*german*/"Pfeile (5 Stück)€", /*french*/"une demi-dizaine de flèches"), // /*spanish*/unas (5) flechas { CustomMessage("a projectile", /*german*/"ein Projektil", /*french*/"un projectile") // /*spanish*/un proyectil }, { - CustomMessage("a few danger darts", /*german*/"ein paar gefährliche Spitzen", /*french*/"une poignée d'obus"), + CustomMessage("a few danger darts", /*german*/"ein paar gefährliche Spitzen€", /*french*/"une poignée d'obus"), // /*spanish*/un par de peligrosos dardos - CustomMessage("a few sharp shafts", /*german*/"ein paar scharfe Stifte", /*french*/"une poignée de piquets")}); + CustomMessage("a few sharp shafts", /*german*/"ein paar scharfe Stifte€", /*french*/"une poignée de piquets")}); // /*spanish*/un par de puntas afiladas - hintTextTable[RHT_ARROWS_10] = HintText(CustomMessage("Arrows (10 pieces)", /*german*/"Pfeile (10 Stück)", /*french*/"une dizaine de flèches"), + hintTextTable[RHT_ARROWS_10] = HintText(CustomMessage("Arrows (10 pieces)", /*german*/"Pfeile (10 Stück)€", /*french*/"une dizaine de flèches"), // /*spanish*/unas (10) flechas { CustomMessage("a projectile", /*german*/"ein Projektil", /*french*/"un projectile") // /*spanish*/un proyectil }, { - CustomMessage("some danger darts", /*german*/"einige gefährliche Spitzen", /*french*/"un paquet d'obus"), + CustomMessage("some danger darts", /*german*/"einige gefährliche Spitzen€", /*french*/"un paquet d'obus"), // /*spanish*/unos cuantos peligrosos dardos - CustomMessage("some sharp shafts", /*german*/"einige scharfe Stifte", /*french*/"un paquet de piquets")}); + CustomMessage("some sharp shafts", /*german*/"einige scharfe Stifte€", /*french*/"un paquet de piquets")}); // /*spanish*/unas cuantas puntas afiladas - hintTextTable[RHT_ARROWS_30] = HintText(CustomMessage("Arrows (30 pieces)", /*german*/"Pfeile (30 Stück)", /*french*/"une trentaine de flèches"), + hintTextTable[RHT_ARROWS_30] = HintText(CustomMessage("Arrows (30 pieces)", /*german*/"Pfeile (30 Stück)€", /*french*/"une trentaine de flèches"), // /*spanish*/unas (30) flechas { CustomMessage("a projectile", /*german*/"ein Projektil", /*french*/"un projectile") // /*spanish*/un proyectil }, { - CustomMessage("plenty of danger darts", /*german*/"viele gefährliche Spitzen", /*french*/"une abondance d'obus"), + CustomMessage("plenty of danger darts", /*german*/"viele gefährliche Spitzen€", /*french*/"une abondance d'obus"), // /*spanish*/bastantes peligrosos dardos - CustomMessage("plenty of sharp shafts", /*german*/"viele scharfe Stifte", /*french*/"une abondance de piquets")}); + CustomMessage("plenty of sharp shafts", /*german*/"viele scharfe Stifte€", /*french*/"une abondance de piquets")}); // /*spanish*/bastantes puntas afiladas - hintTextTable[RHT_DEKU_NUTS_5] = HintText(CustomMessage("Deku Nuts (5 pieces)", /*german*/"Deku-Nüsse (5 Stück)", /*french*/"une demi-dizaine de noix Mojo"), + hintTextTable[RHT_DEKU_NUTS_5] = HintText(CustomMessage("Deku Nuts (5 pieces)", /*german*/"Deku-Nüsse (5 Stück)€", /*french*/"une demi-dizaine de noix Mojo"), // /*spanish*/unas (5) nueces deku { - CustomMessage("some Deku munitions", /*german*/"ein wenig Deku-Munition", /*french*/"un paquet de munitions Mojo"), + CustomMessage("some Deku munitions", /*german*/"etwas Deku-Munition", /*french*/"un paquet de munitions Mojo"), // /*spanish*/un montón de municiones Deku - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum Betäuben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("some nuts", /*german*/"ein paar Nüsse", /*french*/"une poignée de noisettes"), + CustomMessage("some nuts", /*german*/"ein paar Nüsse€", /*french*/"une poignée de noisettes"), // /*spanish*/un par de nueces - CustomMessage("some flashbangs", /*german*/"ein paar Blendgranaten", /*french*/"une poignée d'éclats"), + CustomMessage("some flashbangs", /*german*/"ein paar Blendgranaten€", /*french*/"une poignée d'éclats"), // /*spanish*/un par de semillas aturdidoras - CustomMessage("some scrub spit", /*german*/"ein wenig Buschspucke", /*french*/"une poignée de crachats Mojo")}); + CustomMessage("some scrub spit", /*german*/"etwas Deku-Spucke€", /*french*/"une poignée de crachats Mojo")}); // /*spanish*/un par de escupitajos deku - hintTextTable[RHT_DEKU_NUTS_10] = HintText(CustomMessage("Deku Nuts (10 pieces)", /*german*/"Deku-Nüsse (10 Stück)", /*french*/"une dizaine de noix Mojo"), + hintTextTable[RHT_DEKU_NUTS_10] = HintText(CustomMessage("Deku Nuts (10 pieces)", /*german*/"Deku-Nüsse (10 Stück)€", /*french*/"une dizaine de noix Mojo"), // /*spanish*/unas (10) nueces deku { CustomMessage("some Deku munitions", /*german*/"etwas Deku-Munition", /*french*/"un paquet de munitions Mojo"), // /*spanish*/un montón de municiones Deku - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum Betäuben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("lots-o-nuts", /*german*/"einige Nüsse", /*french*/"un paquet de noisettes"), + CustomMessage("lots-o-nuts", /*german*/"einige Nüsse€", /*french*/"un paquet de noisettes"), // /*spanish*/un puñado de nueces - CustomMessage("plenty of flashbangs", /*german*/"einige Blendgranaten", /*french*/"un paquet d'éclats"), + CustomMessage("plenty of flashbangs", /*german*/"einige Blendgranaten€", /*french*/"un paquet d'éclats"), // /*spanish*/unas cuantas semillas aturdidoras - CustomMessage("plenty of scrub spit", /*german*/"einige Buschspucke", /*french*/"un paquet de crachats Mojo")}); + CustomMessage("plenty of scrub spit", /*german*/"einiges an Deku-Spucke€", /*french*/"un paquet de crachats Mojo")}); // /*spanish*/unos cuantos escupitajos deku - hintTextTable[RHT_DEKU_SEEDS_30] = HintText(CustomMessage("Deku Seeds (30 pieces)", /*german*/"Deku-Samen (30 Stück)", /*french*/"une trentaine de graines Mojo"), + hintTextTable[RHT_DEKU_SEEDS_30] = HintText(CustomMessage("Deku Seeds (30 pieces)", /*german*/"Deku-Kerne (30 Stück)€", /*french*/"une trentaine de graines Mojo"), // /*spanish*/unas (30) semillas deku { CustomMessage("a projectile", /*german*/"ein Projektil", /*french*/"un projectile"), @@ -1921,13 +1924,13 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("catapult ammo", /*german*/"Katapultmunition", /*french*/"un paquet de délicieuses munitions"), // /*spanish*/un par de munición infantil - CustomMessage("lots-o-seeds", /*german*/"viele Samen", /*french*/"un paquet de germes séchés")}); + CustomMessage("lots-o-seeds", /*german*/"viele Kerne€", /*french*/"un paquet de germes séchés")}); // /*spanish*/un puñado de semillas hintTextTable[RHT_DEKU_STICK_1] = HintText(CustomMessage("a Deku Stick", /*german*/"ein Deku-Stab", /*french*/"un bâton Mojo"), // /*spanish*/un palo deku { - CustomMessage("some Deku munitions", /*german*/"ein wenig Deku-Munition", /*french*/"un paquet de munitions Mojo") + CustomMessage("some Deku munitions", /*german*/"etwas Deku-Munition", /*french*/"un paquet de munitions Mojo") // /*spanish*/un montón de municiones Deku }, { CustomMessage("a breakable branch", /*german*/"ein brüchiger Zweig", /*french*/"un bout de bois")}); @@ -1945,87 +1948,87 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_TREASURE_GAME_GREEN_RUPEE] = HintText(CustomMessage("a Green Rupee", /*german*/"ein grüner Rubin", /*french*/"un rubis vert"), // /*spanish*/una rupia verde { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantité de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantité de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("the dollar of defeat", /*german*/"der Rubin der Niederlage", /*french*/"le rubis de la défaite")}); // /*spanish*/el peso de la derrota - hintTextTable[RHT_TRIFORCE_PIECE] = HintText(CustomMessage("a Piece of the Triforce", /*german*/"ein Triforce-Fragment", /*french*/"un fragment de la Triforce"), + hintTextTable[RHT_TRIFORCE_PIECE] = HintText(CustomMessage("a Piece of the Triforce", /*german*/"ein Triforce-Splitter", /*french*/"un fragment de la Triforce"), // /*spanish*/un fragmento de la Trifuerza {}, { CustomMessage("a triumph fork", /*german*/"ein Dreieck des Triumphs", /*french*/"la Tribosse"), // /*spanish*/un trígono del triunfo CustomMessage("cheese", /*german*/"Käse", /*french*/"du fromage"), // /*spanish*/un porción de queso - CustomMessage("a gold fragment", /*german*/"ein goldenes Fragment", /*french*/"un fragment d'or")}); + CustomMessage("a gold fragment", /*german*/"ein Goldfragment", /*french*/"un fragment d'or")}); // /*spanish*/un fragmento dorado - hintTextTable[RHT_GOHMA_SOUL] = HintText(CustomMessage("the soul of Gohma", /*german*/"die Seele Gohmas", /*french*/""), + hintTextTable[RHT_GOHMA_SOUL] = HintText(CustomMessage("the soul of Gohma", /*german*/"Gohmas Seele", /*french*/"l'Âme de Gohma"), { - CustomMessage("something webbed", /*german*/"etwas Verwobenes", /*french*/"") + CustomMessage("something webbed", /*german*/"etwas Verwobenes", /*french*/"un truc entoilé") }, { - CustomMessage("an invasive soul", /*german*/"eine invasive Seele", /*french*/""), - CustomMessage("some spider essence", /*german*/"etwas spinnenartige Essenz", /*french*/"")}); + CustomMessage("an invasive soul", /*german*/"eine parasitäre Seele", /*french*/"une âme invasive"), + CustomMessage("some spider essence", /*german*/"etwas spinnenartige Essenz", /*french*/"une essence d'araignée")}); - hintTextTable[RHT_KING_DODONGO_SOUL] = HintText(CustomMessage("the soul of King Dodongo", /*german*/"die Seele König Dodongos", /*french*/""), + hintTextTable[RHT_KING_DODONGO_SOUL] = HintText(CustomMessage("the soul of King Dodongo", /*german*/"König Dodongos Seele", /*french*/"l'Âme du Roi Dodongo"), { - CustomMessage("something explosive", /*german*/"etwas Explosives", /*french*/"") + CustomMessage("something explosive", /*german*/"etwas Explosives", /*french*/"un truc détonnant") }, { - CustomMessage("a royal soul", /*german*/"eine royale Seele", /*french*/""), - CustomMessage("some reptile essence", /*german*/"etwas reptilienartige Essenz", /*french*/"")}); + CustomMessage("a royal soul", /*german*/"eine königliche Seele", /*french*/"une âme royale"), + CustomMessage("some reptile essence", /*german*/"etwas reptilienartige Essenz", /*french*/"une essence de reptile")}); - hintTextTable[RHT_BARINADE_SOUL] = HintText(CustomMessage("the soul of Barinade", /*german*/"die Seele Barinades", /*french*/""), + hintTextTable[RHT_BARINADE_SOUL] = HintText(CustomMessage("the soul of Barinade", /*german*/"Barinades Seele", /*french*/"l'Âme de Barinade"), { - CustomMessage("something fishy", /*german*/"etwas Fischiges", /*french*/"") + CustomMessage("something fishy", /*german*/"etwas Fischiges", /*french*/"un truc gluant") }, { - CustomMessage("an infectuous soul", /*german*/"eine infektiöse Seele", /*french*/""), - CustomMessage("some parasitic essence", /*german*/"etwas parasitäre Essenz", /*french*/"")}); + CustomMessage("an infectuous soul", /*german*/"eine infektiöse Seele", /*french*/"une âme infectieuse"), + CustomMessage("some parasitic essence", /*german*/"etwas elektrische Essenz", /*french*/"une essence parasitique")}); - hintTextTable[RHT_PHANTOM_GANON_SOUL] = HintText(CustomMessage("the soul of Phantom Ganon", /*german*/"die Seele Phantom-Ganons", /*french*/""), + hintTextTable[RHT_PHANTOM_GANON_SOUL] = HintText(CustomMessage("the soul of Phantom Ganon", /*german*/"Phantom-Ganons Seele", /*french*/"l'Âme de Ganon Spectral"), { - CustomMessage("something spectral", /*german*/"etwas Spektrales", /*french*/"") + CustomMessage("something spectral", /*german*/"etwas Spektrales", /*french*/"un truc spectral") }, { - CustomMessage("a duplicate soul", /*german*/"eine duplizierte Seele", /*french*/""), + CustomMessage("a duplicate soul", /*german*/"eine duplizierte Seele", /*french*/"une âme clonée"), - CustomMessage("some illusionary essence", /*german*/"etwas illusionäre Essenz", /*french*/"")}); + CustomMessage("some illusionary essence", /*german*/"etwas illusionäre Essenz", /*french*/"une essence illusoire")}); - hintTextTable[RHT_VOLVAGIA_SOUL] = HintText(CustomMessage("the soul of Volvagia", /*german*/"die Seele Volvagias", /*french*/""), + hintTextTable[RHT_VOLVAGIA_SOUL] = HintText(CustomMessage("the soul of Volvagia", /*german*/"Volvagias Seele", /*french*/"l'Âme de Volcania"), { - CustomMessage("something hot", /*german*/"etwas Heißes", /*french*/"") + CustomMessage("something hot", /*german*/"etwas Heißes", /*french*/"quelque chose de très chaud") }, { - CustomMessage("a draconic soul", /*german*/"eine drakonische Seele", /*french*/""), - CustomMessage("some magmatic essence", /*german*/"etwas magmatische Essenz", /*french*/"")}); + CustomMessage("a draconic soul", /*german*/"eine drakonische Seele", /*french*/"une essence draconique"), + CustomMessage("some magmatic essence", /*german*/"etwas magmatische Essenz", /*french*/"une essence magmatique")}); - hintTextTable[RHT_MORPHA_SOUL] = HintText(CustomMessage("the soul of Morpha", /*german*/"die Seele Morphas", /*french*/""), + hintTextTable[RHT_MORPHA_SOUL] = HintText(CustomMessage("the soul of Morpha", /*german*/"Morphas Seele", /*french*/"l'Âme de Morpha"), { - CustomMessage("something wet", /*german*/"etwas Nasses", /*french*/"") + CustomMessage("something wet", /*german*/"etwas Nasses", /*french*/"un truc mouillé") }, { - CustomMessage("an aquatic soul", /*german*/"eine aquatische Seele", /*french*/""), - CustomMessage("some liquid essence", /*german*/"etwas flüssige Essenz", /*french*/"")}); + CustomMessage("an aquatic soul", /*german*/"eine aquatische Seele", /*french*/"une âme aquatique"), + CustomMessage("some liquid essence", /*german*/"etwas flüssige Essenz", /*french*/"une essence liquide")}); - hintTextTable[RHT_BONGO_BONGO_SOUL] = HintText(CustomMessage("the soul of Bongo Bongo", /*german*/"die Seele Bongo Bongos", /*french*/""), + hintTextTable[RHT_BONGO_BONGO_SOUL] = HintText(CustomMessage("the soul of Bongo Bongo", /*german*/"Bongo Bongos Seele", /*french*/"l'Âme de Bongo Bongo"), { - CustomMessage("something dark", /*german*/"etwas Dunkles", /*french*/"") + CustomMessage("something dark", /*german*/"etwas Dunkles", /*french*/"quelque chose de sombre") }, { - CustomMessage("a shadowy soul", /*german*/"eine schattige Seele", /*french*/""), - CustomMessage("some handy essence", /*german*/"etwas praktische Essenz", /*french*/"")}); + CustomMessage("a shadowy soul", /*german*/"eine schattige Seele", /*french*/"une âme ténébreuse"), + CustomMessage("some handy essence", /*german*/"etwas bestialische Essenz", /*french*/"l'âme du tape m'en cinq")}); - hintTextTable[RHT_TWINROVA_SOUL] = HintText(CustomMessage("the soul of Twinrova", /*german*/"die Seele Twinrovas", /*french*/""), + hintTextTable[RHT_TWINROVA_SOUL] = HintText(CustomMessage("the soul of Twinrova", /*german*/"Twinrovas Seele", /*french*/"l'Âme du Duo Maléfique"), { - CustomMessage("something spiritual", /*german*/"etwas Spirituelles", /*french*/"") + CustomMessage("something spiritual", /*german*/"etwas Geisterhaftes", /*french*/"un truc spirituel") }, { - CustomMessage("old souls", /*german*/"alte Seelen", /*french*/""), - CustomMessage("twin essences", /*german*/"Zwillingsessenzen", /*french*/"")}); + CustomMessage("old souls", /*german*/"alte Seelen", /*french*/"deux vieilles âmes"), + CustomMessage("twin essences", /*german*/"Zwillingsessenzen€", /*french*/"des essences jumelles")}); - hintTextTable[RHT_GANON_SOUL] = HintText(CustomMessage("the soul of Ganon", /*german*/"die Seele Ganons", /*french*/""), + hintTextTable[RHT_GANON_SOUL] = HintText(CustomMessage("the soul of Ganon", /*german*/"Ganons Seele", /*french*/"l'Âme de Ganon"), { - CustomMessage("something strong", /*german*/"etwas Starkes", /*french*/"") + CustomMessage("something strong", /*german*/"etwas Starkes", /*french*/"un truc de fort") }, { - CustomMessage("an evil soul", /*german*/"eine böse Seele", /*french*/""), - CustomMessage("some powerful essence", /*german*/"etwas mächtige Essenz", /*french*/"")}); + CustomMessage("an evil soul", /*german*/"eine böse Seele", /*french*/"une âme maléfique"), + CustomMessage("some powerful essence", /*german*/"etwas mächtige Essenz", /*french*/"une essence incroyablement puissante")}); - hintTextTable[RHT_OCARINA_A_BUTTON] = HintText(CustomMessage("an Ocarina A Button", /*german*/"eine Okarina A Taste", /*french*/"la Touche A de l'Ocarina"), + hintTextTable[RHT_OCARINA_A_BUTTON] = HintText(CustomMessage("an Ocarina A Button", /*german*/"die A-Taste der Okarina", /*french*/"la Touche A de l'Ocarina"), // /*spanish*/un botón A de Ocarina { CustomMessage("something melodic", /*german*/"etwas Melodisches", /*french*/"quelque chose de mélodieux") @@ -2034,7 +2037,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a musical letter", /*german*/"ein musikalischer Brief", /*french*/"une lettre musicale")}); // /*spanish*/una letra musical - hintTextTable[RHT_OCARINA_C_UP_BUTTON] = HintText(CustomMessage("an Ocarina C Up Button", /*german*/"eine Okarina C-Oben Taste", /*french*/"la Touche C-Haut de l'Ocarina"), + hintTextTable[RHT_OCARINA_C_UP_BUTTON] = HintText(CustomMessage("an Ocarina C Up Button", /*german*/"die C-Oben-Taste der Okarina", /*french*/"la Touche C-Haut de l'Ocarina"), // /*spanish*/un botón C superior de Ocarina { CustomMessage("something melodic", /*german*/"etwas Melodisches", /*french*/"quelque chose de mélodieux") @@ -2043,7 +2046,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a high tone", /*german*/"ein hoher Ton", /*french*/"une tonalité élevée")}); // /*spanish*/un tono alto - hintTextTable[RHT_OCARINA_C_DOWN_BUTTON] = HintText(CustomMessage("an Ocarina C Down Button", /*german*/"eine Okarina C-Unten Taste", /*french*/"la Touche C-Bas de l'Ocarina"), + hintTextTable[RHT_OCARINA_C_DOWN_BUTTON] = HintText(CustomMessage("an Ocarina C Down Button", /*german*/"die C-Unten-Taste der Okarina", /*french*/"la Touche C-Bas de l'Ocarina"), // /*spanish*/un botón C inferior de Ocarina { CustomMessage("something melodic", /*german*/"etwas Melodisches", /*french*/"quelque chose de mélodieux") @@ -2052,7 +2055,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a low tone", /*german*/"ein tiefer Ton", /*french*/"une tonalité basse")}); // /*spanish*/un tono bajo - hintTextTable[RHT_OCARINA_C_LEFT_BUTTON] = HintText(CustomMessage("an Ocarina C Left Button", /*german*/"eine Okarina C-Links Taste", /*french*/"la Touche C-Gauche de l'Ocarina"), + hintTextTable[RHT_OCARINA_C_LEFT_BUTTON] = HintText(CustomMessage("an Ocarina C Left Button", /*german*/"die C-Links-Taste der Okarina", /*french*/"la Touche C-Gauche de l'Ocarina"), // /*spanish*/un botón C izquierdo de Ocarina { CustomMessage("something melodic", /*german*/"etwas Melodisches", /*french*/"quelque chose de mélodieux") @@ -2061,7 +2064,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a leftward tone", /*german*/"ein linksseitiger Ton", /*french*/"une tonalité vers la gauche")}); // /*spanish*/un tono hacia la izquierda - hintTextTable[RHT_OCARINA_C_RIGHT_BUTTON] = HintText(CustomMessage("an Ocarina C Right Button", /*german*/"eine Okarina C-Rechts Taste", /*french*/"la Touche C-Droit de l'Ocarina"), + hintTextTable[RHT_OCARINA_C_RIGHT_BUTTON] = HintText(CustomMessage("an Ocarina C Right Button", /*german*/"die C-Rechts-Taste der Okarina", /*french*/"la Touche C-Droit de l'Ocarina"), // /*spanish*/un botón C derecho de Ocarina { CustomMessage("something melodic", /*german*/"etwas Melodisches", /*french*/"quelque chose de mélodieux") @@ -2070,25 +2073,25 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a rightward tone", /*german*/"ein rechtsseitiger Ton", /*french*/"une tonalité vers la droite")}); // /*spanish*/un tono hacia la derecha - hintTextTable[RHT_FISHING_POLE] = HintText(CustomMessage("a fishing pole", /*german*/"eine Angelrute", /*french*/"canne à pêche"), + hintTextTable[RHT_FISHING_POLE] = HintText(CustomMessage("a fishing pole", /*german*/"eine Angelrute", /*french*/"une canne à pêche"), // /*spanish*/caña de pescar { - CustomMessage("the pond owner's property", /*german*/"der Besitz des Teicheigners", /*french*/"(canne à pêche)") + CustomMessage("the pond owner's property", /*german*/"das Eigentum des Fischweiherbesitzers", /*french*/"(un truc qui appartient au propriétaire de l'étang)") // /*spanish*/(caña de pescar) }, { - CustomMessage("a fish-puller", /*german*/"ein Fischzieher", /*french*/"(canne à pêche)")}); + CustomMessage("a fish-puller", /*german*/"ein Fischzieher", /*french*/"(un aimant à poisson)")}); // /*spanish*/(caña de pescar) - hintTextTable[RHT_BOMBCHU_BAG] = HintText(CustomMessage("Bombchu Bag", /*german*/"!!!", /*french*/"!!!"), + hintTextTable[RHT_BOMBCHU_BAG] = HintText(CustomMessage("a Bombchu Bag", /*german*/"eine Krabbelminentasche", /*french*/"un Sac de Missiles Teigneux"), { - CustomMessage("explosives", /*german*/"ein Explosivpaket", /*french*/"un paquet d'explosifs"), + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs"), // /*spanish*/un montón de explosivos - CustomMessage("something that can remove boulders", /*german*/"etwas, das Geröll entfernen kann", /*french*/"une chose qui enlève les rochers") + CustomMessage("something that can remove boulders", /*german*/"etwas zum Geröll entfernen", /*french*/"une chose qui enlève les rochers") // /*spanish*/algo que pueda quitar rocas }, { - CustomMessage("sack of mice", /*german*/"!!!", /*french*/"!!!")}); + CustomMessage("sack of mice", /*german*/"ein Sack Mäuse", /*french*/"un Sac rempli de souris")}); - hintTextTable[RHT_SKELETON_KEY] = HintText(CustomMessage("a Skeleton Key", /*german*/ "ein Universalschlüssel", /*french*/ "une Clé Squelette"), + hintTextTable[RHT_SKELETON_KEY] = HintText(CustomMessage("a Skeleton Key", /*german*/ "der Skelettschlüssel", /*french*/ "une Clé Squelette"), // /*spanish*/una Llave Maestra { CustomMessage("a key", /*german*/ "ein Schlüssel", /*french*/ "une clé") @@ -2096,62 +2099,32 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a master unlocker", /*german*/ "ein Meisterentsperrer", /*french*/ "un Kit de Déverrouillage") }); // /*spanish*/un desbloqueador maestro - hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + //RANDOTODO if these are ever used for anything other than name, they want abscure and ambiguous hints + hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("an infinite Quiver", /*german*/"der unendliche Köcher", /*french*/"un Carquois Infini")); - hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("an infinite Bomb Bag", /*german*/"die unendliche Bombentasche", /*french*/"un Sac de Bombe sans fond")); - hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("an infinite Bullet Bag", /*german*/"die unendliche Munitionstasche", /*french*/"un Sac de Graine sans fond")); - hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Sticks", /*german*/"unendliche Deku-Stab-Kapazität", /*french*/"des Bâtons Mojo illimités")); - hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Nuts", /*german*/"unendliche Deku-Nuß-Kapazität", /*french*/"des Noix Mojo illimitées")); - hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("unlimited Magic", /*german*/"unendliche Magische Kraft", /*french*/"de la Magie infinie")); - hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("infinite Bombchus", /*german*/"die unendliche Krabbelminentasche", /*french*/"des Missiles Teigneux illimités")); + + hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("an infinite Wallet", /*german*/"die unendliche Geldbörse", /*french*/"une Bourse sans fond")); hintTextTable[RHT_EPONA] = HintText(CustomMessage("Epona", /*german*/"Epona", /*french*/"Epona"), // /*spanish*/a Epona { CustomMessage("something from Malon", /*german*/"ein Geschenk von Malon", /*french*/"un cadeau de Malon"), // /*spanish*/un obsequio de Malon - CustomMessage("a song sung by frogs", /*german*/"ein von Fröschen gesungenes Lied", /*french*/"une chanson aimée des grenouilles"), + CustomMessage("a song sung by frogs", /*german*/"ein von Fröschen gesungenes Lied,", /*french*/"une chanson aimée des grenouilles"), // /*spanish*/una melodía de ranas - CustomMessage("something to cross a broken bridge", /*german*/"etwas, um eine kaputte Brücke zu überqueren", /*french*/"une chose pour traverser un pont brisé") + CustomMessage("something to cross a broken bridge", /*german*/"etwas um eine kaputte Brücke zu überqueren,", /*french*/"une chose pour traverser un pont brisé") // /*spanish*/algo para cruzar un puente roto }, { CustomMessage("a horse", /*german*/"ein Pferd", /*french*/"un fidèle destrier"), @@ -2163,11 +2136,12 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_HINT_MYSTERIOUS] = HintText(CustomMessage("something mysterious", /*german*/"etwas Mysteriöses", /*french*/"un sacré mystère")); // /*spanish*/algo misterioso - hintTextTable[RHT_MYSTERIOUS_ITEM] = HintText(CustomMessage("mysterious item", /*german*/"mysteriöser Gegenstand", /*french*/"objet mystérieux")); + hintTextTable[RHT_MYSTERIOUS_ITEM] = HintText(CustomMessage("mysterious item", /*german*/"ein mysteriöser Gegenstand", /*french*/"objet mystérieux")); // /*spanish*/algo misterioso - + hintTextTable[RHT_MYSTERIOUS_ITEM_CAPITAL] = HintText(CustomMessage("Mysterious Item", /*german*/"Mysteriöser Gegenstand", /*french*/"Objet Mystérieux")); // /*spanish*/Algo Misterioso + // clang-format on } -} +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index 932b97316b..65cc6eb8c0 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -13,16 +13,11 @@ #include "../hint.h" #include "../static_data.h" - using namespace Rando; -HintDistributionSetting::HintDistributionSetting(std::string _name, - HintType _type, - uint32_t _weight, - uint8_t _fixed, - uint8_t _copies, - std::function _filter, - uint8_t _dungeonLimit){ +HintDistributionSetting::HintDistributionSetting(std::string _name, HintType _type, uint32_t _weight, uint8_t _fixed, + uint8_t _copies, std::function _filter, + uint8_t _dungeonLimit) { name = _name; type = _type; weight = _weight; @@ -30,10 +25,12 @@ HintDistributionSetting::HintDistributionSetting(std::string _name, copies = _copies; filter = _filter; dungeonLimit = _dungeonLimit; - } +} -HintText::HintText(CustomMessage clearText_, std::vector ambiguousText_, std::vector obscureText_) -: clearText(std::move(clearText_)), ambiguousText(std::move(ambiguousText_)), obscureText(std::move(obscureText_)){} +HintText::HintText(CustomMessage clearText_, std::vector ambiguousText_, + std::vector obscureText_) + : clearText(std::move(clearText_)), ambiguousText(std::move(ambiguousText_)), obscureText(std::move(obscureText_)) { +} const CustomMessage& HintText::GetClear() const { return clearText; @@ -43,8 +40,8 @@ const CustomMessage& HintText::GetObscure() const { return obscureText.size() > 0 ? RandomElement(obscureText) : clearText; } -const CustomMessage& HintText::GetObscure(uint8_t selection) const { - if (obscureText.size() > selection){ +const CustomMessage& HintText::GetObscure(size_t selection) const { + if (obscureText.size() > selection) { return obscureText[selection]; } else if (obscureText.size() > 0) { return obscureText[0]; @@ -56,8 +53,8 @@ const CustomMessage& HintText::GetAmbiguous() const { return ambiguousText.size() > 0 ? RandomElement(ambiguousText) : clearText; } -const CustomMessage& HintText::GetAmbiguous(uint8_t selection) const { - if (ambiguousText.size() > selection){ +const CustomMessage& HintText::GetAmbiguous(size_t selection) const { + if (ambiguousText.size() > selection) { return ambiguousText[selection]; } else if (ambiguousText.size() > 0) { return ambiguousText[0]; @@ -65,15 +62,15 @@ const CustomMessage& HintText::GetAmbiguous(uint8_t selection) const { return clearText; } -uint8_t HintText::GetAmbiguousSize() const{ +size_t HintText::GetAmbiguousSize() const { return ambiguousText.size(); } -uint8_t HintText::GetObscureSize() const{ +size_t HintText::GetObscureSize() const { return obscureText.size(); } -const CustomMessage& HintText::GetHintMessage(uint8_t selection) const { +const CustomMessage& HintText::GetHintMessage(size_t selection) const { auto ctx = Rando::Context::GetInstance(); if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_OBSCURE)) { return GetObscure(selection); @@ -96,66 +93,65 @@ const CustomMessage HintText::GetMessageCopy() const { } bool HintText::operator==(const HintText& right) const { - return obscureText == right.obscureText && - ambiguousText == right.ambiguousText && - clearText == right.clearText; + return obscureText == right.obscureText && ambiguousText == right.ambiguousText && clearText == right.clearText; } bool HintText::operator!=(const HintText& right) const { return !operator==(right); } -StaticHintInfo::StaticHintInfo(HintType _type, std::vector _hintKeys, RandomizerSettingKey _setting, - std::variant _condition, std::vector _targetChecks, - std::vector _targetItems, std::vector _hintChecks, bool _yourPocket, int _num): - type(_type), hintKeys(_hintKeys), setting(_setting), condition(_condition), targetChecks(_targetChecks), - targetItems(_targetItems), hintChecks(_hintChecks), yourPocket(_yourPocket), num(_num){} +StaticHintInfo::StaticHintInfo(HintType _type, std::vector _hintKeys, + RandomizerSettingKey _setting, std::variant _condition, + std::vector _targetChecks, std::vector _targetItems, + std::vector _hintChecks, bool _yourPocket, int _num) + : type(_type), hintKeys(_hintKeys), setting(_setting), condition(_condition), targetChecks(_targetChecks), + targetItems(_targetItems), hintChecks(_hintChecks), yourPocket(_yourPocket), num(_num) { +} -RandomizerHintTextKey GetRandomJunkHint(){ +RandomizerHintTextKey GetRandomJunkHint() { // Temp code to handle random junk hints now I work in keys instead of a vector of HintText // Will be replaced with a better system once more customisable hint pools are added uint32_t range = RHT_JUNK71 - RHT_JUNK01; return (RandomizerHintTextKey)(Random(0, range) + RHT_JUNK01); } -RandomizerHintTextKey GetRandomGanonJoke(){ - uint32_t range = RHT_GANON_JOKE11 - RHT_GANON_JOKE01; - return (RandomizerHintTextKey)(Random(0, range) + RHT_GANON_JOKE01); +RandomizerHintTextKey GetRandomGanonJoke() { + uint32_t range = RHT_GANON_JOKE11 - RHT_GANON_JOKE01; + return (RandomizerHintTextKey)(Random(0, range) + RHT_GANON_JOKE01); } - -bool FilterWotHLocations(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return ctx->GetItemLocation(loc)->IsWothCandidate(); +bool FilterWotHLocations(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return ctx->GetItemLocation(loc)->IsWothCandidate(); } -bool FilterFoolishLocations(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return ctx->GetItemLocation(loc)->IsFoolishCandidate(); +bool FilterFoolishLocations(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return ctx->GetItemLocation(loc)->IsFoolishCandidate(); } -bool FilterSongLocations(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION; +bool FilterSongLocations(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION; } -bool FilterOverworldLocations(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return Rando::StaticData::GetLocation(loc)->IsOverworld(); +bool FilterOverworldLocations(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return Rando::StaticData::GetLocation(loc)->IsOverworld(); } -bool FilterDungeonLocations(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return Rando::StaticData::GetLocation(loc)->IsDungeon(); +bool FilterDungeonLocations(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return Rando::StaticData::GetLocation(loc)->IsDungeon(); } -bool FilterGoodItems(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return ctx->GetItemLocation(loc)->GetPlacedItem().IsMajorItem(); +bool FilterGoodItems(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return ctx->GetItemLocation(loc)->GetPlacedItem().IsMajorItem(); } -bool NoFilter(RandomizerCheck loc){ - return true; +bool NoFilter(RandomizerCheck loc) { + return true; } const std::array hintSettingTable{{ @@ -225,15 +221,16 @@ uint8_t StonesRequiredBySettings() { stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).Get(); } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Get() - 6; - } else if ((ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS)) && (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON))) { + } else if ((ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS)) && + (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON))) { stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Get() - 6; } if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { stones = std::max({ stones, ctx->GetOption(RSK_LACS_STONE_COUNT).Get() }); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { - stones = std::max({ stones, (uint8_t)(ctx->GetOption(RSK_LACS_REWARD_COUNT).Get() - 6 )}); + stones = std::max({ stones, (uint8_t)(ctx->GetOption(RSK_LACS_REWARD_COUNT).Get() - 6) }); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS)) { - stones = std::max({ stones, (uint8_t)(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get() - 6 )}); + stones = std::max({ stones, (uint8_t)(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get() - 6) }); } return stones; } @@ -245,15 +242,17 @@ uint8_t MedallionsRequiredBySettings() { medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).Get(); } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Get() - 3; - } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS) && ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS) && + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Get() - 3; } if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_MEDALLIONS)) { medallions = std::max({ medallions, ctx->GetOption(RSK_LACS_MEDALLION_COUNT).Get() }); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_REWARDS)) { - medallions = std::max({ medallions, (uint8_t)(ctx->GetOption(RSK_LACS_REWARD_COUNT).Get() - 3 )}); - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS) && ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { - medallions = std::max({ medallions, (uint8_t)(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get() - 3 )}); + medallions = std::max({ medallions, (uint8_t)(ctx->GetOption(RSK_LACS_REWARD_COUNT).Get() - 3) }); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS) && + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { + medallions = std::max({ medallions, (uint8_t)(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get() - 3) }); } return medallions; } @@ -271,555 +270,601 @@ uint8_t TokensRequiredBySettings() { } std::vector>> conditionalAlwaysHints = { - std::make_pair(RC_MARKET_10_BIG_POES, []() { + std::make_pair(RC_MARKET_10_BIG_POES, + []() { auto ctx = Rando::Context::GetInstance(); - return ctx->GetOption(RSK_BIG_POE_COUNT).Get() >= 3 && !ctx->GetOption(RSK_BIG_POES_HINT); - }), // Remember, the option's value being 3 means 4 are required - std::make_pair(RC_DEKU_THEATER_MASK_OF_TRUTH, []() { + return ctx->GetOption(RSK_BIG_POE_COUNT).Get() > 3 && !ctx->GetOption(RSK_BIG_POES_HINT); + }), + std::make_pair(RC_DEKU_THEATER_MASK_OF_TRUTH, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_MASK_SHOP_HINT) && !ctx->GetOption(RSK_COMPLETE_MASK_QUEST); }), - std::make_pair(RC_SONG_FROM_OCARINA_OF_TIME, []() { - auto ctx = Rando::Context::GetInstance(); - return StonesRequiredBySettings() < 2 && !ctx->GetOption(RSK_OOT_HINT); + std::make_pair(RC_SONG_FROM_OCARINA_OF_TIME, + []() { + auto ctx = Rando::Context::GetInstance(); + return StonesRequiredBySettings() < 2 && !ctx->GetOption(RSK_OOT_HINT); }), std::make_pair(RC_HF_OCARINA_OF_TIME_ITEM, []() { return StonesRequiredBySettings() < 2; }), std::make_pair(RC_SHEIK_IN_KAKARIKO, []() { return MedallionsRequiredBySettings() < 5; }), - std::make_pair(RC_DMT_TRADE_CLAIM_CHECK, []() { + std::make_pair(RC_DMT_TRADE_CLAIM_CHECK, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_BIGGORON_HINT); }), - std::make_pair(RC_KAK_30_GOLD_SKULLTULA_REWARD, []() { + std::make_pair(RC_KAK_30_GOLD_SKULLTULA_REWARD, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_KAK_30_SKULLS_HINT) && TokensRequiredBySettings() < 30; }), - std::make_pair(RC_KAK_40_GOLD_SKULLTULA_REWARD, []() { + std::make_pair(RC_KAK_40_GOLD_SKULLTULA_REWARD, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_KAK_40_SKULLS_HINT) && TokensRequiredBySettings() < 40; }), - std::make_pair(RC_KAK_50_GOLD_SKULLTULA_REWARD, []() { + std::make_pair(RC_KAK_50_GOLD_SKULLTULA_REWARD, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_KAK_50_SKULLS_HINT) && TokensRequiredBySettings() < 50; }), - std::make_pair(RC_ZR_FROGS_OCARINA_GAME, []() { + std::make_pair(RC_ZR_FROGS_OCARINA_GAME, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_FROGS_HINT); }), - std::make_pair(RC_KF_LINKS_HOUSE_COW, []() { + std::make_pair(RC_KF_LINKS_HOUSE_COW, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_MALON_HINT); }), - std::make_pair(RC_KAK_100_GOLD_SKULLTULA_REWARD, []() { + std::make_pair(RC_KAK_100_GOLD_SKULLTULA_REWARD, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_KAK_100_SKULLS_HINT) && TokensRequiredBySettings() < 100; }), }; static std::vector GetEmptyGossipStones() { - auto emptyGossipStones = GetEmptyLocations(Rando::StaticData::GetGossipStoneLocations()); - return emptyGossipStones; + auto emptyGossipStones = GetEmptyLocations(Rando::StaticData::GetGossipStoneLocations()); + return emptyGossipStones; } static std::vector GetAccessibleGossipStones(const RandomizerCheck hintedLocation = RC_GANON) { - auto ctx = Rando::Context::GetInstance(); - //temporarily remove the hinted location's item, and then perform a - //reachability search for gossip stone locations. - RandomizerGet originalItem = ctx->GetItemLocation(hintedLocation)->GetPlacedRandomizerGet(); - ctx->GetItemLocation(hintedLocation)->SetPlacedItem(RG_NONE); + auto ctx = Rando::Context::GetInstance(); + // temporarily remove the hinted location's item, and then perform a + // reachability search for gossip stone locations. + RandomizerGet originalItem = ctx->GetItemLocation(hintedLocation)->GetPlacedRandomizerGet(); + ctx->GetItemLocation(hintedLocation)->SetPlacedItem(RG_NONE); - ctx->GetLogic()->Reset(); - auto accessibleGossipStones = ReachabilitySearch(Rando::StaticData::GetGossipStoneLocations()); - //Give the item back to the location - ctx->GetItemLocation(hintedLocation)->SetPlacedItem(originalItem); - - return accessibleGossipStones; -} - -bool IsReachableWithout(std::vector locsToCheck, RandomizerCheck excludedCheck, bool resetAfter = true){ - //temporarily remove the hinted location's item, and then perform a - //reachability search for this check RANDOTODO convert excludedCheck to an ItemLocation - auto ctx = Rando::Context::GetInstance(); - RandomizerGet originalItem = ctx->GetItemLocation(excludedCheck)->GetPlacedRandomizerGet(); - ctx->GetItemLocation(excludedCheck)->SetPlacedItem(RG_NONE); - ctx->GetLogic()->Reset(); - const auto rechableWithout = ReachabilitySearch(locsToCheck); - ctx->GetItemLocation(excludedCheck)->SetPlacedItem(originalItem); - if (resetAfter){ - //if resetAfter is on, reset logic we are done ctx->GetLogic()->Reset(); - } - if (rechableWithout.empty()) { - return false; - } - return true; + auto accessibleGossipStones = ReachabilitySearch(Rando::StaticData::GetGossipStoneLocations()); + // Give the item back to the location + ctx->GetItemLocation(hintedLocation)->SetPlacedItem(originalItem); + + return accessibleGossipStones; } -static void SetAllInAreaAsHintAccesible(RandomizerArea area, std::vector locations){ - auto ctx = Rando::Context::GetInstance(); - std::vector locsInArea = FilterFromPool(locations, [area, ctx](const RandomizerCheck loc){ - return ctx->GetItemLocation(loc)->GetAreas().contains(area); - }); - for(RandomizerCheck loc: locsInArea){ - ctx->GetItemLocation(loc)->SetHintAccesible(); - } +bool IsReachableWithout(std::vector locsToCheck, RandomizerCheck excludedCheck, + bool resetAfter = true) { + // temporarily remove the hinted location's item, and then perform a + // reachability search for this check RANDOTODO convert excludedCheck to an ItemLocation + auto ctx = Rando::Context::GetInstance(); + RandomizerGet originalItem = ctx->GetItemLocation(excludedCheck)->GetPlacedRandomizerGet(); + ctx->GetItemLocation(excludedCheck)->SetPlacedItem(RG_NONE); + ctx->GetLogic()->Reset(); + const auto rechableWithout = ReachabilitySearch(locsToCheck); + ctx->GetItemLocation(excludedCheck)->SetPlacedItem(originalItem); + if (resetAfter) { + // if resetAfter is on, reset logic we are done + ctx->GetLogic()->Reset(); + } + if (rechableWithout.empty()) { + return false; + } + return true; } -static void AddGossipStoneHint( const RandomizerCheck gossipStone, - const HintType hintType, - const std::string distributionName, - const std::vector hintKeys, - const std::vector locations, - const std::vector areas, - const std::vector trials) { - auto ctx = Rando::Context::GetInstance(); - ctx->AddHint(StaticData::gossipStoneCheckToHint[gossipStone], Hint(StaticData::gossipStoneCheckToHint[gossipStone], hintType, distributionName, hintKeys, locations, areas, trials)); - ctx->GetItemLocation(gossipStone)->SetPlacedItem(RG_HINT); //RANDOTODO, better gossip stone to location to hint key system +static void SetAllInAreaAsHintAccesible(RandomizerArea area, std::vector locations) { + auto ctx = Rando::Context::GetInstance(); + std::vector locsInArea = FilterFromPool(locations, [area, ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetAreas().contains(area); + }); + for (RandomizerCheck loc : locsInArea) { + ctx->GetItemLocation(loc)->SetHintAccesible(); + } } -static void AddGossipStoneHintCopies(uint8_t copies, - const HintType hintType, - const std::string distributionName, +static void AddGossipStoneHint(const RandomizerCheck gossipStone, const HintType hintType, + const std::string distributionName, const std::vector hintKeys, + const std::vector locations, const std::vector areas, + const std::vector trials) { + auto ctx = Rando::Context::GetInstance(); + ctx->AddHint(StaticData::gossipStoneCheckToHint[gossipStone], + Hint(StaticData::gossipStoneCheckToHint[gossipStone], hintType, distributionName, hintKeys, locations, + areas, trials)); + ctx->GetItemLocation(gossipStone) + ->SetPlacedItem(RG_HINT); // RANDOTODO, better gossip stone to location to hint key system +} + +static void AddGossipStoneHintCopies(uint8_t copies, const HintType hintType, const std::string distributionName, const std::vector hintKeys = {}, const std::vector locations = {}, const std::vector areas = {}, const std::vector trials = {}, - RandomizerCheck firstStone = RC_UNKNOWN_CHECK){ + RandomizerCheck firstStone = RC_UNKNOWN_CHECK) { - if (firstStone != RC_UNKNOWN_CHECK && copies > 0){ - AddGossipStoneHint(firstStone, hintType, distributionName, hintKeys, locations, areas, trials); - copies -= 1; - } - for(int c=0; c 0) { + AddGossipStoneHint(firstStone, hintType, distributionName, hintKeys, locations, areas, trials); + copies -= 1; + } + for (int c = 0; c < copies; c++) { + // get a random gossip stone + auto gossipStones = GetEmptyGossipStones(); + if (gossipStones.empty()) { + SPDLOG_DEBUG("\tNO GOSSIP STONES TO PLACE HINT\n\n"); + return; + } + auto gossipStone = RandomElement(gossipStones, false); + AddGossipStoneHint(gossipStone, hintType, distributionName, hintKeys, locations, areas, trials); } - auto gossipStone = RandomElement(gossipStones, false); - AddGossipStoneHint(gossipStone, hintType, distributionName, hintKeys, locations, areas, trials); - } } -static bool CreateHint(RandomizerCheck location, uint8_t copies, HintType type, std::string distribution){ - auto ctx = Rando::Context::GetInstance(); +static bool CreateHint(RandomizerCheck location, uint8_t copies, HintType type, std::string distribution) { + auto ctx = Rando::Context::GetInstance(); - //get a gossip stone accessible without the hinted item - std::vector gossipStoneLocations = GetAccessibleGossipStones(location); - if (gossipStoneLocations.empty()) { - SPDLOG_DEBUG("\tNO IN LOGIC GOSSIP STONE\n\n"); - return false; - } - RandomizerCheck gossipStone = RandomElement(gossipStoneLocations); - RandomizerArea area = ctx->GetItemLocation(location)->GetRandomArea(); + // get a gossip stone accessible without the hinted item + std::vector gossipStoneLocations = GetAccessibleGossipStones(location); + if (gossipStoneLocations.empty()) { + SPDLOG_DEBUG("\tNO IN LOGIC GOSSIP STONE\n\n"); + return false; + } + RandomizerCheck gossipStone = RandomElement(gossipStoneLocations); + RandomizerArea area = ctx->GetItemLocation(location)->GetRandomArea(); - //Set that hints are accesible - ctx->GetItemLocation(location)->SetHintAccesible(); - if (type == HINT_TYPE_FOOLISH){ - SetAllInAreaAsHintAccesible(area, ctx->allLocations); - } + // Set that hints are accesible + ctx->GetItemLocation(location)->SetHintAccesible(); + if (type == HINT_TYPE_FOOLISH) { + SetAllInAreaAsHintAccesible(area, ctx->allLocations); + } - AddGossipStoneHintCopies(copies, type, distribution, {}, {location}, {area}, {}, gossipStone); - return true; + AddGossipStoneHintCopies(copies, type, distribution, {}, { location }, { area }, {}, gossipStone); + return true; } +static RandomizerCheck CreateRandomHint(std::vector& possibleHintLocations, uint8_t copies, + HintType type, std::string distributionName) { + auto ctx = Rando::Context::GetInstance(); -static RandomizerCheck CreateRandomHint(std::vector& possibleHintLocations, - uint8_t copies, - HintType type, - std::string distributionName) { - auto ctx = Rando::Context::GetInstance(); - - //return if there aren't any hintable locations or gossip stones available - if (GetEmptyGossipStones().size() < copies) { - SPDLOG_DEBUG("\tNOT ENOUGH GOSSIP STONES TO PLACE HINTS\n\n"); - return RC_UNKNOWN_CHECK; - } - - RandomizerCheck hintedLocation; - bool placed = false; - while (!placed){ - if (possibleHintLocations.empty()) { - SPDLOG_DEBUG("\tNO LOCATIONS TO HINT\n\n"); - return RC_UNKNOWN_CHECK; + // return if there aren't any hintable locations or gossip stones available + if (GetEmptyGossipStones().size() < copies) { + SPDLOG_DEBUG("\tNOT ENOUGH GOSSIP STONES TO PLACE HINTS\n\n"); + return RC_UNKNOWN_CHECK; } - hintedLocation = RandomElement(possibleHintLocations, true); //removing the location to avoid it being hinted again on fail - - SPDLOG_DEBUG("\tLocation: "); - SPDLOG_DEBUG(Rando::StaticData::GetLocation(hintedLocation)->GetName()); - SPDLOG_DEBUG("\n"); - SPDLOG_DEBUG("\tItem: "); - SPDLOG_DEBUG(ctx->GetItemLocation(hintedLocation)->GetPlacedItemName().GetEnglish()); - SPDLOG_DEBUG("\n"); + RandomizerCheck hintedLocation; + bool placed = false; + while (!placed) { + if (possibleHintLocations.empty()) { + SPDLOG_DEBUG("\tNO LOCATIONS TO HINT\n\n"); + return RC_UNKNOWN_CHECK; + } + hintedLocation = + RandomElement(possibleHintLocations, true); // removing the location to avoid it being hinted again on fail - placed = CreateHint(hintedLocation, copies, type, distributionName); - } - return hintedLocation; + SPDLOG_DEBUG("\tLocation: "); + SPDLOG_DEBUG(Rando::StaticData::GetLocation(hintedLocation)->GetName()); + SPDLOG_DEBUG("\n"); + + SPDLOG_DEBUG("\tItem: "); + SPDLOG_DEBUG(ctx->GetItemLocation(hintedLocation)->GetPlacedItemName().GetEnglish()); + SPDLOG_DEBUG("\n"); + + placed = CreateHint(hintedLocation, copies, type, distributionName); + } + return hintedLocation; } static std::vector FilterHintability(std::vector& locations, - std::function extraFilter = NoFilter){ - auto ctx = Rando::Context::GetInstance(); - return FilterFromPool(locations, [extraFilter, ctx](const RandomizerCheck loc) { - return ctx->GetItemLocation(loc)->IsHintable() && !(ctx->GetItemLocation(loc)->IsAHintAccessible()) - && extraFilter(loc); - }); + std::function extraFilter = NoFilter) { + auto ctx = Rando::Context::GetInstance(); + return FilterFromPool(locations, [extraFilter, ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->IsHintable() && !(ctx->GetItemLocation(loc)->IsAHintAccessible()) && + extraFilter(loc); + }); } static void CreateJunkHints(uint8_t numHints) { - for(uint8_t c = 0; c < numHints; c++){ - //duplicate junk hints are possible for now - AddGossipStoneHintCopies(1, HINT_TYPE_HINT_KEY, "Junk", {GetRandomJunkHint()}); - } + for (uint8_t c = 0; c < numHints; c++) { + // duplicate junk hints are possible for now + AddGossipStoneHintCopies(1, HINT_TYPE_HINT_KEY, "Junk", { GetRandomJunkHint() }); + } } static void CreateTrialHints(uint8_t copies) { - if (copies > 0) { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_TRIAL_COUNT).Is(6)) {//six trials - AddGossipStoneHintCopies(copies, HINT_TYPE_HINT_KEY, "Trial", {RHT_SIX_TRIALS}); - } else if (ctx->GetOption(RSK_TRIAL_COUNT).Is(0)) {//zero trials - AddGossipStoneHintCopies(copies, HINT_TYPE_HINT_KEY, "Trial", {RHT_ZERO_TRIALS}); - } else { - std::vector trials = ctx->GetTrials()->GetTrialList(); //there's probably a way to remove this assignment - if (ctx->GetOption(RSK_TRIAL_COUNT).Get() >= 4) {//4 or 5 required trials, get skipped trials - trials = FilterFromPool(trials, [](TrialInfo* trial){return trial->IsSkipped();}); - } else {//1 to 3 trials, get requried trials - auto requiredTrials = FilterFromPool(trials, [](TrialInfo* trial){return trial->IsRequired();}); - } - for (auto& trial : trials) {//create a hint for each hinted trial - AddGossipStoneHintCopies(copies, HINT_TYPE_TRIAL, "Trial", {}, {}, {}, {trial->GetTrialKey()}); - } + if (copies > 0) { + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_TRIAL_COUNT).Is(6)) { // six trials + AddGossipStoneHintCopies(copies, HINT_TYPE_HINT_KEY, "Trial", { RHT_SIX_TRIALS }); + } else if (ctx->GetOption(RSK_TRIAL_COUNT).Is(0)) { // zero trials + AddGossipStoneHintCopies(copies, HINT_TYPE_HINT_KEY, "Trial", { RHT_ZERO_TRIALS }); + } else { + std::vector trials = + ctx->GetTrials()->GetTrialList(); // there's probably a way to remove this assignment + if (ctx->GetOption(RSK_TRIAL_COUNT).Get() >= 4) { // 4 or 5 required trials, get skipped trials + trials = FilterFromPool(trials, [](TrialInfo* trial) { return trial->IsSkipped(); }); + } else { // 1 to 3 trials, get requried trials + auto requiredTrials = FilterFromPool(trials, [](TrialInfo* trial) { return trial->IsRequired(); }); + } + for (auto& trial : trials) { // create a hint for each hinted trial + AddGossipStoneHintCopies(copies, HINT_TYPE_TRIAL, "Trial", {}, {}, {}, { trial->GetTrialKey() }); + } + } } - } } void CreateWarpSongTexts() { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_WARP_SONG_HINTS)){ - auto warpSongEntrances = GetShuffleableEntrances(EntranceType::WarpSong, false); - for (auto entrance : warpSongEntrances) { - //RANDOTODO make random - RandomizerArea destination = entrance->GetConnectedRegion()->GetFirstArea(); - switch (entrance->GetIndex()) { - case 0x0600: // minuet RANDOTODO make into entrance hints when they are added - ctx->AddHint(RH_MINUET_WARP_LOC, Hint(RH_MINUET_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - case 0x04F6: // bolero - ctx->AddHint(RH_BOLERO_WARP_LOC, Hint(RH_BOLERO_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - case 0x0604: // serenade - ctx->AddHint(RH_SERENADE_WARP_LOC, Hint(RH_SERENADE_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - case 0x01F1: // requiem - ctx->AddHint(RH_REQUIEM_WARP_LOC, Hint(RH_REQUIEM_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - case 0x0568: // nocturne - ctx->AddHint(RH_NOCTURNE_WARP_LOC, Hint(RH_NOCTURNE_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - case 0x05F4: // prelude - ctx->AddHint(RH_PRELUDE_WARP_LOC, Hint(RH_PRELUDE_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - default: - break; - } - } - } -} - -int32_t getRandomWeight(int32_t totalWeight){ - if (totalWeight <= 1){ - return 1; - } - return Random(1,totalWeight); -} - -static void DistributeHints(std::vector& selected, size_t stoneCount, std::vector distTable, uint8_t junkWieght, bool addFixed = true){ - int32_t totalWeight = junkWieght; //Start with our Junk Weight, the natural chance of a junk hint - - for (size_t c=0; c < distTable.size(); c++){ //Gather the weights of each distribution and, if it's the first pass, apply fixed hints - totalWeight += distTable[c].weight; //Note that PlaceHints will set weights of distributions to zero if it can't place anything from them - if (addFixed){ - selected[c] += distTable[c].fixed; - stoneCount -= distTable[c].fixed * distTable[c].copies; - } - } - int32_t currentWeight = getRandomWeight(totalWeight); //Initialise with the first random weight from 1 to the total. - while(stoneCount > 0 && totalWeight > 0){//Loop until we run out of stones or have no TotalWeight. 0 totalWeight means junkWeight is 0 - //and that all weights have been 0'd out for another reason, and skips to placing all junk hints - for (size_t distribution = 0; distribution < distTable.size(); distribution++){ - currentWeight -= distTable[distribution].weight; //go over each distribution, subtracting the weight each time. Once we reach zero or less, - if (currentWeight <= 0){ //tell the system to make 1 of that hint, unless not enough stones remain - if (stoneCount >= distTable[distribution].copies && distTable[distribution].copies > 0){ - selected[distribution] += 1; //if we have enough stones, and copies are not zero, assign 1 to this hint type, remove the stones, and break - stoneCount -= distTable[distribution].copies; - break; //This leaves the whole for loop - } else { //If we don't have the stones, or copies is 0 despite there being the wieght to trigger a hit, temporerally set wieght to zero - totalWeight -= distTable[distribution].weight; //Unlike PlaceHint, distTable is passed by value here, making this temporary - distTable[distribution].weight = 0; //this is so we can still roll this hint type if more stones free up later - break; + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_WARP_SONG_HINTS)) { + auto warpSongEntrances = GetShuffleableEntrances(EntranceType::WarpSong, false); + for (auto entrance : warpSongEntrances) { + // RANDOTODO make random + RandomizerArea destination = entrance->GetConnectedRegion()->GetFirstArea(); + switch (entrance->GetIndex()) { + case 0x0600: // minuet RANDOTODO make into entrance hints when they are added + ctx->AddHint(RH_MINUET_WARP_LOC, + Hint(RH_MINUET_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, {}, { destination })); + break; + case 0x04F6: // bolero + ctx->AddHint(RH_BOLERO_WARP_LOC, + Hint(RH_BOLERO_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, {}, { destination })); + break; + case 0x0604: // serenade + ctx->AddHint(RH_SERENADE_WARP_LOC, Hint(RH_SERENADE_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, + {}, { destination })); + break; + case 0x01F1: // requiem + ctx->AddHint(RH_REQUIEM_WARP_LOC, + Hint(RH_REQUIEM_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, {}, { destination })); + break; + case 0x0568: // nocturne + ctx->AddHint(RH_NOCTURNE_WARP_LOC, Hint(RH_NOCTURNE_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, + {}, { destination })); + break; + case 0x05F4: // prelude + ctx->AddHint(RH_PRELUDE_WARP_LOC, + Hint(RH_PRELUDE_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, {}, { destination })); + break; + default: + break; + } } - } } - //if there's still weight then it's junk, as the leftover weight is junkWeight - if (currentWeight > 0){ //zero TotalWeight breaks the while loop and hits the fallback, so skipping this is fine in that case - selected[selected.size()-1] += 1; - stoneCount -= 1; - } - currentWeight = getRandomWeight(totalWeight); - } - //if stones are left, assign junk to every remaining stone as a fallback. - if (stoneCount > 0){ - selected[selected.size()-1] += stoneCount; - } } -uint8_t PlaceHints(std::vector& selectedHints, std::vector& distTable){ - auto ctx = Rando::Context::GetInstance(); - uint8_t curSlot = 0; - for (HintDistributionSetting distribution : distTable){ - std::vector hintTypePool = FilterHintability(ctx->allLocations, distribution.filter); - for (uint8_t numHint = 0; numHint < selectedHints[curSlot]; numHint++){ - hintTypePool = FilterHintability(hintTypePool); - SPDLOG_DEBUG("Attempting to make hint of type: " + StaticData::hintTypeNames[distribution.type].GetEnglish(MF_CLEAN) + "\n"); - RandomizerCheck hintedLocation = RC_UNKNOWN_CHECK; - - hintedLocation = CreateRandomHint(hintTypePool, distribution.copies, distribution.type, distribution.name); - - if (hintedLocation == RC_UNKNOWN_CHECK){ //if hint failed to place, remove all wieght and copies then return the number of stones to redistribute - uint8_t hintsToRemove = (selectedHints[curSlot] - numHint) * distribution.copies; - selectedHints[curSlot] = 0; //as distTable is passed by refernce here, these changes stick for the rest of this seed generation - distTable[curSlot].copies = 0;//and prevent future distribution from choosing this slot - distTable[curSlot].weight = 0; - return hintsToRemove; - } - if(Rando::StaticData::GetLocation(hintedLocation)->IsDungeon()){ - distribution.dungeonLimit -= 1; - if (distribution.dungeonLimit == 0){ - FilterFromPool(hintTypePool, FilterOverworldLocations); - } - } +int32_t getRandomWeight(int32_t totalWeight) { + if (totalWeight <= 1) { + return 1; } - selectedHints[curSlot] = 0; - curSlot += 1; - } - CreateJunkHints(selectedHints[selectedHints.size() - 1]); - return 0; + return Random(1, totalWeight); +} + +static void DistributeHints(std::vector& selected, size_t stoneCount, + std::vector distTable, uint8_t junkWieght, bool addFixed = true) { + int32_t totalWeight = junkWieght; // Start with our Junk Weight, the natural chance of a junk hint + + for (size_t c = 0; c < distTable.size(); + c++) { // Gather the weights of each distribution and, if it's the first pass, apply fixed hints + totalWeight += distTable[c].weight; // Note that PlaceHints will set weights of distributions to zero if it + // can't place anything from them + if (addFixed) { + selected[c] += distTable[c].fixed; + stoneCount -= distTable[c].fixed * distTable[c].copies; + } + } + int32_t currentWeight = getRandomWeight(totalWeight); // Initialise with the first random weight from 1 to the + // total. + while (stoneCount > 0 && + totalWeight > + 0) { // Loop until we run out of stones or have no TotalWeight. 0 totalWeight means junkWeight is 0 + // and that all weights have been 0'd out for another reason, and skips to placing all junk hints + for (size_t distribution = 0; distribution < distTable.size(); distribution++) { + currentWeight -= + distTable[distribution] + .weight; // go over each distribution, subtracting the weight each time. Once we reach zero or less, + if (currentWeight <= 0) { // tell the system to make 1 of that hint, unless not enough stones remain + if (stoneCount >= distTable[distribution].copies && distTable[distribution].copies > 0) { + selected[distribution] += 1; // if we have enough stones, and copies are not zero, assign 1 to this + // hint type, remove the stones, and break + stoneCount -= distTable[distribution].copies; + break; // This leaves the whole for loop + } else { // If we don't have the stones, or copies is 0 despite there being the wieght to trigger a hit, + // temporerally set wieght to zero + totalWeight -= + distTable[distribution] + .weight; // Unlike PlaceHint, distTable is passed by value here, making this temporary + distTable[distribution].weight = + 0; // this is so we can still roll this hint type if more stones free up later + break; + } + } + } + // if there's still weight then it's junk, as the leftover weight is junkWeight + if (currentWeight > + 0) { // zero TotalWeight breaks the while loop and hits the fallback, so skipping this is fine in that case + selected[selected.size() - 1] += 1; + stoneCount -= 1; + } + currentWeight = getRandomWeight(totalWeight); + } + // if stones are left, assign junk to every remaining stone as a fallback. + if (stoneCount > 0) { + selected[static_cast(selected.size()) - 1] += static_cast(stoneCount); + } +} + +uint8_t PlaceHints(std::vector& selectedHints, std::vector& distTable) { + auto ctx = Rando::Context::GetInstance(); + uint8_t curSlot = 0; + for (HintDistributionSetting distribution : distTable) { + std::vector hintTypePool = FilterHintability(ctx->allLocations, distribution.filter); + for (uint8_t numHint = 0; numHint < selectedHints[curSlot]; numHint++) { + hintTypePool = FilterHintability(hintTypePool); + SPDLOG_DEBUG("Attempting to make hint of type: " + + StaticData::hintTypeNames[distribution.type].GetEnglish(MF_CLEAN) + "\n"); + RandomizerCheck hintedLocation = RC_UNKNOWN_CHECK; + + hintedLocation = CreateRandomHint(hintTypePool, distribution.copies, distribution.type, distribution.name); + + if (hintedLocation == RC_UNKNOWN_CHECK) { // if hint failed to place, remove all wieght and copies then + // return the number of stones to redistribute + uint8_t hintsToRemove = (selectedHints[curSlot] - numHint) * distribution.copies; + selectedHints[curSlot] = 0; // as distTable is passed by refernce here, these changes stick for the rest + // of this seed generation + distTable[curSlot].copies = 0; // and prevent future distribution from choosing this slot + distTable[curSlot].weight = 0; + return hintsToRemove; + } + if (Rando::StaticData::GetLocation(hintedLocation)->IsDungeon()) { + distribution.dungeonLimit -= 1; + if (distribution.dungeonLimit == 0) { + FilterFromPool(hintTypePool, FilterOverworldLocations); + } + } + } + selectedHints[curSlot] = 0; + curSlot += 1; + } + CreateJunkHints(selectedHints[selectedHints.size() - 1]); + return 0; } void CreateStoneHints() { - auto ctx = Rando::Context::GetInstance(); - SPDLOG_DEBUG("\nNOW CREATING HINTS\n"); - const HintSetting& hintSetting = hintSettingTable[ctx->GetOption(RSK_HINT_DISTRIBUTION).Get()]; - std::vector distTable = hintSetting.distTable; + auto ctx = Rando::Context::GetInstance(); + SPDLOG_DEBUG("\nNOW CREATING HINTS\n"); + const HintSetting& hintSetting = hintSettingTable[ctx->GetOption(RSK_HINT_DISTRIBUTION).Get()]; + std::vector distTable = hintSetting.distTable; - // Apply impa's song exclusions when zelda is skipped - if(ctx->GetOption(RSK_SKIP_CHILD_ZELDA)){ - ctx->GetItemLocation(RC_SONG_FROM_IMPA)->SetHintAccesible(); - } - - // Add 'always' location hints - std::vector alwaysHintLocations = {}; - if (hintSetting.alwaysCopies > 0) { - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)){ - // If we have Rainbow Bridge set to Greg and the greg hint isn't useful, add a hint for where Greg is - // Do we really need this with the greg hint? - auto gregLocations = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { - return ( - (ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_GREG_RUPEE)) && - ctx->GetItemLocation(loc)->IsHintable() && - !(ctx->GetOption(RSK_GREG_HINT) && (IsReachableWithout({RC_GREG_HINT}, loc, true))); - }); - if (gregLocations.size() > 0){ - alwaysHintLocations.push_back(gregLocations[0]); - } + // Apply impa's song exclusions when zelda is skipped + if (ctx->GetOption(RSK_SKIP_CHILD_ZELDA)) { + ctx->GetItemLocation(RC_SONG_FROM_IMPA)->SetHintAccesible(); } - for (auto& hint : conditionalAlwaysHints) { - RandomizerCheck loc = hint.first; - if (hint.second() && ctx->GetItemLocation(loc)->IsHintable()) { - alwaysHintLocations.push_back(loc); + // Add 'always' location hints + std::vector alwaysHintLocations = {}; + if (hintSetting.alwaysCopies > 0) { + if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)) { + // If we have Rainbow Bridge set to Greg and the greg hint isn't useful, add a hint for where Greg is + // Do we really need this with the greg hint? + auto gregLocations = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { + return ((ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_GREG_RUPEE)) && + ctx->GetItemLocation(loc)->IsHintable() && + !(ctx->GetOption(RSK_GREG_HINT) && (IsReachableWithout({ RC_GREG_HINT }, loc, true))); + }); + if (gregLocations.size() > 0) { + alwaysHintLocations.push_back(gregLocations[0]); + } + } + + for (auto& hint : conditionalAlwaysHints) { + RandomizerCheck loc = hint.first; + if (hint.second() && ctx->GetItemLocation(loc)->IsHintable()) { + alwaysHintLocations.push_back(loc); + } + } + + for (RandomizerCheck location : alwaysHintLocations) { + CreateHint(location, hintSetting.alwaysCopies, HINT_TYPE_ITEM, "Always"); } } - for (RandomizerCheck location : alwaysHintLocations) { - CreateHint(location, hintSetting.alwaysCopies, HINT_TYPE_ITEM, "Always"); + // Add 'trial' location hints + if (ctx->GetOption(RSK_GANONS_TRIALS).IsNot(RO_GANONS_TRIALS_SKIP)) { + CreateTrialHints(hintSetting.trialCopies); } - } - //Add 'trial' location hints - if (ctx->GetOption(RSK_GANONS_TRIALS).IsNot(RO_GANONS_TRIALS_SKIP)) { - CreateTrialHints(hintSetting.trialCopies); - } - - size_t totalStones = GetEmptyGossipStones().size(); - std::vector selectedHints = {}; - for (size_t c=0; c < distTable.size(); c++){ + size_t totalStones = GetEmptyGossipStones().size(); + std::vector selectedHints = {}; + for (size_t c = 0; c < distTable.size(); c++) { + selectedHints.push_back(0); + } selectedHints.push_back(0); - } - selectedHints.push_back(0); - DistributeHints(selectedHints, totalStones, distTable, hintSetting.junkWeight); - - while(totalStones != 0){ - totalStones = PlaceHints(selectedHints, distTable); - if (totalStones != 0){ - DistributeHints(selectedHints, totalStones, distTable, hintSetting.junkWeight, false); - } - } + DistributeHints(selectedHints, totalStones, distTable, hintSetting.junkWeight); - //Getting gossip stone locations temporarily sets one location to not be reachable. - //Call the function one last time to get rid of false positives on locations not - //being reachable. - ReachabilitySearch({}); + while (totalStones != 0) { + totalStones = PlaceHints(selectedHints, distTable); + if (totalStones != 0) { + DistributeHints(selectedHints, totalStones, distTable, hintSetting.junkWeight, false); + } + } + + // Getting gossip stone locations temporarily sets one location to not be reachable. + // Call the function one last time to get rid of false positives on locations not + // being reachable. + ReachabilitySearch({}); } -std::vector FindItemsAndMarkHinted(std::vector items, std::vector hintChecks){ - std::vector locations = {}; - auto ctx = Rando::Context::GetInstance(); - for (size_t c = 0; c < items.size(); c++){ - std::vector found = FilterFromPool(ctx->allLocations, [items, ctx, c](const RandomizerCheck loc) { - return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == items[c];}); - if (found.size() > 0){ - locations.push_back(found[0]); - //RANDOTODO make the called functions of this always return true if empty hintChecks are provided - if (!ctx->GetItemLocation(found[0])->IsAHintAccessible() && (hintChecks.size() == 0 || IsReachableWithout(hintChecks, found[0],true))){ - ctx->GetItemLocation(found[0])->SetHintAccesible(); - } - } else { - locations.push_back(RC_UNKNOWN_CHECK); +std::vector FindItemsAndMarkHinted(std::vector items, + std::vector hintChecks) { + std::vector locations = {}; + auto ctx = Rando::Context::GetInstance(); + for (size_t c = 0; c < items.size(); c++) { + std::vector found = + FilterFromPool(ctx->allLocations, [items, ctx, c](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == items[c]; + }); + if (found.size() > 0) { + locations.push_back(found[0]); + // RANDOTODO make the called functions of this always return true if empty hintChecks are provided + if (!ctx->GetItemLocation(found[0])->IsAHintAccessible() && + (hintChecks.size() == 0 || IsReachableWithout(hintChecks, found[0], true))) { + ctx->GetItemLocation(found[0])->SetHintAccesible(); + } + } else { + locations.push_back(RC_UNKNOWN_CHECK); + } } - } - return locations; + return locations; } void CreateChildAltarHint() { - auto ctx = Rando::Context::GetInstance(); - if (!ctx->GetHint(RH_ALTAR_CHILD)->IsEnabled() && ctx->GetOption(RSK_TOT_ALTAR_HINT)){ - std::vector stoneLocs = {}; - //force marking the rewards as hinted if they are at the end of dungeons as they can be inferred - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { - stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {}); - } else { - stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {RC_ALTAR_HINT_CHILD}); + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(RH_ALTAR_CHILD)->IsEnabled() && ctx->GetOption(RSK_TOT_ALTAR_HINT)) { + std::vector stoneLocs = {}; + // force marking the rewards as hinted if they are at the end of dungeons as they can be inferred + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { + stoneLocs = FindItemsAndMarkHinted({ RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE }, {}); + } else { + stoneLocs = + FindItemsAndMarkHinted({ RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE }, { RC_ALTAR_HINT_CHILD }); + } + std::vector stoneAreas = {}; + for (auto loc : stoneLocs) { + if (loc != RC_UNKNOWN_CHECK) { + stoneAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); + } + } + ctx->AddHint(RH_ALTAR_CHILD, Hint(RH_ALTAR_CHILD, HINT_TYPE_ALTAR_CHILD, {}, stoneLocs, stoneAreas)); } - std::vector stoneAreas = {}; - for (auto loc : stoneLocs){ - if (loc != RC_UNKNOWN_CHECK) { - stoneAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); - } - } - ctx->AddHint(RH_ALTAR_CHILD, Hint(RH_ALTAR_CHILD, HINT_TYPE_ALTAR_CHILD, {}, stoneLocs, stoneAreas)); - } } void CreateAdultAltarHint() { - auto ctx = Rando::Context::GetInstance(); - if (!ctx->GetHint(RH_ALTAR_ADULT)->IsEnabled()){ - std::vector medallionLocs = {}; - if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { - //force marking the rewards as hinted if they are at the end of dungeons as they can be inferred - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { - medallionLocs = FindItemsAndMarkHinted({RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION}, - {}); - } else { - medallionLocs = FindItemsAndMarkHinted({RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION}, - {RC_ALTAR_HINT_ADULT}); - } + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(RH_ALTAR_ADULT)->IsEnabled()) { + std::vector medallionLocs = {}; + if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { + // force marking the rewards as hinted if they are at the end of dungeons as they can be inferred + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { + medallionLocs = FindItemsAndMarkHinted({ RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, + RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION }, + {}); + } else { + medallionLocs = FindItemsAndMarkHinted({ RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, + RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION }, + { RC_ALTAR_HINT_ADULT }); + } + } + std::vector medallionAreas = {}; + for (auto loc : medallionLocs) { + if (loc != RC_UNKNOWN_CHECK) { + medallionAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); + } + } + ctx->AddHint(RH_ALTAR_ADULT, Hint(RH_ALTAR_ADULT, HINT_TYPE_ALTAR_ADULT, {}, medallionLocs, medallionAreas)); } - std::vector medallionAreas = {}; - for (auto loc : medallionLocs){ - if (loc != RC_UNKNOWN_CHECK) { - medallionAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); - } - } - ctx->AddHint(RH_ALTAR_ADULT, Hint(RH_ALTAR_ADULT, HINT_TYPE_ALTAR_ADULT, {}, medallionLocs, medallionAreas)); - } } -void CreateStaticHintFromData(RandomizerHint hint, StaticHintInfo staticData){ - auto ctx = Rando::Context::GetInstance(); - if (!ctx->GetHint(hint)->IsEnabled()){ - OptionValue& option = ctx->GetOption(staticData.setting); - if ((std::holds_alternative(staticData.condition) && option.Is(std::get(staticData.condition))) || - (std::holds_alternative(staticData.condition) && option.Is(std::get(staticData.condition)))){ +void CreateStaticHintFromData(RandomizerHint hint, StaticHintInfo staticData) { + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(hint)->IsEnabled()) { + OptionValue& option = ctx->GetOption(staticData.setting); + if ((std::holds_alternative(staticData.condition) && option.Is(std::get(staticData.condition))) || + (std::holds_alternative(staticData.condition) && + option.Is(std::get(staticData.condition)))) { - std::vector locations = {}; - if (staticData.targetItems.size() > 0){ - locations = FindItemsAndMarkHinted(staticData.targetItems, staticData.hintChecks); - } else { - for(auto check: staticData.targetChecks){ - locations.push_back(check); + std::vector locations = {}; + if (staticData.targetItems.size() > 0) { + locations = FindItemsAndMarkHinted(staticData.targetItems, staticData.hintChecks); + } else { + for (auto check : staticData.targetChecks) { + locations.push_back(check); + } + } + std::vector areas = {}; + for (auto loc : locations) { + ctx->GetItemLocation(loc)->SetHintAccesible(); + if (ctx->GetItemLocation(loc)->GetAreas().empty()) { + // If we get to here then it means a location got through with no area assignment, which means + // something went wrong elsewhere. + SPDLOG_DEBUG("Attempted to hint location with no areas: "); + SPDLOG_DEBUG(Rando::StaticData::GetLocation(loc)->GetName()); + // assert(false); + areas.push_back(RA_NONE); + } else { + areas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); + } + } + // hintKeys are defaulted to in the hint object and do not need to be specified + ctx->AddHint(hint, + Hint(hint, staticData.type, {}, locations, areas, {}, staticData.yourPocket, staticData.num)); } - } - std::vector areas = {}; - for (auto loc : locations){ - ctx->GetItemLocation(loc)->SetHintAccesible(); - if (ctx->GetItemLocation(loc)->GetAreas().empty()){ - //If we get to here then it means a location got through with no area assignment, which means something went wrong elsewhere. - SPDLOG_DEBUG("Attempted to hint location with no areas: "); - SPDLOG_DEBUG(Rando::StaticData::GetLocation(loc)->GetName()); - //assert(false); - areas.push_back(RA_NONE); - } else { - areas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); - } - } - //hintKeys are defaulted to in the hint object and do not need to be specified - ctx->AddHint(hint, Hint(hint, staticData.type, {}, locations, areas, {}, staticData.yourPocket, staticData.num)); } - } } void CreateStaticItemHint(RandomizerHint hintKey, std::vector hintTextKeys, - std::vector items, std::vector hintChecks, bool yourPocket = false) { - //RANDOTODO choose area in case there are multiple - auto ctx = Rando::Context::GetInstance(); - std::vector locations = FindItemsAndMarkHinted(items, hintChecks); - std::vector areas = {}; - for (auto loc : locations){ - areas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); - } - ctx->AddHint(hintKey, Hint(hintKey, HINT_TYPE_AREA, hintTextKeys, locations, areas, {}, yourPocket)); -} - -void CreateGanondorfJoke(){ - auto ctx = Rando::Context::GetInstance(); - if (!ctx->GetHint(RH_GANONDORF_JOKE)->IsEnabled()){ - ctx->AddHint(RH_GANONDORF_JOKE, Hint(RH_GANONDORF_JOKE, HINT_TYPE_HINT_KEY, {GetRandomGanonJoke()})); - } -} - -void CreateGanondorfHint(){ - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_GANONDORF_HINT) && !ctx->GetHint(RH_GANONDORF_HINT)->IsEnabled()){ - if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { - CreateStaticItemHint(RH_GANONDORF_HINT, {RHT_GANONDORF_HINT_LA_ONLY, RHT_GANONDORF_HINT_MS_ONLY, RHT_GANONDORF_HINT_LA_AND_MS}, - {RG_LIGHT_ARROWS, RG_MASTER_SWORD}, {RC_GANONDORF_HINT}, true); - } else { - CreateStaticItemHint(RH_GANONDORF_HINT, {RHT_GANONDORF_HINT_LA_ONLY}, {RG_LIGHT_ARROWS}, {RC_GANONDORF_HINT}, true); + std::vector items, std::vector hintChecks, + bool yourPocket = false) { + // RANDOTODO choose area in case there are multiple + auto ctx = Rando::Context::GetInstance(); + std::vector locations = FindItemsAndMarkHinted(items, hintChecks); + std::vector areas = {}; + for (auto loc : locations) { + areas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); } - } + ctx->AddHint(hintKey, Hint(hintKey, HINT_TYPE_AREA, hintTextKeys, locations, areas, {}, yourPocket)); } -void CreateStaticHints(){ - CreateChildAltarHint(); - CreateAdultAltarHint(); - CreateGanondorfJoke(); - CreateGanondorfHint(); - for (auto[hint, staticData] : StaticData::staticHintInfoMap){ - CreateStaticHintFromData(hint, staticData); - } +void CreateGanondorfJoke() { + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(RH_GANONDORF_JOKE)->IsEnabled()) { + ctx->AddHint(RH_GANONDORF_JOKE, Hint(RH_GANONDORF_JOKE, HINT_TYPE_HINT_KEY, { GetRandomGanonJoke() })); + } } -void CreateAllHints(){ - auto ctx = Rando::Context::GetInstance(); - - CreateStaticHints(); - - if (ctx->GetOption(RSK_GOSSIP_STONE_HINTS).IsNot(RO_GOSSIP_STONES_NONE)) { - SPDLOG_INFO("Creating Hints..."); - CreateStoneHints(); - SPDLOG_INFO("Creating Hints Done"); - } +void CreateGanondorfHint() { + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_GANONDORF_HINT) && !ctx->GetHint(RH_GANONDORF_HINT)->IsEnabled()) { + if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD) && ctx->GetOption(RSK_STARTING_MASTER_SWORD).Is(RO_GENERIC_OFF)) { + CreateStaticItemHint( + RH_GANONDORF_HINT, + { RHT_GANONDORF_HINT_LA_ONLY, RHT_GANONDORF_HINT_MS_ONLY, RHT_GANONDORF_HINT_LA_AND_MS }, + { RG_LIGHT_ARROWS, RG_MASTER_SWORD }, { RC_GANONDORF_HINT }, true); + } else { + CreateStaticItemHint(RH_GANONDORF_HINT, { RHT_GANONDORF_HINT_LA_ONLY }, { RG_LIGHT_ARROWS }, + { RC_GANONDORF_HINT }, true); + } + } +} + +void CreateStaticHints() { + CreateChildAltarHint(); + CreateAdultAltarHint(); + CreateGanondorfJoke(); + CreateGanondorfHint(); + for (auto [hint, staticData] : StaticData::staticHintInfoMap) { + CreateStaticHintFromData(hint, staticData); + } +} + +void CreateAllHints() { + auto ctx = Rando::Context::GetInstance(); + + CreateStaticHints(); + + if (ctx->GetOption(RSK_GOSSIP_STONE_HINTS).IsNot(RO_GOSSIP_STONES_NONE)) { + SPDLOG_INFO("Creating Hints..."); + CreateStoneHints(); + SPDLOG_INFO("Creating Hints Done"); + } } diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.hpp b/soh/soh/Enhancements/randomizer/3drando/hints.hpp index 9199c6c818..365904274f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.hpp @@ -11,62 +11,64 @@ #include "../../custom-message/CustomMessageManager.h" struct HintDistributionSetting { - std::string name; - HintType type; - uint32_t weight; - uint8_t fixed; - uint8_t copies; - std::function filter; - uint8_t dungeonLimit; + std::string name; + HintType type; + uint32_t weight; + uint8_t fixed; + uint8_t copies; + std::function filter; + uint8_t dungeonLimit; - HintDistributionSetting(std::string _name, HintType _type, uint32_t _weight, uint8_t _fixed, uint8_t _copies, - std::function _filter, uint8_t _dungeonLimit = 40); + HintDistributionSetting(std::string _name, HintType _type, uint32_t _weight, uint8_t _fixed, uint8_t _copies, + std::function _filter, uint8_t _dungeonLimit = 40); }; struct HintSetting { - uint8_t alwaysCopies; - uint8_t trialCopies; - uint8_t junkWeight; - std::vector distTable; + uint8_t alwaysCopies; + uint8_t trialCopies; + uint8_t junkWeight; + std::vector distTable; }; class HintText { -public: + public: HintText() = default; - HintText(CustomMessage clearText_, std::vector ambiguousText_ = {}, std::vector obscureText_ = {}); + HintText(CustomMessage clearText_, std::vector ambiguousText_ = {}, + std::vector obscureText_ = {}); const CustomMessage& GetClear() const; const CustomMessage& GetObscure() const; - const CustomMessage& GetObscure(uint8_t selection) const; + const CustomMessage& GetObscure(size_t selection) const; const CustomMessage& GetAmbiguous() const; - const CustomMessage& GetAmbiguous(uint8_t selection) const; - uint8_t GetAmbiguousSize() const; - uint8_t GetObscureSize() const; - const CustomMessage& GetHintMessage(uint8_t selection = 0) const; + const CustomMessage& GetAmbiguous(size_t selection) const; + size_t GetAmbiguousSize() const; + size_t GetObscureSize() const; + const CustomMessage& GetHintMessage(size_t selection = 0) const; const CustomMessage GetMessageCopy() const; bool operator==(const HintText& right) const; bool operator!=(const HintText& right) const; -private: + private: CustomMessage clearText; std::vector ambiguousText = {}; std::vector obscureText = {}; }; -struct StaticHintInfo{ - HintType type; - std::vector hintKeys; - RandomizerSettingKey setting; - std::variant condition; - std::vector targetChecks; - std::vector targetItems; - std::vector hintChecks; - bool yourPocket; - int num; +struct StaticHintInfo { + HintType type; + std::vector hintKeys; + RandomizerSettingKey setting; + std::variant condition; + std::vector targetChecks; + std::vector targetItems; + std::vector hintChecks; + bool yourPocket; + int num; - StaticHintInfo() = default; - StaticHintInfo(HintType _type, std::vector _hintKeys, RandomizerSettingKey _setting, std::variant _condition, - std::vector _targetChecks, std::vector _targetItems = {}, - std::vector _hintChecks = {}, bool _yourPocket = false, int _num = 0); + StaticHintInfo() = default; + StaticHintInfo(HintType _type, std::vector _hintKeys, RandomizerSettingKey _setting, + std::variant _condition, std::vector _targetChecks, + std::vector _targetItems = {}, std::vector _hintChecks = {}, + bool _yourPocket = false, int _num = 0); }; RandomizerHintTextKey GetRandomJunkHint(); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index ac79e860aa..c97ae35ce1 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -13,1359 +13,1269 @@ std::vector ItemPool = {}; std::vector PendingJunkPool = {}; const std::array dungeonRewards = { - RG_KOKIRI_EMERALD, - RG_GORON_RUBY, - RG_ZORA_SAPPHIRE, - RG_FOREST_MEDALLION, - RG_FIRE_MEDALLION, - RG_WATER_MEDALLION, - RG_SPIRIT_MEDALLION, - RG_SHADOW_MEDALLION, - RG_LIGHT_MEDALLION, + RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, + RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION, RG_LIGHT_MEDALLION, }; const std::array JunkPoolItems = { - RG_BOMBS_5, - RG_BOMBS_10, - RG_BOMBS_20, - RG_DEKU_NUTS_5, - RG_DEKU_STICK_1, - RG_DEKU_SEEDS_30, - RG_RECOVERY_HEART, - RG_ARROWS_5, - RG_ARROWS_10, - RG_ARROWS_30, - RG_BLUE_RUPEE, - RG_RED_RUPEE, - RG_PURPLE_RUPEE, - RG_HUGE_RUPEE, - RG_DEKU_NUTS_10, - RG_ICE_TRAP, + RG_BOMBS_5, RG_BOMBS_10, RG_BOMBS_20, RG_DEKU_NUTS_5, RG_DEKU_STICK_1, RG_DEKU_SEEDS_30, + RG_RECOVERY_HEART, RG_ARROWS_5, RG_ARROWS_10, RG_ARROWS_30, RG_BLUE_RUPEE, RG_RED_RUPEE, + RG_PURPLE_RUPEE, RG_HUGE_RUPEE, RG_DEKU_NUTS_10, RG_ICE_TRAP, }; const std::array alwaysItems = { - RG_BIGGORON_SWORD, - RG_BOOMERANG, - RG_LENS_OF_TRUTH, - RG_MEGATON_HAMMER, - RG_IRON_BOOTS, - RG_GORON_TUNIC, - RG_ZORA_TUNIC, - RG_HOVER_BOOTS, - RG_MIRROR_SHIELD, - RG_STONE_OF_AGONY, - RG_FIRE_ARROWS, - RG_ICE_ARROWS, - RG_LIGHT_ARROWS, - RG_DINS_FIRE, - RG_FARORES_WIND, - RG_NAYRUS_LOVE, - RG_GREG_RUPEE, - RG_PROGRESSIVE_HOOKSHOT, //2 progressive hookshots - RG_PROGRESSIVE_HOOKSHOT, - RG_DEKU_SHIELD, - RG_HYLIAN_SHIELD, - RG_PROGRESSIVE_STRENGTH, //3 progressive strength upgrades - RG_PROGRESSIVE_STRENGTH, - RG_PROGRESSIVE_STRENGTH, - RG_PROGRESSIVE_SCALE, //2 progressive scales - RG_PROGRESSIVE_SCALE, - RG_PROGRESSIVE_BOW, //3 progressive Bows - RG_PROGRESSIVE_BOW, - RG_PROGRESSIVE_BOW, - RG_PROGRESSIVE_SLINGSHOT, //3 progressive bullet bags - RG_PROGRESSIVE_SLINGSHOT, - RG_PROGRESSIVE_SLINGSHOT, - RG_PROGRESSIVE_BOMB_BAG, //3 progressive bomb bags - RG_PROGRESSIVE_BOMB_BAG, - RG_PROGRESSIVE_BOMB_BAG, - RG_PROGRESSIVE_WALLET, //2 progressive wallets - RG_PROGRESSIVE_WALLET, - RG_PROGRESSIVE_MAGIC_METER, //2 progressive magic meters - RG_PROGRESSIVE_MAGIC_METER, - RG_DOUBLE_DEFENSE, - RG_PROGRESSIVE_STICK_UPGRADE, //2 stick upgrades - RG_PROGRESSIVE_STICK_UPGRADE, - RG_PROGRESSIVE_NUT_UPGRADE, //2 nut upgrades - RG_PROGRESSIVE_NUT_UPGRADE, - RG_RECOVERY_HEART, //6 recovery hearts - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_BOMBS_5, //2 - RG_BOMBS_5, - RG_BOMBS_10, - RG_BOMBS_20, - RG_ARROWS_5, - RG_ARROWS_10, //5 - RG_ARROWS_10, - RG_ARROWS_10, - RG_TREASURE_GAME_HEART, -}; -const std::array easyItems = { - RG_BIGGORON_SWORD, - RG_KOKIRI_SWORD, - RG_MASTER_SWORD, - RG_BOOMERANG, - RG_LENS_OF_TRUTH, - RG_MEGATON_HAMMER, - RG_IRON_BOOTS, - RG_GORON_TUNIC, - RG_ZORA_TUNIC, - RG_HOVER_BOOTS, - RG_MIRROR_SHIELD, - RG_FIRE_ARROWS, - RG_LIGHT_ARROWS, - RG_DINS_FIRE, - RG_PROGRESSIVE_HOOKSHOT, - RG_PROGRESSIVE_STRENGTH, - RG_PROGRESSIVE_SCALE, - RG_PROGRESSIVE_WALLET, - RG_PROGRESSIVE_MAGIC_METER, - RG_PROGRESSIVE_STICK_UPGRADE, - RG_PROGRESSIVE_NUT_UPGRADE, - RG_PROGRESSIVE_BOW, - RG_PROGRESSIVE_SLINGSHOT, - RG_PROGRESSIVE_BOMB_BAG, - RG_DOUBLE_DEFENSE, - RG_HEART_CONTAINER, //16 Heart Containers - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_PIECE_OF_HEART, //3 heart pieces - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, -}; -const std::array normalItems = { - RG_PIECE_OF_HEART, //35 pieces of heart - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_HEART_CONTAINER, //8 heart containers - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, -}; -const std::array DT_Vanilla = { - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, -}; -const std::array DT_MQ = { - RG_DEKU_SHIELD, - RG_DEKU_SHIELD, - RG_PURPLE_RUPEE, -}; -const std::array DC_Vanilla = { - RG_RED_RUPEE, -}; -const std::array DC_MQ = { - RG_HYLIAN_SHIELD, - RG_BLUE_RUPEE, -}; -const std::array JB_MQ = { - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_RECOVERY_HEART, - RG_DEKU_SHIELD, - RG_DEKU_STICK_1, -}; -const std::array FoT_Vanilla = { - RG_RECOVERY_HEART, - RG_ARROWS_10, - RG_ARROWS_30, -}; -const std::array FoT_MQ = { - RG_ARROWS_5, -}; -const std::array FiT_Vanilla = { - RG_HUGE_RUPEE, -}; -const std::array FiT_MQ = { - RG_BOMBS_20, - RG_HYLIAN_SHIELD, -}; -const std::array SpT_Vanilla = { - RG_DEKU_SHIELD, - RG_DEKU_SHIELD, - RG_RECOVERY_HEART, - RG_BOMBS_20, -}; -const std::array SpT_MQ = { - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_ARROWS_30, -}; -const std::array ShT_Vanilla = { - RG_ARROWS_30, -}; -const std::array ShT_MQ = { - RG_ARROWS_5, - RG_ARROWS_5, - RG_RED_RUPEE, -}; -const std::array BW_Vanilla = { - RG_RECOVERY_HEART, - RG_BOMBS_10, - RG_HUGE_RUPEE, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_10, - RG_DEKU_SHIELD, - RG_HYLIAN_SHIELD, -}; -const std::array GTG_Vanilla = { - RG_ARROWS_30, - RG_ARROWS_30, - RG_ARROWS_30, - RG_HUGE_RUPEE, -}; -const std::array GTG_MQ = { - RG_TREASURE_GAME_GREEN_RUPEE, - RG_TREASURE_GAME_GREEN_RUPEE, - RG_ARROWS_10, - RG_GREEN_RUPEE, - RG_PURPLE_RUPEE, -}; -const std::array GC_Vanilla = { - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_ARROWS_30, -}; -const std::array GC_MQ = { - RG_ARROWS_10, - RG_ARROWS_10, - RG_BOMBS_5, - RG_RED_RUPEE, - RG_RECOVERY_HEART, -}; -const std::array normalBottles = { - RG_EMPTY_BOTTLE, - RG_BOTTLE_WITH_MILK, - RG_BOTTLE_WITH_RED_POTION, - RG_BOTTLE_WITH_GREEN_POTION, - RG_BOTTLE_WITH_BLUE_POTION, - RG_BOTTLE_WITH_FAIRY, - RG_BOTTLE_WITH_FISH, - RG_BOTTLE_WITH_BUGS, - RG_BOTTLE_WITH_POE, - RG_BOTTLE_WITH_BIG_POE, - RG_BOTTLE_WITH_BLUE_FIRE, -}; -const std::array normalRupees = { - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, -}; -const std::array shopsanityRupees = { - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, -}; -const std::array dekuScrubItems = { - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_STICK_1, - RG_BOMBS_5, - RG_BOMBS_5, - RG_BOMBS_5, - RG_BOMBS_5, - RG_BOMBS_5, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, -}; -const std::array songList = { - RG_ZELDAS_LULLABY, - RG_EPONAS_SONG, - RG_SUNS_SONG, - RG_SARIAS_SONG, - RG_SONG_OF_TIME, - RG_SONG_OF_STORMS, - RG_MINUET_OF_FOREST, - RG_PRELUDE_OF_LIGHT, - RG_BOLERO_OF_FIRE, - RG_SERENADE_OF_WATER, - RG_NOCTURNE_OF_SHADOW, - RG_REQUIEM_OF_SPIRIT, -}; -const std::array tradeItems = { - RG_POCKET_EGG, - //RG_POCKET_CUCCO, - RG_COJIRO, - RG_ODD_MUSHROOM, - RG_POACHERS_SAW, - RG_BROKEN_SWORD, - RG_PRESCRIPTION, - RG_EYEBALL_FROG, - RG_EYEDROPS, - RG_CLAIM_CHECK, -}; - -void AddItemToPool(std::vector& pool, RandomizerGet item, size_t count /*= 1*/) { - pool.insert(pool.end(), count, item); -} - -template -static void AddItemsToPool(std::vector& toPool, const FromPool& fromPool) { - AddElementsToPool(toPool, fromPool); -} - -static void AddItemToMainPool(const RandomizerGet item, size_t count = 1) { - ItemPool.insert(ItemPool.end(), count, item); -} - -static void AddRandomBottle(std::vector& bottlePool) { - AddItemToMainPool(RandomElement(bottlePool, true)); -} - -RandomizerGet GetJunkItem() { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_MAYHEM) || ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_ONSLAUGHT)) { - return RG_ICE_TRAP; - } else if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_EXTRA)) { - return RandomElement(JunkPoolItems); - } - //Ice Trap is the last item in JunkPoolItems, so subtract 1 to never hit that index - uint8_t idx = Random(0, JunkPoolItems.size() - 1); - return JunkPoolItems[idx]; -} - -static RandomizerGet GetPendingJunkItem() { - if (PendingJunkPool.empty()) { - return GetJunkItem(); - } - - return RandomElement(PendingJunkPool, true); -} - -//Replace junk items in the pool with pending junk -static void ReplaceMaxItem(const RandomizerGet itemToReplace, int max) { - int itemCount = 0; - for (size_t i = 0; i < ItemPool.size(); i++) { - if (ItemPool[i] == itemToReplace) { - if (itemCount >= max) { - ItemPool[i] = GetJunkItem(); - } - itemCount++; - } - } -} - -void PlaceJunkInExcludedLocation(const RandomizerCheck il) { - //place a non-advancement item in this location - auto ctx = Rando::Context::GetInstance(); - for (size_t i = 0; i < ItemPool.size(); i++) { - if (!Rando::StaticData::RetrieveItem(ItemPool[i]).IsAdvancement()) { - ctx->PlaceItemInLocation(il, ItemPool[i]); - ItemPool.erase(ItemPool.begin() + i); - return; - } - } - SPDLOG_ERROR("ERROR: No Junk to Place!!!"); -} - -static void PlaceVanillaMapsAndCompasses() { - auto ctx = Rando::Context::GetInstance(); - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - dungeon->PlaceVanillaMap(); - dungeon->PlaceVanillaCompass(); - } -} - -static void PlaceVanillaSmallKeys() { - auto ctx = Rando::Context::GetInstance(); - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - dungeon->PlaceVanillaSmallKeys(); - } -} - -static void PlaceVanillaBossKeys() { - auto ctx = Rando::Context::GetInstance(); - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - dungeon->PlaceVanillaBossKey(); - } -} - -static void PlaceItemsForType(RandomizerCheckType rctype, bool overworldActive, bool dungeonActive) { - if (!(overworldActive || dungeonActive)) { - return; - } - for (RandomizerCheck rc : ctx->GetLocations(ctx->allLocations, rctype)) { - auto loc = Rando::StaticData::GetLocation(rc); - - // If item is in the overworld and shuffled, add its item to the pool - if (loc->IsOverworld()) { - if (overworldActive) { - AddItemToMainPool(loc->GetVanillaItem()); - } - } else { - if (dungeonActive) { - // If the same in MQ and vanilla, add. - RandomizerCheckQuest currentQuest = loc->GetQuest(); - if (currentQuest == RCQUEST_BOTH) { - AddItemToMainPool(loc->GetVanillaItem()); - } else { - // Check if current item's dungeon is vanilla or MQ, and only add if quest corresponds to it. - SceneID itemScene = loc->GetScene(); - - if (itemScene >= SCENE_DEKU_TREE && itemScene <= SCENE_GERUDO_TRAINING_GROUND) { - bool isMQ = ctx->GetDungeon(itemScene)->IsMQ(); - - if ((isMQ && currentQuest == RCQUEST_MQ) || (!isMQ && currentQuest == RCQUEST_VANILLA)) { - AddItemToMainPool(loc->GetVanillaItem()); - } - } - } - } - } - } -} - -static void SetScarceItemPool() { - ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 3); - ReplaceMaxItem(RG_BOMBCHU_5, 1); - ReplaceMaxItem(RG_BOMBCHU_10, 2); - ReplaceMaxItem(RG_BOMBCHU_20, 0); - ReplaceMaxItem(RG_PROGRESSIVE_MAGIC_METER, 1); - ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); - ReplaceMaxItem(RG_PROGRESSIVE_STICK_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG) ? 2 : 1); - ReplaceMaxItem(RG_PROGRESSIVE_NUT_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG) ? 2 : 1); - ReplaceMaxItem(RG_PROGRESSIVE_BOW, 2); - ReplaceMaxItem(RG_PROGRESSIVE_SLINGSHOT, 2); - ReplaceMaxItem(RG_PROGRESSIVE_BOMB_BAG, 2); - ReplaceMaxItem(RG_HEART_CONTAINER, 0); -} - -static void SetMinimalItemPool() { - auto ctx = Rando::Context::GetInstance(); - ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 1); - ReplaceMaxItem(RG_BOMBCHU_5, 1); - ReplaceMaxItem(RG_BOMBCHU_10, 0); - ReplaceMaxItem(RG_BOMBCHU_20, 0); - ReplaceMaxItem(RG_NAYRUS_LOVE, 0); - ReplaceMaxItem(RG_PROGRESSIVE_MAGIC_METER, 1); - ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); - ReplaceMaxItem(RG_PROGRESSIVE_STICK_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG) ? 1 : 0); - ReplaceMaxItem(RG_PROGRESSIVE_NUT_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG) ? 1 : 0); - ReplaceMaxItem(RG_PROGRESSIVE_BOW, 1); - ReplaceMaxItem(RG_PROGRESSIVE_SLINGSHOT, 1); - ReplaceMaxItem(RG_PROGRESSIVE_BOMB_BAG, 1); - ReplaceMaxItem(RG_PIECE_OF_HEART, 0); - // Need an extra heart container when starting with 1 heart to be able to reach 3 hearts - ReplaceMaxItem(RG_HEART_CONTAINER, (ctx->GetOption(RSK_STARTING_HEARTS).Get() == 18)? 1 : 0); -} - -void GenerateItemPool() { - //RANDOTODO proper removal of items not in pool or logically relevant instead of dummy checks. - auto ctx = Rando::Context::GetInstance(); - ItemPool.clear(); - PendingJunkPool.clear(); - - //Initialize ice trap models to always major items - ctx->possibleIceTrapModels = { - RG_MIRROR_SHIELD, + RG_BIGGORON_SWORD, RG_BOOMERANG, RG_LENS_OF_TRUTH, RG_MEGATON_HAMMER, RG_IRON_BOOTS, + RG_GORON_TUNIC, + RG_ZORA_TUNIC, RG_HOVER_BOOTS, + RG_MIRROR_SHIELD, RG_STONE_OF_AGONY, - RG_DINS_FIRE, - RG_FARORES_WIND, - RG_NAYRUS_LOVE, RG_FIRE_ARROWS, RG_ICE_ARROWS, RG_LIGHT_ARROWS, + RG_DINS_FIRE, + RG_FARORES_WIND, + RG_NAYRUS_LOVE, + RG_GREG_RUPEE, + RG_PROGRESSIVE_HOOKSHOT, // 2 progressive hookshots + RG_PROGRESSIVE_HOOKSHOT, + RG_DEKU_SHIELD, + RG_HYLIAN_SHIELD, + RG_PROGRESSIVE_STRENGTH, // 3 progressive strength upgrades + RG_PROGRESSIVE_STRENGTH, + RG_PROGRESSIVE_STRENGTH, + RG_PROGRESSIVE_SCALE, // 2 progressive scales + RG_PROGRESSIVE_SCALE, + RG_PROGRESSIVE_BOW, // 3 progressive Bows + RG_PROGRESSIVE_BOW, + RG_PROGRESSIVE_BOW, + RG_PROGRESSIVE_SLINGSHOT, // 3 progressive bullet bags + RG_PROGRESSIVE_SLINGSHOT, + RG_PROGRESSIVE_SLINGSHOT, + RG_PROGRESSIVE_BOMB_BAG, // 3 progressive bomb bags + RG_PROGRESSIVE_BOMB_BAG, + RG_PROGRESSIVE_BOMB_BAG, + RG_PROGRESSIVE_WALLET, // 2 progressive wallets + RG_PROGRESSIVE_WALLET, + RG_PROGRESSIVE_MAGIC_METER, // 2 progressive magic meters + RG_PROGRESSIVE_MAGIC_METER, RG_DOUBLE_DEFENSE, - RG_CLAIM_CHECK, + RG_PROGRESSIVE_STICK_UPGRADE, // 2 stick upgrades + RG_PROGRESSIVE_STICK_UPGRADE, + RG_PROGRESSIVE_NUT_UPGRADE, // 2 nut upgrades + RG_PROGRESSIVE_NUT_UPGRADE, + RG_RECOVERY_HEART, // 6 recovery hearts + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_BOMBS_5, // 2 + RG_BOMBS_5, + RG_BOMBS_10, + RG_BOMBS_20, + RG_ARROWS_5, + RG_ARROWS_10, // 5 + RG_ARROWS_10, + RG_ARROWS_10, + RG_TREASURE_GAME_HEART, +}; +const std::array easyItems = { + RG_BIGGORON_SWORD, + RG_KOKIRI_SWORD, + RG_MASTER_SWORD, + RG_BOOMERANG, + RG_LENS_OF_TRUTH, + RG_MEGATON_HAMMER, + RG_IRON_BOOTS, + RG_GORON_TUNIC, + RG_ZORA_TUNIC, + RG_HOVER_BOOTS, + RG_MIRROR_SHIELD, + RG_FIRE_ARROWS, + RG_LIGHT_ARROWS, + RG_DINS_FIRE, RG_PROGRESSIVE_HOOKSHOT, RG_PROGRESSIVE_STRENGTH, - RG_PROGRESSIVE_BOMB_BAG, + RG_PROGRESSIVE_SCALE, + RG_PROGRESSIVE_WALLET, + RG_PROGRESSIVE_MAGIC_METER, + RG_PROGRESSIVE_STICK_UPGRADE, + RG_PROGRESSIVE_NUT_UPGRADE, RG_PROGRESSIVE_BOW, RG_PROGRESSIVE_SLINGSHOT, - RG_PROGRESSIVE_WALLET, - RG_PROGRESSIVE_SCALE, - RG_PROGRESSIVE_MAGIC_METER, - }; - //Check song shuffle and dungeon reward shuffle just for ice traps - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_ANYWHERE)) { - //Push item ids for songs - ctx->possibleIceTrapModels.push_back(RG_ZELDAS_LULLABY); - ctx->possibleIceTrapModels.push_back(RG_EPONAS_SONG); - ctx->possibleIceTrapModels.push_back(RG_SARIAS_SONG); - ctx->possibleIceTrapModels.push_back(RG_SUNS_SONG); - ctx->possibleIceTrapModels.push_back(RG_SONG_OF_TIME); - ctx->possibleIceTrapModels.push_back(RG_SONG_OF_STORMS); - ctx->possibleIceTrapModels.push_back(RG_MINUET_OF_FOREST); - ctx->possibleIceTrapModels.push_back(RG_BOLERO_OF_FIRE); - ctx->possibleIceTrapModels.push_back(RG_SERENADE_OF_WATER); - ctx->possibleIceTrapModels.push_back(RG_REQUIEM_OF_SPIRIT); - ctx->possibleIceTrapModels.push_back(RG_NOCTURNE_OF_SHADOW); - ctx->possibleIceTrapModels.push_back(RG_PRELUDE_OF_LIGHT); - } - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_ANYWHERE)) { - //Push item ids for dungeon rewards - ctx->possibleIceTrapModels.push_back(RG_KOKIRI_EMERALD); - ctx->possibleIceTrapModels.push_back(RG_GORON_RUBY); - ctx->possibleIceTrapModels.push_back(RG_ZORA_SAPPHIRE); - ctx->possibleIceTrapModels.push_back(RG_FOREST_MEDALLION); - ctx->possibleIceTrapModels.push_back(RG_FIRE_MEDALLION); - ctx->possibleIceTrapModels.push_back(RG_WATER_MEDALLION); - ctx->possibleIceTrapModels.push_back(RG_SPIRIT_MEDALLION); - ctx->possibleIceTrapModels.push_back(RG_SHADOW_MEDALLION); - ctx->possibleIceTrapModels.push_back(RG_LIGHT_MEDALLION); - } + RG_PROGRESSIVE_BOMB_BAG, + RG_DOUBLE_DEFENSE, + RG_HEART_CONTAINER, // 16 Heart Containers + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_PIECE_OF_HEART, // 3 heart pieces + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, +}; +const std::array normalItems = { + // 35 pieces of heart + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + // 8 heart containers + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, +}; +const std::array DT_Vanilla = { + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, +}; +const std::array DT_MQ = { + RG_DEKU_SHIELD, + RG_DEKU_SHIELD, + RG_PURPLE_RUPEE, +}; +const std::array DC_Vanilla = { + RG_RED_RUPEE, +}; +const std::array DC_MQ = { + RG_HYLIAN_SHIELD, + RG_BLUE_RUPEE, +}; +const std::array JB_MQ = { + RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_RECOVERY_HEART, RG_DEKU_SHIELD, RG_DEKU_STICK_1, +}; +const std::array FoT_Vanilla = { + RG_RECOVERY_HEART, + RG_ARROWS_10, + RG_ARROWS_30, +}; +const std::array FoT_MQ = { + RG_ARROWS_5, +}; +const std::array FiT_Vanilla = { + RG_HUGE_RUPEE, +}; +const std::array FiT_MQ = { + RG_BOMBS_20, + RG_HYLIAN_SHIELD, +}; +const std::array SpT_Vanilla = { + RG_DEKU_SHIELD, + RG_DEKU_SHIELD, + RG_RECOVERY_HEART, + RG_BOMBS_20, +}; +const std::array SpT_MQ = { + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_ARROWS_30, +}; +const std::array ShT_Vanilla = { + RG_ARROWS_30, +}; +const std::array ShT_MQ = { + RG_ARROWS_5, + RG_ARROWS_5, + RG_RED_RUPEE, +}; +const std::array BW_Vanilla = { + RG_RECOVERY_HEART, RG_BOMBS_10, RG_HUGE_RUPEE, RG_DEKU_NUTS_5, RG_DEKU_NUTS_10, RG_DEKU_SHIELD, RG_HYLIAN_SHIELD, +}; +const std::array GTG_Vanilla = { + RG_ARROWS_30, + RG_ARROWS_30, + RG_ARROWS_30, + RG_HUGE_RUPEE, +}; +const std::array GTG_MQ = { + RG_TREASURE_GAME_GREEN_RUPEE, RG_TREASURE_GAME_GREEN_RUPEE, RG_ARROWS_10, RG_GREEN_RUPEE, RG_PURPLE_RUPEE, +}; +const std::array GC_Vanilla = { + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_ARROWS_30, +}; +const std::array GC_MQ = { + RG_ARROWS_10, RG_ARROWS_10, RG_BOMBS_5, RG_RED_RUPEE, RG_RECOVERY_HEART, +}; +const std::array normalBottles = { + RG_EMPTY_BOTTLE, + RG_BOTTLE_WITH_MILK, + RG_BOTTLE_WITH_RED_POTION, + RG_BOTTLE_WITH_GREEN_POTION, + RG_BOTTLE_WITH_BLUE_POTION, + RG_BOTTLE_WITH_FAIRY, + RG_BOTTLE_WITH_FISH, + RG_BOTTLE_WITH_BUGS, + RG_BOTTLE_WITH_POE, + RG_BOTTLE_WITH_BIG_POE, + RG_BOTTLE_WITH_BLUE_FIRE, +}; +const std::array normalRupees = { + RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, + RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, + RG_BLUE_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, + RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, RG_HUGE_RUPEE, RG_HUGE_RUPEE, RG_HUGE_RUPEE, +}; +const std::array shopsanityRupees = { + RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, + RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, + RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_HUGE_RUPEE, RG_HUGE_RUPEE, + RG_HUGE_RUPEE, RG_HUGE_RUPEE, RG_HUGE_RUPEE, RG_HUGE_RUPEE, +}; +const std::array dekuScrubItems = { + RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, + RG_DEKU_STICK_1, RG_BOMBS_5, RG_BOMBS_5, RG_BOMBS_5, RG_BOMBS_5, + RG_BOMBS_5, RG_RECOVERY_HEART, RG_RECOVERY_HEART, RG_RECOVERY_HEART, RG_RECOVERY_HEART, + RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, +}; +const std::array songList = { + RG_ZELDAS_LULLABY, RG_EPONAS_SONG, RG_SUNS_SONG, RG_SARIAS_SONG, + RG_SONG_OF_TIME, RG_SONG_OF_STORMS, RG_MINUET_OF_FOREST, RG_PRELUDE_OF_LIGHT, + RG_BOLERO_OF_FIRE, RG_SERENADE_OF_WATER, RG_NOCTURNE_OF_SHADOW, RG_REQUIEM_OF_SPIRIT, +}; +const std::array tradeItems = { + RG_POCKET_EGG, + // RG_POCKET_CUCCO, + RG_COJIRO, + RG_ODD_MUSHROOM, + RG_POACHERS_SAW, + RG_BROKEN_SWORD, + RG_PRESCRIPTION, + RG_EYEBALL_FROG, + RG_EYEDROPS, + RG_CLAIM_CHECK, +}; - if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { - ctx->possibleIceTrapModels.push_back(RG_TRIFORCE_PIECE); - AddItemToMainPool(RG_TRIFORCE_PIECE, (ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_TOTAL).Get() + 1)); - ctx->PlaceItemInLocation(RC_TRIFORCE_COMPLETED, RG_TRIFORCE); // Win condition - ctx->PlaceItemInLocation(RC_GANON, GetJunkItem(), false, true); - } else { - ctx->PlaceItemInLocation(RC_GANON, RG_TRIFORCE); // Win condition - } +void AddItemToPool(std::vector& pool, RandomizerGet item, size_t count /*= 1*/) { + pool.insert(pool.end(), count, item); +} - //Fixed item locations - ctx->PlaceItemInLocation(RC_HC_ZELDAS_LETTER, RG_ZELDAS_LETTER); +template static void AddItemsToPool(std::vector& toPool, const FromPool& fromPool) { + AddElementsToPool(toPool, fromPool); +} - if (ctx->GetOption(RSK_SHUFFLE_KOKIRI_SWORD)) { - AddItemToMainPool(RG_KOKIRI_SWORD); - ctx->possibleIceTrapModels.push_back(RG_KOKIRI_SWORD); - } else { - if (!ctx->GetOption(RSK_STARTING_KOKIRI_SWORD)) { - ctx->PlaceItemInLocation(RC_KF_KOKIRI_SWORD_CHEST, RG_KOKIRI_SWORD, false, true); - } - } +static void AddItemToMainPool(const RandomizerGet item, size_t count = 1) { + ItemPool.insert(ItemPool.end(), count, item); +} - if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { - AddItemToMainPool(RG_MASTER_SWORD); - ctx->possibleIceTrapModels.push_back(RG_MASTER_SWORD); - } else { - if (!ctx->GetOption(RSK_STARTING_MASTER_SWORD)) { - ctx->PlaceItemInLocation(RC_TOT_MASTER_SWORD, RG_MASTER_SWORD, false, true); - } - } +static void AddRandomBottle(std::vector& bottlePool) { + AddItemToMainPool(RandomElement(bottlePool, true)); +} - if (ctx->GetOption(RSK_SHUFFLE_WEIRD_EGG)) { - AddItemToMainPool(RG_WEIRD_EGG); - ctx->possibleIceTrapModels.push_back(RG_WEIRD_EGG); - } else { - ctx->PlaceItemInLocation(RC_HC_MALON_EGG, RG_WEIRD_EGG, false, true); - } - - if (ctx->GetOption(RSK_SHUFFLE_OCARINA)) { - AddItemToMainPool(RG_PROGRESSIVE_OCARINA, 2); - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - AddItemToPool(PendingJunkPool, RG_PROGRESSIVE_OCARINA); +RandomizerGet GetJunkItem() { + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_MAYHEM) || + ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_ONSLAUGHT)) { + return RG_ICE_TRAP; + } else if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_EXTRA)) { + return RandomElement(JunkPoolItems); } - ctx->possibleIceTrapModels.push_back(RG_PROGRESSIVE_OCARINA); - } else { - if (ctx->GetOption(RSK_STARTING_OCARINA).Is(RO_STARTING_OCARINA_OFF)) { - ctx->PlaceItemInLocation(RC_LW_GIFT_FROM_SARIA, RG_PROGRESSIVE_OCARINA, false, true); - ctx->PlaceItemInLocation(RC_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, false, true); - } else { - if (ctx->GetOption(RSK_STARTING_OCARINA).IsNot(RO_STARTING_OCARINA_TIME)) { - ctx->PlaceItemInLocation(RC_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, false, true); - } - } - } + // Ice Trap is the last item in JunkPoolItems, so subtract 1 to never hit that index + uint8_t idx = Random(0, static_cast(JunkPoolItems.size()) - 1); + return JunkPoolItems[idx]; +} - if (ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS)) { - AddItemToMainPool(RG_OCARINA_A_BUTTON); - AddItemToMainPool(RG_OCARINA_C_UP_BUTTON); - AddItemToMainPool(RG_OCARINA_C_DOWN_BUTTON); - AddItemToMainPool(RG_OCARINA_C_LEFT_BUTTON); - AddItemToMainPool(RG_OCARINA_C_RIGHT_BUTTON); - - ctx->possibleIceTrapModels.push_back(RG_OCARINA_A_BUTTON); - ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_UP_BUTTON); - ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_DOWN_BUTTON); - ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_LEFT_BUTTON); - ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_RIGHT_BUTTON); - } - - if (ctx->GetOption(RSK_SKELETON_KEY)) { - AddItemToMainPool(RG_SKELETON_KEY); - } - - if (ctx->GetOption(RSK_SHUFFLE_SWIM)) { - AddItemToMainPool(RG_PROGRESSIVE_SCALE); - } - - if (ctx->GetOption(RSK_SHUFFLE_BEEHIVES)) { - //32 total beehive locations - AddItemToMainPool(RG_RED_RUPEE, 23); - AddItemToMainPool(RG_BLUE_RUPEE, 9); - } - - if (ctx->GetOption(RSK_SHUFFLE_COWS)) { - //9 total cow locations - for (uint8_t i = 0; i < 9; i++) { - AddItemToMainPool(GetJunkItem()); +static RandomizerGet GetPendingJunkItem() { + if (PendingJunkPool.empty()) { + return GetJunkItem(); } - //extra location for Jabu MQ - if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsMQ()) { - AddItemToMainPool(GetJunkItem()); - } - } - // Shuffle Pots - bool overworldPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_OVERWORLD) || - ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); - bool dungeonPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_DUNGEONS) || - ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); - PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive); - - auto fsMode = ctx->GetOption(RSK_FISHSANITY); - if (fsMode.IsNot(RO_FISHSANITY_OFF)) { - if (fsMode.Is(RO_FISHSANITY_POND) || fsMode.Is(RO_FISHSANITY_BOTH)) { - // 17 max child pond fish - uint8_t pondCt = ctx->GetOption(RSK_FISHSANITY_POND_COUNT).Get(); - for (uint8_t i = 0; i < pondCt; i++) { - AddItemToMainPool(GetJunkItem()); - } + return RandomElement(PendingJunkPool, true); +} - if (ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)) { - // 16 max adult pond fish, have to reduce to 16 if every fish is enabled - if (pondCt > 16) - pondCt = 16; - for (uint8_t i = 0; i < pondCt; i++) { - AddItemToMainPool(GetJunkItem()); +// Replace junk items in the pool with pending junk +static void ReplaceMaxItem(const RandomizerGet itemToReplace, int max) { + int itemCount = 0; + for (size_t i = 0; i < ItemPool.size(); i++) { + if (ItemPool[i] == itemToReplace) { + if (itemCount >= max) { + ItemPool[i] = RG_NONE; + } + itemCount++; } - } - } - // 9 grotto fish, 5 zora's domain fish - if (fsMode.Is(RO_FISHSANITY_OVERWORLD) || fsMode.Is(RO_FISHSANITY_BOTH)) { - for (uint8_t i = 0; i < Rando::StaticData::GetOverworldFishLocations().size(); i++) - AddItemToMainPool(GetJunkItem()); } +} - if (fsMode.Is(RO_FISHSANITY_HYRULE_LOACH)) { - AddItemToMainPool(RG_PURPLE_RUPEE); - } else { - ctx->PlaceItemInLocation(RC_LH_HYRULE_LOACH, RG_PURPLE_RUPEE, false, true); - } - } - - if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE)) { - AddItemToMainPool(RG_FISHING_POLE); - ctx->possibleIceTrapModels.push_back(RG_FISHING_POLE); - } - - if (ctx->GetOption(RSK_INFINITE_UPGRADES).Is(RO_INF_UPGRADES_PROGRESSIVE)) { - AddItemToMainPool(RG_PROGRESSIVE_BOMB_BAG); - AddItemToMainPool(RG_PROGRESSIVE_BOW); - AddItemToMainPool(RG_PROGRESSIVE_NUT_UPGRADE); - AddItemToMainPool(RG_PROGRESSIVE_SLINGSHOT); - AddItemToMainPool(RG_PROGRESSIVE_STICK_UPGRADE); - AddItemToMainPool(RG_PROGRESSIVE_MAGIC_METER); - AddItemToMainPool(RG_PROGRESSIVE_WALLET); - } - - if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_BEANS_ONLY) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { - AddItemToMainPool(RG_MAGIC_BEAN_PACK); - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - AddItemToPool(PendingJunkPool, RG_MAGIC_BEAN_PACK); - } - ctx->possibleIceTrapModels.push_back(RG_MAGIC_BEAN_PACK); - } else { - ctx->PlaceItemInLocation(RC_ZR_MAGIC_BEAN_SALESMAN, RG_MAGIC_BEAN, false, true); - } - - if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { - if (/*!ProgressiveGoronSword TODO: Implement Progressive Goron Sword*/true) { - AddItemToMainPool(RG_GIANTS_KNIFE); - } - if (ctx->GetOption(RSK_BOMBCHU_BAG)) { - AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS); - } else { - AddItemToMainPool(RG_BOMBCHU_10); - } - } else { - ctx->PlaceItemInLocation(RC_KAK_GRANNYS_SHOP, RG_BLUE_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_GC_MEDIGORON, RG_GIANTS_KNIFE, false, true); - ctx->PlaceItemInLocation(RC_WASTELAND_BOMBCHU_SALESMAN, RG_BOMBCHU_10, false, true); - } - - if (ctx->GetOption(RSK_SHUFFLE_FROG_SONG_RUPEES)) { - AddItemToMainPool(RG_PURPLE_RUPEE, 5); - } else { - ctx->PlaceItemInLocation(RC_ZR_FROGS_ZELDAS_LULLABY, RG_PURPLE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZR_FROGS_EPONAS_SONG, RG_PURPLE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZR_FROGS_SARIAS_SONG, RG_PURPLE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZR_FROGS_SUNS_SONG, RG_PURPLE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZR_FROGS_SONG_OF_TIME, RG_PURPLE_RUPEE, false, true); - } - - if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)) { - AddItemToMainPool(RG_POCKET_EGG); - AddItemToMainPool(RG_COJIRO); - AddItemToMainPool(RG_ODD_MUSHROOM); - AddItemToMainPool(RG_ODD_POTION); - AddItemToMainPool(RG_POACHERS_SAW); - AddItemToMainPool(RG_BROKEN_SWORD); - AddItemToMainPool(RG_PRESCRIPTION); - AddItemToMainPool(RG_EYEBALL_FROG); - AddItemToMainPool(RG_EYEDROPS); - } - AddItemToMainPool(RG_CLAIM_CHECK); - - if (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS)) { - AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY, 6); // 6 individual keys - } else if (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK)) { - AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY); // 1 key which will behave as a pack of 6 - } else { - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RG_GREEN_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RG_GREEN_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_1, RG_TREASURE_GAME_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_2, RG_TREASURE_GAME_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_3, RG_TREASURE_GAME_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_4, RG_TREASURE_GAME_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_5, RG_TREASURE_GAME_SMALL_KEY, false, true); - }; - - if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OFF)) { - for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { - ctx->PlaceItemInLocation(loc, RG_GOLD_SKULLTULA_TOKEN, false, true); - } - } else if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_DUNGEONS)) { - for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { - if (Rando::StaticData::GetLocation(loc)->IsOverworld()) { - ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GOLD_SKULLTULA_TOKEN, false, true); - } else { - AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN); - } - } - } else if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OVERWORLD)) { - for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { - if (Rando::StaticData::GetLocation(loc)->IsDungeon()) { - ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GOLD_SKULLTULA_TOKEN, false, true); - } else { - AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN); - } - } - } else { - AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN, 100); - } - - if (ctx->GetOption(RSK_SHUFFLE_100_GS_REWARD)) { - if (ctx->GetOption(RSK_SHUFFLE_TOKENS).IsNot(RO_TOKENSANITY_OFF) && ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - AddItemToPool(PendingJunkPool, RG_GOLD_SKULLTULA_TOKEN, 10); - } - AddItemToMainPool(RG_HUGE_RUPEE); - } else { - ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_HUGE_RUPEE, false, true); - } - - if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS)) { - AddItemToMainPool(RG_GOHMA_SOUL); - AddItemToMainPool(RG_KING_DODONGO_SOUL); - AddItemToMainPool(RG_BARINADE_SOUL); - AddItemToMainPool(RG_PHANTOM_GANON_SOUL); - AddItemToMainPool(RG_VOLVAGIA_SOUL); - AddItemToMainPool(RG_MORPHA_SOUL); - AddItemToMainPool(RG_BONGO_BONGO_SOUL); - AddItemToMainPool(RG_TWINROVA_SOUL); - - ctx->possibleIceTrapModels.push_back(RG_GOHMA_SOUL); - ctx->possibleIceTrapModels.push_back(RG_KING_DODONGO_SOUL); - ctx->possibleIceTrapModels.push_back(RG_BARINADE_SOUL); - ctx->possibleIceTrapModels.push_back(RG_PHANTOM_GANON_SOUL); - ctx->possibleIceTrapModels.push_back(RG_VOLVAGIA_SOUL); - ctx->possibleIceTrapModels.push_back(RG_MORPHA_SOUL); - ctx->possibleIceTrapModels.push_back(RG_BONGO_BONGO_SOUL); - ctx->possibleIceTrapModels.push_back(RG_TWINROVA_SOUL); - if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON)) { - AddItemToMainPool(RG_GANON_SOUL); - ctx->possibleIceTrapModels.push_back(RG_GANON_SOUL); - } - } - - if (ctx->GetOption(RSK_SHUFFLE_CHILD_WALLET)) { - AddItemToMainPool(RG_PROGRESSIVE_WALLET); - } - - if (ctx->GetOption(RSK_INCLUDE_TYCOON_WALLET)) { - AddItemToMainPool(RG_PROGRESSIVE_WALLET); - } - - if (ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG)) { - AddItemToMainPool(RG_PROGRESSIVE_STICK_UPGRADE); - } - - if (ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG)) { - AddItemToMainPool(RG_PROGRESSIVE_NUT_UPGRADE); - } - - if (ctx->GetOption(RSK_BOMBCHU_BAG)) { - AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS, 5); - } else { - AddItemToMainPool(RG_BOMBCHU_5); - AddItemToMainPool(RG_BOMBCHU_10, 3); - AddItemToMainPool(RG_BOMBCHU_20); - } - - //Ice Traps - AddItemToMainPool(RG_ICE_TRAP); - if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsVanilla()) { - AddItemToMainPool(RG_ICE_TRAP); - } - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla()) { - AddItemToMainPool(RG_ICE_TRAP, 4); - } - - //Gerudo Fortress - if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE)) { - ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - } else if (ctx->GetOption(RSK_GERUDO_KEYS).IsNot(RO_GERUDO_KEYS_VANILLA)) { - if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST)) { - AddItemToMainPool(RG_GERUDO_FORTRESS_SMALL_KEY); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - } else { - //Only add key ring if 4 Fortress keys necessary - if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && ctx->GetOption(RSK_KEYRINGS)) { - AddItemToMainPool(RG_GERUDO_FORTRESS_KEY_RING); - //Add junk to make up for missing keys - for (uint8_t i = 0; i < 3; i++) { - AddItemToMainPool(GetJunkItem()); +void PlaceJunkInExcludedLocation(const RandomizerCheck il) { + // place a non-advancement item in this location + auto ctx = Rando::Context::GetInstance(); + for (size_t i = 0; i < ItemPool.size(); i++) { + if (!Rando::StaticData::RetrieveItem(ItemPool[i]).IsAdvancement()) { + ctx->PlaceItemInLocation(il, ItemPool[i]); + ItemPool.erase(ItemPool.begin() + i); + return; } - } else { - AddItemToMainPool(RG_GERUDO_FORTRESS_SMALL_KEY, 4); - } } - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && ctx->GetOption(RSK_KEYRINGS) ) { - AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_SMALL_KEY); - } - } - } else { - if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST)) { - ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - } else { - ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - } - } + SPDLOG_ERROR("ERROR: No Junk to Place!!!"); +} - //Gerudo Membership Card - if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) && ctx->GetOption(RSK_GERUDO_FORTRESS).IsNot(RO_GF_CARPENTERS_FREE)) { - AddItemToMainPool(RG_GERUDO_MEMBERSHIP_CARD); - ctx->possibleIceTrapModels.push_back(RG_GERUDO_MEMBERSHIP_CARD); - } else if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { - AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); - ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_ICE_TRAP, false, true); - } else { - ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, false, true); - } - - //Keys - - //For key rings, need to add as many junk items as "missing" keys - if (ctx->GetOption(RSK_KEYRINGS).IsNot(RO_KEYRINGS_OFF)) { - uint8_t ringJunkAmt = 0; +static void PlaceVanillaMapsAndCompasses() { + auto ctx = Rando::Context::GetInstance(); for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (dungeon->HasKeyRing()) { - ringJunkAmt += dungeon->GetSmallKeyCount() - 1; - } + dungeon->PlaceVanillaMap(); + dungeon->PlaceVanillaCompass(); } - for (uint8_t i = 0; i < ringJunkAmt; i++) { - AddItemToMainPool(GetJunkItem()); - } - } +} - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { - AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); +static void PlaceVanillaSmallKeys() { + auto ctx = Rando::Context::GetInstance(); + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + dungeon->PlaceVanillaSmallKeys(); + } +} + +static void PlaceVanillaBossKeys() { + auto ctx = Rando::Context::GetInstance(); + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + dungeon->PlaceVanillaBossKey(); + } +} + +static void PlaceItemsForType(RandomizerCheckType rctype, bool overworldActive, bool dungeonActive) { + if (!(overworldActive || dungeonActive)) { + return; + } + for (RandomizerCheck rc : ctx->GetLocations(ctx->allLocations, rctype)) { + auto loc = Rando::StaticData::GetLocation(rc); + + // If item is in the overworld and shuffled, add its item to the pool + if (loc->IsOverworld()) { + if (overworldActive) { + AddItemToMainPool(loc->GetVanillaItem()); + } + } else { + if (dungeonActive) { + // If the same in MQ and vanilla, add. + RandomizerCheckQuest currentQuest = loc->GetQuest(); + if (currentQuest == RCQUEST_BOTH) { + AddItemToMainPool(loc->GetVanillaItem()); + } else { + // Check if current item's dungeon is vanilla or MQ, and only add if quest corresponds to it. + SceneID itemScene = loc->GetScene(); + + if (itemScene >= SCENE_DEKU_TREE && itemScene <= SCENE_GERUDO_TRAINING_GROUND) { + bool isMQ = ctx->GetDungeon(itemScene)->IsMQ(); + + if ((isMQ && currentQuest == RCQUEST_MQ) || (!isMQ && currentQuest == RCQUEST_VANILLA)) { + AddItemToMainPool(loc->GetVanillaItem()); + } + } + } + } + } + } +} + +static void SetScarceItemPool() { + ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 3); + ReplaceMaxItem(RG_BOMBCHU_5, 1); + ReplaceMaxItem(RG_BOMBCHU_10, 2); + ReplaceMaxItem(RG_BOMBCHU_20, 0); + ReplaceMaxItem(RG_PROGRESSIVE_MAGIC_METER, 1); + ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); + ReplaceMaxItem(RG_PROGRESSIVE_STICK_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG) ? 2 : 1); + ReplaceMaxItem(RG_PROGRESSIVE_NUT_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG) ? 2 : 1); + ReplaceMaxItem(RG_PROGRESSIVE_BOW, 2); + ReplaceMaxItem(RG_PROGRESSIVE_SLINGSHOT, 2); + ReplaceMaxItem(RG_PROGRESSIVE_BOMB_BAG, 2); + ReplaceMaxItem(RG_HEART_CONTAINER, 0); +} + +static void SetMinimalItemPool() { + auto ctx = Rando::Context::GetInstance(); + ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 1); + ReplaceMaxItem(RG_BOMBCHU_5, 1); + ReplaceMaxItem(RG_BOMBCHU_10, 0); + ReplaceMaxItem(RG_BOMBCHU_20, 0); + ReplaceMaxItem(RG_NAYRUS_LOVE, 0); + ReplaceMaxItem(RG_PROGRESSIVE_MAGIC_METER, 1); + ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); + ReplaceMaxItem(RG_PROGRESSIVE_STICK_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG) ? 1 : 0); + ReplaceMaxItem(RG_PROGRESSIVE_NUT_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG) ? 1 : 0); + ReplaceMaxItem(RG_PROGRESSIVE_BOW, 1); + ReplaceMaxItem(RG_PROGRESSIVE_SLINGSHOT, 1); + ReplaceMaxItem(RG_PROGRESSIVE_BOMB_BAG, 1); + ReplaceMaxItem(RG_PIECE_OF_HEART, 0); + // Need an extra heart container when starting with 1 heart to be able to reach 3 hearts + ReplaceMaxItem(RG_HEART_CONTAINER, (ctx->GetOption(RSK_STARTING_HEARTS).Get() == 18) ? 1 : 0); +} + +void GenerateItemPool() { + // RANDOTODO proper removal of items not in pool or logically relevant instead of dummy checks. + auto ctx = Rando::Context::GetInstance(); + ItemPool.clear(); + PendingJunkPool.clear(); + + // Initialize ice trap models to always major items + ctx->possibleIceTrapModels = { + RG_MIRROR_SHIELD, + RG_BOOMERANG, + RG_LENS_OF_TRUTH, + RG_MEGATON_HAMMER, + RG_IRON_BOOTS, + RG_HOVER_BOOTS, + RG_STONE_OF_AGONY, + RG_DINS_FIRE, + RG_FARORES_WIND, + RG_NAYRUS_LOVE, + RG_FIRE_ARROWS, + RG_ICE_ARROWS, + RG_LIGHT_ARROWS, + RG_DOUBLE_DEFENSE, + RG_CLAIM_CHECK, + RG_PROGRESSIVE_HOOKSHOT, + RG_PROGRESSIVE_STRENGTH, + RG_PROGRESSIVE_BOMB_BAG, + RG_PROGRESSIVE_BOW, + RG_PROGRESSIVE_SLINGSHOT, + RG_PROGRESSIVE_WALLET, + RG_PROGRESSIVE_SCALE, + RG_PROGRESSIVE_MAGIC_METER, + }; + // Check song shuffle and dungeon reward shuffle just for ice traps + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_ANYWHERE)) { + // Push item ids for songs + ctx->possibleIceTrapModels.push_back(RG_ZELDAS_LULLABY); + ctx->possibleIceTrapModels.push_back(RG_EPONAS_SONG); + ctx->possibleIceTrapModels.push_back(RG_SARIAS_SONG); + ctx->possibleIceTrapModels.push_back(RG_SUNS_SONG); + ctx->possibleIceTrapModels.push_back(RG_SONG_OF_TIME); + ctx->possibleIceTrapModels.push_back(RG_SONG_OF_STORMS); + ctx->possibleIceTrapModels.push_back(RG_MINUET_OF_FOREST); + ctx->possibleIceTrapModels.push_back(RG_BOLERO_OF_FIRE); + ctx->possibleIceTrapModels.push_back(RG_SERENADE_OF_WATER); + ctx->possibleIceTrapModels.push_back(RG_REQUIEM_OF_SPIRIT); + ctx->possibleIceTrapModels.push_back(RG_NOCTURNE_OF_SHADOW); + ctx->possibleIceTrapModels.push_back(RG_PRELUDE_OF_LIGHT); + } + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_ANYWHERE)) { + // Push item ids for dungeon rewards + ctx->possibleIceTrapModels.push_back(RG_KOKIRI_EMERALD); + ctx->possibleIceTrapModels.push_back(RG_GORON_RUBY); + ctx->possibleIceTrapModels.push_back(RG_ZORA_SAPPHIRE); + ctx->possibleIceTrapModels.push_back(RG_FOREST_MEDALLION); + ctx->possibleIceTrapModels.push_back(RG_FIRE_MEDALLION); + ctx->possibleIceTrapModels.push_back(RG_WATER_MEDALLION); + ctx->possibleIceTrapModels.push_back(RG_SPIRIT_MEDALLION); + ctx->possibleIceTrapModels.push_back(RG_SHADOW_MEDALLION); + ctx->possibleIceTrapModels.push_back(RG_LIGHT_MEDALLION); + } + + if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { + ctx->possibleIceTrapModels.push_back(RG_TRIFORCE_PIECE); + AddItemToMainPool(RG_TRIFORCE_PIECE, (ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_TOTAL).Get() + 1)); + ctx->PlaceItemInLocation(RC_TRIFORCE_COMPLETED, RG_TRIFORCE); // Win condition + ctx->PlaceItemInLocation(RC_GANON, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_GANON, RG_TRIFORCE); // Win condition + } + + // Fixed item locations + ctx->PlaceItemInLocation(RC_HC_ZELDAS_LETTER, RG_ZELDAS_LETTER); + + if (ctx->GetOption(RSK_SHUFFLE_KOKIRI_SWORD)) { + AddItemToMainPool(RG_KOKIRI_SWORD); + ctx->possibleIceTrapModels.push_back(RG_KOKIRI_SWORD); + } else { + if (!ctx->GetOption(RSK_STARTING_KOKIRI_SWORD)) { + ctx->PlaceItemInLocation(RC_KF_KOKIRI_SWORD_CHEST, RG_KOKIRI_SWORD, false, true); + } + } + + if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { + AddItemToMainPool(RG_MASTER_SWORD); + ctx->possibleIceTrapModels.push_back(RG_MASTER_SWORD); + } else { + if (!ctx->GetOption(RSK_STARTING_MASTER_SWORD)) { + ctx->PlaceItemInLocation(RC_TOT_MASTER_SWORD, RG_MASTER_SWORD, false, true); + } + } + + if (ctx->GetOption(RSK_SHUFFLE_WEIRD_EGG)) { + AddItemToMainPool(RG_WEIRD_EGG); + ctx->possibleIceTrapModels.push_back(RG_WEIRD_EGG); + } else { + ctx->PlaceItemInLocation(RC_HC_MALON_EGG, RG_WEIRD_EGG, false, true); + } + + if (ctx->GetOption(RSK_SHUFFLE_OCARINA)) { + AddItemToMainPool(RG_PROGRESSIVE_OCARINA, 2); + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemToPool(PendingJunkPool, RG_PROGRESSIVE_OCARINA); + } + ctx->possibleIceTrapModels.push_back(RG_PROGRESSIVE_OCARINA); + } else { + if (ctx->GetOption(RSK_STARTING_OCARINA).Is(RO_STARTING_OCARINA_OFF)) { + ctx->PlaceItemInLocation(RC_LW_GIFT_FROM_SARIA, RG_PROGRESSIVE_OCARINA, false, true); + ctx->PlaceItemInLocation(RC_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, false, true); + } else { + if (ctx->GetOption(RSK_STARTING_OCARINA).IsNot(RO_STARTING_OCARINA_TIME)) { + ctx->PlaceItemInLocation(RC_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, false, true); + } + } + } + + if (ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS)) { + AddItemToMainPool(RG_OCARINA_A_BUTTON); + AddItemToMainPool(RG_OCARINA_C_UP_BUTTON); + AddItemToMainPool(RG_OCARINA_C_DOWN_BUTTON); + AddItemToMainPool(RG_OCARINA_C_LEFT_BUTTON); + AddItemToMainPool(RG_OCARINA_C_RIGHT_BUTTON); + + ctx->possibleIceTrapModels.push_back(RG_OCARINA_A_BUTTON); + ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_UP_BUTTON); + ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_DOWN_BUTTON); + ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_LEFT_BUTTON); + ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_RIGHT_BUTTON); + } + + if (ctx->GetOption(RSK_SKELETON_KEY)) { + AddItemToMainPool(RG_SKELETON_KEY); + } + + if (ctx->GetOption(RSK_SHUFFLE_SWIM)) { + AddItemToMainPool(RG_PROGRESSIVE_SCALE); + } + + if (ctx->GetOption(RSK_SHUFFLE_BEEHIVES)) { + // 32 total beehive locations + AddItemToPool(PendingJunkPool, RG_RED_RUPEE, 23); + AddItemToPool(PendingJunkPool, RG_BLUE_RUPEE, 9); + } + + // Shuffle Pots + bool overworldPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); + bool dungeonPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); + PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive); + + // Shuffle Crates + bool overworldCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + bool overworldNLCratesActive = ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) && + (ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL)); + bool dungeonCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + PlaceItemsForType(RCTYPE_CRATE, overworldCratesActive, dungeonCratesActive); + PlaceItemsForType(RCTYPE_NLCRATE, overworldNLCratesActive, dungeonCratesActive); + PlaceItemsForType(RCTYPE_SMALL_CRATE, overworldCratesActive, dungeonCratesActive); + + auto fsMode = ctx->GetOption(RSK_FISHSANITY); + if (fsMode.IsNot(RO_FISHSANITY_OFF)) { + if (fsMode.Is(RO_FISHSANITY_POND) || fsMode.Is(RO_FISHSANITY_BOTH)) { + // 17 max child pond fish + uint8_t pondCt = ctx->GetOption(RSK_FISHSANITY_POND_COUNT).Get(); + for (uint8_t i = 0; i < pondCt; i++) { + AddItemToMainPool(GetJunkItem()); + } + + if (ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)) { + // 16 max adult pond fish, have to reduce to 16 if every fish is enabled + if (pondCt > 16) + pondCt = 16; + for (uint8_t i = 0; i < pondCt; i++) { + AddItemToMainPool(GetJunkItem()); + } + } + } + // 9 grotto fish, 5 zora's domain fish + if (fsMode.Is(RO_FISHSANITY_OVERWORLD) || fsMode.Is(RO_FISHSANITY_BOTH)) { + for (uint8_t i = 0; i < Rando::StaticData::GetOverworldFishLocations().size(); i++) + AddItemToMainPool(GetJunkItem()); + } + + if (fsMode.Is(RO_FISHSANITY_HYRULE_LOACH)) { + AddItemToMainPool(RG_PURPLE_RUPEE); + } else { + ctx->PlaceItemInLocation(RC_LH_HYRULE_LOACH, RG_PURPLE_RUPEE, false, true); + } } if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE)) { - AddItemToPool(PendingJunkPool, RG_FISHING_POLE); + AddItemToMainPool(RG_FISHING_POLE); + ctx->possibleIceTrapModels.push_back(RG_FISHING_POLE); } - //Plentiful small keys - if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) || ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { - if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_BOTTOM_OF_THE_WELL_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_BOTTOM_OF_THE_WELL_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::FOREST_TEMPLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::FIRE_TEMPLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::WATER_TEMPLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_GERUDO_TRAINING_GROUND_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_GERUDO_TRAINING_GROUND_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_SMALL_KEY); - } + if (ctx->GetOption(RSK_INFINITE_UPGRADES).Is(RO_INF_UPGRADES_PROGRESSIVE)) { + AddItemToMainPool(RG_PROGRESSIVE_BOMB_BAG); + AddItemToMainPool(RG_PROGRESSIVE_BOW); + AddItemToMainPool(RG_PROGRESSIVE_NUT_UPGRADE); + AddItemToMainPool(RG_PROGRESSIVE_SLINGSHOT); + AddItemToMainPool(RG_PROGRESSIVE_STICK_UPGRADE); + AddItemToMainPool(RG_PROGRESSIVE_MAGIC_METER); + AddItemToMainPool(RG_PROGRESSIVE_WALLET); } - if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) || ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { - AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_BOSS_KEY); - } - - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANYWHERE) || ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON) || ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { - AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_BOSS_KEY); - } - } - - if (ctx->GetOption(RSK_LOCK_OVERWORLD_DOORS)) { - AddItemToPool(ItemPool, RG_GUARD_HOUSE_KEY); - AddItemToPool(ItemPool, RG_MARKET_BAZAAR_KEY); - AddItemToPool(ItemPool, RG_MARKET_POTION_SHOP_KEY); - AddItemToPool(ItemPool, RG_MASK_SHOP_KEY); - AddItemToPool(ItemPool, RG_MARKET_SHOOTING_GALLERY_KEY); - AddItemToPool(ItemPool, RG_BOMBCHU_BOWLING_KEY); - AddItemToPool(ItemPool, RG_TREASURE_CHEST_GAME_BUILDING_KEY); - AddItemToPool(ItemPool, RG_BOMBCHU_SHOP_KEY); - AddItemToPool(ItemPool, RG_RICHARDS_HOUSE_KEY); - AddItemToPool(ItemPool, RG_ALLEY_HOUSE_KEY); - AddItemToPool(ItemPool, RG_KAK_BAZAAR_KEY); - AddItemToPool(ItemPool, RG_KAK_POTION_SHOP_KEY); - AddItemToPool(ItemPool, RG_BOSS_HOUSE_KEY); - AddItemToPool(ItemPool, RG_GRANNYS_POTION_SHOP_KEY); - AddItemToPool(ItemPool, RG_SKULLTULA_HOUSE_KEY); - AddItemToPool(ItemPool, RG_IMPAS_HOUSE_KEY); - AddItemToPool(ItemPool, RG_WINDMILL_KEY); - AddItemToPool(ItemPool, RG_KAK_SHOOTING_GALLERY_KEY); - AddItemToPool(ItemPool, RG_DAMPES_HUT_KEY); - AddItemToPool(ItemPool, RG_TALONS_HOUSE_KEY); - AddItemToPool(ItemPool, RG_STABLES_KEY); - AddItemToPool(ItemPool, RG_BACK_TOWER_KEY); - AddItemToPool(ItemPool, RG_HYLIA_LAB_KEY); - AddItemToPool(ItemPool, RG_FISHING_HOLE_KEY); - } - - //Shopsanity - if ( - ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF) || - ( - ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_SPECIFIC_COUNT) && - ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_ZERO_ITEMS) - ) - ) { - AddItemsToPool(ItemPool, normalRupees); - } else { - AddItemsToPool(ItemPool, shopsanityRupees); //Shopsanity gets extra large rupees - } - - // Shuffle Fairies - if (ctx->GetOption(RSK_SHUFFLE_FAIRIES)) { - for (auto rc : Rando::StaticData::GetOverworldFairyLocations()) { - AddItemToMainPool(GetJunkItem()); - } - // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone + 3 Shadow Temple - int extra = 13; - extra += ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla() ? 0 : 2; - extra += ctx->GetDungeon(Rando::WATER_TEMPLE)->IsVanilla() ? 0 : 3; - extra += ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla() ? 2 : 1; - extra += ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla() ? 1 : 2; - extra += ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla() ? 1 : 0; - extra += ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsVanilla() ? 1 : 0; - extra += ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla() ? 1 : 0; - for (int i = 0; i < extra; i++) { - AddItemToMainPool(GetJunkItem()); - } - } - - //Scrubsanity - if (ctx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_ALL)) { - //Deku Tree - if (ctx->GetDungeon(Rando::DEKU_TREE)->IsMQ()) { - AddItemToMainPool(RG_DEKU_SHIELD); - } - - //Dodongos Cavern - AddItemToMainPool(RG_DEKU_STICK_1); - AddItemToMainPool(RG_DEKU_SHIELD); - if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { - AddItemToMainPool(RG_RECOVERY_HEART); - } else { - AddItemToMainPool(RG_DEKU_NUTS_5); - } - - //Jabu Jabus Belly - if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsVanilla()) { - AddItemToMainPool(RG_DEKU_NUTS_5); - } - - //Ganons Castle - AddItemToMainPool(RG_BOMBS_5); - AddItemToMainPool(RG_RECOVERY_HEART); - AddItemToMainPool(RG_BLUE_RUPEE); - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { - AddItemToMainPool(RG_DEKU_NUTS_5); - } - - //Overworld Scrubs - AddItemsToPool(ItemPool, dekuScrubItems); - - //Scrubs which sell seeds or arrows sell it based on age, this randomly assigns them - for (uint8_t i = 0; i < 7; i++) { - if (Random(0, 3)) { - AddItemToMainPool(RG_ARROWS_30); - } else { - AddItemToMainPool(RG_DEKU_SEEDS_30); - } - } - } - - bool overworldFreeStandingActive = ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_OVERWORLD) || - ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_ALL); - bool dungeonFreeStandingActive = ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_DUNGEONS) || - ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_ALL); - PlaceItemsForType(RCTYPE_FREESTANDING, overworldFreeStandingActive, dungeonFreeStandingActive); - - AddItemsToPool(ItemPool, alwaysItems); - AddItemsToPool(ItemPool, dungeonRewards); - - //Dungeon pools - if (ctx->GetDungeon(Rando::DEKU_TREE)->IsMQ()) { - AddItemsToPool(ItemPool, DT_MQ); - } else { - AddItemsToPool(ItemPool, DT_Vanilla); - } - if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { - AddItemsToPool(ItemPool, DC_MQ); - } else { - AddItemsToPool(ItemPool, DC_Vanilla); - } - if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsMQ()) { - AddItemsToPool(ItemPool, JB_MQ); - } - if (ctx->GetDungeon(Rando::FOREST_TEMPLE)->IsMQ()) { - AddItemsToPool(ItemPool, FoT_MQ); - } else { - AddItemsToPool(ItemPool, FoT_Vanilla); - } - if (ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsMQ()) { - AddItemsToPool(ItemPool, FiT_MQ); - } else { - AddItemsToPool(ItemPool, FiT_Vanilla); - } - if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsMQ()) { - AddItemsToPool(ItemPool, SpT_MQ); - } else { - AddItemsToPool(ItemPool, SpT_Vanilla); - } - if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->IsMQ()) { - AddItemsToPool(ItemPool, ShT_MQ); - } else { - AddItemsToPool(ItemPool, ShT_Vanilla); - } - if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla()) { - AddItemsToPool(ItemPool, BW_Vanilla); - } - if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsMQ()) { - AddItemsToPool(ItemPool, GTG_MQ); - } else { - AddItemsToPool(ItemPool, GTG_Vanilla); - } - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { - AddItemsToPool(ItemPool, GC_MQ); - } else { - AddItemsToPool(ItemPool, GC_Vanilla); - } - - uint8_t rutoBottles = 1; - if (ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_OPEN)) { - rutoBottles = 0; - } - - //Add 4 total bottles - uint8_t bottleCount = 4; - std::vector bottles; - bottles.assign(normalBottles.begin(), normalBottles.end()); - ctx->possibleIceTrapModels.push_back( - Rando::StaticData::RetrieveItem(RandomElement(bottles)).GetRandomizerGet()); // Get one random bottle type for ice traps - for (uint8_t i = 0; i < bottleCount; i++) { - if (i >= rutoBottles) { - if ((i == bottleCount - 1) && - (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL))) { - AddItemToMainPool(RG_BOTTLE_WITH_BLUE_POTION); - } else { - AddRandomBottle(bottles); - } - } else { - AddItemToMainPool(RG_RUTOS_LETTER); - } - } - - //add extra songs only if song shuffle is anywhere - AddItemsToPool(ItemPool, songList); - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_ANYWHERE) && ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - AddItemsToPool(PendingJunkPool, songList); - } - - /*For item pool generation, dungeon items are either placed in their vanilla - | location, or added to the pool now and filtered out later depending on when - | they need to get placed or removed in fill.cpp. These items are kept in the - | pool until removal because the filling algorithm needs to know all of the - | advancement items that haven't been placed yet for placing higher priority - | items like stones/medallions.*/ - - if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { - PlaceVanillaMapsAndCompasses(); - } else { - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (dungeon->GetMap() != RG_NONE) { - AddItemToMainPool(dungeon->GetMap()); - } - - if (dungeon->GetCompass() != RG_NONE) { - AddItemToMainPool(dungeon->GetCompass()); - } - } - } - - if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { - PlaceVanillaSmallKeys(); - } else { - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (dungeon->HasKeyRing() && ctx->GetOption(RSK_KEYSANITY).IsNot(RO_DUNGEON_ITEM_LOC_STARTWITH)) { - AddItemToMainPool(dungeon->GetKeyRing()); - } else if (dungeon->GetSmallKeyCount() > 0) { - AddItemToMainPool(dungeon->GetSmallKey(), dungeon->GetSmallKeyCount()); - } - } - } - - if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { - PlaceVanillaBossKeys(); - } else { - AddItemToMainPool(RG_FOREST_TEMPLE_BOSS_KEY); - AddItemToMainPool(RG_FIRE_TEMPLE_BOSS_KEY); - AddItemToMainPool(RG_WATER_TEMPLE_BOSS_KEY); - AddItemToMainPool(RG_SPIRIT_TEMPLE_BOSS_KEY); - AddItemToMainPool(RG_SHADOW_TEMPLE_BOSS_KEY); - } - - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { - ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_GANONS_CASTLE_BOSS_KEY); - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Get() >= RO_GANON_BOSS_KEY_LACS_VANILLA && ctx->GetOption(RSK_GANONS_BOSS_KEY).IsNot(RO_GANON_BOSS_KEY_TRIFORCE_HUNT)) { - ctx->PlaceItemInLocation(RC_TOT_LIGHT_ARROWS_CUTSCENE, RG_GANONS_CASTLE_BOSS_KEY); - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA)) { - ctx->PlaceItemInLocation(RC_GANONS_TOWER_BOSS_KEY_CHEST, RG_GANONS_CASTLE_BOSS_KEY); - } else { - AddItemToMainPool(RG_GANONS_CASTLE_BOSS_KEY); - } - - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - AddItemsToPool(ItemPool, easyItems); - } else { - AddItemsToPool(ItemPool, normalItems); - } - - if (!ctx->GetOption(RSK_SHUFFLE_KOKIRI_SWORD)) { - ReplaceMaxItem(RG_KOKIRI_SWORD, 0); - } - - if (!ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { - ReplaceMaxItem(RG_MASTER_SWORD, 0); - } - - if (/*ProgressiveGoronSword TODO: Implement Setting*/false) { - ReplaceMaxItem(RG_BIGGORON_SWORD, 0); - AddItemToMainPool(RG_PROGRESSIVE_GORONSWORD, 2); - ctx->possibleIceTrapModels.push_back(RG_PROGRESSIVE_GORONSWORD); - } else { - ctx->possibleIceTrapModels.push_back(RG_BIGGORON_SWORD); - } - - //Replace ice traps with junk from the pending junk pool if necessary - if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_OFF)) { - ReplaceMaxItem(RG_ICE_TRAP, 0); - } - //Replace all junk items with ice traps for onslaught mode - else if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_ONSLAUGHT)) { - for (uint8_t i = 0; i < JunkPoolItems.size() - 3; i++) { // -3 Omits Huge Rupees and Deku Nuts 10 - ReplaceMaxItem(JunkPoolItems[i], 0); - } - } - - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_SCARCE)) { - SetScarceItemPool(); - } else if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_MINIMAL)) { - SetMinimalItemPool(); - } else if (/*RemoveDoubleDefense TODO: Implement setting*/ false) { - ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); - } - - //this feels ugly and there's probably a better way, but - //it replaces random junk with pending junk. - bool junkSet; - for (RandomizerGet pendingJunk : PendingJunkPool) { - junkSet = false; - for (RandomizerGet& item : ItemPool) { - for (RandomizerGet junk : JunkPoolItems) { - if (item == junk && item != RG_HUGE_RUPEE && item != RG_DEKU_NUTS_10) { - item = pendingJunk; - junkSet = true; - break; + if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_BEANS_ONLY) || + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { + AddItemToMainPool(RG_MAGIC_BEAN_PACK); + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemToPool(PendingJunkPool, RG_MAGIC_BEAN_PACK); } - } - if (junkSet) break; + ctx->possibleIceTrapModels.push_back(RG_MAGIC_BEAN_PACK); + } else { + ctx->PlaceItemInLocation(RC_ZR_MAGIC_BEAN_SALESMAN, RG_MAGIC_BEAN, false, true); } - } - PendingJunkPool.clear(); -} -void AddJunk() { - SPDLOG_DEBUG("HAD TO PLACE EXTRA JUNK "); - AddItemToMainPool(GetPendingJunkItem()); + if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { + if (/*!ProgressiveGoronSword TODO: Implement Progressive Goron Sword*/ true) { + AddItemToMainPool(RG_GIANTS_KNIFE); + } + if (ctx->GetOption(RSK_BOMBCHU_BAG)) { + AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS); + } else { + AddItemToMainPool(RG_BOMBCHU_10); + } + } else { + ctx->PlaceItemInLocation(RC_KAK_GRANNYS_SHOP, RG_BLUE_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_GC_MEDIGORON, RG_GIANTS_KNIFE, false, true); + ctx->PlaceItemInLocation(RC_WASTELAND_BOMBCHU_SALESMAN, RG_BOMBCHU_10, false, true); + } + + if (ctx->GetOption(RSK_SHUFFLE_FROG_SONG_RUPEES)) { + AddItemToMainPool(RG_PURPLE_RUPEE, 5); + } else { + ctx->PlaceItemInLocation(RC_ZR_FROGS_ZELDAS_LULLABY, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_EPONAS_SONG, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_SARIAS_SONG, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_SUNS_SONG, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_SONG_OF_TIME, RG_PURPLE_RUPEE, false, true); + } + + if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)) { + AddItemToMainPool(RG_POCKET_EGG); + AddItemToMainPool(RG_COJIRO); + AddItemToMainPool(RG_ODD_MUSHROOM); + AddItemToMainPool(RG_ODD_POTION); + AddItemToMainPool(RG_POACHERS_SAW); + AddItemToMainPool(RG_BROKEN_SWORD); + AddItemToMainPool(RG_PRESCRIPTION); + AddItemToMainPool(RG_EYEBALL_FROG); + AddItemToMainPool(RG_EYEDROPS); + } + AddItemToMainPool(RG_CLAIM_CHECK); + + if (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS)) { + AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY, 6); // 6 individual keys + } else if (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK)) { + AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY); // 1 key which will behave as a pack of 6 + } + + if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OFF)) { + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { + ctx->PlaceItemInLocation(loc, RG_GOLD_SKULLTULA_TOKEN, false, true); + } + } else if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_DUNGEONS)) { + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { + if (Rando::StaticData::GetLocation(loc)->IsOverworld()) { + ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GOLD_SKULLTULA_TOKEN, false, true); + } else { + AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN); + } + } + } else if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OVERWORLD)) { + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { + if (Rando::StaticData::GetLocation(loc)->IsDungeon()) { + ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GOLD_SKULLTULA_TOKEN, false, true); + } else { + AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN); + } + } + } else { + AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN, 100); + } + + if (ctx->GetOption(RSK_SHUFFLE_100_GS_REWARD)) { + if (ctx->GetOption(RSK_SHUFFLE_TOKENS).IsNot(RO_TOKENSANITY_OFF) && + ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemToPool(PendingJunkPool, RG_GOLD_SKULLTULA_TOKEN, 10); + } + AddItemToMainPool(RG_HUGE_RUPEE); + } else { + ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_HUGE_RUPEE, false, true); + } + + if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS)) { + AddItemToMainPool(RG_GOHMA_SOUL); + AddItemToMainPool(RG_KING_DODONGO_SOUL); + AddItemToMainPool(RG_BARINADE_SOUL); + AddItemToMainPool(RG_PHANTOM_GANON_SOUL); + AddItemToMainPool(RG_VOLVAGIA_SOUL); + AddItemToMainPool(RG_MORPHA_SOUL); + AddItemToMainPool(RG_BONGO_BONGO_SOUL); + AddItemToMainPool(RG_TWINROVA_SOUL); + + ctx->possibleIceTrapModels.push_back(RG_GOHMA_SOUL); + ctx->possibleIceTrapModels.push_back(RG_KING_DODONGO_SOUL); + ctx->possibleIceTrapModels.push_back(RG_BARINADE_SOUL); + ctx->possibleIceTrapModels.push_back(RG_PHANTOM_GANON_SOUL); + ctx->possibleIceTrapModels.push_back(RG_VOLVAGIA_SOUL); + ctx->possibleIceTrapModels.push_back(RG_MORPHA_SOUL); + ctx->possibleIceTrapModels.push_back(RG_BONGO_BONGO_SOUL); + ctx->possibleIceTrapModels.push_back(RG_TWINROVA_SOUL); + if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON)) { + AddItemToMainPool(RG_GANON_SOUL); + ctx->possibleIceTrapModels.push_back(RG_GANON_SOUL); + } + } + + if (ctx->GetOption(RSK_SHUFFLE_CHILD_WALLET)) { + AddItemToMainPool(RG_PROGRESSIVE_WALLET); + } + + if (ctx->GetOption(RSK_INCLUDE_TYCOON_WALLET)) { + AddItemToMainPool(RG_PROGRESSIVE_WALLET); + } + + if (ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG)) { + AddItemToMainPool(RG_PROGRESSIVE_STICK_UPGRADE); + } + + if (ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG)) { + AddItemToMainPool(RG_PROGRESSIVE_NUT_UPGRADE); + } + + if (ctx->GetOption(RSK_BOMBCHU_BAG)) { + AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS, 5); + } else { + AddItemToMainPool(RG_BOMBCHU_5); + AddItemToMainPool(RG_BOMBCHU_10, 3); + AddItemToMainPool(RG_BOMBCHU_20); + } + + // Ice Traps + AddItemToMainPool(RG_ICE_TRAP); + if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsVanilla()) { + AddItemToMainPool(RG_ICE_TRAP); + } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla()) { + AddItemToMainPool(RG_ICE_TRAP, 4); + } + + // Gerudo Fortress + if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE)) { + ctx->PlaceItemInLocation(RC_TH_1_TORCH_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_DEAD_END_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_DOUBLE_CELL_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_STEEP_SLOPE_CARPENTER, RG_RECOVERY_HEART, false, true); + } else if (ctx->GetOption(RSK_GERUDO_KEYS).IsNot(RO_GERUDO_KEYS_VANILLA)) { + if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST)) { + AddItemToMainPool(RG_GERUDO_FORTRESS_SMALL_KEY); + ctx->PlaceItemInLocation(RC_TH_DEAD_END_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_DOUBLE_CELL_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_STEEP_SLOPE_CARPENTER, RG_RECOVERY_HEART, false, true); + } else { + // Only add key ring if 4 Fortress keys necessary + if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && ctx->GetOption(RSK_KEYRINGS)) { + AddItemToMainPool(RG_GERUDO_FORTRESS_KEY_RING); + // Add junk to make up for missing keys + for (uint8_t i = 0; i < 3; i++) { + AddItemToMainPool(GetJunkItem()); + } + } else { + AddItemToMainPool(RG_GERUDO_FORTRESS_SMALL_KEY, 4); + } + } + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && + ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && ctx->GetOption(RSK_KEYRINGS)) { + AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_SMALL_KEY); + } + } + } else { + if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST)) { + ctx->PlaceItemInLocation(RC_TH_1_TORCH_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_TH_DEAD_END_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_DOUBLE_CELL_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_STEEP_SLOPE_CARPENTER, RG_RECOVERY_HEART, false, true); + } else { + ctx->PlaceItemInLocation(RC_TH_1_TORCH_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_TH_DEAD_END_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_TH_DOUBLE_CELL_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_TH_STEEP_SLOPE_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + } + } + + // Gerudo Membership Card + if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) && + ctx->GetOption(RSK_GERUDO_FORTRESS).IsNot(RO_GF_CARPENTERS_FREE)) { + AddItemToMainPool(RG_GERUDO_MEMBERSHIP_CARD); + ctx->possibleIceTrapModels.push_back(RG_GERUDO_MEMBERSHIP_CARD); + } else if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { + AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); + ctx->PlaceItemInLocation(RC_TH_FREED_CARPENTERS, RG_ICE_TRAP, false, true); + } else { + ctx->PlaceItemInLocation(RC_TH_FREED_CARPENTERS, RG_GERUDO_MEMBERSHIP_CARD, false, true); + } + + // Keys + + // For key rings, need to add as many junk items as "missing" keys + if (ctx->GetOption(RSK_KEYRINGS).IsNot(RO_KEYRINGS_OFF)) { + uint8_t ringJunkAmt = 0; + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (dungeon->HasKeyRing()) { + ringJunkAmt += dungeon->GetSmallKeyCount() - 1; + } + } + for (uint8_t i = 0; i < ringJunkAmt; i++) { + AddItemToMainPool(GetJunkItem()); + } + } + + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { + AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); + } + + if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE)) { + AddItemToPool(PendingJunkPool, RG_FISHING_POLE); + } + + // Plentiful small keys + if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || + ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) || + ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { + if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_BOTTOM_OF_THE_WELL_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_BOTTOM_OF_THE_WELL_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::FOREST_TEMPLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::FIRE_TEMPLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::WATER_TEMPLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_GERUDO_TRAINING_GROUND_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_GERUDO_TRAINING_GROUND_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_SMALL_KEY); + } + } + + if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || + ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) || + ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { + AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_BOSS_KEY); + } + + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANYWHERE) || + ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON) || + ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { + AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_BOSS_KEY); + } + } + + if (ctx->GetOption(RSK_LOCK_OVERWORLD_DOORS)) { + AddItemToPool(ItemPool, RG_GUARD_HOUSE_KEY); + AddItemToPool(ItemPool, RG_MARKET_BAZAAR_KEY); + AddItemToPool(ItemPool, RG_MARKET_POTION_SHOP_KEY); + AddItemToPool(ItemPool, RG_MASK_SHOP_KEY); + AddItemToPool(ItemPool, RG_MARKET_SHOOTING_GALLERY_KEY); + AddItemToPool(ItemPool, RG_BOMBCHU_BOWLING_KEY); + AddItemToPool(ItemPool, RG_TREASURE_CHEST_GAME_BUILDING_KEY); + AddItemToPool(ItemPool, RG_BOMBCHU_SHOP_KEY); + AddItemToPool(ItemPool, RG_RICHARDS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_ALLEY_HOUSE_KEY); + AddItemToPool(ItemPool, RG_KAK_BAZAAR_KEY); + AddItemToPool(ItemPool, RG_KAK_POTION_SHOP_KEY); + AddItemToPool(ItemPool, RG_BOSS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_GRANNYS_POTION_SHOP_KEY); + AddItemToPool(ItemPool, RG_SKULLTULA_HOUSE_KEY); + AddItemToPool(ItemPool, RG_IMPAS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_WINDMILL_KEY); + AddItemToPool(ItemPool, RG_KAK_SHOOTING_GALLERY_KEY); + AddItemToPool(ItemPool, RG_DAMPES_HUT_KEY); + AddItemToPool(ItemPool, RG_TALONS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_STABLES_KEY); + AddItemToPool(ItemPool, RG_BACK_TOWER_KEY); + AddItemToPool(ItemPool, RG_HYLIA_LAB_KEY); + AddItemToPool(ItemPool, RG_FISHING_HOLE_KEY); + } + + // Shopsanity + if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF) || + (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_SPECIFIC_COUNT) && + ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_ZERO_ITEMS))) { + AddItemsToPool(ItemPool, normalRupees); + } else { + AddItemsToPool(ItemPool, shopsanityRupees); // Shopsanity gets extra large rupees + } + + // Shuffle Fairies + if (ctx->GetOption(RSK_SHUFFLE_FAIRIES)) { + for (auto rc : Rando::StaticData::GetOverworldFairyLocations()) { + AddItemToMainPool(GetJunkItem()); + } + // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone + 3 Shadow Temple + int extra = 13; + extra += ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla() ? 0 : 2; + extra += ctx->GetDungeon(Rando::WATER_TEMPLE)->IsVanilla() ? 0 : 3; + extra += ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla() ? 2 : 1; + extra += ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla() ? 1 : 2; + extra += ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla() ? 1 : 0; + extra += ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsVanilla() ? 1 : 0; + extra += ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla() ? 1 : 0; + for (int i = 0; i < extra; i++) { + AddItemToMainPool(GetJunkItem()); + } + } + + // Scrubsanity + if (ctx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_ALL)) { + // Deku Tree + if (ctx->GetDungeon(Rando::DEKU_TREE)->IsMQ()) { + AddItemToMainPool(RG_DEKU_SHIELD); + } + + // Dodongos Cavern + AddItemToMainPool(RG_DEKU_STICK_1); + AddItemToMainPool(RG_DEKU_SHIELD); + if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { + AddItemToMainPool(RG_RECOVERY_HEART); + } else { + AddItemToMainPool(RG_DEKU_NUTS_5); + } + + // Jabu Jabus Belly + if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsVanilla()) { + AddItemToMainPool(RG_DEKU_NUTS_5); + } + + // Ganons Castle + AddItemToMainPool(RG_BOMBS_5); + AddItemToMainPool(RG_RECOVERY_HEART); + AddItemToMainPool(RG_BLUE_RUPEE); + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { + AddItemToMainPool(RG_DEKU_NUTS_5); + } + + // Overworld Scrubs + AddItemsToPool(ItemPool, dekuScrubItems); + + // Scrubs which sell seeds or arrows sell it based on age, this randomly assigns them + for (uint8_t i = 0; i < 7; i++) { + if (Random(0, 3)) { + AddItemToMainPool(RG_ARROWS_30); + } else { + AddItemToMainPool(RG_DEKU_SEEDS_30); + } + } + } + + bool overworldFreeStandingActive = ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_ALL); + bool dungeonFreeStandingActive = ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_ALL); + PlaceItemsForType(RCTYPE_FREESTANDING, overworldFreeStandingActive, dungeonFreeStandingActive); + + AddItemsToPool(ItemPool, alwaysItems); + AddItemsToPool(ItemPool, dungeonRewards); + + // Dungeon pools + if (ctx->GetDungeon(Rando::DEKU_TREE)->IsMQ()) { + AddItemsToPool(ItemPool, DT_MQ); + } else { + AddItemsToPool(ItemPool, DT_Vanilla); + } + if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { + AddItemsToPool(ItemPool, DC_MQ); + } else { + AddItemsToPool(ItemPool, DC_Vanilla); + } + if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsMQ()) { + AddItemsToPool(ItemPool, JB_MQ); + } + if (ctx->GetDungeon(Rando::FOREST_TEMPLE)->IsMQ()) { + AddItemsToPool(ItemPool, FoT_MQ); + } else { + AddItemsToPool(ItemPool, FoT_Vanilla); + } + if (ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsMQ()) { + AddItemsToPool(ItemPool, FiT_MQ); + } else { + AddItemsToPool(ItemPool, FiT_Vanilla); + } + if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsMQ()) { + AddItemsToPool(ItemPool, SpT_MQ); + } else { + AddItemsToPool(ItemPool, SpT_Vanilla); + } + if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->IsMQ()) { + AddItemsToPool(ItemPool, ShT_MQ); + } else { + AddItemsToPool(ItemPool, ShT_Vanilla); + } + if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla()) { + AddItemsToPool(ItemPool, BW_Vanilla); + } + if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsMQ()) { + AddItemsToPool(ItemPool, GTG_MQ); + } else { + AddItemsToPool(ItemPool, GTG_Vanilla); + } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { + AddItemsToPool(ItemPool, GC_MQ); + } else { + AddItemsToPool(ItemPool, GC_Vanilla); + } + + uint8_t rutoBottles = 1; + if (ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_OPEN)) { + rutoBottles = 0; + } + + // Add 4 total bottles + uint8_t bottleCount = 4; + std::vector bottles; + bottles.assign(normalBottles.begin(), normalBottles.end()); + ctx->possibleIceTrapModels.push_back(Rando::StaticData::RetrieveItem(RandomElement(bottles)) + .GetRandomizerGet()); // Get one random bottle type for ice traps + for (uint8_t i = 0; i < bottleCount; i++) { + if (i >= rutoBottles) { + if ((i == bottleCount - 1) && + (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL))) { + AddItemToMainPool(RG_BOTTLE_WITH_BLUE_POTION); + } else { + AddRandomBottle(bottles); + } + } else { + AddItemToMainPool(RG_RUTOS_LETTER); + } + } + + if (ctx->GetOption(RSK_SHUFFLE_SONGS).IsNot(RO_SONG_SHUFFLE_OFF)) { + AddItemsToPool(ItemPool, songList); + // add extra songs only if song shuffle is anywhere + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_ANYWHERE) && + ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemsToPool(PendingJunkPool, songList); + } + } else { + ctx->PlaceItemInLocation(RC_SHEIK_IN_FOREST, RG_MINUET_OF_FOREST, false, true); + ctx->PlaceItemInLocation(RC_SHEIK_IN_CRATER, RG_BOLERO_OF_FIRE, false, true); + ctx->PlaceItemInLocation(RC_SHEIK_IN_ICE_CAVERN, RG_SERENADE_OF_WATER, false, true); + ctx->PlaceItemInLocation(RC_SHEIK_AT_COLOSSUS, RG_REQUIEM_OF_SPIRIT, false, true); + ctx->PlaceItemInLocation(RC_SHEIK_IN_KAKARIKO, RG_NOCTURNE_OF_SHADOW, false, true); + ctx->PlaceItemInLocation(RC_SHEIK_AT_TEMPLE, RG_PRELUDE_OF_LIGHT, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_IMPA, RG_ZELDAS_LULLABY, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_MALON, RG_EPONAS_SONG, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_SARIA, RG_SARIAS_SONG, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RG_SUNS_SONG, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_OCARINA_OF_TIME, RG_SONG_OF_TIME, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_WINDMILL, RG_SONG_OF_STORMS, false, true); + } + + /*For item pool generation, dungeon items are either placed in their vanilla + | location, or added to the pool now and filtered out later depending on when + | they need to get placed or removed in fill.cpp. These items are kept in the + | pool until removal because the filling algorithm needs to know all of the + | advancement items that haven't been placed yet for placing higher priority + | items like stones/medallions.*/ + + if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { + PlaceVanillaMapsAndCompasses(); + } else { + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (dungeon->GetMap() != RG_NONE) { + AddItemToMainPool(dungeon->GetMap()); + } + + if (dungeon->GetCompass() != RG_NONE) { + AddItemToMainPool(dungeon->GetCompass()); + } + } + } + + if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { + PlaceVanillaSmallKeys(); + } else { + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (dungeon->HasKeyRing() && ctx->GetOption(RSK_KEYSANITY).IsNot(RO_DUNGEON_ITEM_LOC_STARTWITH)) { + AddItemToMainPool(dungeon->GetKeyRing()); + } else if (dungeon->GetSmallKeyCount() > 0) { + AddItemToMainPool(dungeon->GetSmallKey(), dungeon->GetSmallKeyCount()); + } + } + } + + if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { + PlaceVanillaBossKeys(); + } else { + AddItemToMainPool(RG_FOREST_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_FIRE_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_WATER_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_SPIRIT_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_SHADOW_TEMPLE_BOSS_KEY); + } + + if (!ctx->GetOption(RSK_TRIFORCE_HUNT)) { // Don't add GBK to the pool at all for Triforce Hunt. + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { + ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_GANONS_CASTLE_BOSS_KEY); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Get() >= RO_GANON_BOSS_KEY_LACS_VANILLA) { + ctx->PlaceItemInLocation(RC_TOT_LIGHT_ARROWS_CUTSCENE, RG_GANONS_CASTLE_BOSS_KEY); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA)) { + ctx->PlaceItemInLocation(RC_GANONS_TOWER_BOSS_KEY_CHEST, RG_GANONS_CASTLE_BOSS_KEY); + } else { + AddItemToMainPool(RG_GANONS_CASTLE_BOSS_KEY); + } + } + + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemsToPool(ItemPool, easyItems); + } else { + AddItemsToPool(ItemPool, normalItems); + } + + if (!ctx->GetOption(RSK_SHUFFLE_KOKIRI_SWORD)) { + ReplaceMaxItem(RG_KOKIRI_SWORD, 0); + } + + if (!ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { + ReplaceMaxItem(RG_MASTER_SWORD, 0); + } + + if (/*ProgressiveGoronSword TODO: Implement Setting*/ false) { + ReplaceMaxItem(RG_BIGGORON_SWORD, 0); + AddItemToMainPool(RG_PROGRESSIVE_GORONSWORD, 2); + ctx->possibleIceTrapModels.push_back(RG_PROGRESSIVE_GORONSWORD); + } else { + ctx->possibleIceTrapModels.push_back(RG_BIGGORON_SWORD); + } + + // Replace ice traps with junk from the pending junk pool if necessary + if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_OFF)) { + ReplaceMaxItem(RG_ICE_TRAP, 0); + } + // Replace all junk items with ice traps for onslaught mode + else if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_ONSLAUGHT)) { + PendingJunkPool.clear(); + for (uint8_t i = 0; i < JunkPoolItems.size() - 3; i++) { // -3 Omits Huge Rupees and Deku Nuts 10 + ReplaceMaxItem(JunkPoolItems[i], 0); + } + } + + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_SCARCE)) { + SetScarceItemPool(); + } else if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_MINIMAL)) { + SetMinimalItemPool(); + } else if (/*RemoveDoubleDefense TODO: Implement setting*/ false) { + ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); + } + + std::erase(ItemPool, RG_NONE); + + if (ItemPool.size() < ctx->allLocations.size()) { + Shuffle(PendingJunkPool); + size_t junkNeeded = std::min(PendingJunkPool.size(), ctx->allLocations.size() - ItemPool.size()); + ItemPool.insert(ItemPool.end(), PendingJunkPool.begin(), PendingJunkPool.begin() + junkNeeded); + PendingJunkPool.erase(PendingJunkPool.begin(), PendingJunkPool.begin() + junkNeeded); + } else if (ItemPool.size() > ctx->allLocations.size()) { + // RANDOTODO: all junk should be put in PendingJunkPool so this is never needed + size_t remove = ItemPool.size() - ctx->allLocations.size(); + for (size_t i = 0; remove > 0 && i < ItemPool.size(); i++) { + for (size_t j = 0; j < JunkPoolItems.size(); j++) { + if (ItemPool[i] == JunkPoolItems[j]) { + ItemPool[i] = RG_NONE; + remove--; + break; + } + } + } + std::erase(ItemPool, RG_NONE); + } + + // RANDOTODO: Ideally this should be checking for equality, but that is not currently the case and has never been + // the case, and isn't even currently the case in the 3drando repo we inherited this from years ago, so it may + // be a large undertaking to fix. + assert(ItemPool.size() <= ctx->allLocations.size() || !"Item Pool larger than Location Pool"); } diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp index 4ef5830011..095b417b4c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp @@ -11,6 +11,5 @@ void AddItemToPool(std::vector& pool, const RandomizerGet item, s RandomizerGet GetJunkItem(); void PlaceJunkInExcludedLocation(const RandomizerCheck il); void GenerateItemPool(); -void AddJunk(); extern std::vector ItemPool; diff --git a/soh/soh/Enhancements/randomizer/3drando/menu.cpp b/soh/soh/Enhancements/randomizer/3drando/menu.cpp index 6bcf21af95..35f21ce20d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/menu.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/menu.cpp @@ -12,7 +12,6 @@ #include "soh/Enhancements/debugger/performanceTimer.h" #include #include "../../randomizer/randomizerTypes.h" -#include namespace { bool seedChanged; @@ -22,22 +21,20 @@ Rando::Option* currentSetting; } // namespace bool GenerateRandomizer(std::set excludedLocations, std::set enabledTricks, - std::string seedInput) { + std::string seedInput) { const auto ctx = Rando::Context::GetInstance(); ResetPerformanceTimers(); StartPerformanceTimer(PT_WHOLE_SEED); - srand(time(NULL)); + srand(static_cast(time(NULL))); // if a blank seed was entered, make a random one if (seedInput.empty()) { - seedInput = std::to_string(rand() % 0xFFFFFFFF); + seedInput = std::to_string(rand()); } else if (seedInput.rfind("seed_testing_count", 0) == 0 && seedInput.length() > 18) { int count; try { count = std::stoi(seedInput.substr(18), nullptr); - } catch (std::invalid_argument &e) { - count = 1; - } catch (std::out_of_range &e) { + } catch (std::invalid_argument&) { count = 1; } catch (std::out_of_range&) { count = 1; } Playthrough::Playthrough_Repeat(excludedLocations, enabledTricks, count); @@ -45,8 +42,8 @@ bool GenerateRandomizer(std::set excludedLocations, std::setSetSeedString(seedInput); - uint32_t seedHash = boost::hash_32{}(ctx->GetSeedString()); - ctx->SetSeed(seedHash & 0xFFFFFFFF); + uint32_t seedHash = SohUtils::Hash(ctx->GetSeedString()); + ctx->SetSeed(seedHash); ctx->ClearItemLocations(); int ret = Playthrough::Playthrough_Init(ctx->GetSeed(), excludedLocations, enabledTricks); diff --git a/soh/soh/Enhancements/randomizer/3drando/menu.hpp b/soh/soh/Enhancements/randomizer/3drando/menu.hpp index e0e6e4210e..b40c97c2da 100644 --- a/soh/soh/Enhancements/randomizer/3drando/menu.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/menu.hpp @@ -13,4 +13,5 @@ #define DELETE_PRESET 6 #define RESET_TO_DEFAULTS 8 -bool GenerateRandomizer(std::set excludedLocations, std::set enabledTricks, std::string seedInput); \ No newline at end of file +bool GenerateRandomizer(std::set excludedLocations, std::set enabledTricks, + std::string seedInput); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp index 144dee80a5..1e4a3db387 100644 --- a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp @@ -1,8 +1,6 @@ #include "playthrough.hpp" #include -#include -#include "custom_messages.hpp" #include "fill.hpp" #include "../location_access.h" #include "random.hpp" @@ -16,14 +14,14 @@ namespace Playthrough { -int Playthrough_Init(uint32_t seed, std::set excludedLocations, std::set enabledTricks) { +int Playthrough_Init(uint32_t seed, std::set excludedLocations, + std::set enabledTricks) { // initialize the RNG with just the seed incase any settings need to be // resolved to something random Random_Init(seed); auto ctx = Rando::Context::GetInstance(); ctx->overrides.clear(); - CustomMessages::ClearMessages(); ctx->ItemReset(); ctx->HintReset(); ctx->GetLogic()->Reset(); @@ -63,11 +61,10 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, settingsStr += (char*)gBuildVersion; } - uint32_t finalHash = boost::hash_32{}(std::to_string(ctx->GetSeed()) + settingsStr); + uint32_t finalHash = SohUtils::Hash(std::to_string(ctx->GetSeed()) + settingsStr); Random_Init(finalHash); ctx->SetHash(std::to_string(finalHash)); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { VanillaFill(); // Just place items in their vanilla locations } else { // Fill locations with logic @@ -80,8 +77,9 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, GenerateHash(); if (true) { - //TODO: Handle different types of file output (i.e. Spoiler Log, Plando Template, Patch Files, Race Files, etc.) - // write logs + // TODO: Handle different types of file output (i.e. Spoiler Log, Plando Template, Patch Files, Race Files, + // etc.) + // write logs SPDLOG_INFO("Writing Spoiler Log..."); StartPerformanceTimer(PT_SPOILER_LOG); if (SpoilerLog_Write()) { @@ -99,14 +97,15 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, } // used for generating a lot of seeds at once -int Playthrough_Repeat(std::set excludedLocations, std::set enabledTricks, int count /*= 1*/) { +int Playthrough_Repeat(std::set excludedLocations, std::set enabledTricks, + int count /*= 1*/) { SPDLOG_INFO("GENERATING {} SEEDS", count); auto ctx = Rando::Context::GetInstance(); uint32_t repeatedSeed = 0; for (int i = 0; i < count; i++) { - ctx->SetSeedString(std::to_string(rand() % 0xFFFFFFFF)); - repeatedSeed = boost::hash_32{}(ctx->GetSeedString()); - ctx->SetSeed(repeatedSeed % 0xFFFFFFFF); + ctx->SetSeedString(std::to_string(rand())); + repeatedSeed = SohUtils::Hash(ctx->GetSeedString()); + ctx->SetSeed(repeatedSeed); SPDLOG_DEBUG("testing seed: %d", repeatedSeed); ClearProgress(); Playthrough_Init(ctx->GetSeed(), excludedLocations, enabledTricks); diff --git a/soh/soh/Enhancements/randomizer/3drando/playthrough.hpp b/soh/soh/Enhancements/randomizer/3drando/playthrough.hpp index 1dbbc78429..52ad6a3ee8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/playthrough.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/playthrough.hpp @@ -4,6 +4,8 @@ #include "../context.h" namespace Playthrough { - int Playthrough_Init(uint32_t seed, std::set excludedLocations, std::set enabledTricks); - int Playthrough_Repeat(std::set excludedLocations, std::set enabledTricks, int count = 1); -} +int Playthrough_Init(uint32_t seed, std::set excludedLocations, + std::set enabledTricks); +int Playthrough_Repeat(std::set excludedLocations, std::set enabledTricks, + int count = 1); +} // namespace Playthrough diff --git a/soh/soh/Enhancements/randomizer/3drando/pool_functions.hpp b/soh/soh/Enhancements/randomizer/3drando/pool_functions.hpp index 5a83cda5bc..5edcb0fdaa 100644 --- a/soh/soh/Enhancements/randomizer/3drando/pool_functions.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/pool_functions.hpp @@ -5,38 +5,35 @@ #include #include -template -static void erase_if(std::vector& vector, Predicate pred) { - vector.erase(std::remove_if(begin(vector), end(vector), pred), end(vector)); +template static void erase_if(std::vector& vector, Predicate pred) { + vector.erase(std::remove_if(begin(vector), end(vector), pred), end(vector)); } template std::vector FilterFromPool(std::vector& vector, Predicate pred, bool eraseAfterFilter = false) { - std::vector filteredPool = {}; - std::copy_if(vector.begin(), vector.end(), std::back_inserter(filteredPool), pred); + std::vector filteredPool = {}; + std::copy_if(vector.begin(), vector.end(), std::back_inserter(filteredPool), pred); - if (eraseAfterFilter) { - erase_if(vector, pred); - } + if (eraseAfterFilter) { + erase_if(vector, pred); + } - return filteredPool; + return filteredPool; } template std::vector FilterAndEraseFromPool(std::vector& vector, Predicate pred) { - return FilterFromPool(vector, pred, true); + return FilterFromPool(vector, pred, true); } -template -void AddElementsToPool(std::vector& toPool, const FromPool& fromPool) { - toPool.insert(toPool.end(), std::cbegin(fromPool), std::cend(fromPool)); +template void AddElementsToPool(std::vector& toPool, const FromPool& fromPool) { + toPool.insert(toPool.end(), std::cbegin(fromPool), std::cend(fromPool)); } -template -bool ElementInContainer(T& element, const Container& container) { - return std::find(container.begin(), container.end(), element) != container.end(); +template bool ElementInContainer(T& element, const Container& container) { + return std::find(container.begin(), container.end(), element) != container.end(); } template bool IsAnyOf(First&& first, T&&... t) { - return ((first == t) || ...); + return ((first == t) || ...); } diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp index d26e89adba..51cfdd535f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp @@ -11,7 +11,7 @@ #include "soh/cvar_prefixes.h" void RandoMain::GenerateRando(std::set excludedLocations, std::set enabledTricks, - std::string seedString) { + std::string seedString) { Rando::Context::GetInstance()->SetSeedGenerated(GenerateRandomizer(excludedLocations, enabledTricks, seedString)); diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp index 8ac22069bf..b03dd8b88b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.hpp @@ -3,5 +3,6 @@ #include namespace RandoMain { -void GenerateRando(std::set excludedLocations, std::set enabledTricks, std::string seedInput); +void GenerateRando(std::set excludedLocations, std::set enabledTricks, + std::string seedInput); } diff --git a/soh/soh/Enhancements/randomizer/3drando/random.cpp b/soh/soh/Enhancements/randomizer/3drando/random.cpp index 92cf22b85d..4cac198183 100644 --- a/soh/soh/Enhancements/randomizer/3drando/random.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/random.cpp @@ -1,36 +1,55 @@ #include "random.hpp" +#include #include -#include -#include -#include +#include static bool init = false; -static boost::random::mt19937 generator; +static uint64_t state = 0; +const uint64_t multiplier = 6364136223846793005ULL; +const uint64_t increment = 11634580027462260723ULL; -//Initialize with seed specified -void Random_Init(uint32_t seed) { +// Initialize with seed specified +void Random_Init(uint64_t seed) { init = true; - generator = boost::random::mt19937{seed}; + state = seed; } -//Returns a random integer in range [min, max-1] -uint32_t Random(int min, int max) { +uint32_t next32() { if (!init) { - //No seed given, get a random number from device to seed + // No seed given, get a random number from device to seed #if !defined(__SWITCH__) && !defined(__WIIU__) - const auto seed = static_cast(std::random_device{}()); + uint64_t seed = static_cast(std::random_device{}()); #else - uint32_t seed = static_cast(std::hash{}(std::to_string(rand()))); + uint64_t seed = static_cast(std::hash{}(std::to_string(rand()))); #endif Random_Init(seed); } - boost::random::uniform_int_distribution distribution(min, max-1); - return distribution(generator); + + state = state * multiplier + increment; + uint32_t xorshifted = static_cast(((state >> 18) ^ state) >> 27); + uint32_t rot = static_cast(state >> 59); + return std::rotr(xorshifted, rot); } -//Returns a random floating point number in [0.0, 1.0] -double RandomDouble() { - boost::random::uniform_real_distribution distribution(0.0, 1.0); - return distribution(generator); +// Returns a random integer in range [min, max-1] +uint32_t Random(uint32_t min, uint32_t max) { + if (min == max) { + return min; + } + assert(max > min); + + uint32_t n = max - min; + uint32_t cutoff = UINT32_MAX - UINT32_MAX % static_cast(n); + for (;;) { + uint32_t r = next32(); + if (r <= cutoff) { + return min + r % n; + } + } +} + +// Returns a random floating point number in [0.0, 1.0) +double RandomDouble() { + return ldexp(next32(), -32); } diff --git a/soh/soh/Enhancements/randomizer/3drando/random.hpp b/soh/soh/Enhancements/randomizer/3drando/random.hpp index 24ab78dcdb..5143894710 100644 --- a/soh/soh/Enhancements/randomizer/3drando/random.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/random.hpp @@ -7,35 +7,31 @@ #include #include -void Random_Init(uint32_t seed); -uint32_t Random(int min, int max); +void Random_Init(uint64_t seed); +uint32_t Random(uint32_t min, uint32_t max); double RandomDouble(); -//Get a random element from a vector or array -template -T RandomElement(std::vector& vector, bool erase) { - const auto idx = Random(0, vector.size()); +// Get a random element from a vector or array +template T RandomElement(std::vector& vector, bool erase) { + const auto idx = Random(0, static_cast(vector.size())); const T selected = vector[idx]; if (erase) { vector.erase(vector.begin() + idx); } return selected; } -template -auto& RandomElement(Container& container) { - return container[Random(0, std::size(container))]; +template auto& RandomElement(Container& container) { + return container[Random(0, static_cast(std::size(container)))]; } -template -const auto& RandomElement(const Container& container) { - return container[Random(0, std::size(container))]; +template const auto& RandomElement(const Container& container) { + return container[Random(0, static_cast(std::size(container)))]; } -template -const T RandomElementFromSet(const std::set& set) { +template const T RandomElementFromSet(const std::set& set) { if (set.size() == 1) { return *set.begin(); } - uint32_t rand = Random(0, set.size()); + uint32_t rand = Random(0, static_cast(set.size())); auto it = set.begin(); for (uint32_t i = 0; i < rand; i++) { it++; @@ -44,19 +40,15 @@ const T RandomElementFromSet(const std::set& set) { return *it; } -//Shuffle items within a vector or array -//RANDOTODO There's probably a more efficient way to do what this does. -template -void Shuffle(std::vector& vector) { - for (std::size_t i = 0; i + 1 < vector.size(); i++) - { - std::swap(vector[i], vector[Random(i, vector.size())]); +// Shuffle items within a vector or array +// RANDOTODO There's probably a more efficient way to do what this does. +template void Shuffle(std::vector& vector) { + for (size_t i = 0; i + 1 < vector.size(); i++) { + std::swap(vector[i], vector[Random(static_cast(i), static_cast(vector.size()))]); } } -template -void Shuffle(std::array& arr) { - for (std::size_t i = 0; i + 1 < arr.size(); i++) - { - std::swap(arr[i], arr[Random(i, arr.size())]); +template void Shuffle(std::array& arr) { + for (size_t i = 0; i + 1 < arr.size(); i++) { + std::swap(arr[i], arr[Random(static_cast(i), static_cast(arr.size()))]); } } diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index edaf8aa5d2..441454cd07 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -10,248 +10,200 @@ #include #include "z64item.h" -PriceSettingsStruct::PriceSettingsStruct(RandomizerSettingKey _main, - RandomizerSettingKey _fixedPrice, - RandomizerSettingKey _range1, - RandomizerSettingKey _range2, - RandomizerSettingKey _noWallet, - RandomizerSettingKey _childWallet, - RandomizerSettingKey _adultWallet, - RandomizerSettingKey _giantWallet, - RandomizerSettingKey _tycoonWallet, - RandomizerSettingKey _affordable){ - main = _main; - fixedPrice = _fixedPrice; - range1 = _range1; - range2 = _range2; - noWallet = _noWallet; - childWallet = _childWallet; - adultWallet = _adultWallet; - giantWallet= _giantWallet; - tycoonWallet= _tycoonWallet; - affordable= _affordable; +PriceSettingsStruct::PriceSettingsStruct(RandomizerSettingKey _main, RandomizerSettingKey _fixedPrice, + RandomizerSettingKey _range1, RandomizerSettingKey _range2, + RandomizerSettingKey _noWallet, RandomizerSettingKey _childWallet, + RandomizerSettingKey _adultWallet, RandomizerSettingKey _giantWallet, + RandomizerSettingKey _tycoonWallet, RandomizerSettingKey _affordable) { + main = _main; + fixedPrice = _fixedPrice; + range1 = _range1; + range2 = _range2; + noWallet = _noWallet; + childWallet = _childWallet; + adultWallet = _adultWallet; + giantWallet = _giantWallet; + tycoonWallet = _tycoonWallet; + affordable = _affordable; } - static std::array, 0xF1> trickNameTable; // Table of trick names for ice traps -bool initTrickNames = false; //Indicates if trick ice trap names have been initialized yet +bool initTrickNames = false; // Indicates if trick ice trap names have been initialized yet -//Set vanilla shop item locations before potentially shuffling +// Set vanilla shop item locations before potentially shuffling void PlaceVanillaShopItems() { auto ctx = Rando::Context::GetInstance(); - //Loop to place vanilla items in each location + // Loop to place vanilla items in each location for (RandomizerCheck& randomizerCheck : Rando::StaticData::GetShopLocations()) { ctx->GetItemLocation(randomizerCheck)->PlaceVanillaItem(); } } -//These are the vanilla shop items, but in a priority order of importance -//However many shop item slots were cleared, this will return 64 minus that number of vanilla shop items to be placed with assumed fill -//The first 32 items here will always be present in shops -//Shopsanity 4 will only have the first 32, shopsanity 1 will have the first 56, etc. -//Shopsanity random will have anywhere from the first 32 to the first 56, so the order of items after 32 is relevant +// These are the vanilla shop items, but in a priority order of importance +// However many shop item slots were cleared, this will return 64 minus that number of vanilla shop items to be placed +// with assumed fill The first 32 items here will always be present in shops Shopsanity 4 will only have the first 32, +// shopsanity 1 will have the first 56, etc. Shopsanity random will have anywhere from the first 32 to the first 56, so +// the order of items after 32 is relevant std::vector GetMinVanillaShopItems(int total_replaced) { std::vector minShopItems = { - RG_BUY_DEKU_SHIELD, - RG_BUY_HYLIAN_SHIELD, - RG_BUY_GORON_TUNIC, - RG_BUY_ZORA_TUNIC, - RG_BUY_DEKU_NUTS_5, - RG_BUY_BOMBS_20, - RG_BUY_BOMBCHUS_10, - RG_BUY_DEKU_STICK_1, + RG_BUY_DEKU_SHIELD, RG_BUY_HYLIAN_SHIELD, RG_BUY_GORON_TUNIC, RG_BUY_ZORA_TUNIC, RG_BUY_DEKU_NUTS_5, + RG_BUY_BOMBS_20, RG_BUY_BOMBCHUS_10, RG_BUY_DEKU_STICK_1, //^First 8 items: Exist on shopsanity 7 or less - RG_BUY_FAIRYS_SPIRIT, - RG_BUY_DEKU_SEEDS_30, - RG_BUY_ARROWS_10, - RG_BUY_BLUE_FIRE, - RG_BUY_RED_POTION_30, - RG_BUY_GREEN_POTION, - RG_BUY_DEKU_NUTS_10, - RG_BUY_BOMBCHUS_10, + RG_BUY_FAIRYS_SPIRIT, RG_BUY_DEKU_SEEDS_30, RG_BUY_ARROWS_10, RG_BUY_BLUE_FIRE, RG_BUY_RED_POTION_30, + RG_BUY_GREEN_POTION, RG_BUY_DEKU_NUTS_10, RG_BUY_BOMBCHUS_10, //^First 16 items: Exist on shopsanity 6 or less - RG_BUY_BOMBCHUS_10, - RG_BUY_BOMBCHUS_20, - RG_BUY_BOMBS_525, - RG_BUY_BOMBS_535, - RG_BUY_BOMBS_10, - RG_BUY_DEKU_NUTS_5, - RG_BUY_ARROWS_30, - RG_BUY_ARROWS_50, + RG_BUY_BOMBCHUS_10, RG_BUY_BOMBCHUS_20, RG_BUY_BOMBS_525, RG_BUY_BOMBS_535, RG_BUY_BOMBS_10, RG_BUY_DEKU_NUTS_5, + RG_BUY_ARROWS_30, RG_BUY_ARROWS_50, //^First 24 items: Exist on shopsanity 5 or less - RG_BUY_ARROWS_10, - RG_BUY_FAIRYS_SPIRIT, - RG_BUY_BOTTLE_BUG, - RG_BUY_FISH, + RG_BUY_ARROWS_10, RG_BUY_FAIRYS_SPIRIT, RG_BUY_BOTTLE_BUG, RG_BUY_FISH, //^First 28 items from OoTR - RG_BUY_HYLIAN_SHIELD, - RG_BUY_BOTTLE_BUG, - RG_BUY_DEKU_STICK_1, - RG_BUY_DEKU_STICK_1, + RG_BUY_HYLIAN_SHIELD, RG_BUY_BOTTLE_BUG, RG_BUY_DEKU_STICK_1, RG_BUY_DEKU_STICK_1, //^First 32 items: Exist on shopsanity 4 or less - RG_BUY_BLUE_FIRE, - RG_BUY_FISH, - RG_BUY_BOMBCHUS_10, - RG_BUY_DEKU_NUTS_5, - RG_BUY_ARROWS_10, - RG_BUY_BOMBCHUS_20, - RG_BUY_BOMBS_535, - RG_BUY_RED_POTION_30, + RG_BUY_BLUE_FIRE, RG_BUY_FISH, RG_BUY_BOMBCHUS_10, RG_BUY_DEKU_NUTS_5, RG_BUY_ARROWS_10, RG_BUY_BOMBCHUS_20, + RG_BUY_BOMBS_535, RG_BUY_RED_POTION_30, //^First 40 items: Exist on shopsanity 3 or less - RG_BUY_BOMBS_30, - RG_BUY_BOMBCHUS_20, - RG_BUY_DEKU_NUTS_5, - RG_BUY_ARROWS_10, - RG_BUY_DEKU_NUTS_5, - RG_BUY_ARROWS_30, - RG_BUY_RED_POTION_40, - RG_BUY_FISH, + RG_BUY_BOMBS_30, RG_BUY_BOMBCHUS_20, RG_BUY_DEKU_NUTS_5, RG_BUY_ARROWS_10, RG_BUY_DEKU_NUTS_5, RG_BUY_ARROWS_30, + RG_BUY_RED_POTION_40, RG_BUY_FISH, //^First 48 items: Exist on shopsanity 2 or less - RG_BUY_BOMBCHUS_20, - RG_BUY_ARROWS_30, - RG_BUY_RED_POTION_50, - RG_BUY_ARROWS_30, - RG_BUY_DEKU_NUTS_5, - RG_BUY_ARROWS_50, - RG_BUY_ARROWS_50, - RG_BUY_GREEN_POTION, + RG_BUY_BOMBCHUS_20, RG_BUY_ARROWS_30, RG_BUY_RED_POTION_50, RG_BUY_ARROWS_30, RG_BUY_DEKU_NUTS_5, + RG_BUY_ARROWS_50, RG_BUY_ARROWS_50, RG_BUY_GREEN_POTION, //^First 56 items: Exist on shopsanity 1 or less - RG_BUY_POE, - RG_BUY_POE, - RG_BUY_HEART, - RG_BUY_HEART, - RG_BUY_HEART, - RG_BUY_HEART, - RG_BUY_HEART, - RG_BUY_HEART, + RG_BUY_POE, RG_BUY_POE, RG_BUY_HEART, RG_BUY_HEART, RG_BUY_HEART, RG_BUY_HEART, RG_BUY_HEART, RG_BUY_HEART, //^All 64 items: Only exist with shopsanity 0 }; - //Now delete however many items there are to replace + // Now delete however many items there are to replace for (int i = 0; i < total_replaced; i++) { minShopItems.pop_back(); } return minShopItems; } -//This table contains a cumulative probability for each possible shop price based on -// a beta distribution with alpha = 1.5, beta = 2, and the result of the distribution, a float in [0.0, 1.0), -// being mutliplied by 60, casted to an integer, then multiplied by 5 to give a value in range [0, 295] in increments of 5. -// Meaning the first value is the probability of 0, the next value is the probability of 0 plus the probability of 5, etc. -//Probabilities generated using a python script with 1 billion trials, so should hopefully be pretty good -//Average price ~126 +// This table contains a cumulative probability for each possible shop price based on +// a beta distribution with alpha = 1.5, beta = 2, and the result of the distribution, a float in [0.0, 1.0), +// being mutliplied by 60, casted to an integer, then multiplied by 5 to give a value in range [0, 295] in increments +// of 5. Meaning the first value is the probability of 0, the next value is the probability of 0 plus the probability +// of 5, etc. +// Probabilities generated using a python script with 1 billion trials, so should hopefully be pretty good +// Average price ~126 //~38% chance of needing no wallet, ~45% chance of needing 1, ~17% chance of needing 2 -static constexpr std::array ShopPriceProbability= { - 0.005326994, 0.014908518, 0.027114719, 0.041315285, 0.057136304, 0.074325887, 0.092667151, 0.112002061, 0.132198214, 0.153125390, - 0.174696150, 0.196810540, 0.219388148, 0.242361379, 0.265657012, 0.289205134, 0.312970402, 0.336877590, 0.360881110, 0.384932772, - 0.408976198, 0.432982176, 0.456902494, 0.480686053, 0.504313389, 0.527746488, 0.550938554, 0.573856910, 0.596465330, 0.618736235, - 0.640646600, 0.662162782, 0.683240432, 0.703859801, 0.724001242, 0.743631336, 0.762722631, 0.781259986, 0.799198449, 0.816521905, - 0.833208595, 0.849243398, 0.864579161, 0.879211177, 0.893112051, 0.906263928, 0.918639420, 0.930222611, 0.940985829, 0.950914731, - 0.959992180, 0.968187000, 0.975495390, 0.981884488, 0.987344345, 0.991851853, 0.995389113, 0.997937921, 0.999481947, 1.000000000, +static constexpr std::array ShopPriceProbability = { + 0.005326994, 0.014908518, 0.027114719, 0.041315285, 0.057136304, 0.074325887, 0.092667151, 0.112002061, 0.132198214, + 0.153125390, 0.174696150, 0.196810540, 0.219388148, 0.242361379, 0.265657012, 0.289205134, 0.312970402, 0.336877590, + 0.360881110, 0.384932772, 0.408976198, 0.432982176, 0.456902494, 0.480686053, 0.504313389, 0.527746488, 0.550938554, + 0.573856910, 0.596465330, 0.618736235, 0.640646600, 0.662162782, 0.683240432, 0.703859801, 0.724001242, 0.743631336, + 0.762722631, 0.781259986, 0.799198449, 0.816521905, 0.833208595, 0.849243398, 0.864579161, 0.879211177, 0.893112051, + 0.906263928, 0.918639420, 0.930222611, 0.940985829, 0.950914731, 0.959992180, 0.968187000, 0.975495390, 0.981884488, + 0.987344345, 0.991851853, 0.995389113, 0.997937921, 0.999481947, 1.000000000, }; // Generate random number from 5 to wallet max int GetPriceFromMax(int max) { - return Random(1, max) * 5; // random range of 1 - wallet max / 5, where wallet max is the highest it goes as a multiple of 5 + // random range of 1 - wallet max / 5, where wallet max is the highest it goes as a multiple of 5 + return Random(1, max) * 5; } -uint16_t GetPriceFromSettings(Rando::Location *loc, PriceSettingsStruct priceSettings) { - auto ctx = Rando::Context::GetInstance(); - switch (ctx->GetOption(priceSettings.main).Get()){ - case RO_PRICE_VANILLA: - return loc->GetVanillaPrice(); - case RO_PRICE_CHEAP_BALANCED: - return GetCheapBalancedPrice(); - case RO_PRICE_BALANCED:{ - double random = RandomDouble(); //Randomly generated probability value - for (size_t i = 0; i < ShopPriceProbability.size(); i++) { - if (random < ShopPriceProbability[i]) { - //The randomly generated value has surpassed the total probability up to this point, so this is the generated price - return i * 5; //i in range [0, 59], output in range [0, 295] in increments of 5 +uint16_t GetPriceFromSettings(Rando::Location* loc, PriceSettingsStruct priceSettings) { + auto ctx = Rando::Context::GetInstance(); + switch (ctx->GetOption(priceSettings.main).Get()) { + case RO_PRICE_VANILLA: + return loc->GetVanillaPrice(); + case RO_PRICE_CHEAP_BALANCED: + return GetCheapBalancedPrice(); + case RO_PRICE_BALANCED: { + double random = RandomDouble(); // Randomly generated probability value + for (size_t i = 0; i < ShopPriceProbability.size(); i++) { + if (random < ShopPriceProbability[i]) { + // The randomly generated value has surpassed the total probability up to this point, so this is the + // generated price i in range [0, 59], output in range [0, 295] in increments of 5 + return static_cast(i) * 5; + } } - } - return 150; - } - case RO_PRICE_FIXED: - return (uint16_t)ctx->GetOption(priceSettings.fixedPrice).Get() * 5; - case RO_PRICE_RANGE:{ - uint16_t range1 = (uint16_t)ctx->GetOption(priceSettings.range1).Get() * 5; - uint16_t range2 = (uint16_t)ctx->GetOption(priceSettings.range2).Get() * 5; - return range1 < range2 ? Random(range1, range2+1) : Random(range2, range1+1); - } - case RO_PRICE_SET_BY_WALLET:{ - bool isTycoon = ctx->GetOption(RSK_INCLUDE_TYCOON_WALLET).Get(); - uint16_t noWeight = ctx->GetOption(priceSettings.noWallet).Get(); - uint16_t childWeight = ctx->GetOption(priceSettings.childWallet).Get(); - uint16_t adultWeight = ctx->GetOption(priceSettings.adultWallet).Get(); - uint16_t giantWeight = ctx->GetOption(priceSettings.giantWallet).Get(); - uint16_t tycoonWeight = isTycoon ? ctx->GetOption(priceSettings.tycoonWallet).Get() : 0; - uint16_t totalWeight = noWeight + childWeight + adultWeight + giantWeight + tycoonWeight; - if (totalWeight == 0){ //if no weight, return from sane range - return Random(0, 501); - } - int16_t selected = Random(1, totalWeight + 1); - selected = selected - noWeight; - if (selected <= 0){ - return 0; - } - selected = selected - childWeight; - if (selected <= 0){ - return Random(1, 100); - } - selected = selected - adultWeight; - if (selected <= 0){ - return Random(100, 201); - } - selected = selected - giantWeight; - if (selected <= 0){ - return Random(201, 501); - } - return Random(501, 999); - } - } - SPDLOG_ERROR("GetPriceFromSettings has failed to return a price for location {}, assigning a default value.", loc->GetName()); - assert(false); - return 69; //this should never happen, if it does, EASTER EGG that tells us something is wrong + return 150; + } + case RO_PRICE_FIXED: + return (uint16_t)ctx->GetOption(priceSettings.fixedPrice).Get() * 5; + case RO_PRICE_RANGE: { + uint16_t range1 = (uint16_t)ctx->GetOption(priceSettings.range1).Get() * 5; + uint16_t range2 = (uint16_t)ctx->GetOption(priceSettings.range2).Get() * 5; + return range1 < range2 ? Random(range1, range2 + 1) : Random(range2, range1 + 1); + } + case RO_PRICE_SET_BY_WALLET: { + bool isTycoon = ctx->GetOption(RSK_INCLUDE_TYCOON_WALLET).Get(); + uint16_t noWeight = ctx->GetOption(priceSettings.noWallet).Get(); + uint16_t childWeight = ctx->GetOption(priceSettings.childWallet).Get(); + uint16_t adultWeight = ctx->GetOption(priceSettings.adultWallet).Get(); + uint16_t giantWeight = ctx->GetOption(priceSettings.giantWallet).Get(); + uint16_t tycoonWeight = isTycoon ? ctx->GetOption(priceSettings.tycoonWallet).Get() : 0; + uint16_t totalWeight = noWeight + childWeight + adultWeight + giantWeight + tycoonWeight; + if (totalWeight == 0) { // if no weight, return from sane range + return Random(0, 501); + } + int16_t selected = Random(1, totalWeight + 1); + selected = selected - noWeight; + if (selected <= 0) { + return 0; + } + selected = selected - childWeight; + if (selected <= 0) { + return Random(1, 100); + } + selected = selected - adultWeight; + if (selected <= 0) { + return Random(100, 201); + } + selected = selected - giantWeight; + if (selected <= 0) { + return Random(201, 501); + } + return Random(501, 999); + } + } + SPDLOG_ERROR("GetPriceFromSettings has failed to return a price for location {}, assigning a default value.", + loc->GetName()); + assert(false); + return 69; // this should never happen, if it does, EASTER EGG that tells us something is wrong } -uint16_t GetRandomPrice(Rando::Location *loc, PriceSettingsStruct priceSettings) { - uint16_t initialPrice = GetPriceFromSettings(loc, priceSettings); - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(priceSettings.affordable) && !ctx->GetOption(priceSettings.main).Is(RO_PRICE_FIXED)){ - if (initialPrice > 500) { - return 505; - } else if (initialPrice > 200) { - return 205; - } else if (initialPrice > 99) { - return 100; - } else if (initialPrice > 0) { - return 5; - } - return 0; - } else { - return initialPrice; - } +uint16_t GetRandomPrice(Rando::Location* loc, PriceSettingsStruct priceSettings) { + uint16_t initialPrice = GetPriceFromSettings(loc, priceSettings); + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(priceSettings.affordable) && !ctx->GetOption(priceSettings.main).Is(RO_PRICE_FIXED)) { + if (initialPrice > 500) { + return 505; + } else if (initialPrice > 200) { + return 205; + } else if (initialPrice > 99) { + return 100; + } else if (initialPrice > 0) { + return 5; + } + return 0; + } else { + return initialPrice; + } } -//Similar to above, beta distribution with alpha = 1, beta = 2, -// multiplied by 20 instead of 60 to give values in rage [0, 95] in increments of 5 -//Average price ~31 +// Similar to above, beta distribution with alpha = 1, beta = 2, +// multiplied by 20 instead of 60 to give values in rage [0, 95] in increments of 5 +// Average price ~31 static constexpr std::array CheapPriceProbability = { - 0.097500187, 0.190002748, 0.277509301, 0.360018376, 0.437522571, 0.510021715, 0.577520272, 0.640029304, 0.697527584, 0.750024535, - 0.797518749, 0.840011707, 0.877508776, 0.910010904, 0.937504342, 0.960004661, 0.977502132, 0.989998967, 0.997500116, 1.000000000, + 0.097500187, 0.190002748, 0.277509301, 0.360018376, 0.437522571, 0.510021715, 0.577520272, + 0.640029304, 0.697527584, 0.750024535, 0.797518749, 0.840011707, 0.877508776, 0.910010904, + 0.937504342, 0.960004661, 0.977502132, 0.989998967, 0.997500116, 1.000000000, }; uint16_t GetCheapBalancedPrice() { double random = RandomDouble(); for (size_t i = 0; i < CheapPriceProbability.size(); i++) { if (random < CheapPriceProbability[i]) { - return i * 5; // i in range [0, 19], output in range [0, 95] in increments of 5 + // i in range [0, 19], output in range [0, 95] in increments of 5 + return static_cast(i) * 5; } } return -1; } -//Get 0 to 7, or a random number from 1-7 depending on shopsanity setting +// Get 0 to 7, or a random number from 1-7 depending on shopsanity setting int GetShopsanityReplaceAmount() { auto ctx = Rando::Context::GetInstance(); if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF)) { @@ -274,861 +226,947 @@ int GetShopsanityReplaceAmount() { } else if (ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_SEVEN_ITEMS)) { return 7; } else if (ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_EIGHT_ITEMS)) { - return 8; //temporarily unreachable due to logic limitations + return 8; // temporarily unreachable due to logic limitations + } else { + assert(false); + return 0; } - } else { //Random, get number in [1, 7] + } else { // Random, get number in [1, 7] return Random(1, 8); } } -//Initialize the table of trick names with an easy, medium, and hard name for each language +/* Initialize the table of trick names with an easy, medium, and hard name for each language. + english, french, german // spanish */ void InitTrickNames() { trickNameTable[RG_KOKIRI_SWORD] = { - Text{"Korok Sword", "Épée Korok", "Espada Korok"}, - Text{"Hero's Sword", "Épée du Héros", "Espada del héroe"}, - Text{"Razor Sword", "Lame Rasoir", "Espada de esmeril"} + Text{ "Korok Sword", "Épée Korok", "Korok-Schwert" }, // "Espada Korok" + Text{ "Hero's Sword", "Épée du Héros", "Heroenschwert" }, // "Espada del héroe" + Text{ "Razor Sword", "Lame Rasoir", "Elfenschwert" }, // "Espada de esmeril" }; trickNameTable[RG_MASTER_SWORD] = { - Text{"Goddess Sword", "Épée de la déesse", "Espada Divina"}, - Text{"Gilded Sword", "Excalibur", "Espada de los Sabios"}, - Text{"Magical Sword", "Lame dorée", "Fay"} + Text{ "Goddess Sword", "Épée de la déesse", "Schwert der Göttin" }, // "Espada Divina" + Text{ "Gilded Sword", "Excalibur", "Schmirgelklinge" }, // "Espada de los Sabios" + Text{ "Magical Sword", "Lame dorée", "Magisches Schwert" }, // "Fay" }; trickNameTable[RG_GIANTS_KNIFE] = { - Text{"Medigoron's Sword", "l'Épée de Medigoron", "La espada de Medigoron"}, - Text{"Razor Sword", "Lame Rasoir", "Espada de esmeril"}, - Text{"Royal Claymore", "Claymore Royale", "Royal Claymore"} + Text{ "Medigoron's Sword", "l'Épée de Medigoron", "Medigoron-Schwert" }, // "La espada de Medigoron" + Text{ "Razor Sword", "Lame Rasoir", "Elfenschwert" }, // "Espada de esmeril" + Text{ "Royal Claymore", "Claymore Royale", "Königs-Zweihänder" }, // "Royal Claymore" }; trickNameTable[RG_BIGGORON_SWORD] = { - Text{"Power Sword", "Épée de Puissance", "Espada de poder"}, - Text{"Fierce Deity Sword", "Épée du dieu démon", "Espada de la Fiera Deidad"}, - Text{"Tempered Sword", "Épée de Légende Nv.2", "Espada Maestra mejorada"}, - Text{"Biggoron's Knife", "Lame de Grogoron", "Daga de Biggoron"} + Text{ "Power Sword", "Épée de Puissance", "Schwert der Macht" }, // "Espada de poder", + Text{ "Fierce Deity Sword", "Épée du dieu démon", + "Schwert der grimmischen Gottheit" }, // "Espada de la Fiera Deidad" + Text{ "Tempered Sword", "Épée de Légende Nv.2", "Master-Schwert Lv.2" }, // "Espada Maestra mejorada" + Text{ "Biggoron's Knife", "Lame de Grogoron", "Biggoron-Messer" }, // "Daga de Biggoron" }; trickNameTable[RG_DEKU_SHIELD] = { - Text{"Boko Shield", "Bouclier Boko", "Escudo Boko"}, - Text{"Ordon Shield", "Bouclier de Toal", "Escudo de Ordon"}, - Text{"Wooden Shield", "Bouclier de Bois", "Escudo de madera"} + Text{ "Boko Shield", "Bouclier Boko", "Bokschild" }, // "Escudo Boko" + Text{ "Ordon Shield", "Bouclier de Toal", "Ordon-Schild" }, // "Escudo de Ordon" + Text{ "Wooden Shield", "Bouclier de Bois", "Holzschild" }, // "Escudo de madera" }; trickNameTable[RG_HYLIAN_SHIELD] = { - Text{"Hyrule Shield", "Bouclier d'Hyrule", "Escudo Hylian"}, - Text{"Goddess Shield", "Bouclier Sacré", "Escudo Divino"}, - Text{"Hero's Shield", "Bouclier du Héros", "Escudo del héroe"} + Text{ "Hyrule Shield", "Bouclier d'Hyrule", "Hyrule-Schild" }, // "Escudo Hylian" + Text{ "Goddess Shield", "Bouclier Sacré", "Göttlicher Schild" }, // "Escudo Divino" + Text{ "Hero's Shield", "Bouclier du Héros", "Heroenschild" }, // "Escudo del héroe" }; trickNameTable[RG_MIRROR_SHIELD] = { - Text{"Magic Mirror", "Miroir Magique", "Escudo mágico"}, - Text{"Magical Shield", "Bouclier Magique", "Escudo arcano"}, - Text{"Mirror of Twilight", "Miroir des Ombres", "Espejo del Crepúsculo"} + Text{ "Magic Mirror", "Miroir Magique", "Magiespiegel" }, // "Escudo mágico" + Text{ "Magical Shield", "Bouclier Magique", "Magischer Schild" }, // "Escudo arcano" + Text{ "Mirror of Twilight", "Miroir des Ombres", "Schattenspiegel" }, // "Espejo del Crepúsculo" }; trickNameTable[RG_GORON_TUNIC] = { - Text{"Gerudo Top", "Tunique Gerudo", "Pechera gerudo"}, - Text{"Flamebreaker Armor", "Armure de Pierre", " Armadura ignífuga"}, - Text{"Red Mail", "Habits Rouges", "Ropas rojas"} + Text{ "Gerudo Top", "Tunique Gerudo", "Damengewand" }, // "Pechera gerudo" + Text{ "Flamebreaker Armor", "Armure de Pierre", "Anti-Feuer-Rüstung" }, // "Armadura ignífuga" + Text{ "Red Mail", "Habits Rouges", "Rotes Gewand" }, // "Ropas rojas" }; trickNameTable[RG_ZORA_TUNIC] = { - Text{"Rito Tunic", "Tunique Rito", "Sayo rito"}, - Text{"Mermaid Suit", "Costume de sirène", "Costume de sirène"}, - Text{"Zora Armor", "Armure Zora", "Túnica Zora"}, - Text{"Blue Mail", "Habits Bleus", "Ropas azules"} + Text{ "Rito Tunic", "Tunique Rito", "Orni-Gewand" }, // "Sayo rito" + Text{ "Mermaid Suit", "Costume de sirène", "Nixenanzug" }, // "Costume de sirène" + Text{ "Zora Armor", "Armure Zora", "Zora-Panzer" }, // "Túnica Zora" + Text{ "Blue Mail", "Habits Bleus", "Blaues Gewand" }, // "Ropas azules" }; trickNameTable[RG_IRON_BOOTS] = { - Text{"Iron Hoofs", "Patins de Plomb", "Botas férreas"}, - Text{"Snow Boots", "Bottes de Neige", "Botas de nieve"}, - Text{"Red Boots", "Bottes rouges", "Botas rojas"}, - Text{"Zora Greaves", "Bottes Zora", "Zora Greaves"}, - Text{"Boots of Power", "Bottes de Puissance", "Botas de plomo"} + Text{ "Iron Hoofs", "Patins de Plomb", "Eisenhufe€" }, // "Botas férreas" + Text{ "Snow Boots", "Bottes de Neige", "Schneestiefel€" }, // "Botas de nieve" + Text{ "Red Boots", "Bottes rouges", "Rote Stiefel€" }, // "Botas rojas" + Text{ "Zora Greaves", "Bottes Zora", "Zora-Beinschutz" }, // "Zora Greaves" + Text{ "Boots of Power", "Bottes de Puissance", "Stärkestiefel€" }, // "Botas de plomo" }; trickNameTable[RG_HOVER_BOOTS] = { - Text{"Hover Hoofs", "Patins des airs", "Botas flotadoras"}, - Text{"Golden Boots", "Bottes dorées", "Botas de Oro"}, - Text{"Pegasus Boots", "Bottes pégase", "Botas de Pegaso"}, - Text{"Boots of Speed", "Bottes de vitesse", "Botas del desierto"} + Text{ "Hover Hoofs", "Patins des airs", "Gleithufe€" }, // "Botas flotadoras" + Text{ "Golden Boots", "Bottes dorées", "Goldstiefel€" }, // "Botas de Oro" + Text{ "Pegasus Boots", "Bottes pégase", "Pegasus-Stiefel€" }, // "Botas de Pegaso" + Text{ "Boots of Speed", "Bottes de vitesse", "Tempostiefel€" }, // "Botas del desierto" }; trickNameTable[RG_WEIRD_EGG] = { - Text{"Poached Egg", "Oeuf à la coque", "Huevo pasado"}, - Text{"Lon Lon Egg", "Oeuf Lon Lon", "Huevo Lon Lon"}, - Text{"Zora Egg", "Oeuf Zora", "Huevo Zora"} + Text{ "Poached Egg", "Oeuf à la coque", "Spiegelei" }, // "Huevo pasado" + Text{ "Lon Lon Egg", "Oeuf Lon Lon", "Lon Lon-Ei" }, // "Huevo Lon Lon" + Text{ "Zora Egg", "Oeuf Zora", "Zora-Ei" }, // "Huevo Zora" }; trickNameTable[RG_ZELDAS_LETTER] = { - Text{"Ruto's Letter", "Lettre de Ruto", "Carta de Ruto"}, - Text{"Royal Letter", "Lettre Eoyale", "Carta para Kafei"}, - Text{"Zelda's Business Card", "Carte d'affaires de Zelda", "Carta"}, - Text{"Letter to Kafei", "Lettre pour Kafei", "Carta para Kafei "}, - Text{"Goat's Letter", "Lettre de la Chèvre", "Carta de la Cabra"}, - Text{"Maggie's Letter", "Lettre de Maggy", "Carta de Dolores"} + Text{ "Ruto's Letter", "Lettre de Ruto", "Rutos Brief" }, // "Carta de Ruto" + Text{ "Royal Letter", "Lettre Eoyale", "Royaler Brief" }, // "Carta para Kafei" + Text{ "Zelda's Business Card", "Carte d'affaires de Zelda", "Zeldas Visitenkarte" }, // "Carta" + Text{ "Letter to Kafei", "Lettre pour Kafei", "Brief an Kafei" }, // "Carta para Kafei" + Text{ "Goat's Letter", "Lettre de la Chèvre", "Brief der Ziege" }, // "Carta de la Cabra" + Text{ "Maggie's Letter", "Lettre de Maggy", "Dolores' Brief" }, // "Carta de Dolores" }; trickNameTable[RG_BOOMERANG] = { - Text{"Banana", "Banane", "Plátano"}, - Text{"Prank Fetch Toy", "Inséparable Bâtonnet", "Bumerang"}, - Text{"Gale Boomerang", "Boomerang Tornade", "Bumerán tornado"}, - Text{"Magic Boomerang", "Boomerang Magique", "Bumerán mágico"} + Text{ "Banana", "Banane", "Banane" }, // "Plátano" + Text{ "Prank Fetch Toy", "Inséparable Bâtonnet", "Boomerang" }, // "Bumerang" + Text{ "Gale Boomerang", "Boomerang Tornade", "Sturmbumerang" }, // "Bumerán tornado" + Text{ "Magic Boomerang", "Boomerang Magique", "Magischer Bumerang" }, // "Bumerán mágico" }; trickNameTable[RG_LENS_OF_TRUTH] = { - Text{"Sheikah-leidoscope", "Sheikah-léidoscope", "Monóculo de la Verdad"}, - Text{"Sheikah Sensor", "Sonar Sheikah", "Sensor Sheikah"}, - Text{"Crystal of Vision", "Cristal de Vision", "Cristal de Visión"}, - Text{"Magnifying Lens", "Loupe", "Lente Aumentadora"} + Text{ "Sheikah-leidoscope", "Sheikah-léidoscope", "Shiekah-leidoskop" }, // "Monóculo de la Verdad" + Text{ "Sheikah Sensor", "Sonar Sheikah", "Shiekah-Sensor" }, // "Sensor Sheikah" + Text{ "Crystal of Vision", "Cristal de Vision", "Kristall der Sicht" }, // "Cristal de Visión" + Text{ "Magnifying Lens", "Loupe", "Magische Lupe" }, // "Lente Aumentadora" }; trickNameTable[RG_MEGATON_HAMMER] = { - Text{"Goron Gavel", "Masse Perforatrice", "Mazo Goron"}, - Text{"Magic Hammer", "Marteau Magique", "Martillo mágico"}, - Text{"Skull Hammer", "Maillet Ressort", "Martillo de hierro"} + Text{ "Goron Gavel", "Masse Perforatrice", "Goronen-Hammer" }, // "Mazo Goron" + Text{ "Magic Hammer", "Marteau Magique", "Magischer Hammer" }, // "Martillo mágico" + Text{ "Skull Hammer", "Maillet Ressort", "Schädel-Hammer" }, // "Martillo de hierro" }; trickNameTable[RG_STONE_OF_AGONY] = { - Text{"Cave Charm", "Charme de grotte", "Amuleto de la cueva"}, - Text{"Stone of Agahnim", "Fragment d'Agahnim", "Piedra de Agahnim"}, - Text{"Shard of Agony", "Fragment de Souffrance", "Piedra de la Agonía"}, - Text{"Pirate's Charm", "Pierre de Pirate", "Amuleto Pirata"} + Text{ "Cave Charm", "Charme de grotte", "Höhlenamulett" }, // "Amuleto de la cueva" + Text{ "Stone of Agahnim", "Fragment d'Agahnim", "Stein des Agahnim" }, // "Piedra de Agahnim" + Text{ "Shard of Agony", "Fragment de Souffrance", "Scherbe des Wissens" }, // "Piedra de la Agonía" + Text{ "Pirate's Charm", "Pierre de Pirate", "Links Talisman" }, // "Amuleto Pirata" }; trickNameTable[RG_DINS_FIRE] = { - Text{"Eldin's Fire", "Feu d'Eldin", "Fuego de Eldin"}, - Text{"Din's Blaze", "Flamme de Din", "Poder de Din"}, - Text{"Magic Lantern", "Lanterne Magique", "Linterna mágica"}, - Text{"Ether Medallion", "Médaillon d'Éther", "Medallón de Tesoro"}, - Text{"Bombos Medallion", "Médaillon des Flammes", "Medallón del Temblor"} + Text{ "Eldin's Fire", "Feu d'Eldin", "Eldins Feuerinferno" }, // "Fuego de Eldin" + Text{ "Din's Blaze", "Flamme de Din", "Dins Flammen" }, // "Poder de Din" + Text{ "Magic Lantern", "Lanterne Magique", "Magische Laterne" }, // "Linterna mágica" + Text{ "Ether Medallion", "Médaillon d'Éther", "Luft-Medaillon" }, // "Medallón de Tesoro" + Text{ "Bombos Medallion", "Médaillon des Flammes", "Feuer-Medaillon" }, // "Medallón del Temblor" }; trickNameTable[RG_FARORES_WIND] = { - Text{"Faron's Wind", "Vent de Firone", "Viento de Farone"}, - Text{"Farore's Windfall", "Zéphyr de Farore", "Valor de Farore"}, - Text{"Tingle Air", "Tingle Air", "Tingle de aire"}, - Text{"Travel Medallion", "Amulette de téléportation", "Medallón Maligno"}, - Text{"Irene's Taxi", "Le taxi d'Aëline", "El taxi de Airín"} + Text{ "Faron's Wind", "Vent de Firone", "Phirones Donnersturm" }, // "Viento de Farone" + Text{ "Farore's Windfall", "Zéphyr de Farore", "Farores Wind" }, // "Valor de Farore" + Text{ "Tingle Air", "Tingle de aire", "Tingle Luft" }, // "Tingle Air" + Text{ "Travel Medallion", "Amulette de téléportation", "Teleport-Medaillon" }, // "Medallón Maligno" + Text{ "Irene's Taxi", "Le taxi d'Aëline", "Irenes Taxi" }, // "El taxi de Airín" }; trickNameTable[RG_NAYRUS_LOVE] = { - Text{"Lanayru's Love", "Amour de Lanelle", "Amor de Lanayru"}, - Text{"Nayru's Passion", "Passion de Nayru", "Sabiduría de Nayru"}, - Text{"Tingle Shield", "Bouclier Tingle", "Escudo de hormigueo"}, - Text{"Shield Spell", "Bouclier Magique", "Hechizo de Protección"}, - Text{"Magic Armor", "Armure Magique", "Armadura mágica"} + Text{ "Lanayru's Love", "Amour de Lanelle", "Ranelles Umarmung" }, // "Amor de Lanayru" + Text{ "Nayru's Passion", "Passion de Nayru", "Nayrus Hingabe" }, // "Sabiduría de Nayru" + Text{ "Tingle Shield", "Bouclier Tingle", "Tingleschild" }, // "Escudo de hormigueo" + Text{ "Shield Spell", "Bouclier Magique", "Schildzauber" }, // "Hechizo de Protección" + Text{ "Magic Armor", "Armure Magique", "Magie-Rüstung" }, // "Armadura mágica" }; trickNameTable[RG_FIRE_ARROWS] = { - Text{"Fire Rod", "Baguette de feu", "Cetro de fuego"}, - Text{"Bomb Arrow", "Flèche-Bombe", "Flecha bomba"}, - Text{"Red Candle", "Bougie Rouge", "Vela roja"} + Text{ "Fire Rod", "Baguette de feu", "Feuerstab" }, // "Cetro de fuego" + Text{ "Bomb Arrow", "Flèche-Bombe", "Bomben-Pfeile€" }, // "Flecha bomba" + Text{ "Red Candle", "Bougie Rouge", "Rote Kerze" }, // "Vela roja" }; trickNameTable[RG_ICE_ARROWS] = { - Text{"Ice Rod", "Baguette des Glaces", "Cetro de Hielo"}, - Text{"Ancient Arrow", "Flèche Archéonique", "Flecha ancestral"}, - Text{"Ice Trap Arrow", "Flèche de Piège de Glace", "Cetro de hielo"} + Text{ "Ice Rod", "Baguette des Glaces", "Eisstab" }, // "Cetro de Hielo" + Text{ "Ancient Arrow", "Flèche Archéonique", "Antike Pfeile€" }, // "Flecha ancestral" + Text{ "Ice Trap Arrow", "Flèche de Piège de Glace", "Eisfallen-Pfeile€" }, // "Cetro de hielo" }; trickNameTable[RG_LIGHT_ARROWS] = { - Text{"Wind Arrow", "Flèche de Vent", "Flecha del Viento"}, - Text{"Wand of Gamelon", "Baguette de Gamelon", "Varita de Gamelón"}, - Text{"Shock Arrow", "Flèches Électriques", "Flecha eléctrica"}, - Text{"Silver Arrow", "Flèches d'Argent", "Flecha de plata"} + Text{ "Wind Arrow", "Flèche de Vent", "Wind-Pfeile€" }, // "Flecha del Viento" + Text{ "Wand of Gamelon", "Baguette de Gamelon", "Zauberstab von Gamelon" }, // "Varita de Gamelón" + Text{ "Shock Arrow", "Flèches Électriques", "Elektro-Pfeile€" }, // "Flecha eléctrica" + Text{ "Silver Arrow", "Flèches d'Argent", "Silber-Pfeile€" }, // "Flecha de plata" }; trickNameTable[RG_GERUDO_MEMBERSHIP_CARD] = { - Text{"Desert Title Deed", "Abonnement Gerudo", "Escritura del desierto"}, - Text{"Sickle Moon Flag", "Drapeau du croissant de lune", "Bandera de la Luna Creciente"}, - Text{"Complimentary ID", "Bon de félicitation", "Cupón especial"}, - Text{"Gerudo's Card", "Carte Goron", "Tóken Gerudo"}, - Text{"Gerudo's Membership Card", "Autographe de Nabooru", "Tarjeta Gerudo"} + Text{ "Desert Title Deed", "Abonnement Gerudo", "Wüsten-Urkunde" }, // "Escritura del desierto" + Text{ "Sickle Moon Flag", "Drapeau du croissant de lune", + "Mondsichel-Fahne" }, // "Bandera de la Luna Creciente" + Text{ "Complimentary ID", "Bon de félicitation", "Laudatio-Schein" }, // "Cupón especial" + Text{ "Gerudo's Card", "Carte Goron", "Gerudo-Symbol" }, // "Tóken Gerudo" + Text{ "Gerudo's Membership Card", "Autographe de Nabooru", "Gerudo-Mitgliedskarte" }, // "Tarjeta Gerudo" }; trickNameTable[RG_MAGIC_BEAN_PACK] = { - Text{"Funky Bean Pack", "Paquet de Fèves Magiques", "Lote de frijoles mágicos"}, - Text{"Grapple Berries", "Baies de grappin", "Bayas de garfio"}, - Text{"Crenel Bean Pack", "Paquet de Haricots Gonggle", "Lote de alubias mágicas"}, - Text{"Mystical Seed Pack", "Pack de graines mystiques", "Paquete de semillas místicas"} + Text{ "Funky Bean Pack", "Paquet de Fèves Magiques", "Wunderbohnen-Packung" }, // "Lote de frijoles mágicos" + Text{ "Grapple Berries", "Baies de grappin", "Grapple-Beeren€" }, // "Bayas de garfio" + Text{ "Crenel Bean Pack", "Paquet de Haricots Gonggle", "Gongolerbsen-Packung" }, // "Lote de alubias mágicas" + Text{ "Mystical Seed Pack", "Pack de graines mystiques", "Saatbeutel" }, // "Paquete de semillas místicas" }; trickNameTable[RG_DOUBLE_DEFENSE] = { - Text{"Diamond Hearts", "Coeurs de Diamant", "Contenedor de diamante"}, - Text{"Double Damage", "Double Souffrance", "Doble daño receptivo"}, - Text{"Quadruple Defence", "Quadruple Défence", "Defensa cuádruple"} + Text{ "Diamond Hearts", "Coeurs de Diamant", "Diamantherzen€" }, // "Contenedor de diamante" + Text{ "Double Damage", "Double Souffrance", "Doppelte Angriffskraft" }, // "Doble daño receptivo" + Text{ "Quadruple Defence", "Quadruple Défence", "Vierfache Verteidigung" }, // "Defensa cuádruple" }; trickNameTable[RG_POCKET_EGG] = { - Text{"Arpagos Egg", "Oeuf d'Arpagos", "Huevo de Arpagos"}, - Text{"Lon Lon Egg", "oeuf Lon Lon", "Huevo Lon Lon"}, - Text{"Zora Egg", "oeuf Zora", "Huevo del Pez Viento"} + Text{ "Arpagos Egg", "Oeuf d'Arpagos", "Arpagos-Ei" }, // "Huevo de Arpagos" + Text{ "Lon Lon Egg", "oeuf Lon Lon", "Lon Lon-Ei" }, // "Huevo Lon Lon" + Text{ "Zora Egg", "oeuf Zora", "Zora-Ei" }, // "Huevo del Pez Viento" }; trickNameTable[RG_POCKET_EGG] = { - Text{"D.I.Y. Alarm Clock", "Réveille-matin improvisé", "Alarma emplumada portátil"}, - Text{"Kakariko Cucco", "Cocotte Cocorico", "Cuco de Kakariko"}, - Text{"Hatched Cucco", "Cocotte éclose", "Pollo de bolsillo"} + Text{ "D.I.Y. Alarm Clock", "Réveille-matin improvisé", + "Improvisierter Wecker" }, // "Alarma emplumada portátil" + Text{ "Kakariko Cucco", "Cocotte Cocorico", "Kakariko-Huhn" }, // "Cuco de Kakariko" + Text{ "Hatched Cucco", "Cocotte éclose", "Geschlüpftes Küken" }, // "Pollo de bolsillo" }; trickNameTable[RG_COJIRO] = { - Text{"Blucco", "Chair-Qui-Poule", "Cucazul"}, - Text{"Piyoko", "Piyoko", "Piyoko"}, - Text{"Dark Cucco", "Cocotte Sombre", "Cucco oscuro"}, - Text{"Grog's Cucco", "Cocotte de Grog", "Cuco de Grog"} + Text{ "Blucco", "Chair-Qui-Poule", "Blenni" }, // "Cucazul" + Text{ "Piyoko", "Piyoko", "Piyoko" }, // "Piyoko" + Text{ "Dark Cucco", "Cocotte Sombre", "Dunkles Huhn" }, // "Cucco oscuro" + Text{ "Grog's Cucco", "Cocotte de Grog", "Grogs Huhn" }, // "Cuco de Grog" }; trickNameTable[RG_ODD_MUSHROOM] = { - Text{"Magic Mushroom", "Champignon magique", "Champiñón mágico"}, - Text{"Endura Shroom", "Champi Vigueur", "Champiñón del bosque"}, - Text{"Sleepy Toadstool", "Crapaud Fatigué", "Seta durmiente"}, - Text{"Mushroom", "Champignon", "Seta"} + Text{ "Magic Mushroom", "Champignon magique", "Magischer Pilz" }, // "Champiñón mágico" + Text{ "Endura Shroom", "Champi Vigueur", "Fittling" }, // "Champiñón del bosque" + Text{ "Sleepy Toadstool", "Crapaud Fatigué", "Schlummermorchel" }, // "Seta durmiente" + Text{ "Mushroom", "Champignon", "Pilz" }, // "Seta" }; trickNameTable[RG_ODD_POTION] = { - Text{"Odd Medicine", "Élixir suspect", "Poción rara"}, - Text{"Granny's Poultice", "Mixture de Granny", "Medicina de la abuela"}, - Text{"Mushroom Poultice", "Mixture de champignon", "Medicina de champiñones"}, - Text{"Secret Medicine", "Médicament", "Pócima secreta"}, - Text{"Mushroom Spores", "Spores de Champignons", "Esporas de hongos"}, - Text{"Hanyu Spore", "Hanyu Spore", "Espora Hanyu"} + Text{ "Odd Medicine", "Élixir suspect", "Moderpaket" }, // "Poción rara" + Text{ "Granny's Poultice", "Mixture de Granny", "Omas Mixtur" }, // "Medicina de la abuela" + Text{ "Mushroom Poultice", "Mixture de champignon", "Pilzumschlag" }, // "Medicina de champiñones" + Text{ "Secret Medicine", "Médicament", "Geheime Medizin" }, // "Pócima secreta" + Text{ "Mushroom Spores", "Spores de Champignons", "Pilzsporen" }, // "Esporas de hongos" + Text{ "Hanyu Spore", "Hanyu Spore", "Hanyu-Sporen" }, // "Espora Hanyu" }; trickNameTable[RG_POACHERS_SAW] = { - Text{"Carpenter's Saw", "Scie du charpentier", "Sierra del carpintero"}, - Text{"Poacher's Sword", "Hache du chasseur", "Espada del capataz"}, - Text{"Ancient Bladesaw", "Longue Épée Archéonique", "Mandoble ancestral"}, - Text{"Woodcutter's Axe", "Hache du Bûcheron", "Hacha de leñador"}, - Text{"Grog's Saw", "Scie de Grog", "Sierra del Cazador Furtivo"} + Text{ "Carpenter's Saw", "Scie du charpentier", "Zimmermannssäge" }, // "Sierra del carpintero" + Text{ "Poacher's Sword", "Hache du chasseur", "Wildererschwert" }, // "Espada del capataz" + Text{ "Ancient Bladesaw", "Longue Épée Archéonique", "Antike Großsäge" }, // "Mandoble ancestral" + Text{ "Woodcutter's Axe", "Hache du Bûcheron", "Holzfälleraxt" }, // "Hacha de leñador" + Text{ "Grog's Saw", "Scie de Grog", "Grogs Säge" }, // "Sierra del Cazador Furtivo" }; trickNameTable[RG_BROKEN_SWORD] = { - Text{"Broken Biggoron's Sword", "Épée brisée de Grogoron", "Espada de Biggoron rota"}, - Text{"Broken Giant's Knife", "Lame des Géants brisée", "Daga gigante rota"}, - Text{"Broken Noble Sword", "Épée noble brisée", "Espada noble rota"}, - Text{"Broken Picori Blade", "Épée Minish brisée", "Espada minish rota"}, - Text{"Decayed Master Sword", "Épée de légende pourrie", "Espada decadente de leyenda"} + Text{ "Broken Biggoron's Sword", "Épée brisée de Grogoron", + "zerbr. Biggoron-Schwert" }, // "Espada de Biggoron rota" + Text{ "Broken Giant's Knife", "Lame des Géants brisée", "zerbr. Langschwert" }, // "Daga gigante rota" + Text{ "Broken Noble Sword", "Épée noble brisée", "zerbr. Edelschwert" }, // "Espada noble rota" + Text{ "Broken Picori Blade", "Épée Minish brisée", "zerbr. Schwert der Minish" }, // "Espada minish rota" + Text{ "Decayed Master Sword", "Épée de légende pourrie", + "zerfr. Master-Schwert" }, // "Espada decadente de leyenda" }; trickNameTable[RG_PRESCRIPTION] = { - Text{"Biggoron's Prescription", "Ordonnance de Grogoron", "Receta de Biggoron"}, - Text{"Eyedrop Prescription", "Ordonnance de gouttes", "Receta ocular"}, - Text{"Urgent Prescription", "Ordonnance urgente", "Prescripción"}, - Text{"Swordsman's Scroll", "Précis d'escrime", "Esgrimidorium"}, - Text{"Portrait of Oren", "Portrait d'Orlène", "Retrato de Oren"}, - Text{"Letter to King Zora", "Lettre au roi Zora", "Carta al Rey Zora"} + Text{ "Biggoron's Prescription", "Ordonnance de Grogoron", "Biggorons Rezept" }, // "Receta de Biggoron" + Text{ "Eyedrop Prescription", "Ordonnance de gouttes", "Augentropfen-Rezept" }, // "Receta ocular" + Text{ "Urgent Prescription", "Ordonnance urgente", "Dringendes Rezept" }, // "Prescripción" + Text{ "Swordsman's Scroll", "Précis d'escrime", "Schwert-Rolle" }, // "Esgrimidorium" + Text{ "Portrait of Oren", "Portrait d'Orlène", "Portrait von Oreen" }, // "Retrato de Oren" + Text{ "Letter to King Zora", "Lettre au roi Zora", "Brief an König Zora" }, // "Carta al Rey Zora" }; trickNameTable[RG_EYEBALL_FROG] = { - Text{"Don Gero", "Don Gero", "Don Gero"}, - Text{"Hot-Footed Frog", "Grenouille à pieds chauds", "Rana de patas calientes"}, - Text{"Lost Swordsmith", "Forgeron perdu", "Espadachín perdido"}, - Text{"Eyedrop Frog", "Grenouille-qui-louche", "Globo Ocular de Rana"} + Text{ "Don Gero", "Don Gero", "Don Gero" }, // "Don Gero" + Text{ "Hot-Footed Frog", "Grenouille à pieds chauds", "Spurtkröte" }, // "Rana de patas calientes" + Text{ "Lost Swordsmith", "Forgeron perdu", "Vermisster Schmied" }, // "Espadachín perdido" + Text{ "Eyedrop Frog", "Grenouille-qui-louche", "Augentropfen-Frosch" }, // "Globo Ocular de Rana" }; trickNameTable[RG_EYEDROPS] = { - Text{"Biggoron's Eyedrops", "Gouttes de Grogoron", "Gotas de Biggoron"}, - Text{"Hyrule's Finest Eyedrops", "Eau du Lac Hylia", "Gotas oculares"}, - Text{"Moon's Tear", "Larme de Lune", "Lágrima de Luna"}, - Text{"Engine Grease", "Graisse moteur", "Grasa del motor"}, - Text{"Zora Perfume", "Parfum Zora", "Perfume Zora"} + Text{ "Biggoron's Eyedrops", "Gouttes de Grogoron", "Biggorons Augentropfen" }, // "Gotas de Biggoron" + Text{ "Hyrule's Finest Eyedrops", "Eau du Lac Hylia", "Hyrules beste Augentropfen" }, // "Gotas oculares" + Text{ "Moon's Tear", "Larme de Lune", "Mondträne" }, // "Lágrima de Luna" + Text{ "Engine Grease", "Graisse moteur", "Schmierfett" }, // "Grasa del motor" + Text{ "Zora Perfume", "Parfum Zora", "Zora-Parfüm" }, // "Perfume Zora" }; trickNameTable[RG_CLAIM_CHECK] = { - Text{"Clay Check", "Certificat Grogoron", "Comprobante de Reclamación"}, - Text{"Ancient Tablet", "Stèle ancienne", "Litografía arcana"}, - Text{"Sheikah Slate", "Tablette Sheikah", "Piedra Sheikah"}, - Text{"Cyclone Slate", "Ardoise des tornades", "Pizarra de los Torbellinos"} + Text{ "Clay Check", "Certificat Grogoron", "Berg-Urkunde" }, // "Comprobant e de Reclamación" + Text{ "Ancient Tablet", "Stèle ancienne", "Alte Steintafel" }, // "Litografía arcana" + Text{ "Sheikah Slate", "Tablette Sheikah", "Shiekah-Stein" }, // "Piedra Sheikah" + Text{ "Cyclone Slate", "Ardoise des tornades", "Froschkompass" }, // "Pizarra de los Torbellinos" }; trickNameTable[RG_GOLD_SKULLTULA_TOKEN] = { - Text{"Skulltula Token", "Bon de Skulltula dorée", "Símbolo de Skulltula"}, - Text{"Golden Skulltula Spirit", "Pièce de Skulltula dorée", "Tóken de Skulltula Dorada"}, - Text{"Gold Walltula Token", "Jeton de Walltula dorée", "Skulltula dorada"}, - Text{"Maiamai", "Ti'gorneau", "Maimai"}, - Text{"Gratitude Crystal", "Cristal de gratitude", "Gema de gratitud"}, - Text{"Korok Seed", "Noix korogu", "Semilla de kolog"} + Text{ "Skulltula Token", "Bon de Skulltula dorée", "Skulltula-Beweis" }, // "Símbolo de Skulltula" + Text{ "Golden Skulltula Spirit", "Pièce de Skulltula dorée", "Skulltula-Seele" }, // "Tóken de Skulltula Dorada" + Text{ "Gold Walltula Token", "Jeton de Walltula dorée", "Walltula-Symbol" }, // "Skulltula dorada" + Text{ "Maiamai", "Ti'gorneau", "Maimai" }, // "Maimai" + Text{ "Gratitude Crystal", "Cristal de gratitude", "Juwel der Güte" }, // "Gema de gratitud" + Text{ "Korok Seed", "Noix korogu", "Krog-Samen" }, // "Semilla de kolog" }; trickNameTable[RG_PROGRESSIVE_HOOKSHOT] = { - Text{"Progressive Grappling Hook", "Lance-chaîne (prog.)", "Garra progresiva"}, - Text{"Progressive Clawshot", "Grappin-griffe (prog.)", "Zarpa progresiva"}, - Text{"Progressive Gripshot", "Grappince (prog.)", "Enganchador progresivo"}, - Text{"Progressive Rope", "Corde (prog.)", "Cuerda progresivo"} + Text{ "Progressive Grappling Hook", "Lance-chaîne (prog.)", "Enterhaken (prog.)" }, // "Garra progresiva" + Text{ "Progressive Clawshot", "Grappin-griffe (prog.)", "Greifhaken (prog.)" }, // "Zarpa progresiva" + Text{ "Progressive Gripshot", "Grappince (prog.)", "Tauschhaken (prog.)" }, // "Enganchador progresivo" + Text{ "Progressive Rope", "Corde (prog.)", "Giftwurm (prog.)" }, // "Cuerda progresivo" }; trickNameTable[RG_PROGRESSIVE_STRENGTH] = { - Text{"Power Glove", "Gant de Puissance (prog.)", "Guanteletes progresivos"}, - Text{"Power Bracelet", "Bracelet de Force (prog.)", "Brasaletes progresivos"}, - Text{"Magic Bracelet", "Bracelet Magique (prog.)", "Manoplas progresivas"} + Text{ "Power Glove", "Gant de Puissance (prog.)", "Krafthandschuh (prog.)" }, // "Guanteletes progresivos" + Text{ "Power Bracelet", "Bracelet de Force (prog.)", "Kraftarmband (prog.)" }, // "Brasaletes progresivos" + Text{ "Magic Bracelet", "Bracelet Magique (prog.)", "Magiearmband (prog.)" }, // "Manoplas progresivas" }; trickNameTable[RG_PROGRESSIVE_BOMB_BAG] = { - Text{"Progressive Bomb Capacity", "Capacité de bombes (prog.)", "Mayor capacidad de bombas"}, - Text{"Progressive Bomb Pack", "Paquet de bombes (prog.)", "Zurrón de bombas progresivo"}, - Text{"Progressive Bomb Box", "Boîte à bombes (prog.)", "Bolsa de bombas progresiva"}, - Text{"Progressive Blast Mask", "Masque d'Explosion (prog.)", "Máscara explosiva progresiva"}, - Text{"Progressive Powder Kegs", "Baril de Poudre (prog.)", "Barril de polvo progresivo"}, - Text{"Progressive Remote Bombs", "Bombes à distance (prog.)", "Bombas remotas progresivas"} + Text{ "Progressive Bomb Capacity", "Capacité de bombes (prog.)", + "Bomben-Kapazität (prog.)" }, // "Mayor capacidad de bombas" + Text{ "Progressive Bomb Pack", "Paquet de bombes (prog.)", + "Bombenrucksack (prog.)" }, // "Zurrón de bombas progresivo" + Text{ "Progressive Bomb Box", "Boîte à bombes (prog.)", + "Bombenschachtel (prog.)" }, // "Bolsa de bombas progresiva" + Text{ "Progressive Blast Mask", "Masque d'Explosion (prog.)", + "Ka-Bumm-Maske (prog.)" }, // "Máscara explosiva progresiva" + Text{ "Progressive Powder Kegs", "Baril de Poudre (prog.)", + "Pulverfass (prog.)" }, // "Barril de polvo progresivo" + Text{ "Progressive Remote Bombs", "Bombes à distance (prog.)", + "Fernzünderbomben (prog.)€" }, // "Bombas remotas progresivas" }; trickNameTable[RG_PROGRESSIVE_BOW] = { - Text{"Progressive Arrow Capacity", "Capacité de flèches (prog.)", "Mayor capacidad de flechas"}, - Text{"Progressive Hero's Bow", "Arc du héros (prog.)", "Arco del héroe progresivo"}, - Text{"Progressive Arrow Holder", "Arbalète (prog.)", "Ballesta progresiva"}, - Text{"Progressive Crossbow", "Arbalète (prog.)", "Ballesta progresiva"}, - Text{"Progressive Sacred Bow", "Arc sacré (prog)", "Arco Sagrado Progresivo"}, - Text{"Progressive Lynel Bow", "Arc de Lynel (prog.)", "Arco de centaleón Progresivo"} + Text{ "Progressive Arrow Capacity", "Capacité de flèches (prog.)", + "Pfeil-Kapazität (prog.)" }, // "Mayor capacidad de flechas" + Text{ "Progressive Hero's Bow", "Arc du héros (prog.)", "Heroenbogen (prog.)" }, // "Arco del héroe progresivo" + Text{ "Progressive Arrow Holder", "Arbalète (prog.)", "Köcher (prog.)" }, // "Ballesta progresiva" + Text{ "Progressive Crossbow", "Arbalète (prog.)", "Armbrust (prog.)" }, // "Ballesta progresiva" + Text{ "Progressive Sacred Bow", "Arc sacré (prog)", "Heiliger Bogen (prog.)" }, // "Arco Sagrado Progresivo" + Text{ "Progressive Lynel Bow", "Arc de Lynel (prog.)", + "Leunenbogen (prog.)" }, // "Arco de centaleón Progresivo" }; trickNameTable[RG_PROGRESSIVE_SLINGSHOT] = { - Text{"Progressive Seed Capacity", "Capacité de graines (prog.)", "Mayor capacidad de semillas"}, - Text{"Progressive Catapult", "Catapulte (prog.)", "Catapulta progresiva"}, - Text{"Progressive Scattershot", "Lance-Pierre rafale (prog.)", "Resortera múltiple progresiva"}, - Text{"Progressive Seed Launcher", "Lanceur de semences (prog.)", "Lanzador de semillas progresivo"}, - Text{"Progressive Seed Satchel", "Sac de graines (prog.)", "Bolsa de semillas progresiva"} + Text{ "Progressive Seed Capacity", "Capacité de graines (prog.)", + "Kern-Kapazität (prog.)" }, // "Mayor capacidad de semillas" + Text{ "Progressive Catapult", "Catapulte (prog.)", "Katapult (prog.)" }, // "Catapulta progresiva" + Text{ "Progressive Scattershot", "Lance-Pierre rafale (prog.)", + "Streuschleuder (prog.)" }, // "Resortera múltiple progresiva" + Text{ "Progressive Seed Launcher", "Lanceur de semences (prog.)", + "Blasrohr (prog.)" }, // "Lanzador de semillas progresivo" + Text{ "Progressive Seed Satchel", "Sac de graines (prog.)", + "Saatbeutel (prog.)" }, // "Bolsa de semillas progresiva" }; trickNameTable[RG_PROGRESSIVE_WALLET] = { - Text{"Progressive Rupee Capacity", "Capacité de rubis (prog.)", "Mayor capacidad de rupias"}, - Text{"Progressive Purse", "Sacoche (prog.)", "Cartera de rupias progresiva"}, - Text{"Progressive Rupee Bag", "Sac à rubis (prog.)", "Zurrón de rupias progresivo"}, - Text{"Progressive Rupoor Capacity", "Capacité de Roupir (prog.)", "Capacidad progresiva Rupobre"}, - Text{"Progressive Spoils Bag", "Sac à Butin (prog.)", "Bolsa de trofeos progresiva"}, - Text{"Progressive Ruby Bag", "Capacité du sac Ruby (prog.)", "Bolso Ruby progresivo"} + Text{ "Progressive Rupee Capacity", "Capacité de rubis (prog.)", + "Rubin-Kapazität (prog.)" }, // "Mayor capacidad de rupias" + Text{ "Progressive Purse", "Sacoche (prog.)", "Portemonnaie (prog.)" }, // "Cartera de rupias progresiva" + Text{ "Progressive Rupee Bag", "Sac à rubis (prog.)", "Rubintasche (prog.)" }, // "Zurrón de rupias progresivo" + Text{ "Progressive Rupoor Capacity", "Capacité de Roupir (prog.)", + "Rubinfalle (prog.)" }, // "Capacidad progresiva Rupobre" + Text{ "Progressive Spoils Bag", "Sac à Butin (prog.)", "Beutetasche (prog.)" }, // "Bolsa de trofeos progresiva" + Text{ "Progressive Ruby Bag", "Capacité du sac Ruby (prog.)", "Rubytasche (prog.)" }, // "Bolso Ruby progresivo" }; trickNameTable[RG_PROGRESSIVE_SCALE] = { - Text{"Progressive Flippers", "Palmes de Zora (prog.)", "Aletas de zora progresiva"}, - Text{"Progressive Dragon's Scale", "Écaille du dragon d'eau (prog.)", "Escama dragón acuático progresiva"}, - Text{"Progressive Diving Ability", "Plongée (prog.)", "Buceo progresivo"}, - Text{"Progressive Pearl", "Perle (prog.)", "Perla progresiva"}, - Text{"Progressive Scute", "Bulle (prog.)", "Fragmento Zora progresivo"} + Text{ "Progressive Flippers", "Palmes de Zora (prog.)", + "Schwimmflossen (prog.)€" }, // "Aletas de zora progresiva" + Text{ "Progressive Dragon's Scale", "Écaille du dragon d'eau (prog.)", + "Drachen-Schuppe (prog.)" }, // "Escama dragón acuático progresiva" + Text{ "Progressive Diving Ability", "Plongée (prog.)", "Tauchfähigkeit (prog.)" }, // "Buceo progresivo" + Text{ "Progressive Pearl", "Perle (prog.)", "Perle (prog.)" }, // "Perla progresiva" + Text{ "Progressive Scute", "Bulle (prog.)", "Schuppe (prog.)" }, // "Fragmento Zora progresivo" }; trickNameTable[RG_PROGRESSIVE_NUT_UPGRADE] = { - Text{"Progressive Nut Pack", "Paquet de noix (prog.)", "Mayor capacidad de semillas"}, - Text{"Progressive Bait Bag", "Sac à Appâts (prog.)", "Bolsa de cebo progresiva"}, - Text{"Progressive Pear Capacity", "Capacité de poire (prog.)", "Capacidad progresiva de pera"}, - Text{"Progressive Nut Bag", "Sac de noix (prog.)", "Bolsa de nueces progresiva"}, - Text{"Progressive Husk Capacity", "Capacité de noisettes (prog.)", "Mayor capacidad de castañas"} + Text{ "Progressive Nut Pack", "Paquet de noix (prog.)", + "Nußrucksack (prog.)" }, // "Mayor capacidad de semillas" + Text{ "Progressive Bait Bag", "Sac à Appâts (prog.)", "Futtertasche (prog.)" }, // "Bolsa de cebo progresiva" + Text{ "Progressive Pear Capacity", "Capacité de poire (prog.)", + "Putput-Kapazität (prog.)" }, // "Capacidad progresiva de pera" + Text{ "Progressive Nut Bag", "Sac de noix (prog.)", "Nußbeutel (prog.)" }, // "Bolsa de nueces progresiva" + Text{ "Progressive Husk Capacity", "Capacité de noisettes (prog.)", + "Schalen-Kapazität (prog.)€" }, // "Mayor capacidad de castañas" }; trickNameTable[RG_PROGRESSIVE_STICK_UPGRADE] = { - Text{"Progressive Stick Bag", "Sac de bâtons (prog.)", "Mayor capacidad de ramas deku"}, - Text{"Progressive Stick Pack", "Paquet de bâtons Mojo (prog.)", "Mayor capacidad de bastones"}, - Text{"Progressive Branch Capacity", "Capacité de la succursale (prog.)", "Capacidad progresiva de la sucursal"}, - Text{"Progressive Rod Capacity", "Capacité de tiges (prog.)", "Mayor capacidad de cetros deku"} + Text{ "Progressive Stick Bag", "Sac de bâtons (prog.)", + "Stabbeutel (prog.)" }, // "Mayor capacidad de ramas deku" + Text{ "Progressive Stick Pack", "Paquet de bâtons Mojo (prog.)", + "Stabrucksack (prog.)" }, // "Mayor capacidad de bastones" + Text{ "Progressive Branch Capacity", "Capacité de la succursale (prog.)", + "Ast-Kapazität (prog.)" }, // "Capacidad progresiva de la sucursal" + Text{ "Progressive Rod Capacity", "Capacité de tiges (prog.)", + "Stock-Kapazität (prog.)" }, // "Mayor capacidad de cetros deku" }; trickNameTable[RG_PROGRESSIVE_BOMBCHUS] = { - Text{"Progressive Bomblings", "Bombinsectes (prog.)", "Bombinsectos progresivos"}, - Text{"Progressive Sentrobe Bombs", "Bombe de Sphérodrone (prog.)", "Bomba de helicobot progresivo"}, - Text{"Progressive Bomb-ombs", "Bombe Soldat (prog.)", "Soldado bomba progresivo"}, - Text{"Progressive Missiles", "Missiles (prog.)", "Misiles progresivos"}, - Text{"Progressive Bombchu Bag", "Sac à Bombchu (prog.)", "Bombachus progresivos"} + Text{ "Progressive Bomblings", "Bombinsectes (prog.)", "Bombenmäuse (prog.)€" }, // "Bombinsectos progresivos" + Text{ "Progressive Sentrobe Bombs", "Bombe de Sphérodrone (prog.)", + "Rokopterbomben (prog.)€" }, // "Bomba de helicobot progresivo" + Text{ "Progressive Bomb-ombs", "Bombe Soldat (prog.)", "Bob-omb (prog.)" }, // "Soldado bomba progresivo" + Text{ "Progressive Missiles", "Missiles (prog.)", "Missiles (prog.)€" }, // "Misiles progresivos" + Text{ "Progressive Bombchu Bag", "Sac à Bombchu (prog.)", + "Krabbelminenbeutel (prog.)" }, // "Bombachus progresivos" }; trickNameTable[RG_PROGRESSIVE_MAGIC_METER] = { - Text{"Progressive Stamina Meter", "Jauge d'endurance (prog.)", "Medidor de vigor progresivo"}, - Text{"Progressive Energy Gauge", "Jauge d'énergie (prog.)", "Medidor de energía progresivo"}, - Text{"Progressive Magic Powder", "Poudre magique (prog.)", "Medidor de carga progresivo"} + Text{ "Progressive Stamina Meter", "Jauge d'endurance (prog.)", + "Ausdauer (prog.)" }, // "Medidor de vigor progresivo" + Text{ "Progressive Energy Gauge", "Jauge d'énergie (prog.)", + "Energie (prog.)" }, // "Medidor de energía progresivo" + Text{ "Progressive Magic Powder", "Poudre magique (prog.)", + "Zauberpulver (prog.)" }, // "Medidor de carga progresivo" }; trickNameTable[RG_PROGRESSIVE_OCARINA] = { - Text{"Progressive Memento", "Souvenir (prog.)", "Silbato progresivo"}, - Text{"Progressive Whistle", "Siffler (prog.)", "Silbido progresivo"}, - Text{"Progressive Flute", "Flûte (prog.)", "Flauta progresiva"}, - Text{"Progressive Recorder", "Harmonica (prog.)", "Armónica progresiva"} + Text{ "Progressive Memento", "Souvenir (prog.)", "Souvenir (prog.)" }, // "Silbato progresivo" + Text{ "Progressive Whistle", "Siffler (prog.)", "Pfeife (prog.)" }, // "Silbido progresivo" + Text{ "Progressive Flute", "Flûte (prog.)", "Flöte (prog.)" }, // "Flauta progresiva" + Text{ "Progressive Recorder", "Harmonica (prog.)", "Rekorder (prog.)" }, // "Armónica progresiva" }; trickNameTable[RG_PROGRESSIVE_GORONSWORD] = { - Text{"Progressive Titan Blade", "Lame des Titans (prog.)", "Hoja del Titán progresiva"}, - Text{"Progressive Goron Knife", "Lame Goron (prog.)", "Daga Goron progresiva"}, - Text{"Progressive Giant Sword", "Épée géante (prog.)", "Espada gigante progresiva"}, - Text{"Progressive Darknut Sword", "Épée de Darknut (prog.)", "Espada Darknut progresiva"}, - Text{"Progressive Power Sword", "Épée de Puissance (prog.)", "Espada de poder progresiva"}, - Text{"Progressive Big Stabby", "Gros coup de poignard (prog.)", "Gran puñalada progresiva"} + Text{ "Progressive Titan Blade", "Lame des Titans (prog.)", + "Titanenklinge (prog.)" }, // "Hoja del Titán progresiva" + Text{ "Progressive Goron Knife", "Lame Goron (prog.)", "Goronenmesser (prog.)" }, // "Daga Goron progresiva" + Text{ "Progressive Giant Sword", "Épée géante (prog.)", + "Riesenschwert (prog.)" }, // "Espada gigante progresiva" + Text{ "Progressive Darknut Sword", "Épée de Darknut (prog.)", + "Gardeschwert (prog.)" }, // "Espada Darknut progresiva" + Text{ "Progressive Power Sword", "Épée de Puissance (prog.)", + "Schwert der Macht (prog.)" }, // "Espada de poder progresiva" + Text{ "Progressive Big Stabby", "Gros coup de poignard (prog.)", + "Großschwert (prog.)" }, // "Gran puñalada progresiva" }; trickNameTable[RG_EMPTY_BOTTLE] = { - Text{"Empty Canteen", "Cantine vide", "cantimplora vacía"}, - Text{"Vial of Winds", "Fiole de vents", "Vial de Vientos"}, - Text{"Tingle Bottle", "Flacon de Tingle", "Botella de Tingle"}, - Text{"Magic Bottle", "Flacon magique", "Frasco feérico"}, - Text{"Glass Bottle", "Flacon de verre", "Botella de cristal"}, - Text{"Bottle with Water", "Flacon d'eau", "Botella Tingle"} + Text{ "Empty Canteen", "Cantine vide", "Leere Feldflasche" }, // "cantimplora vacía" + Text{ "Vial of Winds", "Fiole de vents", "Phiole der Winde" }, // "Vial de Vientos" + Text{ "Tingle Bottle", "Flacon de Tingle", "Tingle-Flasche" }, // "Botella de Tingle" + Text{ "Magic Bottle", "Flacon magique", "Magische Flasche" }, // "Frasco feérico" + Text{ "Glass Bottle", "Flacon de verre", "Glasflasche" }, // "Botella de cristal" + Text{ "Bottle with Water", "Flacon d'eau", "Flasche (Wasser)" }, // "Botella Tingle" }; trickNameTable[RG_BOTTLE_WITH_MILK] = { - Text{"Bottle with Chateau Romani", "Flacon de cuvée Romani", "Botella de Reserva Romani"}, - Text{"Bottle with Premium Milk", "Flacon avec lait de qualité supérieure", "Biberón con leche Premium"}, - Text{"Bottle with Mystery Milk", "Flacon de lait grand cru", "Botella de leche extra"}, - Text{"Bottle with Fresh Milk", "Flacon de lait frais", "Botella de leche fresca"},}; + Text{ "Bottle with Chateau Romani", "Flacon de cuvée Romani", + "Flasche (Chateau Romani)" }, // "Botella de Reserva Romani" + Text{ "Bottle with Premium Milk", "Flacon avec lait de qualité supérieure", + "Flasche (Vollmilch)" }, // "Biberón con leche Premium" + Text{ "Bottle with Mystery Milk", "Flacon de lait grand cru", + "Flasche (Verdächtige Milch)" }, // "Botella de leche extra" + Text{ "Bottle with Fresh Milk", "Flacon de lait frais", + "Flasche (Frische Milch)" }, // "Botella de leche fresca" + }; trickNameTable[RG_BOTTLE_WITH_RED_POTION] = { - Text{"Bottle with Red Chu Jelly", "Flacon de gelée Chuchu rouge", "Jugo de Chuchu Rojo"}, - Text{"Bottle with Hibiscus Potion", "Flacon de potion de Hibiscus", "Botella de poción de Hibisco"}, - Text{"Bottle with Medicine of Life", "Flacon d'élixir rouge", "Botella de medicina de la vida"}, - Text{"Bottle with Heart Potion", "Flacon de potion de soin", "Botella de poción de salud"} + Text{ "Bottle with Red Chu Jelly", "Flacon de gelée Chuchu rouge", + "Flasche (Rotes Schleim-Gelee)" }, // "Jugo de Chuchu Rojo" + Text{ "Bottle with Hibiscus Potion", "Flacon de potion de Hibiscus", + "Flasche (Hibiskus-Trank)" }, // "Botella de poción de Hibisco" + Text{ "Bottle with Medicine of Life", "Flacon d'élixir rouge", + "Flasche (Roter Trank)" }, // "Botella de medicina de la vida" + Text{ "Bottle with Heart Potion", "Flacon de potion de soin", + "Flasche (Herztrank)" }, // "Botella de poción de salud" }; trickNameTable[RG_BOTTLE_WITH_GREEN_POTION] = { - Text{"Bottle with Green Chu Jelly", "Flacon de gelée Chuchu verte", "Jugo de Chuchu Verde"}, - Text{"Bottle with Lamp Oil", "Flacon de Huile à lanterne", "Botella de Aceite de candil "}, - Text{"Bottle with Medicine of Magic", "Flacon d'élixir vert", "Botella de medicina mágica"}, - Text{"Bottle with Stamina Potion", "Flacon d'Endurol", "Botella de elixir vigorizante"} + Text{ "Bottle with Green Chu Jelly", "Flacon de gelée Chuchu verte", + "Flasche (Grünes Schleim-Gelee)" }, // "Jugo de Chuchu Verde" + Text{ "Bottle with Lamp Oil", "Flacon de Huile à lanterne", + "Flasche (Lampenöl)" }, // "Botella de Aceite de candil" + Text{ "Bottle with Medicine of Magic", "Flacon d'élixir vert", + "Flasche (Grüner Trank)" }, // "Botella de medicina mágica" + Text{ "Bottle with Stamina Potion", "Flacon d'Endurol", + "Flasche (Ausdauertrank)" }, // "Botella de elixir vigorizante" }; trickNameTable[RG_BOTTLE_WITH_BLUE_POTION] = { - Text{"Bottle with Blue Chu Jelly", "Flacon de gelée Chuchu bleue", "Jugo de Chuchu Azul"}, - Text{"Bottle with Water of Life", "Flacon d'élixir bleu", "Botella de agua de la vida"}, - Text{"Bottle with Air Potion", "Flacon de potion d'oxygène", "Botella de oxígeno"} + Text{ "Bottle with Blue Chu Jelly", "Flacon de gelée Chuchu bleue", + "Flasche (Blaues Schleim-Gelee)" }, // "Jugo de Chuchu Azul" + Text{ "Bottle with Water of Life", "Flacon d'élixir bleu", + "Flasche (Blauer Trank)" }, // "Botella de agua de la vida" + Text{ "Bottle with Air Potion", "Flacon de potion d'oxygène", "Flasche (Lufttrank)" }, // "Botella de oxígeno" }; trickNameTable[RG_BOTTLE_WITH_FAIRY] = { - Text{"Bottle with Forest Firefly", "Flacon avec une luciole", "Luciérnaga del bosque"}, - Text{"Bottle with Deku Princess", "Flacon avec Deku Princess", "Botella con Deku Princess"}, - Text{"Bottle with Stray Fairy", "Flacon avec une fée perdue", "Hada perdida en una botella"} + Text{ "Bottle with Forest Firefly", "Flacon avec une luciole", + "Flasche (Glühwürmchen)" }, // "Luciérnaga del bosque" + Text{ "Bottle with Deku Princess", "Flacon avec Deku Princess", + "Flasche (Deku-Prinzessin)" }, // "Botella con Deku Princess" + Text{ "Bottle with Stray Fairy", "Flacon avec une fée perdue", + "Flasche (Verirrte Fee)" }, // "Hada perdida en una botella" }; trickNameTable[RG_BOTTLE_WITH_FISH] = { - Text{"Bottle with Small Jabu-Jabu", "Flacon avec mini Jabu-Jabu", "Lord Chapu-Chapu embotellado"}, - Text{"Bottle with Reekfish", "Flacon avec Reekfish", "Reekfish embotellada"}, - Text{"Bottle with Hyrule Bass", "Flacon avec perche d'Hyrule", "Locha de Hyrule embotellada"}, - Text{"Bottle with Hyrule Loach", "Flacon avec loche d'Hyrule", "Perca de Términa embotellada"} + Text{ "Bottle with Small Jabu-Jabu", "Flacon avec mini Jabu-Jabu", + "Flasche (Baby Jabu)" }, // "Lord Chapu-Chapu embotellado" + Text{ "Bottle with Reekfish", "Flacon avec Reekfish", "Flasche (Dunstforelle)" }, // "Reekfish embotellada" + Text{ "Bottle with Hyrule Bass", "Flacon avec perche d'Hyrule", + "Flasche (Hyrulebarsch)" }, // "Locha de Hyrule embotellada" + Text{ "Bottle with Hyrule Loach", "Flacon avec loche d'Hyrule", + "Flasche (Hylianische Forelle)" }, // "Perca de Términa embotellada" }; trickNameTable[RG_BOTTLE_WITH_BLUE_FIRE] = { - Text{"Bottle with Will-O-Wisp", "Flacon avec feu follet", "Botella de llama azul"}, - Text{"Bottle with Ancient Flame", "Flacon de flamme ancienne", "Botella de fuego ancestral"}, - Text{"Bottle with a Blue Candle", "Flacon avec une bougie bleue", "Botella con una vela azul"}, - Text{"Bottle with Red Ice", "Flacon de Glace Rouge", "Botella de Hielo rojo"}, - Text{"Bottle with Nayru's Flame", "Flacon de flamme de Nayru", "Botella de llamas de Nayru"} + Text{ "Bottle with Will-O-Wisp", "Flacon avec feu follet", "Flasche (Rotes Feuer)" }, // "Botella de llama azul" + Text{ "Bottle with Ancient Flame", "Flacon de flamme ancienne", + "Flasche (Antike Flamme)" }, // "Botella de fuego ancestral" + Text{ "Bottle with a Blue Candle", "Flacon avec une bougie bleue", + "Flasche (Blaue Kerze)" }, // "Botella con una vela azul" + Text{ "Bottle with Red Ice", "Flacon de Glace Rouge", "Flasche (Rotes Eis)" }, // "Botella de Hielo rojo" + Text{ "Bottle with Nayru's Flame", "Flacon de flamme de Nayru", + "Flasche (Nayrus Flamme)" }, // "Botella de llamas de Nayru" }; trickNameTable[RG_BOTTLE_WITH_BUGS] = { - Text{"Bottle with Baby Tektites", "Flacon de bébé Araknon", "Tektites en una botella"}, - Text{"Bottle with A Beetle", "Flacon avec un scarabée", "Botella con un escarabajo"}, - Text{"Bottle with Lanayru Ants", "Flacon de fourmis de Lanelle", "Celestarabajo embotellado"}, - Text{"Bottle with Insects", "Flacon de bibittes", "Saltabosques embotellados"}, - Text{"Bottle with a Golden Bee", "Flacon avec une abeille dorée", "Botella con una abeja dorada"} + Text{ "Bottle with Baby Tektites", "Flacon de bébé Araknon", + "Flasche (Baby Arachno)" }, // "Tektites en una botella" + Text{ "Bottle with A Beetle", "Flacon avec un scarabée", "Flasche (Wanze)" }, // "Botella con un escarabajo" + Text{ "Bottle with Lanayru Ants", "Flacon de fourmis de Lanelle", + "Flasche (Ranelle-Ameise)" }, // "Celestarabajo embotellado" + Text{ "Bottle with Insects", "Flacon de bibittes", "Flasche (Insekt)" }, // "Saltabosques embotellados" + Text{ "Bottle with a Golden Bee", "Flacon avec une abeille dorée", + "Flasche (Goldene Biene)" }, // "Botella con una abeja dorada" }; trickNameTable[RG_BOTTLE_WITH_POE] = { - Text{"Bottle with Ghini", "Flacon avec Ghini", "Ghini en una botella"}, - Text{"Bottle with Reapling", "Flacon avec Âme Damnée", "Reapling en una botella"}, - Text{"Bottle with Imp Poe", "Flacon avec Spectre", "Espectro en una botella"}, - Text{"Bottle with Anti-Fairy", "Flacon avec Tetdoss", "Whisp en una botella"} + Text{ "Bottle with Ghini", "Flacon avec Ghini", "Flasche (Ghini)" }, // "Ghini en una botella" + Text{ "Bottle with Reapling", "Flacon avec Âme Damnée", "Flasche (Zombie)" }, // "Reapling en una botella" + Text{ "Bottle with Imp Poe", "Flacon avec Spectre", "Flasche (Geist)" }, // "Espectro en una botella" + Text{ "Bottle with Anti-Fairy", "Flacon avec Tetdoss", "Flasche (Knochenfratze)" }, // "Whisp en una botella" }; trickNameTable[RG_RUTOS_LETTER] = { - Text{"Bottle with Maggie's Letter", "Flacon avec lettre de Maggy", "Carta de Dolores"}, - Text{"Bottle with Letter to Kafei", "Flacon avec lettre pour Kafei", "Carta para Kafei"}, - Text{"Bottle with Zelda's Letter", "Flacon avec Lettre de Zelda", "Carta náutica"} + Text{ "Bottle with Maggie's Letter", "Flacon avec lettre de Maggy", + "Flasche (Dolores Brief)" }, // "Carta de Dolores" + Text{ "Bottle with Letter to Kafei", "Flacon avec lettre pour Kafei", + "Flasche (Brief an Kafei)" }, // "Carta para Kafei" + Text{ "Bottle with Zelda's Letter", "Flacon avec Lettre de Zelda", + "Flasche (Zeldas Brief)" }, // "Carta náutica" }; trickNameTable[RG_BOTTLE_WITH_BIG_POE] = { - Text{"Bottle with Composer Brother", "Flacon avec un compositeur", "Hermana Poe embotellada"}, - Text{"Bottle with Jalhalla", "Flacon avec Jalhalla", "Yaihalla embotellado"}, - Text{"Bottle with Grim Repoe", "Flacon avec le Faucheur", "Bubble en una botella"} + Text{ "Bottle with Composer Brother", "Flacon avec un compositeur", + "Flasche (Ludwig Brahmstein)" }, // "Hermana Poe embotellada" + Text{ "Bottle with Jalhalla", "Flacon avec Jalhalla", "Flasche (Jalhalla)" }, // "Yaihalla embotellado" + Text{ "Bottle with Grim Repoe", "Flacon avec le Faucheur", + "Flasche (Tagschwärmer)" }, // "Bubble en una botella" }; trickNameTable[RG_ZELDAS_LULLABY] = { - Text{"Ballad of the Goddess", "Chant de la déesse", "Cántico de la Diosa"}, - Text{"Song of Healing", "Chant de l'apaisement", "Canción de curación"}, - Text{"Song of the Hero", "Chant du héros", "Canción del héroe"} + Text{ "Ballad of the Goddess", "Chant de la déesse", "Hymne der Göttin" }, // "Cántico de la Diosa" + Text{ "Song of Healing", "Chant de l'apaisement", "Lied der Befreiung" }, // "Canción de curación" + Text{ "Song of the Hero", "Chant du héros", "Heldenlied" }, // "Canción del héroe" }; trickNameTable[RG_EPONAS_SONG] = { - Text{"Song of Birds","Chant des oiseaux","Cantar del ave"}, - Text{"Song of Soaring", "Chant de l'envol", "Canción del viento"}, - Text{"Song of Horse", "Chant du cheval", "Chant du cheval"} + Text{ "Song of Birds", "Chant des oiseaux", "Vogelruf" }, // "Cantar del ave" + Text{ "Song of Soaring", "Chant de l'envol", "Lied der Schwingen" }, // "Canción del viento" + Text{ "Song of Horse", "Chant du cheval", "Lied des Pferdes" }, // "Chant du cheval" }; trickNameTable[RG_SARIAS_SONG] = { - Text{"Mido's Song", "La chanson de Mido", "La canción de Mido"}, - Text{"Kass' Theme", "Le thème de Kass", "El tema de Kass"}, - Text{"Tune of Echoes", "Chant des Échos ", "Melodía del Eco "} + Text{ "Mido's Song", "La chanson de Mido", "Midos Lied" }, // "La canción de Mido" + Text{ "Kass' Theme", "Le thème de Kass", "Kashiwa Thema" }, // "El tema de Kass" + Text{ "Tune of Echoes", "Chant des Échos ", "Melodie des Echos" }, // "Melodía del Eco" }; trickNameTable[RG_SUNS_SONG] = { - Text{"Song of Passing", "Mambo de Manbo", "Melodía del transcurrir"}, - Text{"Command Melody", "Air du marionnettiste", "Cara al Sol"}, - Text{"Moon's Song", "La chanson de Moon", "La canción de la luna"} + Text{ "Song of Passing", "Mambo de Manbo", "Kleine Tag- und Nachtmusik" }, // "Melodía del transcurrir" + Text{ "Command Melody", "Air du marionnettiste", "Sonate des Puppenspielers" }, // "Cara al Sol" + Text{ "Moon's Song", "La chanson de Moon", "Lied des Mondes" }, // "La canción de la luna" }; trickNameTable[RG_SONG_OF_TIME] = { - Text{"Song of Double Time", "Chant accéléré", "Canción del doble tiempo"}, - Text{"Inverted Song of Time", "Chant du temps inversé", "Canción del tiempo invertida"}, - Text{"Tune of Ages", "Chant du Temps", "Melodía del Tiempo"} + Text{ "Song of Double Time", "Chant accéléré", "Thema der Zeit im Wind" }, // "Canción del doble tiempo" + Text{ "Inverted Song of Time", "Chant du temps inversé", + "Ballade des Kronos" }, // "Canción del tiempo invertida" + Text{ "Tune of Ages", "Chant du Temps", "Melodie der Zeit" }, // "Melodía del Tiempo" }; trickNameTable[RG_SONG_OF_STORMS] = { - Text{"Ballad of Gales", "Requiem de la tornade", "Melodía del Tornado"}, - Text{"Frog's Song of Soul", "Rap des grenouilles", "Canción del alma de la rana"}, - Text{"Wind's Requiem", "Mélodie du vent", "Melodía del Viento"} + Text{ "Ballad of Gales", "Requiem de la tornade", "Kanon des Sturmes" }, // "Melodía del Tornado" + Text{ "Frog's Song of Soul", "Rap des grenouilles", "Krötenrap" }, // "Canción del alma de la rana" + Text{ "Wind's Requiem", "Mélodie du vent", "Lied des Windes" }, // "Melodía del Viento" }; trickNameTable[RG_MINUET_OF_FOREST] = { - Text{"Saria's Karaoke", "Karaoké de Saria", "Dueto del bosque"}, - Text{"Sonata of Awakening", "Sonate de l'éveil", "Sonata del despertar"}, - Text{"Wind God's Aria", "Hymne du dieu du vent", "Melodía del Espíritu del Viento"} + Text{ "Saria's Karaoke", "Karaoké de Saria", "Salias Karaoke" }, // "Dueto del bosque" + Text{ "Sonata of Awakening", "Sonate de l'éveil", "Sonate des Erwachens" }, // "Sonata del despertar" + Text{ "Wind God's Aria", "Hymne du dieu du vent", + "Hymne des Zephirgottes" }, // "Melodía del Espíritu del Viento" }; trickNameTable[RG_BOLERO_OF_FIRE] = { - Text{"Darunia's Tango", "Tango de Darunia", "Coro del fuego"}, - Text{"Tune of Currents", "Chants des Flux", "Melodía de las Corrientes"}, - Text{"Goron Lullaby", "Berceuse des Gorons", "Nana goron"} + Text{ "Darunia's Tango", "Tango de Darunia", "Darunias Tango" }, // "Coro del fuego" + Text{ "Tune of Currents", "Chants des Flux", "Lied des Zeitstroms" }, // "Melodía de las Corrientes" + Text{ "Goron Lullaby", "Berceuse des Gorons", "Goronisches Schlummerlied" }, // "Nana goron" }; trickNameTable[RG_SERENADE_OF_WATER] = { - Text{"Ruto's Blues", "Blues de Ruto", "Sonata del agua"}, - Text{"New Wave Bossa Nova", "Bossa-nova des flots", "Bossanova de las olas"}, - Text{"Manbo's Mambo", "Mambo de Manbo", "Mambo de Manbo"} + Text{ "Ruto's Blues", "Blues de Ruto", "Rutos Blues" }, // "Sonata del agua" + Text{ "New Wave Bossa Nova", "Bossa-nova des flots", "Bossa Nova der Kaskaden" }, // "Bossanova de las olas" + Text{ "Manbo's Mambo", "Mambo de Manbo", "Manbos Mambo" }, // "Mambo de Manbo" }; trickNameTable[RG_REQUIEM_OF_SPIRIT] = { - Text{"Nabooru's Reggae", "Reggae de Nabooru", "Reggae del espíritu"}, - Text{"Elegy of Emptiness", "Hymne du vide", "Elegía al vacío"}, - Text{"Earth God's Lyric", "Hymne du dieu de la terre", "Melodía del Espíritu de la Tierra"} + Text{ "Nabooru's Reggae", "Reggae de Nabooru", "Naborus Reggae" }, // "Reggae del espíritu" + Text{ "Elegy of Emptiness", "Hymne du vide", "Elegie des leeren Herzens" }, // "Elegía al vacío" + Text{ "Earth God's Lyric", "Hymne du dieu de la terre", + "Hymne des Terragottes" }, // "Melodía del Espíritu de la Tierra" }; trickNameTable[RG_NOCTURNE_OF_SHADOW] = { - Text{"Impa's Death Metal", "Death métal d'Impa", "Diurno de la sombra"}, - Text{"Oath to Order", "Ode de l'appel", "Oda al orden"}, - Text{"Song of Discovery", "Chant des secrets", "Canto revelador"} + Text{ "Impa's Death Metal", "Death métal d'Impa", "Impas Death Metal" }, // "Diurno de la sombra" + Text{ "Oath to Order", "Ode de l'appel", "Gesang des Himmels" }, // "Oda al orden" + Text{ "Song of Discovery", "Chant des secrets", "Schatzsucherlied" }, // "Canto revelador" }; trickNameTable[RG_PRELUDE_OF_LIGHT] = { - Text{"Rauru's Sing-Along", "Chansonnette de Rauru", "Predulio de luz"}, - Text{"Ballad of the Wind Fish", "Ballade sur Poisson-Rêve", "Balada del Piez Viento"}, - Text{"Song of Light", "Chant de la lumière", "Sonidos de la luz"} + Text{ "Rauru's Sing-Along", "Chansonnette de Rauru", "Raurus Singalong" }, // "Predulio de luz" + Text{ "Ballad of the Wind Fish", "Ballade sur Poisson-Rêve", + "Ballade vom Windfisch" }, // "Balada del Piez Viento" + Text{ "Song of Light", "Chant de la lumière", "Lied des Lichts" }, // "Sonidos de la luz" }; trickNameTable[RG_KOKIRI_EMERALD] = { - Text{"Pendant of Courage", "Pendentif du courage", "Colgante del valor"}, - Text{"Farore's Pearl", "Perle de Farore", "Orbe de Farore"}, - Text{"Aquanine", "Smaragdine", "Yerbánida"}, - Text{"Farore's Emerald", "Émeraude de Farore", "Esmeralda de Farore"}, - Text{"Kokiri's Peridot", "Péridot Kokiri", "Ágata de los Kokiri"} + Text{ "Pendant of Courage", "Pendentif du courage", "Amulett des Mutes" }, // "Colgante del valor" + Text{ "Farore's Pearl", "Perle de Farore", "Farores Deamont" }, // "Orbe de Farore" + Text{ "Aquanine", "Smaragdine", "Smaragdstahl" }, // "Yerbánida" + Text{ "Farore's Emerald", "Émeraude de Farore", "Farore-Smaragd" }, // "Esmeralda de Farore" + Text{ "Kokiri's Peridot", "Péridot Kokiri", "Kokiri-Peridot" }, // "Ágata de los Kokiri" }; trickNameTable[RG_GORON_RUBY] = { - Text{"Pendant of Power", "Pendentif de la force", "Colgante del poder"}, - Text{"Din's Pearl", "Perle de Din", "Orbe de Din"}, - Text{"Crimsonine", "Alzanine", "Bermellina"}, - Text{"Din's Ruby", "Rubis de Din", "Rubí de Din"}, - Text{"Goron's Garnet", "Grenat Goron", "Topacio de los Goron"} + Text{ "Pendant of Power", "Pendentif de la force", "Amulett der Stärke" }, // "Colgante del poder" + Text{ "Din's Pearl", "Perle de Din", "Dins Deamont" }, // "Orbe de Din" + Text{ "Crimsonine", "Alzanine", "Scharlachstahl" }, // "Bermellina" + Text{ "Din's Ruby", "Rubis de Din", "Din-Rubin" }, // "Rubí de Din" + Text{ "Goron's Garnet", "Grenat Goron", "Goronen-Granat" }, // "Topacio de los Goron" }; trickNameTable[RG_ZORA_SAPPHIRE] = { - Text{"Pendant of Wisdom", "Pendentif de la sagesse", "Colgante de la sabiduría"}, - Text{"Nayru's Pearl", "Perle de Nayru", "Orbe de Nayru"}, - Text{"Azurine", "Aquanine", "Azurina"}, - Text{"Nayru's Sapphire", "Saphir de Nayru", "Zafiro de Nayru"}, - Text{"Zora's Aquamarine", "Aquamarine Zora", "Lapislázuli de los Zora"} + Text{ "Pendant of Wisdom", "Pendentif de la sagesse", "Amulett der Weisheit" }, // "Colgante de la sabiduría" + Text{ "Nayru's Pearl", "Perle de Nayru", "Nayrus Deamont" }, // "Orbe de Nayru" + Text{ "Azurine", "Aquanine", "Azurstahl" }, // "Azurina" + Text{ "Nayru's Sapphire", "Saphir de Nayru", "Nayru-Saphir" }, // "Zafiro de Nayru" + Text{ "Zora's Aquamarine", "Aquamarine Zora", "Zora-Aquamarin" }, // "Lapislázuli de los Zora" }; trickNameTable[RG_FOREST_MEDALLION] = { - Text{"Wind Medallion", "Médaillon du vent", "Medallón del Viento"}, - Text{"Wind Element", "Elément Vent", "Elemento de aire"}, - Text{"Saria's Medallion", "Médaillon de Saria", "Medallón de Saria"}, - Text{"Sign of Air", "Glyphe de l'air", "Glifo de aire"}, - Text{"Medallion of Forest", "Médaillon du Temple de la Forêt", "Medalla del Bosque"} + Text{ "Wind Medallion", "Médaillon du vent", "Amulett des Windes" }, // "Medallón del Viento" + Text{ "Wind Element", "Elément Vent", "Wind-Element" }, // "Elemento de aire" + Text{ "Saria's Medallion", "Médaillon de Saria", "Salias Amulett" }, // "Medallón de Saria" + Text{ "Sign of Air", "Glyphe de l'air", "Zeichen der Luft" }, // "Glifo de aire" + Text{ "Medallion of Forest", "Médaillon du Temple de la Forêt", + "Medaillon des Waldes" }, // "Medalla del Bosque" }; trickNameTable[RG_FIRE_MEDALLION] = { - Text{"Fire Element", "Elément Feu", "Elemento de fuego"}, - Text{"Darunia's Medallion", "Médaillon de Darunia", "Medallón de Darunia"}, - Text{"Sign of Fire", "Glyphe de feu", "Glifo de fuego"}, - Text{"Medallion of Fire", "Médaillon du Temple du Feu", "Medalla del Fuego"} + Text{ "Fire Element", "Elément Feu", "Flammen-Element" }, // "Elemento de fuego" + Text{ "Darunia's Medallion", "Médaillon de Darunia", "Darunias Amulett" }, // "Medallón de Darunia" + Text{ "Sign of Fire", "Glyphe de feu", "Zeichen des Feuers" }, // "Glifo de fuego" + Text{ "Medallion of Fire", "Médaillon du Temple du Feu", "Medaillon des Feuers" }, // "Medalla del Fuego" }; trickNameTable[RG_WATER_MEDALLION] = { - Text{"Water Element", "Elément Eau", "Elemento de agua"}, - Text{"Ice Medallion", "Médaillon de glace", "Medallón Helado"}, - Text{"Ruto's Medallion", "Médaillon de Ruto", "Medallón de Ruto"}, - Text{"Sign of Water", "Glyphe de l'eau", "Glifo de agua"}, - Text{"Medallion of Water", "Médaillon du Temple de l'Eau", "Medalla del Agua"} + Text{ "Water Element", "Elément Eau", "Tropfen-Element" }, // "Elemento de agua" + Text{ "Ice Medallion", "Médaillon de glace", "Amulett des Eises" }, // "Medallón Helado" + Text{ "Ruto's Medallion", "Médaillon de Ruto", "Rutos Amulett" }, // "Medallón de Ruto" + Text{ "Sign of Water", "Glyphe de l'eau", "Zeichen des Wassers" }, // "Glifo de agua" + Text{ "Medallion of Water", "Médaillon du Temple de l'Eau", "Medaillon des Wassers" }, // "Medalla del Agua" }; trickNameTable[RG_SPIRIT_MEDALLION] = { - Text{"Earth Element", "Elément Terre", "Elemento de tierra"}, - Text{"Nabooru's Medallion", "Médaillon de Nabooru", "Medallón de Nabooru"}, - Text{"Sign of Earth", "Glyphe de la Terre", "Glifo de la tierra"}, - Text{"Medallion of Spirit", "Médaillon du Temple de l'Esprit", "Medalla del Espíritu"} + Text{ "Earth Element", "Elément Terre", "Erd-Element" }, // "Elemento de tierra" + Text{ "Nabooru's Medallion", "Médaillon de Nabooru", "Naborus Amulett" }, // "Medallón de Nabooru" + Text{ "Sign of Earth", "Glyphe de la Terre", "Zeichen der Erde" }, // "Glifo de la tierra" + Text{ "Medallion of Spirit", "Médaillon du Temple de l'Esprit", + "Medaillon der Geister" }, // "Medalla del Espíritu" }; trickNameTable[RG_SHADOW_MEDALLION] = { - Text{"Fused Shadow", "Cristal d'ombre", "Sombra Fundida"}, - Text{"Impa's Medallion", "Médaillon d'Impa", "Medallón de Impa"}, - Text{"Sign of Illusion", "Glyphe de l'illusion", "Glifo de ilusión"}, - Text{"Medallion of Shadow", "Médaillon du Temple de l'Ombre", "Medalla de la Sombra"} + Text{ "Fused Shadow", "Cristal d'ombre", "Schattenkristall" }, // "Sombra Fundida" + Text{ "Impa's Medallion", "Médaillon d'Impa", "Impas Amulett" }, // "Medallón de Impa" + Text{ "Sign of Illusion", "Glyphe de l'illusion", "Zeichen der Illusionen" }, // "Glifo de ilusión" + Text{ "Medallion of Shadow", "Médaillon du Temple de l'Ombre", + "Medaillon des Schattens" }, // "Medalla de la Sombra" }; trickNameTable[RG_LIGHT_MEDALLION] = { - Text{"Compass of Light", "Boussole de lumière", "Brújula de Luz"}, - Text{"Rauru's Medallion", "Médaillon de Rauru", "Medallón de Rauru"}, - Text{"Sign of Destiny", "Glyphe du destin", "Glifo del destino"}, - Text{"Medallion of Light", "Médaillon du temple de lumière", "Medalla de la Luz"} + Text{ "Compass of Light", "Boussole de lumière", "Licht-Kompaß" }, // "Brújula de Luz" + Text{ "Rauru's Medallion", "Médaillon de Rauru", "Raurus Amulett" }, // "Medallón de Rauru" + Text{ "Sign of Destiny", "Glyphe du destin", "Zeichen des Schicksals" }, // "Glifo del destino" + Text{ "Medallion of Light", "Médaillon du temple de lumière", "Medaillon des Lichts" }, // "Medalla de la Luz" }; trickNameTable[RG_RECOVERY_HEART] = { - Text{"Love", "Bisou", "Te amo"}, - Text{"Life", "Vie", "vida"}, - Text{"HP", "VP", "VP"} + Text{ "Love", "Bisou", "Liebe" }, // "Te amo" + Text{ "Life", "Vie", "Leben" }, // "vida" + Text{ "HP", "PV", "KP" }, // "VP" }; trickNameTable[RG_GREEN_RUPEE] = { - Text{"False Greg", "Faux Greg", "Falso Greg"}, - Text{"One Ruby", "Un rubis", "Un rubí"}, - Text{"Rupoor (1)", "Roupir (1)", "Rupobre (1)"}, - Text{"One Rupee", "Un rubis", "Guaraní hyliano"}, - Text{"Rupee (1)", "Rubis (1)", "Peso hyliano"} + Text{ "Rupee (1)", "Rubis (1)", "Rubin (1)" }, // "Peso hyliano" + Text{ "One Ruby", "Un rubis", "ein Ruby" }, // "Un rubí" + Text{ "One Rupee", "Un rubis", "ein Rubin" }, // "Guaraní hyliano" + Text{ "False Greg", "Faux Greg", "falscher Greg" }, // "Falso Greg" + Text{ "Rupoor (1)", "Roupir (1)", "Rubinfalle (1)" }, // "Rupobre (1)" }; trickNameTable[RG_BLUE_RUPEE] = { - Text{"Blupee", "Bleubi", "Azupia"}, - Text{"Five Rubies", "Cinq Rubys", "Cinco rubíes"}, - Text{"Five Rupees", "Cinq rubis", "Bolívar hyliano"}, - Text{"Rupee (5)", "Rubis (5)", "Peso hyliano"}, - Text{"Rupoor (5)", "Roupir (5)", "Rupobre (5)"} + Text{ "Blupee", "Bleubi", "Fünfer" }, // "Azupia" + Text{ "Five Rubies", "Cinq Rubys", "fünf Rubies€" }, // "Cinco rubíes" + Text{ "Five Rupees", "Cinq rubis", "fünf Rubine€" }, // "Bolívar hyliano" + Text{ "Rupee (5)", "Rubis (5)", "Rubin (5)" }, // "Peso hyliano" + Text{ "Rupoor (5)", "Roupir (5)", "Rubinfalle (5)" }, // "Rupobre (5)" }; trickNameTable[RG_RED_RUPEE] = { - Text{"Big 20", "Grand 20", "Los 20 grandes"}, - Text{"Twenty Rubies", "vingt rubis", "Veinte rubíes"}, - Text{"Rupoor (20)", "Roupir (20)", "Rupobre (20)"}, - Text{"Twenty Rupees", "Vingt rubis", "Colon hyliano"}, - Text{"Rupee (20)", "Rubis (20)", "Peso hyliano"} + Text{ "Big 20", "Grand 20", "Zwanni" }, // "Los 20 grandes" + Text{ "Twenty Rubies", "vingt rubis", "zwanzig Rubies€" }, // "Veinte rubíes" + Text{ "Twenty Rupees", "Vingt rubis", "zwanzig Rubine€" }, // "Colon hyliano" + Text{ "Rupee (20)", "Rubis (20)", "Rubin (20)" }, // "Peso hyliano" + Text{ "Rupoor (20)", "Roupir (20)", "Rubinfalle (20)" }, // "Rupobre (20)" }; trickNameTable[RG_PURPLE_RUPEE] = { - Text{"Purpee", "pourbi", "morupiua"}, - Text{"Fifty Rubies", "cinquante rubis", "Cincuenta rubíes"}, - Text{"Rupoor (50)", "Roupir (50)", "Rupobre (50)"}, - Text{"Fifty Rupees", "Cinquante rubis", "Balboa hyliano"}, - Text{"Rupee (50)", "Rubis (50)", "Peso hyliano"} + Text{ "Purpee", "Pourbi", "Fuffi" }, // "morupiua" + Text{ "Fifty Rubies", "Cinquante rubis", "fünfzig Rubies€" }, // "Cincuenta rubíes" + Text{ "Fifty Rupees", "Cinquante rubis", "fünfzig Rubine€" }, // "Balboa hyliano" + Text{ "Rupee (50)", "Rubis (50)", "Rubin (50)" }, // "Peso hyliano" + Text{ "Rupoor (50)", "Roupir (50)", "Rubinfalle (50)" }, // "Rupobre (50)" }; trickNameTable[RG_HUGE_RUPEE] = { - Text{"Hugo", "Or Rubi", "Oro Rubi"}, - Text{"Two Hundred Rubies", "deux cents rubis", "Doscientos rubíes"}, - Text{"Diamond", "Diamant", "Diamante"}, - Text{"Huge Ruby", "Énorme rubis", "Rubi gigante"}, - Text{"Two Hundred Rupees", "Deux cent rubis", "Euro hyliano"}, - Text{"Rupee (200)", "Rubis (200)", "Dólar hyliano"} + Text{ "Hugo", "Or Rubi", "zwei Hunnis€" }, // "Oro Rubi" + Text{ "Two Hundred Rubies", "Deux cents rubis", "zweihundert Rubies€" }, // "Doscientos rubíes" + Text{ "Diamond", "Diamant", "Diamant" }, // "Diamante" + Text{ "Huge Ruby", "Énorme rubis", "großer Ruby" }, // "Rubi gigante" + Text{ "Two Hundred Rupees", "Deux cent rubis", "zweihundert Rubine€" }, // "Euro hyliano" + Text{ "Rupee (200)", "Rubis (200)", "Rubin (200)" }, // "Dólar hyliano" }; trickNameTable[RG_PIECE_OF_HEART] = { - Text{"Pizza Heart", "Fromage de cœur", "Pieza de Chorizo"}, - Text{"Little Bit Of Love", "Un peu d'amour", "Un poco de amor"}, - Text{"Rare Peach Stone", "Pierre de pêche rare", "Pierre de pêche rare"} + Text{ "Pizza Heart", "Fromage de cœur", "Harzteil" }, // "Pieza de Chorizo" + Text{ "Little Bit Of Love", "Un peu d'amour", "etwas Liebe" }, // "Un poco de amor" + Text{ "Rare Peach Stone", "Pierre de pêche rare", "ein seltener Pfirsichstein" }, // "Pierre de pêche rare" }; trickNameTable[RG_HEART_CONTAINER] = { - Text{"Crystal Heart", "Cœur de cristal", "Corazón de cristal"}, - Text{"Life Heart", "Cœur de vie", "Vida Corazón"}, - Text{"Lots of Love", "Beaucoup d'amour", "Mucho amor"} + Text{ "Crystal Heart", "Cœur de cristal", "Kristallherz" }, // "Corazón de cristal" + Text{ "Life Heart", "Cœur de vie", "Lebensherz" }, // "Vida Corazón" + Text{ "Lots of Love", "Beaucoup d'amour", "viel Liebe" }, // "Mucho amor" }; trickNameTable[RG_TRIFORCE_PIECE] = { - Text{"Piece of Cheese", "Morceau de Fromage", "Piece of Cheese"}, - Text{"Triforce Shard", "Éclat de Triforce", "Triforce Shard"}, - Text{"Shiny Rock", "Caiiloux Brillant", "Shiny Rock"} + Text{ "Piece of Cheese", "Morceau de Fromage", "Käseteil" }, // "Piece of Cheese" + Text{ "Triforce Shard", "Éclat de Triforce", "Triforce-Fragment" }, // "Triforce Shard" + Text{ "Shiny Rock", "Caillou Brillant", "glänzender Stein" }, // "Shiny Rock" }; - trickNameTable[RG_GOHMA_SOUL] = { - Text{"Spider Sense", "", ""}, - Text{"Deku Spirit", "", ""}, - Text{"Ghost of Ghoma", "", ""} + Text{ "Spider Sense", "Sens de l'Araignée", "Spinnensinn" }, + Text{ "Deku Spirit", "Parasite Mojo", "Deku Geist" }, + Text{ "Ghost of Ghoma", "Fantôme de Gohma", "Gohmas Geist" }, }; trickNameTable[RG_KING_DODONGO_SOUL] = { - Text{"Lizard Soul", "", ""}, - Text{"Regal Remains", "", ""}, - Text{"Dodongo's Core", "", ""} + Text{ "Lizard Soul", "Âme d'un Lézard", "Reptilienseele" }, + Text{ "Regal Remains", "Restes Délicieux", "royale Überreste€" }, + Text{ "Dodongo's Core", "Coeur de Dodongo", "Dodongos Kern" }, }; trickNameTable[RG_BARINADE_SOUL] = { - Text{"Parasitic Poltergeist", "", ""}, - Text{"Jabu Insides", "", ""}, - Text{"Barinade Bacteria", "", ""} + Text{ "Parasitic Poltergeist", "Poltergeist Parasite", "infektiöser Poltergeist" }, + Text{ "Jabu Insides", "Entrailles de Jabu-Jabu", "Jabus Innereien" }, + Text{ "Barinade Bacteria", "Bactérie de Barinade", "Barinades Bakterien" }, }; trickNameTable[RG_PHANTOM_GANON_SOUL] = { - Text{"Bigger Poe", "", ""}, - Text{"Sacred Forest Pine Tree", "", ""}, - Text{"Ganon's Phantom", "", ""} + Text{ "Bigger Poe", "Âme Gigantesque", "ein großer Nachtschwärmer" }, + Text{ "Sacred Forest Pine Tree", "Grande Perche du Bosquet Sacré", "Kiefer der Heiligen Lichtung" }, + Text{ "Ganon's Phantom", "Fantôme de Ganon", "Ganons Phantom" }, }; trickNameTable[RG_VOLVAGIA_SOUL] = { - Text{"Dragon Roast", "", ""}, - Text{"Hot n' Ready", "", ""}, - Text{"Volvagia's Vitality", "", ""} + Text{ "Dragon Roast", "Friture du Dragon", "Drachenbraten" }, + Text{ "Hot n' Ready", "Sauce Barbecue", "Barbecue Sauce" }, + Text{ "Volvagia's Vitality", "Vitalité de Volcania", "Volvagias Vitalität" }, }; trickNameTable[RG_MORPHA_SOUL] = { - Text{"Dihydrogen Monoxide", "", ""}, - Text{"Morpha Molecules", "", ""}, - Text{"Wet Stuff", "", ""} + Text{ "Dihydrogen Monoxide", "Monoxyde de Dihydrogène", "Dihydrogenmonoxid" }, + Text{ "Morpha Molecules", "Molécule de Morpha", "Morphas Molekyle" }, + Text{ "Wet Stuff", "Truc Mouillé", "nasses Zeug" }, }; trickNameTable[RG_BONGO_BONGO_SOUL] = { - Text{"Shadow Soul", "", ""}, - Text{"Dark Essence", "", ""}, - Text{"Bongo Bongo's Bongo", "", ""} + Text{ "Shadow Soul", "Âme de l'Ombre", "Schattenseele" }, + Text{ "Dark Essence", "Essence Sombre", "Dunkle Essenz" }, + Text{ "Bongo Bongo's Bongo", "Bongo de Bongo Bongo", "Bongo Bongos Bongo" }, }; trickNameTable[RG_TWINROVA_SOUL] = { - Text{"Sandy Ashes", "", ""}, - Text{"Spiritual Spirit", "", ""}, - Text{"Twin Rovers", "", ""} + Text{ "Sandy Ashes", "Cendres des Vieilles", "Sandige Asche" }, + Text{ "Spiritual Spirit", "Esprit Spirituel", "Geisterhafter Geist" }, + Text{ "Twin Rovers", "Duo Angélique", "Twinrovas Seile" }, }; trickNameTable[RG_GANON_SOUL] = { - Text{"Pure Evil", "", ""}, - Text{"Ganon's Ghost", "", ""}, - Text{"Pork", "", ""} + Text{ "Pure Evil", "Mal Incarné", "Das pure Böse" }, + Text{ "Ganon's Ghost", "Le Malin", "Ganons Geist" }, + Text{ "Pork", "Porc", "Schweinefleisch" }, }; - trickNameTable[RG_FISHING_POLE] = { - Text{"Fish Tickler", "Fish Tickler", "Fish Tickler"}, - Text{"Floating Lure", "Floating Lure", "Floating Lure"}, - Text{"Fishing Reel", "Fishing Reel", "Fishing Reel"} + Text{ "Fish Tickler", "Fish Tickler", "Fischkitzler" }, + Text{ "Floating Lure", "Floating Lure", "Schwimmer" }, + Text{ "Fishing Reel", "Fishing Reel", "Angelschnur" }, }; - trickNameTable[RG_OCARINA_A_BUTTON] = { - Text{"Ocarina J Button", "", ""}, - Text{"Ocarina Ayy Button", "", ""}, - Text{"Ocarina A Trigger", "", ""} + Text{ "Ocarina J Button", "Touche Ha de l'Ocarina", "J-Taste der Okarina" }, + Text{ "Ocarina Ayy Button", "Touche Ah de l'Ocarina", "A-Taste der Flöte" }, + Text{ "Ocarina A Trigger", "Bumper A de l'Ocarina", "A-Trigger der Okarina" }, }; trickNameTable[RG_OCARINA_C_UP_BUTTON] = { - Text{"Ocarina C North Button", "", ""}, - Text{"Ocarina C App Button", "", ""}, - Text{"Ocarina Sup Button", "", ""} + Text{ "Ocarina C North Button", "Touche C Nord de l'Ocarina", "C-Nord-Taste der Okarina" }, + Text{ "Ocarina C App Button", "Touche C'est Haut de l'Ocarina", "C-Oben-Taste des Rekorders" }, + Text{ "Ocarina Sup Button", "Touche O de l'Ocarina", "C-Oben-Trigger der Okarina" }, }; trickNameTable[RG_OCARINA_C_DOWN_BUTTON] = { - Text{"Ocarina C South Button", "", ""}, - Text{"Ocarina Z Down Button", "", ""}, - Text{"Ocarina See Down Button", "", ""}, - Text{"Ocarina C Dawn Button", "", ""} + Text{ "Ocarina C South Button", "Touche C Sud de l'Ocarina", "C-Süd-Taste der Okarina" }, + Text{ "Ocarina Z Down Button", "Touche Z Bas de l'Ocarina", "Z-Unten-Taste der Okarina" }, + Text{ "Ocarina See Down Button", "Touche C'est Bas de l'Ocarina", "C-Unten-Taste der Harfe" }, + Text{ "Ocarina C Dawn Button", "Touche Séba de l'Ocarina", "C-Unten-Trigger der Okarina" }, }; trickNameTable[RG_OCARINA_C_LEFT_BUTTON] = { - Text{"Ocarina C West Button", "", ""}, - Text{"Ocarina Sea Left Button", "", ""}, - Text{"Ocarina C Lift Button", "", ""}, - Text{"Ocarina Rewind Button", "", ""} + Text{ "Ocarina C West Button", "Touche C Ouest de l'Ocarina", "C-West-Taste der Okarina" }, + Text{ "Ocarina Sea Left Button", "Touche Cégoche de L'Ocarina", "C-Links-Taste der Nixenglocke" }, + Text{ "Ocarina C Lift Button", "Touche C'est Gauche de l'Ocarina", "C-Zelda-Taste der Okarina" }, + Text{ "Ocarina Rewind Button", "Touche Rembobiner de l'Ocarina", "C-Links-Trigger der Okarina" }, }; trickNameTable[RG_OCARINA_C_RIGHT_BUTTON] = { - Text{"Ocarina C East Button", "", ""}, - Text{"Ocarina C Wright Button", "", ""}, - Text{"Overworld C Right Button", "", ""} + Text{ "Ocarina C East Button", "Touche C Est de l'Ocarina", "C-Ost-Taste der Okarina" }, + Text{ "Ocarina C Wright Button", "Touche C'est Droite de l'Ocarina", "C-Rechts-Trigger der Okarina" }, + Text{ "Overworld C Right Button", "Trou Droit de l'Ocarina", "C-Rechts-Taste der E-Gitarre" }, }; /* //Names for individual upgrades, in case progressive names are replaced trickNameTable[GI_HOOKSHOT] = { - Text{"Grappling Hook", "Grappin-griffe", "Gancho lanzable"}, - Text{"Clawshot", "Lance-chaîne", "Zarpa"}, - Text{"Gripshot", "Grappince", "Enganchador"} + Text{"Grappling Hook", "Grappin-griffe", "Enterhaken" }, // "Gancho lanzable" + Text{"Clawshot", "Lance-chaîne", "Greifhaken" }, // "Zarpa" + Text{"Gripshot", "Grappince", "Tauschhaken" }, // "Enganchador" }; trickNameTable[GI_LONGSHOT] = { - Text{"Longshot, no strings attached", "Grappin sans attrape", "Gancho lanzable más largo"}, - Text{"Double Clawshot", "Double-grappin", "Superzarpa"}, - Text{"Switch Hook", "Great grappin", "Gancho chulo"} + Text{"Longshot, no strings attached", "Grappin sans attrape", "Enterhaken, Umtausch ausgeschloßen"}, // "Gancho + lanzable más largo" Text{"Double Clawshot", "Double-grappin", "Doppelhaken" }, // "Superzarpa" Text{"Switch Hook", + "Great grappin", "Tauschhaken" }, // "Gancho chulo" }; trickNameTable[GI_BOMB_BAG_1] = { - Text{"Bomb Capacity (20)", "Capacité de bombes (20)", "Bolsa de bombas (contiene 20)"}, - Text{"Bronze Bomb Bag", "Sac de Bombes de bronze", "Saco de bronce de bombas"}, - Text{"Small Bomb Bag", "Petit Sac de Bombes", "Zurrón de bombas pequeño"} + Text{"Bomb Capacity (20)", "Capacité de bombes (20)", "Bomben-Kapazität (20)" }, // "Bolsa de bombas (contiene + 20)" Text{"Bronze Bomb Bag", "Sac de Bombes de bronze", "Bronzene Bombentasche" }, // "Saco de bronce de bombas" + Text{"Small Bomb Bag", "Petit Sac de Bombes", "Kleine Bombentasche" }, // "Zurrón de bombas pequeño" }; trickNameTable[GI_BOMB_BAG_2] = { - Text{"Bomb Capacity (30)", "Capacité de bombes (30)", "Bolsa de bombas (contiene 30)"}, - Text{"Silver Bomb Bag", "Sac de Bombes d'argent", "Saco plateado de bombas"}, - Text{"Medium Bomb Bag", "Sac de Bombes moyen", "Zurrón de bombas mediano"} + Text{"Bomb Capacity (30)", "Capacité de bombes (30)", "Bomben-Kapazität (30)" }, // "Bolsa de bombas (contiene + 30)" Text{"Silver Bomb Bag", "Sac de Bombes d'argent", "Silberne Bombentasche" }, // "Saco plateado de bombas" + Text{"Medium Bomb Bag", "Sac de Bombes moyen", "Mittlere Bombentasche" }, // "Zurrón de bombas mediano" }; trickNameTable[GI_BOMB_BAG_3] = { - Text{"Bomb Capacity (40)", "Capacité de bombes (40)", "Bolsa de bombas (contiene 40)"}, - Text{"Golden Bomb Bag", "Sac de Bombes d'or", "Saco dorado de bombas"}, - Text{"Large Bomb Bag", "Gros Sac de Bombes", "Zurrón de bombas grande"} + Text{"Bomb Capacity (40)", "Capacité de bombes (40)", "Bomben-Kapazität (40)" }, // "Bolsa de bombas (contiene + 40)" Text{"Golden Bomb Bag", "Sac de Bombes d'or", "Goldene Bombentasche" }, // "Saco dorado de bombas" Text{"Large + Bomb Bag", "Gros Sac de Bombes", "Gigantische Bombentasche" }, // "Zurrón de bombas grande" }; trickNameTable[GI_BOW_1] = { - Text{"Bow", "Arc", "Arco del Hada"}, - Text{"Hero's Bow", "Arc du héros", "Arco del héroe"}, - Text{"Small Quiver", "Petit carquois", "Saco de flechas pequeño"} + Text{"Bow", "Arc", "Bogen" }, // "Arco del Hada" + Text{"Hero's Bow", "Arc du héros", "Heroenbogen" }, // "Arco del héroe" + Text{"Small Quiver", "Petit carquois", "Kleiner Köcher" }, // "Saco de flechas pequeño" }; trickNameTable[GI_BOW_2] = { - Text{"Arrow Capacity (40)", "Capacité de flèches (40)", "Capacidad de flechas (40)"}, - Text{"Silver Quiver", "Carquois d'argent", "Carcaj plateado"}, - Text{"Medium Quiver", "Carquois moyen", "Saco de flechas mediano"} + Text{"Arrow Capacity (40)", "Capacité de flèches (40)", "Pfeil-Kapazität (40)" }, // "Capacidad de flechas (40)" + Text{"Silver Quiver", "Carquois d'argent", "Silberner Köcher" }, // "Carcaj plateado" + Text{"Medium Quiver", "Carquois moyen", "Mittlerer Köcher" }, // "Saco de flechas mediano" }; trickNameTable[GI_BOW_3] = { - Text{"Arrow Capacity (50)", "Capacité de flèches (50)", "Capacidad de flechas (50)"}, - Text{"Golden Quiver", "Carquois d'or", "Carcaj dorado"}, - Text{"Large Quiver", "Gros carquois", "Saco de flechas grande"} + Text{"Arrow Capacity (50)", "Capacité de flèches (50)", "Pfeil-Kapazität (50)" }, // "Capacidad de flechas (50)" + Text{"Golden Quiver", "Carquois d'or", "Goldener Köcher" }, // "Carcaj dorado" + Text{"Large Quiver", "Gros carquois", "Gigantischer Köcher" }, // "Saco de flechas grande" }; trickNameTable[GI_SLINGSHOT_1] = { - Text{"Slingshot", "Lance-Pierre", "Tirachinas del Hada"}, - Text{"Scattershot", "Lance-Pierre rafale", "Tirachinas múltiple"}, - Text{"Small Seed Satchel", "Petit sac de graines", "Bolsa de semillas pequeña"} + Text{"Slingshot", "Lance-Pierre", "Schleuder" }, // "Tirachinas del Hada" + Text{"Scattershot", "Lance-Pierre rafale", "Streuschleuder" }, // "Tirachinas múltiple" + Text{"Small Seed Satchel", "Petit sac de graines", "Kleine Munitionstasche" }, // "Bolsa de semillas pequeña" }; trickNameTable[GI_SLINGSHOT_2] = { - Text{"Deku Seed Capacity (40)", "Capacité de graines (40)", "Capacidad de semillas (40)"}, - Text{"Silver Deku Seed Bullet Bag", "Sac de graines d'argent", "Bolsa de balas (contiene 40)"}, - Text{"Medium Seed Satchel", "Sac de graines moyen", "Bolsa de semillas mediana"} + Text{"Deku Seed Capacity (40)", "Capacité de graines (40)", "Deku-Kern-Kapazität (40)" }, // "Capacidad de + semillas (40)" Text{"Silver Deku Seed Bullet Bag", "Sac de graines d'argent", "Silberne Munitionstasche" }, // + "Bolsa de balas (contiene 40)" Text{"Medium Seed Satchel", "Sac de graines moyen", "Mittlere Munitionstasche" }, // + "Bolsa de semillas mediana" }; trickNameTable[GI_SLINGSHOT_3] = { - Text{"Deku Seed Capacity (50)", "Capacité de graines (50)", "Capacidad de semillas (50)"}, - Text{"Golden Deku Seed Bullet Bag", "Sac de graines d'or", "Bolsa de balas (contiene 50)"}, - Text{"Large Seed Satchel", "Gros sac de graines", "Bolsa de semillas grande"} + Text{"Deku Seed Capacity (50)", "Capacité de graines (50)", "Deku-Kern-Kapazität (50)" }, // "Capacidad de + semillas (50)" Text{"Golden Deku Seed Bullet Bag", "Sac de graines d'or", "Goldene Munitionstasche" }, // "Bolsa de + balas (contiene 50)" Text{"Large Seed Satchel", "Gros sac de graines", "Gigantische Munitionstasche" }, // "Bolsa de + semillas grande" }; trickNameTable[GI_STRENGTH_1] = { - Text{"Goron's Gauntlet", "Gantelet Goron", "Brazalete amarillo"}, - Text{"Power Bracelet", "Bracelet de force", "Brazalete de fuerza"}, - Text{"Magic Bracelet", "Bracelet de Lavio", "Brazalete de Ravio"} + Text{"Goron's Gauntlet", "Gantelet Goron", "Goronen-Handschuhe€" }, // "Brazalete amarillo" + Text{"Power Bracelet", "Bracelet de force", "Kraftarmband" }, // "Brazalete de fuerza" + Text{"Magic Bracelet", "Bracelet de Lavio", "Magiearmband" }, // "Brazalete de Ravio" }; trickNameTable[GI_STRENGTH_2] = { - Text{"Silver Bracelets", "Bracelets d'argent", "Guantes Moguma"}, - Text{"Power Gloves", "Gant de puissance", "Guante del Poder"}, - Text{"Magic Gauntlets", "Gantelet magique", "Guante mágico"} + Text{"Silver Bracelets", "Bracelets d'argent", "Silberarmband" }, // "Guantes Moguma" + Text{"Power Gloves", "Gant de puissance", "Silberhandschuhe€" }, // "Guante del Poder" + Text{"Magic Gauntlets", "Gantelet magique", "Magiehandschuhe€" }, // "Guante mágico" }; trickNameTable[GI_STRENGTH_3] = { - Text{"Golden Bracelets", "Bracelets d'or", "Guantelete de Thanos"}, - Text{"Titan's Mitts", "Moufle de titan", "Guantes de Titán"}, - Text{"Magnetic Gloves", "Magnéto-gants", "Guantes de fuego"} + Text{"Golden Bracelets", "Bracelets d'or", "Goldarmband" }, // "Guantelete de Thanos" + Text{"Titan's Mitts", "Moufle de titan", "Goldhandschuhe€" }, // "Guantes de Titán" + Text{"Magnetic Gloves", "Magnéto-gants", "Magnethandschuhe€" }, // "Guantes de fuego" }; trickNameTable[GI_SCALE_1] = { - Text{"Silver Pearl", "Perle d'argent", "Perla de Plata progresiva"}, - Text{"Adult Scale", "Écaille d'adulte", "Bola de bolos zora"}, - Text{"Zora Scale", "Écaille Zora", "Escama de Zora"} + Text{"Silver Pearl", "Perle d'argent", "Silberne Perle" }, // "Perla de Plata progresiva" + Text{"Adult Scale", "Écaille d'adulte", "Große Schuppe" }, // "Bola de bolos zora" + Text{"Zora Scale", "Écaille Zora", "Zora-Schuppe" }, // "Escama de Zora" }; trickNameTable[GI_SCALE_2] = { - Text{"Golden Pearl", "Perle d'or", "Perla de Oro progresiva"}, - Text{"Giant Scale", "Écaille de géant", "Escama de Faren"}, - Text{"Water Dragon Scale", "Écaille du dragon de l'eau", "Escama de dragón acuático"} + Text{"Golden Pearl", "Perle d'or", "Goldene Perle" }, // "Perla de Oro progresiva" + Text{"Giant Scale", "Écaille de géant", "Riesenschuppe" }, // "Escama de Faren" + Text{"Water Dragon Scale", "Écaille du dragon de l'eau", "Wasserdrachenschuppe" }, // "Escama de dragón + acuático" }; trickNameTable[GI_WALLET_1] = { - Text{"Rupee Capacity (200)", "Capacité de rubis (200)", "Capacidad de rupias (200)"}, - Text{"Silver Wallet", "Bourse d'argent", "Cartera de rupias de adulto"}, - Text{"Medium Wallet", "Bourse moyenne", "Zurrón de rupias mediano"} + Text{"Rupee Capacity (200)", "Capacité de rubis (200)", "Rubinkapazität (200)" }, // "Capacidad de rupias (200)" + Text{"Silver Wallet", "Bourse d'argent", "Silberne Geldbörse" }, // "Cartera de rupias de adulto" + Text{"Medium Wallet", "Bourse moyenne", "Mittlere Geldbörse" }, // "Zurrón de rupias mediano" }; trickNameTable[GI_WALLET_2] = { - Text{"Rupee Capacity (500)", "Capacité de rubis (500)", "Capacidad de rupias (500)"}, - Text{"Golden Wallet", "Bourse d'or", "Cartera de rupias gigante"}, - Text{"Large Wallet", "Grosse Bourse", "Zurrón de rupias grande"} + Text{"Rupee Capacity (500)", "Capacité de rubis (500)", "Rubin-Kapazität (500)" }, // "Capacidad de rupias + (500)" Text{"Golden Wallet", "Bourse d'or", "Riesenportemonnaie" }, // "Cartera de rupias gigante" Text{"Large + Wallet", "Grosse Bourse", "Gigantische Geldbörse" }, // "Zurrón de rupias grande" }; trickNameTable[GI_WALLET_3] = { - Text{"Rupee Capacity (999)", "Capacité de rubis (999)", "Capacidad de rupias (999)"}, - Text{"Golden Wallet", "Bourse d'or", "Cartera de ricachón"}, - Text{"Large Wallet", "Grosse Bourse", "Zurrón de rupias gigante"} + Text{"Rupee Capacity (999)", "Capacité de rubis (999)", "Rubin-Kapazität (999) }, // "Capacidad de rupias (999)" + Text{"Golden Wallet", "Bourse d'or", "Goldenes Portemonnaie" }, // "Cartera de ricachón" + Text{"Large Wallet", "Grosse Bourse", "Gigantische Geldbörse" }, // "Zurrón de rupias gigante" }; trickNameTable[GI_DEKU_NUT_UPGRADE_1] = { - Text{"Deku Bomb Capacity (30)", "Capacité de bombes Mojo (30)", "Capacidad de semillas deku (40)"}, - Text{"Baba Nut Capacity (30)", "Capacité de noix Baba (30)", "Capacidad de nueces baba (40)"}, - Text{"Deku Nut Pack (30)", "Paquet de noix Mojo (30)", "Capacidad de nueces mojo (40)"} + Text{"Deku Bomb Capacity (30)", "Capacité de bombes Mojo (30)", "Deku-Bomben-Kapazität (30)" }, // "Capacidad de + semillas deku (40)" Text{"Baba Nut Capacity (30)", "Capacité de noix Baba (30)", "Ranha-Nuß-Kapazität (30)" }, // + "Capacidad de nueces baba (40)" Text{"Deku Nut Pack (30)", "Paquet de noix Mojo (30)", "Deku-Nußrucksack (30)" }, // + "Capacidad de nueces mojo (40)" }; trickNameTable[GI_DEKU_NUT_UPGRADE_2] = { - Text{"Deku Bomb Capacity (40)", "Capacité de bombes Mojo (40)", "Capacidad de semillas deku (50)"}, - Text{"Baba Nut Capacity (40)", "Capacité de noix Baba (40)", "Capacidad de nueces baba (50)"}, - Text{"Deku Nut Pack (40)", "Paquet de noix Mojo (40)", "Capacidad de nueces mojo (50)"} + Text{"Deku Bomb Capacity (40)", "Capacité de bombes Mojo (40)", "Deku-Bomben-Kapazität (40)" }, // "Capacidad de + semillas deku (50)" Text{"Baba Nut Capacity (40)", "Capacité de noix Baba (40)", "Ranha-Nuß-Kapazität (40)" }, // + "Capacidad de nueces baba (50)" Text{"Deku Nut Pack (40)", "Paquet de noix Mojo (40)", "Deku-Nußrucksack (40)" }, // + "Capacidad de nueces mojo (50)" }; trickNameTable[GI_DEKU_STICK_UPGRADE_1] = { - Text{"Deku Rod Capacity (20)", "Capacité de tiges Mojo (20)", "Capacidad de palos mojo (20)"}, - Text{"Boko Stick Capacity (20)", "Capacité de Bâtons Boko (20)", "Capacidad de palos boko (20)"}, - Text{"Deku Stick Pack (20)", "Paquet de bâtons Mojo (20)", "Capacidad de bastones deku (20)"} + Text{"Deku Rod Capacity (20)", "Capacité de tiges Mojo (20)", "Deku-Stock-Kapazität (20)" }, // "Capacidad de + palos mojo (20)" Text{"Boko Stick Capacity (20)", "Capacité de Bâtons Boko (20)", "Bokstock-Kapazität (20)" }, // + "Capacidad de palos boko (20)" Text{"Deku Stick Pack (20)", "Paquet de bâtons Mojo (20)", "Deku-Stabrucksack (20)" + }, // "Capacidad de bastones deku (20)" }; trickNameTable[GI_DEKU_STICK_UPGRADE_2] = { - Text{"Deku Rod Capacity (30)", "Capacité de tiges Mojo (30)", "Capacidad de palos mojo (30)"}, - Text{"Boko Stick Capacity (30)", "Capacité de Bâtons Boko (30)", "Capacidad de palos boko (30)"}, - Text{"Deku Stick Pack (30)", "Paquet de bâtons Mojo (30)", "Capacidad de bastones deku (30)"} + Text{"Deku Rod Capacity (30)", "Capacité de tiges Mojo (30)", "Deku-Stock-Kapazität (30)" }, // "Capacidad de + palos mojo (30)" Text{"Boko Stick Capacity (30)", "Capacité de Bâtons Boko (30)", "Bokstock-Kapazität (30)" }, // + "Capacidad de palos boko (30)" Text{"Deku Stick Pack (30)", "Paquet de bâtons Mojo (30)", "Deku-Stabrucksack (30)" + }, // "Capacidad de bastones deku (30)" }; trickNameTable[GI_MAGIC_1] = { - Text{"Stamina Meter", "Jauge d'endurance", "Medidor de vigor"}, - Text{"Energy Meter", "Jauge d'énergie", "Medidor de energía"}, - Text{"Magic Powder", "Poudre magique", "Medidor de carga"} + Text{"Stamina Meter", "Jauge d'endurance", "Ausdauerleiste" }, // "Medidor de vigor" + Text{"Energy Meter", "Jauge d'énergie", "Energieleiste" }, // "Medidor de energía" + Text{"Magic Powder", "Poudre magique", "Zauberpulver" }, // "Medidor de carga" }; trickNameTable[GI_MAGIC_2] = { - Text{"Enhanced Stamina Meter", "Jauge d'endurance améliorée", "Medidor de vigor mejorado"}, - Text{"Enhanced Energy Meter", "Jauge d'énergie améliorée", "Medidor de energía mejorado"}, - Text{"Enhanced Magic Powder", "Poudre magique améliorée", "Medidor de carga mejorado"} + Text{"Enhanced Stamina Meter", "Jauge d'endurance améliorée", "Verb. Ausdauerleiste" }, // "Medidor de vigor + mejorado" Text{"Enhanced Energy Meter", "Jauge d'énergie améliorée", "Verb. Energieleiste" }, // "Medidor de energía + mejorado" Text{"Enhanced Magic Powder", "Poudre magique améliorée", "Verb. Zauberpulver" }, // "Medidor de carga + mejorado" }; trickNameTable[GI_OCARINA_1] = { - Text{"Ocarina", "Ocarina", "Ocarina"}, - Text{"Saria's Ocarina", "Ocarina de Saria", "Ocarina de Saria"}, - Text{"Wood Ocarina", "Ocarina de bois", "Ocarina del Hada"} + Text{"Ocarina", "Ocarina", "Okarina" }, // "Ocarina" + Text{"Saria's Ocarina", "Ocarina de Saria", "Salias Okarina" }, // "Ocarina de Saria" + Text{"Wood Ocarina", "Ocarina de bois", "Holzokarina" }, // "Ocarina del Hada" }; trickNameTable[GI_OCARINA_2] = { - Text{"Flute", "Flûte", "Flauta"}, - Text{"Zelda's Ocarina", "Ocarina de Zelda", "Ocarina de Zelda"}, - Text{"Ocarina of Winds", "Ocarina des vents", "Ocarina del Viento"} + Text{"Flute", "Flûte", "Flöte" }, // "Flauta" + Text{"Zelda's Ocarina", "Ocarina de Zelda", "Zeldas Okarina" }, // "Ocarina de Zelda" + Text{"Ocarina of Winds", "Ocarina des vents", "Okarina des Windes" }, // "Ocarina del Viento" }; trickNameTable[GI_CUCCO] = { - Text{"D.I.Y. Alarm Clock", "Réveille-matin improvisé", "Alarma emplumada"}, - Text{"Kakariko Cucco", "Cocotte Cocorico", "Cuco de Kakariko"}, - Text{"Hatched Cucco", "Cocotte éclose", "Pollo"} + Text{"D.I.Y. Alarm Clock", "Réveille-matin improvisé", "Improvisierter Wecker"}, // "Alarma emplumada" + Text{"Kakariko Cucco", "Cocotte Cocorico", "Kakariko Huhn" }, // "Cuco de Kakariko" + Text{"Hatched Cucco", "Cocotte éclose", "Geschlüpftes Küken" }, // "Pollo" }; trickNameTable[GI_MASK_KEATON] = { - Text{"Kee... Something Mask", "Masque de Quiche", "Máscara Kealgo"}, - Text{"Kitsune Mask", "Masque de Kitsune", "Máscara Kitsune"}, - Text{"Kafei's Mask", "Masque de Kafei", "Máscara de Kafei"} + Text{"Kee... Something Mask", "Masque de Quiche", "Keaton-Maske" }, // "Máscara Kealgo" + Text{"Kitsune Mask", "Masque de Kitsune", "Kitsune-Maske" }, // "Máscara Kitsune" + Text{"Kafei's Mask", "Masque de Kafei", "Kafeis Maske" }, // "Máscara de Kafei" }; trickNameTable[GI_MASK_SKULL] = { - Text{"Skull Kid's Mask", "Masque de Skull Kid", "Máscara de Skull Kid"}, - Text{"Stalfos Mask", "Masque de squelette", "Máscara de Stalfos"}, - Text{"Captain's Hat", "Heaume du capitaine", "Casco del capitán"} + Text{"Skull Kid's Mask", "Masque de Skull Kid", "Horror-Kids-Maske" }, // "Máscara de Skull Kid" + Text{"Stalfos Mask", "Masque de squelette", "Stalfos-Maske" }, // "Máscara de Stalfos" + Text{"Captain's Hat", "Heaume du capitaine", "Helm des Hauptmanns" }, // "Casco del capitán" }; trickNameTable[GI_MASK_SPOOKY] = { - Text{"Skrik Mask", "Masque Skrik", "Máscara Escalofriante"}, - Text{"ReDead Mask", "Masque de Remort", "Máscara de ReDead"}, - Text{"Gibdo Mask", "Masque de Gibdo", "Careta de Gibdo"} + Text{"Skrik Mask", "Masque Skrik", "Grusel-Maske" }, // "Máscara Escalofriante" + Text{"ReDead Mask", "Masque de Remort", "Remort-Maske" }, // "Máscara de ReDead" + Text{"Gibdo Mask", "Masque de Gibdo", "Gibdo-Maske" }, // "Careta de Gibdo" }; trickNameTable[GI_MASK_BUNNY] = { - Text{"Peppy Mask", "Masque de Peppy", "Capucha de Pascua"}, - Text{"Bunny Ears", "Oreilles de lapin", "Orejas de conejo"}, - Text{"Postman's Hat", "Casquette du facteur", "Gorra de cartero"} + Text{"Peppy Mask", "Masque de Peppy", "Peppy-Maske" }, // "Capucha de Pascua" + Text{"Bunny Ears", "Oreilles de lapin", "Ohrlöffel" }, // "Orejas de conejo" + Text{"Postman's Hat", "Casquette du facteur", "Mütze des Postboten" }, // "Gorra de cartero" }; trickNameTable[GI_MASK_GORON] = { - Text{"Goro Mask", "Masque Goro", "Máscara Goro"}, - Text{"Mask of Goron", "Masque des Gorons", "Máscara de los Goron"}, - Text{"Darunia Mask", "Masque de Darunia", "Máscara de Darmani"} + Text{"Goro Mask", "Masque Goro", "Garos Maske" }, // "Máscara Goro" + Text{"Mask of Goron", "Masque des Gorons", "Goronen-Haut" }, // "Máscara de los Goron" + Text{"Darunia Mask", "Masque de Darunia", }, "Darunias Maske" // "Máscara de Darmani" }; trickNameTable[GI_MASK_ZORA] = { - Text{"Zola Mask", "Masque Zola", "Máscara Zola"}, - Text{"Mask of Zora", "Masque des Zoras", "Máscara de los Zora"}, - Text{"Ruto Mask", "Masque de Ruto", "Máscara de Mikau"} + Text{"Zola Mask", "Masque Zola", "Zola-Maske" }, // "Máscara Zola" + Text{"Mask of Zora", "Masque des Zoras", "Zora-Schuppen€" }, // "Máscara de los Zora" + Text{"Ruto Mask", "Masque de Ruto", "Rutos Maske" }, // "Máscara de Mikau" }; trickNameTable[GI_MASK_GERUDO] = { - Text{"Ganguro Mask", "Masque de Ganguro", "Máscara Canguro"}, - Text{"Mask of Gerudo", "Masque des Gerudos", "Máscara de las Gerudo"}, - Text{"Nabooru Mask", "Masque de Nabooru", "Máscara de Nabooru"} + Text{"Ganguro Mask", "Masque de Ganguro", "Ganguro-Maske" }, // "Máscara Canguro" + Text{"Mask of Gerudo", "Masque des Gerudos", "Gerudo-Perücke" }, // "Máscara de las Gerudo" + Text{"Nabooru Mask", "Masque de Nabooru", "Naborus Maske" }, // "Máscara de Nabooru" }; trickNameTable[GI_MASK_TRUTH] = { - Text{"Sheikah Mask", "Masque Sheikah", "Máscara Sheikah"}, - Text{"Mask of Gossip", "Masque de potins", "Máscara chismosa"}, - Text{"Eye of Truth", "oeil de vérité", "Ojo de la Verdad"} + Text{"Sheikah Mask", "Masque Sheikah", "Shiekah-Maske" }, // "Máscara Sheikah" + Text{"Mask of Gossip", "Masque de potins", "Maske der Mythen" }, // "Máscara chismosa" + Text{"Eye of Truth", "oeil de vérité", "Auge der Wahrheit" }, // "Ojo de la Verdad" }; */ } -//Generate a fake name for the ice trap based on the item it's displayed as +// Generate a fake name for the ice trap based on the item it's displayed as Text GetIceTrapName(uint8_t id) { - //If the trick names table has not been initialized, do so + // If the trick names table has not been initialized, do so if (!initTrickNames) { InitTrickNames(); initTrickNames = true; } - //Randomly get the easy, medium, or hard name for the given item id + // Randomly get the easy, medium, or hard name for the given item id return RandomElement(trickNameTable[id]); } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.hpp b/soh/soh/Enhancements/randomizer/3drando/shops.hpp index b1f09a9a73..81c4a43582 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.hpp @@ -16,16 +16,10 @@ struct PriceSettingsStruct { RandomizerSettingKey tycoonWallet; RandomizerSettingKey affordable; - PriceSettingsStruct(RandomizerSettingKey _main, - RandomizerSettingKey _fixedPrice, - RandomizerSettingKey _range1, - RandomizerSettingKey _range2, - RandomizerSettingKey _noWallet, - RandomizerSettingKey _childWallet, - RandomizerSettingKey _adultWallet, - RandomizerSettingKey _giantWallet, - RandomizerSettingKey _tycoonWallet, - RandomizerSettingKey _affordable); + PriceSettingsStruct(RandomizerSettingKey _main, RandomizerSettingKey _fixedPrice, RandomizerSettingKey _range1, + RandomizerSettingKey _range2, RandomizerSettingKey _noWallet, RandomizerSettingKey _childWallet, + RandomizerSettingKey _adultWallet, RandomizerSettingKey _giantWallet, + RandomizerSettingKey _tycoonWallet, RandomizerSettingKey _affordable); }; extern void PlaceVanillaShopItems(); @@ -34,5 +28,3 @@ extern uint16_t GetRandomPrice(Rando::Location* loc, PriceSettingsStruct priceSe extern uint16_t GetCheapBalancedPrice(); extern int GetShopsanityReplaceAmount(); extern Text GetIceTrapName(uint8_t id); - - diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index da4c3eb438..3c91a1f704 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -66,69 +66,72 @@ static auto GetSpoilerLogPath() { } static auto GetPlacementLogPath() { - return GetGeneralPath(); + return GetGeneralPath(); } // Writes the location to the specified node. -static void WriteLocation( - std::string sphere, const RandomizerCheck locationKey, const bool withPadding = false) { - Rando::Location* location = Rando::StaticData::GetLocation(locationKey); - Rando::ItemLocation* itemLocation = Rando::Context::GetInstance()->GetItemLocation(locationKey); +static void WriteLocation(std::string sphere, const RandomizerCheck locationKey, const bool withPadding = false) { + Rando::Location* location = Rando::StaticData::GetLocation(locationKey); + Rando::ItemLocation* itemLocation = Rando::Context::GetInstance()->GetItemLocation(locationKey); - switch (gSaveContext.language) { + switch (gSaveContext.language) { case LANGUAGE_ENG: default: jsonData["playthrough"][sphere][location->GetName()] = itemLocation->GetPlacedItemName().GetEnglish(); break; + case LANGUAGE_GER: + jsonData["playthrough"][sphere][location->GetName()] = itemLocation->GetPlacedItemName().GetGerman(); + break; case LANGUAGE_FRA: jsonData["playthrough"][sphere][location->GetName()] = itemLocation->GetPlacedItemName().GetFrench(); break; } } -//Writes a shuffled entrance to the specified node +// Writes a shuffled entrance to the specified node static void WriteShuffledEntrance(std::string sphereString, Entrance* entrance) { - int16_t originalIndex = entrance->GetIndex(); - int16_t destinationIndex = -1; - int16_t replacementIndex = entrance->GetReplacement()->GetIndex(); - int16_t replacementDestinationIndex = -1; - std::string name = GetEntranceData(originalIndex)->source; - std::string text = GetEntranceData(replacementIndex)->destination; + int16_t originalIndex = entrance->GetIndex(); + int16_t destinationIndex = -1; + int16_t replacementIndex = entrance->GetReplacement()->GetIndex(); + int16_t replacementDestinationIndex = -1; + std::string name = GetEntranceData(originalIndex)->source; + std::string text = GetEntranceData(replacementIndex)->destination; - // Track the reverse destination, useful for savewarp handling - if (entrance->GetReverse() != nullptr) { - destinationIndex = entrance->GetReverse()->GetIndex(); - // When decouple is off we track the replacement's reverse destination, useful for recording visited entrances - if (!entrance->IsDecoupled()) { - replacementDestinationIndex = entrance->GetReplacement()->GetReverse()->GetIndex(); + // Track the reverse destination, useful for savewarp handling + if (entrance->GetReverse() != nullptr) { + destinationIndex = entrance->GetReverse()->GetIndex(); + // When decouple is off we track the replacement's reverse destination, useful for recording visited entrances + if (!entrance->IsDecoupled()) { + replacementDestinationIndex = entrance->GetReplacement()->GetReverse()->GetIndex(); + } } - } - json entranceJson = json::object({ - {"type", entrance->GetType()}, - {"index", originalIndex}, - {"destination", destinationIndex}, - {"override", replacementIndex}, - {"overrideDestination", replacementDestinationIndex}, - }); - - jsonData["entrances"].push_back(entranceJson); - - // When decoupled entrances is off, handle saving reverse entrances - if (entrance->GetReverse() != nullptr && !entrance->IsDecoupled()) { - json reverseEntranceJson = json::object({ - {"type", entrance->GetReverse()->GetType()}, - {"index", replacementDestinationIndex}, - {"destination", replacementIndex}, - {"override", destinationIndex}, - {"overrideDestination", originalIndex}, + json entranceJson = json::object({ + { "type", entrance->GetType() }, + { "index", originalIndex }, + { "destination", destinationIndex }, + { "override", replacementIndex }, + { "overrideDestination", replacementDestinationIndex }, }); - jsonData["entrances"].push_back(reverseEntranceJson); - } + jsonData["entrances"].push_back(entranceJson); - switch (gSaveContext.language) { + // When decoupled entrances is off, handle saving reverse entrances + if (entrance->GetReverse() != nullptr && !entrance->IsDecoupled()) { + json reverseEntranceJson = json::object({ + { "type", entrance->GetReverse()->GetType() }, + { "index", replacementDestinationIndex }, + { "destination", replacementIndex }, + { "override", destinationIndex }, + { "overrideDestination", originalIndex }, + }); + + jsonData["entrances"].push_back(reverseEntranceJson); + } + + switch (gSaveContext.language) { case LANGUAGE_ENG: + case LANGUAGE_GER: case LANGUAGE_FRA: default: jsonData["entrancesMap"][sphereString][name] = text; @@ -141,32 +144,31 @@ static void WriteSettings() { auto ctx = Rando::Context::GetInstance(); std::array options = Rando::Settings::GetInstance()->GetAllOptions(); for (const Rando::Option& option : options) { - if (option.GetName() != ""){ - jsonData["settings"][option.GetName()] = option.GetOptionText(ctx->GetOption(option.GetKey()).Get()); - } + if (option.GetName() != "") { + jsonData["settings"][option.GetName()] = option.GetOptionText(ctx->GetOption(option.GetKey()).Get()); + } } } // Removes any line breaks from s. std::string RemoveLineBreaks(std::string s) { - s.erase(std::remove(s.begin(), s.end(), '\n'), s.end()); - return s; + s.erase(std::remove(s.begin(), s.end(), '\n'), s.end()); + return s; } // Writes the excluded locations to the spoiler log, if there are any. static void WriteExcludedLocations() { - auto ctx = Rando::Context::GetInstance(); + auto ctx = Rando::Context::GetInstance(); - for (size_t i = 1; i < Rando::Settings::GetInstance()->GetExcludeLocationsOptions().size(); i++) { - for (const auto& location : Rando::Settings::GetInstance()->GetExcludeLocationsOptions()[i]) { - if (ctx->GetLocationOption(static_cast(location->GetKey())).Get() == RO_LOCATION_INCLUDE) { - continue; - } - - jsonData["excludedLocations"].push_back(RemoveLineBreaks(location->GetName())); + for (size_t i = 1; i < Rando::Settings::GetInstance()->GetExcludeLocationsOptions().size(); i++) { + for (const auto& location : Rando::Settings::GetInstance()->GetExcludeLocationsOptions()[i]) { + if (ctx->GetLocationOption(static_cast(location->GetKey())).Get() == RO_LOCATION_INCLUDE) { + continue; + } + jsonData["excludedLocations"].push_back(RemoveLineBreaks(location->GetName())); + } } - } } // Writes the starting inventory to the spoiler log, if there is any. @@ -182,16 +184,16 @@ static void WriteStartingInventory() { } } -//Writes the enabled tricks to the spoiler log, if there are any. +// Writes the enabled tricks to the spoiler log, if there are any. static void WriteEnabledTricks() { - auto ctx = Rando::Context::GetInstance(); + auto ctx = Rando::Context::GetInstance(); - for (const auto& setting : Rando::Settings::GetInstance()->GetOptionGroup(RSG_TRICKS).GetOptions()) { - if (ctx->GetTrickOption(static_cast(setting->GetKey())).IsNot(RO_GENERIC_ON)) { - continue; + for (const auto& setting : Rando::Settings::GetInstance()->GetOptionGroup(RSG_TRICKS).GetOptions()) { + if (ctx->GetTrickOption(static_cast(setting->GetKey())).IsNot(RO_GENERIC_ON)) { + continue; + } + jsonData["enabledTricks"].push_back(RemoveLineBreaks(setting->GetName()).c_str()); } - jsonData["enabledTricks"].push_back(RemoveLineBreaks(setting->GetName()).c_str()); - } } // Writes the Master Quest dungeons to the spoiler log, if there are any. @@ -208,47 +210,49 @@ static void WriteMasterQuestDungeons() { // Writes the required trials to the spoiler log, if there are any. static void WriteChosenOptions() { - auto ctx = Rando::Context::GetInstance(); - for (const auto& trial : ctx->GetTrials()->GetTrialList()) { - if (trial->IsRequired()) { - std::string trialName = trial->GetName().GetForCurrentLanguage(MF_CLEAN); - jsonData["requiredTrials"].push_back(RemoveLineBreaks(trialName)); + auto ctx = Rando::Context::GetInstance(); + for (const auto& trial : ctx->GetTrials()->GetTrialList()) { + if (trial->IsRequired()) { + std::string trialName = trial->GetName().GetForCurrentLanguage(MF_CLEAN); + jsonData["requiredTrials"].push_back(RemoveLineBreaks(trialName)); + } + } + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT)) { + jsonData["SelectedStartingAge"] = "Adult"; + } else { + jsonData["SelectedStartingAge"] = "Child"; } - } - if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT)){ - jsonData["SelectedStartingAge"] = "Adult"; - } else { - jsonData["SelectedStartingAge"] = "Child"; - } } // Writes the intended playthrough to the spoiler log, separated into spheres. static void WritePlaythrough() { - auto ctx = Rando::Context::GetInstance(); + auto ctx = Rando::Context::GetInstance(); - for (uint32_t i = 0; i < ctx->playthroughLocations.size(); ++i) { - auto sphereNum = std::to_string(i); - std::string sphereString = "sphere "; - if (i < 10) sphereString += "0"; - sphereString += sphereNum; - for (const RandomizerCheck key : ctx->playthroughLocations[i]) { - WriteLocation(sphereString, key, true); + for (uint32_t i = 0; i < ctx->playthroughLocations.size(); ++i) { + auto sphereNum = std::to_string(i); + std::string sphereString = "sphere "; + if (i < 10) + sphereString += "0"; + sphereString += sphereNum; + for (const RandomizerCheck key : ctx->playthroughLocations[i]) { + WriteLocation(sphereString, key, true); + } } - } } -//Write the randomized entrance playthrough to the spoiler log, if applicable +// Write the randomized entrance playthrough to the spoiler log, if applicable static void WriteShuffledEntrances() { - auto ctx = Rando::Context::GetInstance(); - for (uint32_t i = 0; i < ctx->GetEntranceShuffler()->playthroughEntrances.size(); ++i) { - auto sphereNum = std::to_string(i); - std::string sphereString = "sphere "; - if (i < 10) sphereString += "0"; - sphereString += sphereNum; - for (Entrance* entrance : ctx->GetEntranceShuffler()->playthroughEntrances[i]) { - WriteShuffledEntrance(sphereString, entrance); + auto ctx = Rando::Context::GetInstance(); + for (uint32_t i = 0; i < ctx->GetEntranceShuffler()->playthroughEntrances.size(); ++i) { + auto sphereNum = std::to_string(i); + std::string sphereString = "sphere "; + if (i < 10) + sphereString += "0"; + sphereString += sphereNum; + for (Entrance* entrance : ctx->GetEntranceShuffler()->playthroughEntrances[i]) { + WriteShuffledEntrance(sphereString, entrance); + } } - } } Rando::ItemLocation* GetItemLocation(RandomizerGet item) { @@ -265,52 +269,71 @@ static void WriteAllLocations() { std::string placedItemName; switch (gSaveContext.language) { - case 0: - default: - placedItemName = location->GetPlacedItemName().english; - break; - case 2: - placedItemName = location->GetPlacedItemName().french; - break; + case 0: + default: + placedItemName = location->GetPlacedItemName().GetEnglish(); + break; + case 1: + placedItemName = location->GetPlacedItemName().GetGerman(); + break; + case 2: + placedItemName = location->GetPlacedItemName().GetFrench(); + break; } // If it's a simple item (not an ice trap, doesn't have a price) // just add the name of the item and move on - if (!location->HasCustomPrice() && - location->GetPlacedRandomizerGet() != RG_ICE_TRAP) { - - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] = placedItemName; + if (!location->HasCustomPrice() && location->GetPlacedRandomizerGet() != RG_ICE_TRAP) { + + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] = + placedItemName; continue; } // We're dealing with a complex item, build out the json object for it - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["item"] = placedItemName; + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["item"] = + placedItemName; if (location->HasCustomPrice()) { jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["price"] = location->GetPrice(); } if (location->IsAHintAccessible()) { - hintedLocations.emplace(Rando::StaticData::GetLocation(key)->GetHintKey(), location); + hintedLocations.emplace(Rando::StaticData::GetLocation(key)->GetHintKey(), location); } if (location->GetPlacedRandomizerGet() == RG_ICE_TRAP) { - switch (gSaveContext.language) { - case 0: - default: - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["model"] = - Rando::StaticData::RetrieveItem(ctx->overrides[location->GetRandomizerCheck()].LooksLike()).GetName().english; - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["trickName"] = - ctx->overrides[location->GetRandomizerCheck()].GetTrickName().english; - break; - case 2: - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["model"] = - Rando::StaticData::RetrieveItem(ctx->overrides[location->GetRandomizerCheck()].LooksLike()).GetName().french; - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["trickName"] = - ctx->overrides[location->GetRandomizerCheck()].GetTrickName().french; - break; - } - } + switch (gSaveContext.language) { + case 0: + default: + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["model"] = Rando::StaticData::RetrieveItem( + ctx->overrides[location->GetRandomizerCheck()].LooksLike()) + .GetName() + .GetEnglish(); + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["trickName"] = ctx->overrides[location->GetRandomizerCheck()].GetTrickName().GetEnglish(); + break; + case 1: + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["model"] = Rando::StaticData::RetrieveItem( + ctx->overrides[location->GetRandomizerCheck()].LooksLike()) + .GetName() + .GetGerman(); + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["trickName"] = ctx->overrides[location->GetRandomizerCheck()].GetTrickName().GetGerman(); + break; + case 2: + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["model"] = Rando::StaticData::RetrieveItem( + ctx->overrides[location->GetRandomizerCheck()].LooksLike()) + .GetName() + .GetFrench(); + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["trickName"] = ctx->overrides[location->GetRandomizerCheck()].GetTrickName().GetFrench(); + break; + } + } } } @@ -319,9 +342,9 @@ const char* SpoilerLog_Write() { jsonData.clear(); - jsonData["version"] = (char*) gBuildVersion; - jsonData["git_branch"] = (char*) gGitBranch; - jsonData["git_commit"] = (char*) gGitCommitHash; + jsonData["version"] = (char*)gBuildVersion; + jsonData["git_branch"] = (char*)gGitBranch; + jsonData["git_commit"] = (char*)gGitCommitHash; jsonData["seed"] = ctx->GetSeedString(); jsonData["finalSeed"] = ctx->GetSeed(); @@ -335,7 +358,7 @@ const char* SpoilerLog_Write() { WriteSettings(); WriteExcludedLocations(); WriteStartingInventory(); - WriteEnabledTricks(); + WriteEnabledTricks(); WriteMasterQuestDungeons(); WriteChosenOptions(); WritePlaythrough(); @@ -353,7 +376,7 @@ const char* SpoilerLog_Write() { std::string jsonString = jsonData.dump(4); std::ostringstream fileNameStream; - for (uint8_t i = 0; i < ctx->hashIconIndexes.size(); i ++) { + for (uint8_t i = 0; i < ctx->hashIconIndexes.size(); i++) { if (i) { fileNameStream << '-'; } @@ -384,4 +407,3 @@ void PlacementLog_Msg(std::string_view msg) { void PlacementLog_Clear() { placementtxt = ""; } - diff --git a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp index c72b5f285c..dda37b18a1 100644 --- a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp @@ -10,188 +10,188 @@ std::vector StartingInventory; uint8_t AdditionalHeartContainers; static void AddItemToInventory(RandomizerGet item, size_t count = 1) { - StartingInventory.insert(StartingInventory.end(), count, item); + StartingInventory.insert(StartingInventory.end(), count, item); } void GenerateStartingInventory() { - auto ctx = Rando::Context::GetInstance(); - StartingInventory.clear(); + auto ctx = Rando::Context::GetInstance(); + StartingInventory.clear(); - if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { - for (auto* dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (dungeon->GetMap() != RG_NONE) { - AddItemToInventory(dungeon->GetMap()); - } + if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { + for (auto* dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (dungeon->GetMap() != RG_NONE) { + AddItemToInventory(dungeon->GetMap()); + } - if (dungeon->GetCompass() != RG_NONE) { - AddItemToInventory(dungeon->GetCompass()); - } - } - } - - if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { - for (auto* dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (dungeon->GetSmallKeyCount() > 0) { - AddItemToInventory(dungeon->GetSmallKey(), dungeon->GetSmallKeyCount()); - } - } - } else if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { - // Logic cannot handle vanilla key layout in some dungeons - // this is because vanilla expects the dungeon major item to be - // locked behind the keys, which is not always true in rando. - // We can resolve this by starting with some extra keys - // - OoT Randomizer - if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsMQ()) { - AddItemToInventory(RG_SPIRIT_TEMPLE_SMALL_KEY, 3); - } - } - - if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { - AddItemToInventory(RG_FOREST_TEMPLE_BOSS_KEY); - AddItemToInventory(RG_FIRE_TEMPLE_BOSS_KEY); - AddItemToInventory(RG_WATER_TEMPLE_BOSS_KEY); - AddItemToInventory(RG_SPIRIT_TEMPLE_BOSS_KEY); - AddItemToInventory(RG_SHADOW_TEMPLE_BOSS_KEY); - } - - // Add Ganon's Boss key with Triforce Hunt so the game thinks it's obtainable from the start. - // During save init, the boss key isn't actually given and it's instead given when completing the triforce. - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH) || - ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_TRIFORCE_HUNT)) { - AddItemToInventory(RG_GANONS_CASTLE_BOSS_KEY); - } - - if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) && !ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { - AddItemToInventory(RG_GERUDO_MEMBERSHIP_CARD); - } - - //Starting Inventory Menu - //Values are associated so that the count of items matches the index of - //the option selected. If None is selected, the value will be zero and - //zero of the item will be added to the starting inventory. - // TODO: Uncomment when these options are implemented. - // AddItemToInventory(RG_PROGRESSIVE_STICK_UPGRADE, StartingStickCapacity.Value()); - // AddItemToInventory(RG_PROGRESSIVE_NUT_UPGRADE, StartingNutCapacity.Value()); - // AddItemToInventory(RG_PROGRESSIVE_BOMB_BAG, StartingBombBag.Value()); - // AddItemToInventory((BombchuBag ? RG_PROGRESSIVE_BOMBCHUS : RG_BOMBCHU_20), StartingBombchus.Value()); - // AddItemToInventory(RG_PROGRESSIVE_BOW, StartingBow.Value()); - // AddItemToInventory(RG_FIRE_ARROWS, StartingFireArrows.Value()); - // AddItemToInventory(RG_ICE_ARROWS, StartingIceArrows.Value()); - // AddItemToInventory(RG_LIGHT_ARROWS, StartingLightArrows.Value()); - // AddItemToInventory(RG_DINS_FIRE, StartingDinsFire.Value()); - // AddItemToInventory(RG_FARORES_WIND, StartingFaroresWind.Value()); - // AddItemToInventory(RG_NAYRUS_LOVE, StartingNayrusLove.Value()); - // AddItemToInventory(RG_PROGRESSIVE_SLINGSHOT, StartingSlingshot.Value()); - // AddItemToInventory(RG_BOOMERANG, StartingBoomerang.Value()); - // AddItemToInventory(RG_LENS_OF_TRUTH, StartingLensOfTruth.Value()); - // AddItemToInventory(RG_MAGIC_BEAN_PACK, StartingMagicBean.Value()); - // AddItemToInventory(RG_MEGATON_HAMMER, StartingMegatonHammer.Value()); - // AddItemToInventory(RG_PROGRESSIVE_HOOKSHOT, StartingHookshot.Value()); - // AddItemToInventory(RG_IRON_BOOTS, StartingIronBoots.Value()); - // AddItemToInventory(RG_HOVER_BOOTS, StartingHoverBoots.Value()); - //For starting bottles, we need to check if they are a big poe and add that if so - // since a big poe bottle is not logically equivalent to an empty bottle. - // if (StartingBottle1.Value() == STARTINGBOTTLE_BIG_POE) { - // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); - // } else if (StartingBottle1.Value()) { - // AddItemToInventory(RG_EMPTY_BOTTLE, 1); - // } - // if (StartingBottle2.Value() == STARTINGBOTTLE_BIG_POE) { - // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); - // } else if (StartingBottle2.Value()) { - // AddItemToInventory(RG_EMPTY_BOTTLE, 1); - // } - // if (StartingBottle3.Value() == STARTINGBOTTLE_BIG_POE) { - // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); - // } else if (StartingBottle3.Value()) { - // AddItemToInventory(RG_EMPTY_BOTTLE, 1); - // } - // if (StartingBottle4.Value() == STARTINGBOTTLE_BIG_POE) { - // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); - // } else if (StartingBottle4.Value()) { - // AddItemToInventory(RG_EMPTY_BOTTLE, 1); - // } - // AddItemToInventory(RG_RUTOS_LETTER, StartingRutoBottle.Value()); - AddItemToInventory(RG_PROGRESSIVE_OCARINA, ctx->GetOption(RSK_STARTING_OCARINA).Get()); - AddItemToInventory(RG_ZELDAS_LULLABY, ctx->GetOption(RSK_STARTING_ZELDAS_LULLABY) ? 1 : 0); - AddItemToInventory(RG_EPONAS_SONG, ctx->GetOption(RSK_STARTING_EPONAS_SONG) ? 1 : 0); - AddItemToInventory(RG_SARIAS_SONG, ctx->GetOption(RSK_STARTING_SARIAS_SONG) ? 1 : 0); - AddItemToInventory(RG_SUNS_SONG, ctx->GetOption(RSK_STARTING_SUNS_SONG) ? 1 : 0); - AddItemToInventory(RG_SONG_OF_TIME, ctx->GetOption(RSK_STARTING_SONG_OF_TIME) ? 1 : 0); - AddItemToInventory(RG_SONG_OF_STORMS, ctx->GetOption(RSK_STARTING_SONG_OF_STORMS) ? 1 : 0); - AddItemToInventory(RG_MINUET_OF_FOREST, ctx->GetOption(RSK_STARTING_MINUET_OF_FOREST) ? 1 : 0); - AddItemToInventory(RG_BOLERO_OF_FIRE, ctx->GetOption(RSK_STARTING_BOLERO_OF_FIRE) ? 1 : 0); - AddItemToInventory(RG_SERENADE_OF_WATER, ctx->GetOption(RSK_STARTING_SERENADE_OF_WATER) ? 1 : 0); - AddItemToInventory(RG_REQUIEM_OF_SPIRIT, ctx->GetOption(RSK_STARTING_REQUIEM_OF_SPIRIT) ? 1 : 0); - AddItemToInventory(RG_NOCTURNE_OF_SHADOW, ctx->GetOption(RSK_STARTING_NOCTURNE_OF_SHADOW) ? 1 : 0); - AddItemToInventory(RG_PRELUDE_OF_LIGHT, ctx->GetOption(RSK_STARTING_PRELUDE_OF_LIGHT) ? 1 : 0); - AddItemToInventory(RG_KOKIRI_SWORD, ctx->GetOption(RSK_STARTING_KOKIRI_SWORD) ? 1 : 0); - // if (ProgressiveGoronSword) { - // AddItemToInventory(RG_PROGRESSIVE_GORONSWORD, StartingBiggoronSword.Value()); - // } else { - // AddItemToInventory(RG_GIANTS_KNIFE, (StartingBiggoronSword.Is(STARTINGBGS_GIANTS_KNIFE)) ? 1 : 0); - // AddItemToInventory(RG_BIGGORON_SWORD, (StartingBiggoronSword.Is(STARTINGBGS_BIGGORON_SWORD)) ? 1 : 0); - // } - AddItemToInventory(RG_MASTER_SWORD, ctx->GetOption(RSK_STARTING_MASTER_SWORD) ? 1 : 0); - AddItemToInventory(RG_DEKU_SHIELD, ctx->GetOption(RSK_STARTING_DEKU_SHIELD) ? 1 : 0); - // AddItemToInventory(RG_HYLIAN_SHIELD, StartingHylianShield.Value()); - // AddItemToInventory(RG_MIRROR_SHIELD, StartingMirrorShield.Value()); - // AddItemToInventory(RG_GORON_TUNIC, StartingGoronTunic.Value()); - // AddItemToInventory(RG_ZORA_TUNIC, StartingZoraTunic.Value()); - // AddItemToInventory(RG_PROGRESSIVE_MAGIC_METER, StartingMagicMeter.Value()); - // AddItemToInventory(RG_PROGRESSIVE_STRENGTH, StartingStrength.Value()); - // AddItemToInventory(RG_PROGRESSIVE_SCALE, StartingScale.Value()); - // AddItemToInventory(RG_PROGRESSIVE_WALLET, StartingWallet.Value()); - // AddItemToInventory(RG_STONE_OF_AGONY, StartingShardOfAgony.Value()); - // AddItemToInventory(RG_DOUBLE_DEFENSE, StartingDoubleDefense.Value()); - // AddItemToInventory(RG_KOKIRI_EMERALD, StartingKokiriEmerald.Value()); - // AddItemToInventory(RG_GORON_RUBY, StartingGoronRuby.Value()); - // AddItemToInventory(RG_ZORA_SAPPHIRE, StartingZoraSapphire.Value()); - // AddItemToInventory(RG_FOREST_MEDALLION, StartingForestMedallion.Value()); - // AddItemToInventory(RG_FIRE_MEDALLION, StartingFireMedallion.Value()); - // AddItemToInventory(RG_WATER_MEDALLION, StartingWaterMedallion.Value()); - // AddItemToInventory(RG_SPIRIT_MEDALLION, StartingSpiritMedallion.Value()); - // AddItemToInventory(RG_SHADOW_MEDALLION, StartingShadowMedallion.Value()); - // AddItemToInventory(RG_LIGHT_MEDALLION, StartingLightMedallion.Value()); - AddItemToInventory(RG_GOLD_SKULLTULA_TOKEN, ctx->GetOption(RSK_STARTING_SKULLTULA_TOKEN).Get()); - - int8_t hearts = ctx->GetOption(RSK_STARTING_HEARTS).Get() - 2; - AdditionalHeartContainers = 0; - if (hearts < 0) { - AddItemToInventory(RG_PIECE_OF_HEART, 4); - // Plentiful and minimal have less than 4 standard pieces of heart so also replace the winner heart - if (ctx->GetOption(RSK_ITEM_POOL).Get() == 0 || ctx->GetOption(RSK_ITEM_POOL).Get() == 3) { - AddItemToInventory(RG_TREASURE_GAME_HEART); + if (dungeon->GetCompass() != RG_NONE) { + AddItemToInventory(dungeon->GetCompass()); + } + } } - AdditionalHeartContainers = 1 - hearts; - } else if (hearts > 0) { - // 16 containers in plentiful, 8 in balanced and 0 in the others - uint8_t maxContainers = 8 * std::max(0, 2 - ctx->GetOption(RSK_ITEM_POOL).Get()); - - if (hearts <= maxContainers) { - AddItemToInventory(RG_HEART_CONTAINER, hearts); - } else { - AddItemToInventory(RG_HEART_CONTAINER, maxContainers); - AddItemToInventory(RG_PIECE_OF_HEART, (hearts - maxContainers) * 4); + if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { + for (auto* dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (dungeon->GetSmallKeyCount() > 0) { + AddItemToInventory(dungeon->GetSmallKey(), dungeon->GetSmallKeyCount()); + } + } + } else if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { + // Logic cannot handle vanilla key layout in some dungeons + // this is because vanilla expects the dungeon major item to be + // locked behind the keys, which is not always true in rando. + // We can resolve this by starting with some extra keys + // - OoT Randomizer + if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsMQ()) { + AddItemToInventory(RG_SPIRIT_TEMPLE_SMALL_KEY, 3); + } } - if (hearts == 17) { - AddItemToInventory(RG_TREASURE_GAME_HEART); + if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { + AddItemToInventory(RG_FOREST_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_FIRE_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_WATER_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_SPIRIT_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_SHADOW_TEMPLE_BOSS_KEY); + } + + // Add Ganon's Boss key with Triforce Hunt so the game thinks it's obtainable from the start. + // During save init, the boss key isn't actually given and it's instead given when completing the triforce. + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH) || ctx->GetOption(RSK_TRIFORCE_HUNT)) { + AddItemToInventory(RG_GANONS_CASTLE_BOSS_KEY); + } + + if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) && + !ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { + AddItemToInventory(RG_GERUDO_MEMBERSHIP_CARD); + } + + // Starting Inventory Menu + // Values are associated so that the count of items matches the index of + // the option selected. If None is selected, the value will be zero and + // zero of the item will be added to the starting inventory. + // TODO: Uncomment when these options are implemented. + // AddItemToInventory(RG_PROGRESSIVE_STICK_UPGRADE, StartingStickCapacity.Value()); + // AddItemToInventory(RG_PROGRESSIVE_NUT_UPGRADE, StartingNutCapacity.Value()); + // AddItemToInventory(RG_PROGRESSIVE_BOMB_BAG, StartingBombBag.Value()); + // AddItemToInventory((BombchuBag ? RG_PROGRESSIVE_BOMBCHUS : RG_BOMBCHU_20), StartingBombchus.Value()); + // AddItemToInventory(RG_PROGRESSIVE_BOW, StartingBow.Value()); + // AddItemToInventory(RG_FIRE_ARROWS, StartingFireArrows.Value()); + // AddItemToInventory(RG_ICE_ARROWS, StartingIceArrows.Value()); + // AddItemToInventory(RG_LIGHT_ARROWS, StartingLightArrows.Value()); + // AddItemToInventory(RG_DINS_FIRE, StartingDinsFire.Value()); + // AddItemToInventory(RG_FARORES_WIND, StartingFaroresWind.Value()); + // AddItemToInventory(RG_NAYRUS_LOVE, StartingNayrusLove.Value()); + // AddItemToInventory(RG_PROGRESSIVE_SLINGSHOT, StartingSlingshot.Value()); + // AddItemToInventory(RG_BOOMERANG, StartingBoomerang.Value()); + // AddItemToInventory(RG_LENS_OF_TRUTH, StartingLensOfTruth.Value()); + // AddItemToInventory(RG_MAGIC_BEAN_PACK, StartingMagicBean.Value()); + // AddItemToInventory(RG_MEGATON_HAMMER, StartingMegatonHammer.Value()); + // AddItemToInventory(RG_PROGRESSIVE_HOOKSHOT, StartingHookshot.Value()); + // AddItemToInventory(RG_IRON_BOOTS, StartingIronBoots.Value()); + // AddItemToInventory(RG_HOVER_BOOTS, StartingHoverBoots.Value()); + // For starting bottles, we need to check if they are a big poe and add that if so + // since a big poe bottle is not logically equivalent to an empty bottle. + // if (StartingBottle1.Value() == STARTINGBOTTLE_BIG_POE) { + // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); + // } else if (StartingBottle1.Value()) { + // AddItemToInventory(RG_EMPTY_BOTTLE, 1); + // } + // if (StartingBottle2.Value() == STARTINGBOTTLE_BIG_POE) { + // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); + // } else if (StartingBottle2.Value()) { + // AddItemToInventory(RG_EMPTY_BOTTLE, 1); + // } + // if (StartingBottle3.Value() == STARTINGBOTTLE_BIG_POE) { + // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); + // } else if (StartingBottle3.Value()) { + // AddItemToInventory(RG_EMPTY_BOTTLE, 1); + // } + // if (StartingBottle4.Value() == STARTINGBOTTLE_BIG_POE) { + // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); + // } else if (StartingBottle4.Value()) { + // AddItemToInventory(RG_EMPTY_BOTTLE, 1); + // } + // AddItemToInventory(RG_RUTOS_LETTER, StartingRutoBottle.Value()); + AddItemToInventory(RG_PROGRESSIVE_OCARINA, ctx->GetOption(RSK_STARTING_OCARINA).Get()); + AddItemToInventory(RG_ZELDAS_LULLABY, ctx->GetOption(RSK_STARTING_ZELDAS_LULLABY) ? 1 : 0); + AddItemToInventory(RG_EPONAS_SONG, ctx->GetOption(RSK_STARTING_EPONAS_SONG) ? 1 : 0); + AddItemToInventory(RG_SARIAS_SONG, ctx->GetOption(RSK_STARTING_SARIAS_SONG) ? 1 : 0); + AddItemToInventory(RG_SUNS_SONG, ctx->GetOption(RSK_STARTING_SUNS_SONG) ? 1 : 0); + AddItemToInventory(RG_SONG_OF_TIME, ctx->GetOption(RSK_STARTING_SONG_OF_TIME) ? 1 : 0); + AddItemToInventory(RG_SONG_OF_STORMS, ctx->GetOption(RSK_STARTING_SONG_OF_STORMS) ? 1 : 0); + AddItemToInventory(RG_MINUET_OF_FOREST, ctx->GetOption(RSK_STARTING_MINUET_OF_FOREST) ? 1 : 0); + AddItemToInventory(RG_BOLERO_OF_FIRE, ctx->GetOption(RSK_STARTING_BOLERO_OF_FIRE) ? 1 : 0); + AddItemToInventory(RG_SERENADE_OF_WATER, ctx->GetOption(RSK_STARTING_SERENADE_OF_WATER) ? 1 : 0); + AddItemToInventory(RG_REQUIEM_OF_SPIRIT, ctx->GetOption(RSK_STARTING_REQUIEM_OF_SPIRIT) ? 1 : 0); + AddItemToInventory(RG_NOCTURNE_OF_SHADOW, ctx->GetOption(RSK_STARTING_NOCTURNE_OF_SHADOW) ? 1 : 0); + AddItemToInventory(RG_PRELUDE_OF_LIGHT, ctx->GetOption(RSK_STARTING_PRELUDE_OF_LIGHT) ? 1 : 0); + AddItemToInventory(RG_KOKIRI_SWORD, ctx->GetOption(RSK_STARTING_KOKIRI_SWORD) ? 1 : 0); + // if (ProgressiveGoronSword) { + // AddItemToInventory(RG_PROGRESSIVE_GORONSWORD, StartingBiggoronSword.Value()); + // } else { + // AddItemToInventory(RG_GIANTS_KNIFE, (StartingBiggoronSword.Is(STARTINGBGS_GIANTS_KNIFE)) ? 1 : 0); + // AddItemToInventory(RG_BIGGORON_SWORD, (StartingBiggoronSword.Is(STARTINGBGS_BIGGORON_SWORD)) ? 1 : 0); + // } + AddItemToInventory(RG_MASTER_SWORD, ctx->GetOption(RSK_STARTING_MASTER_SWORD) ? 1 : 0); + AddItemToInventory(RG_DEKU_SHIELD, ctx->GetOption(RSK_STARTING_DEKU_SHIELD) ? 1 : 0); + // AddItemToInventory(RG_HYLIAN_SHIELD, StartingHylianShield.Value()); + // AddItemToInventory(RG_MIRROR_SHIELD, StartingMirrorShield.Value()); + // AddItemToInventory(RG_GORON_TUNIC, StartingGoronTunic.Value()); + // AddItemToInventory(RG_ZORA_TUNIC, StartingZoraTunic.Value()); + // AddItemToInventory(RG_PROGRESSIVE_MAGIC_METER, StartingMagicMeter.Value()); + // AddItemToInventory(RG_PROGRESSIVE_STRENGTH, StartingStrength.Value()); + // AddItemToInventory(RG_PROGRESSIVE_SCALE, StartingScale.Value()); + // AddItemToInventory(RG_PROGRESSIVE_WALLET, StartingWallet.Value()); + // AddItemToInventory(RG_STONE_OF_AGONY, StartingShardOfAgony.Value()); + // AddItemToInventory(RG_DOUBLE_DEFENSE, StartingDoubleDefense.Value()); + // AddItemToInventory(RG_KOKIRI_EMERALD, StartingKokiriEmerald.Value()); + // AddItemToInventory(RG_GORON_RUBY, StartingGoronRuby.Value()); + // AddItemToInventory(RG_ZORA_SAPPHIRE, StartingZoraSapphire.Value()); + // AddItemToInventory(RG_FOREST_MEDALLION, StartingForestMedallion.Value()); + // AddItemToInventory(RG_FIRE_MEDALLION, StartingFireMedallion.Value()); + // AddItemToInventory(RG_WATER_MEDALLION, StartingWaterMedallion.Value()); + // AddItemToInventory(RG_SPIRIT_MEDALLION, StartingSpiritMedallion.Value()); + // AddItemToInventory(RG_SHADOW_MEDALLION, StartingShadowMedallion.Value()); + // AddItemToInventory(RG_LIGHT_MEDALLION, StartingLightMedallion.Value()); + AddItemToInventory(RG_GOLD_SKULLTULA_TOKEN, ctx->GetOption(RSK_STARTING_SKULLTULA_TOKEN).Get()); + + int8_t hearts = ctx->GetOption(RSK_STARTING_HEARTS).Get() - 2; + AdditionalHeartContainers = 0; + if (hearts < 0) { + AddItemToInventory(RG_PIECE_OF_HEART, 4); + // Plentiful and minimal have less than 4 standard pieces of heart so also replace the winner heart + if (ctx->GetOption(RSK_ITEM_POOL).Get() == 0 || ctx->GetOption(RSK_ITEM_POOL).Get() == 3) { + AddItemToInventory(RG_TREASURE_GAME_HEART); + } + + AdditionalHeartContainers = 1 - hearts; + } else if (hearts > 0) { + // 16 containers in plentiful, 8 in balanced and 0 in the others + uint8_t maxContainers = 8 * std::max(0, 2 - ctx->GetOption(RSK_ITEM_POOL).Get()); + + if (hearts <= maxContainers) { + AddItemToInventory(RG_HEART_CONTAINER, hearts); + } else { + AddItemToInventory(RG_HEART_CONTAINER, maxContainers); + AddItemToInventory(RG_PIECE_OF_HEART, (hearts - maxContainers) * 4); + } + + if (hearts == 17) { + AddItemToInventory(RG_TREASURE_GAME_HEART); + } } - } } bool StartingInventoryHasBottle() { - RandomizerGet bottle = RG_EMPTY_BOTTLE; - return ElementInContainer(bottle, StartingInventory); + RandomizerGet bottle = RG_EMPTY_BOTTLE; + return ElementInContainer(bottle, StartingInventory); } void ApplyStartingInventory() { for (RandomizerGet item : StartingInventory) { - if (item == RG_PIECE_OF_HEART || item == RG_HEART_CONTAINER || item == RG_TREASURE_GAME_HEART) - continue; + if (item == RG_PIECE_OF_HEART || item == RG_HEART_CONTAINER || item == RG_TREASURE_GAME_HEART) + continue; - Rando::StaticData::RetrieveItem(item).ApplyEffect(); - } + Rando::StaticData::RetrieveItem(item).ApplyEffect(); + } } diff --git a/soh/soh/Enhancements/randomizer/3drando/text.hpp b/soh/soh/Enhancements/randomizer/3drando/text.hpp index 46c0196bbb..6e53ac11b5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/text.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/text.hpp @@ -7,22 +7,18 @@ #define SINGULAR 1 class Text { -public: + public: Text() = default; - Text(std::string english_, std::string french_, std::string spanish_) - : english(std::move(english_)), - french(std::move(french_)), - spanish(std::move(spanish_)), - german(std::move("")) { - // german defaults to english text until a translation is provided. - german = english; - } - Text(std::string english_, std::string french_, std::string spanish_, std::string german_) - : english(std::move(english_)), - french(std::move(french_)), - spanish(std::move(spanish_)), - german(std::move(german_)) {} - Text(std::string english_) : english(std::move(english_)), french(std::move("")), spanish(std::move("")), german(std::move("")) { + Text(std::string english_, std::string french_, std::string german_) + : english(std::move(english_)), french(std::move(french_)), german(std::move(german_)), spanish(std::move("")) { + // spanish defaults to english text until a translation is provided. + spanish = english; + } + Text(std::string english_, std::string french_, std::string german_, std::string spanish_) + : english(std::move(english_)), french(std::move(french_)), german(std::move(german_)), spanish(std::move("")) { + } + Text(std::string english_) + : english(std::move(english_)), french(std::move("")), german(std::move("")), spanish(std::move("")) { // default unprovided languages to english text french = spanish = german = english; } @@ -38,6 +34,12 @@ public: return english; } + const std::string& GetGerman() const { + if (german.length() > 0) { + return german; + } + return english; + } const std::string& GetSpanish() const { if (spanish.length() > 0) { return spanish; @@ -45,33 +47,35 @@ public: return english; } - const std::string& GetGerman() const { - if (german.length() > 0) { - return german; - } - return english; - } - const std::string& GetForLanguage(uint8_t language) const { switch (language) { - case 0: //LANGUAGE_ENG: changed to resolve #include loops + case 0: // LANGUAGE_ENG: changed to resolve #include loops return GetEnglish(); - case 2: //LANGUAGE_FRA: + case 2: // LANGUAGE_FRA: return GetFrench(); - case 1: //LANGUAGE_GER: + case 1: // LANGUAGE_GER: return GetGerman(); default: return GetEnglish(); } } - Text operator+ (const Text& right) const { - return Text{english + right.GetEnglish(), french + right.GetFrench(), spanish + right.GetSpanish(), - german + right.GetGerman()}; + Text operator+(const Text& right) const { + return Text{ + english + right.GetEnglish(), + french + right.GetFrench(), + german + right.GetGerman(), + spanish + right.GetSpanish(), + }; } - Text operator+ (const std::string& right) const { - return Text{english + right, french + right, spanish + right, german + right}; + Text operator+(const std::string& right) const { + return Text{ + english + right, + french + right, + german + right, + spanish + right, + }; } bool operator==(const Text& right) const { @@ -79,7 +83,7 @@ public: } bool operator==(const std::string& right) const { - return english == right || french == right || spanish == right || german == right; + return english == right || french == right || german == right || spanish == right; } bool operator!=(const Text& right) const { @@ -88,11 +92,11 @@ public: void Replace(std::string oldStr, std::string newStr) { - for (std::string* str : {&english, &french, &spanish, &german}) { + for (std::string* str : { &english, &french, &german, &spanish }) { size_t position = str->find(oldStr); while (position != std::string::npos) { - str->replace(position, oldStr.length(), newStr); - position = str->find(oldStr); + str->replace(position, oldStr.length(), newStr); + position = str->find(oldStr); } } } @@ -108,30 +112,30 @@ public: french.replace(position, oldStr.length(), newText.GetFrench()); position = french.find(oldStr); } - position = spanish.find(oldStr); - while (position != std::string::npos) { - spanish.replace(position, oldStr.length(), newText.GetSpanish()); - position = spanish.find(oldStr); - } position = german.find(oldStr); while (position != std::string::npos) { german.replace(position, oldStr.length(), newText.GetGerman()); position = german.find(oldStr); } + position = spanish.find(oldStr); + while (position != std::string::npos) { + spanish.replace(position, oldStr.length(), newText.GetSpanish()); + position = spanish.find(oldStr); + } } // Convert first char to upper case Text Capitalize(void) const { Text cap = *this + ""; - for (std::string* str : {&cap.english, &cap.french, &cap.spanish, &cap.german}) { + for (std::string* str : { &cap.english, &cap.french, &cap.german, &cap.spanish }) { (*str)[0] = std::toupper((*str)[0]); } return cap; } - //find the appropriate bars that separate singular from plural + // find the appropriate bars that separate singular from plural void SetForm(int form) { - for (std::string* str : {&english, &french, &spanish, &german}) { + for (std::string* str : { &english, &french, &german, &spanish }) { size_t firstBar = str->find('|'); if (firstBar != std::string::npos) { @@ -151,12 +155,12 @@ public: } } } - //remove the remaining bar + // remove the remaining bar this->Replace("|", ""); } std::string english = ""; std::string french = ""; - std::string spanish = ""; std::string german = ""; + std::string spanish = ""; }; diff --git a/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp b/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp new file mode 100644 index 0000000000..6c1db52f7b --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp @@ -0,0 +1,45 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ResourceManagerHelpers.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" +#include "objects/object_gi_compass/object_gi_compass.h" +#include "objects/object_gi_map/object_gi_map.h" + +extern "C" { +extern SaveContext gSaveContext; +#include "variables.h" +#include "macros.h" +u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); +} + +#define CVAR_COLORED_MAPS_AND_COMPASSES_NAME CVAR_RANDOMIZER_ENHANCEMENT("ColoredMapsAndCompasses") +#define CVAR_COLORED_MAPS_AND_COMPASSES_DEFAULT 1 +#define CVAR_COLORED_MAPS_AND_COMPASSES_VALUE \ + CVarGetInteger(CVAR_COLORED_MAPS_AND_COMPASSES_NAME, CVAR_COLORED_MAPS_AND_COMPASSES_DEFAULT) + +void OnLoadFileColoredMapsAndCompasses(int32_t _) { + s8 mapsAndCompassesCanBeOutsideDungeon = + IS_RANDO && DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS); + s8 isColoredMapsAndCompassesEnabled = mapsAndCompassesCanBeOutsideDungeon && CVAR_COLORED_MAPS_AND_COMPASSES_VALUE; + if (isColoredMapsAndCompassesEnabled) { + ResourceMgr_PatchGfxByName(gGiDungeonMapDL, "Map_PrimColor", 5, gsDPNoOp()); + ResourceMgr_PatchGfxByName(gGiDungeonMapDL, "Map_EnvColor", 6, gsDPNoOp()); + ResourceMgr_PatchGfxByName(gGiCompassDL, "Compass_PrimColor", 5, gsDPNoOp()); + ResourceMgr_PatchGfxByName(gGiCompassDL, "Compass_EnvColor", 6, gsDPNoOp()); + } else { + ResourceMgr_UnpatchGfxByName(gGiDungeonMapDL, "Map_PrimColor"); + ResourceMgr_UnpatchGfxByName(gGiDungeonMapDL, "Map_EnvColor"); + ResourceMgr_UnpatchGfxByName(gGiCompassDL, "Compass_PrimColor"); + ResourceMgr_UnpatchGfxByName(gGiCompassDL, "Compass_EnvColor"); + } +} + +void RegisterColoredMapsAndCompasses() { + COND_HOOK(OnLoadFile, CVAR_COLORED_MAPS_AND_COMPASSES_VALUE, OnLoadFileColoredMapsAndCompasses) + + // Also need to call it directly to patch/unpatch on cvar change + OnLoadFileColoredMapsAndCompasses(0); +} + +static RegisterShipInitFunc initFunc(RegisterColoredMapsAndCompasses, { CVAR_COLORED_MAPS_AND_COMPASSES_NAME }); diff --git a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp index 33e264bd4c..04e0e4ea55 100644 --- a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp +++ b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp @@ -9,10 +9,9 @@ extern PlayState* gPlayState; #include "src/overlays/actors/ovl_En_Door/z_en_door.h" } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() - using SceneDoorParamsPair = std::pair; std::map lookupTable = { + // clang-format off {{ SCENE_MARKET_ENTRANCE_DAY, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED }, {{ SCENE_MARKET_ENTRANCE_NIGHT, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED }, {{ SCENE_MARKET_ENTRANCE_RUINS, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED }, @@ -61,13 +60,15 @@ std::map lookupTable = { {{ SCENE_LON_LON_RANCH, 447 }, RAND_INF_BACK_TOWER_UNLOCKED }, {{ SCENE_LAKE_HYLIA, 447 }, RAND_INF_HYLIA_LAB_UNLOCKED }, {{ SCENE_LAKE_HYLIA, 1471 }, RAND_INF_FISHING_HOLE_UNLOCKED }, + + // clang-format on }; static void OnDoorInit(void* actorRef) { EnDoor* enDoor = static_cast(actorRef); enDoor->randomizerInf = RAND_INF_MAX; - auto it = lookupTable.find({gPlayState->sceneNum, enDoor->actor.params}); + auto it = lookupTable.find({ gPlayState->sceneNum, enDoor->actor.params }); if (it != lookupTable.end()) { enDoor->randomizerInf = it->second; if (!Flags_GetRandomizerInf(enDoor->randomizerInf)) { @@ -90,7 +91,8 @@ void RegisterLockOverworldDoors() { COND_VB_SHOULD(VB_CONSUME_SMALL_KEY, shouldRegister, { EnDoor* enDoor = va_arg(args, EnDoor*); - if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { + if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && + enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { Flags_SetRandomizerInf(enDoor->randomizerInf); *should = false; } @@ -99,7 +101,8 @@ void RegisterLockOverworldDoors() { COND_VB_SHOULD(VB_NOT_HAVE_SMALL_KEY, shouldRegister, { EnDoor* enDoor = va_arg(args, EnDoor*); - if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { + if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && + enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { *should = !Flags_GetRandomizerInf((RandomizerInf)(enDoor->randomizerInf + 1)); } }); @@ -107,21 +110,20 @@ void RegisterLockOverworldDoors() { COND_VB_SHOULD(VB_DOOR_BE_LOCKED, shouldRegister, { EnDoor* enDoor = va_arg(args, EnDoor*); - if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { + if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && + enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { *should = !Flags_GetRandomizerInf(enDoor->randomizerInf); } }); - // The door actor uses the same param to indicate if a door should be locked or be a scene transition, so it cannot be both. Here we're - // overriding the check for scene transition to also check if the door is being unlocked and should be a scene transition. + // The door actor uses the same param to indicate if a door should be locked or be a scene transition, so it cannot + // be both. Here we're overriding the check for scene transition to also check if the door is being unlocked and + // should be a scene transition. COND_VB_SHOULD(VB_DOOR_PLAY_SCENE_TRANSITION, shouldRegister, { EnDoor* enDoor = va_arg(args, EnDoor*); - if (!*should && ( - enDoor->actor.id == ACTOR_EN_DOOR && - ((enDoor->actor.params >> 7) & 7) == 1 && - enDoor->randomizerInf != RAND_INF_MAX - )) { + if (!*should && (enDoor->actor.id == ACTOR_EN_DOOR && ((enDoor->actor.params >> 7) & 7) == 1 && + enDoor->randomizerInf != RAND_INF_MAX)) { *should = true; } }); diff --git a/soh/soh/Enhancements/randomizer/Plandomizer.cpp b/soh/soh/Enhancements/randomizer/Plandomizer.cpp index e6c9399b5e..4e03e8b8f2 100644 --- a/soh/soh/Enhancements/randomizer/Plandomizer.cpp +++ b/soh/soh/Enhancements/randomizer/Plandomizer.cpp @@ -1,4 +1,5 @@ #include "Plandomizer.h" +#include #include "soh/SohGui/UIWidgets.hpp" #include "soh/util.h" #include @@ -17,10 +18,10 @@ #include "soh/Enhancements/randomizer/3drando/shops.hpp" extern "C" { - #include "include/z64item.h" - #include "objects/gameplay_keep/gameplay_keep.h" - extern SaveContext gSaveContext; - extern PlayState* gPlayState; +#include "include/z64item.h" +#include "objects/gameplay_keep/gameplay_keep.h" +extern SaveContext gSaveContext; +extern PlayState* gPlayState; } const std::string randomizeButton = ICON_FA_RANDOM; @@ -33,14 +34,14 @@ std::string shortName = ""; std::string logTemp = ""; std::string lastLoadedSpoiler = ""; int32_t temporaryItemIndex = -1; -RandomizerCheckArea selectedArea = RCAREA_INVALID; +RandomizerCheckArea selectedArea = RCAREA_INVALID; -ImVec4 itemColor = ImVec4( 1.0f, 1.0f, 1.0f, 1.0f ); +ImVec4 itemColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); ImTextureID textureID; ImVec2 imageSize = ImVec2(32.0f, 32.0f); float imagePadding = 2.0f; -ImVec2 textureUV0 = ImVec2( 0, 0 ); -ImVec2 textureUV1 = ImVec2( 1, 1 ); +ImVec2 textureUV0 = ImVec2(0, 0); +ImVec2 textureUV1 = ImVec2(1, 1); bool shouldPopup = false; bool shouldTrapPopup = false; @@ -61,208 +62,196 @@ std::vector plandoHintData; extern std::map rcAreaNames; std::unordered_map bossKeyShortNames = { - { RG_FOREST_TEMPLE_BOSS_KEY, "Frst" }, - { RG_FIRE_TEMPLE_BOSS_KEY, "Fire" }, - { RG_WATER_TEMPLE_BOSS_KEY, "Watr" }, - { RG_SPIRIT_TEMPLE_BOSS_KEY, "Sprt" }, - { RG_SHADOW_TEMPLE_BOSS_KEY, "Shdw" }, - { RG_GANONS_CASTLE_BOSS_KEY, "Ganon" }, + { RG_FOREST_TEMPLE_BOSS_KEY, "Frst" }, { RG_FIRE_TEMPLE_BOSS_KEY, "Fire" }, + { RG_WATER_TEMPLE_BOSS_KEY, "Watr" }, { RG_SPIRIT_TEMPLE_BOSS_KEY, "Sprt" }, + { RG_SHADOW_TEMPLE_BOSS_KEY, "Shdw" }, { RG_GANONS_CASTLE_BOSS_KEY, "Ganon" }, }; std::unordered_map ocarinaButtonNames = { - { RG_OCARINA_A_BUTTON, "A" }, - { RG_OCARINA_C_UP_BUTTON, "C-UP" }, - { RG_OCARINA_C_DOWN_BUTTON, "C-DWN" }, - { RG_OCARINA_C_LEFT_BUTTON, "C-LFT" }, - { RG_OCARINA_C_RIGHT_BUTTON, "C-RHT" }, + { RG_OCARINA_A_BUTTON, "A" }, { RG_OCARINA_C_UP_BUTTON, "C-UP" }, + { RG_OCARINA_C_DOWN_BUTTON, "C-DWN" }, { RG_OCARINA_C_LEFT_BUTTON, "C-LFT" }, + { RG_OCARINA_C_RIGHT_BUTTON, "C-RHT" }, }; std::map bossSoulColorMapping = { - { RG_GOHMA_SOUL, { 0.00f, 1.00f, 0.00f, 1.0f } }, - { RG_KING_DODONGO_SOUL, { 1.00f, 0.00f, 0.39f, 1.0f } }, - { RG_BARINADE_SOUL, { 0.20f, 1.00f, 1.00f, 1.0f } }, - { RG_PHANTOM_GANON_SOUL, { 0.02f, 0.76f, 0.18f, 1.0f } }, - { RG_VOLVAGIA_SOUL, { 0.93f, 0.37f, 0.37f, 1.0f } }, - { RG_MORPHA_SOUL, { 0.33f, 0.71f, 0.87f, 1.0f } }, - { RG_BONGO_BONGO_SOUL, { 0.49f, 0.06f, 0.69f, 1.0f } }, - { RG_TWINROVA_SOUL, { 0.87f, 0.62f, 0.18f, 1.0f } }, - { RG_GANON_SOUL, { 0.31f, 0.31f, 0.31f, 1.0f } } + { RG_GOHMA_SOUL, { 0.00f, 1.00f, 0.00f, 1.0f } }, { RG_KING_DODONGO_SOUL, { 1.00f, 0.00f, 0.39f, 1.0f } }, + { RG_BARINADE_SOUL, { 0.20f, 1.00f, 1.00f, 1.0f } }, { RG_PHANTOM_GANON_SOUL, { 0.02f, 0.76f, 0.18f, 1.0f } }, + { RG_VOLVAGIA_SOUL, { 0.93f, 0.37f, 0.37f, 1.0f } }, { RG_MORPHA_SOUL, { 0.33f, 0.71f, 0.87f, 1.0f } }, + { RG_BONGO_BONGO_SOUL, { 0.49f, 0.06f, 0.69f, 1.0f } }, { RG_TWINROVA_SOUL, { 0.87f, 0.62f, 0.18f, 1.0f } }, + { RG_GANON_SOUL, { 0.31f, 0.31f, 0.31f, 1.0f } } }; - std::vector infiniteItemList = { - RG_GREEN_RUPEE, RG_BLUE_RUPEE, RG_RED_RUPEE, RG_PURPLE_RUPEE, RG_HUGE_RUPEE, - RG_ARROWS_5, RG_ARROWS_10, RG_ARROWS_30, - RG_DEKU_STICK_1, RG_DEKU_SEEDS_30, RG_DEKU_NUTS_5, RG_DEKU_NUTS_10, - RG_BOMBS_5, RG_BOMBS_10, RG_BOMBS_20, RG_BOMBCHU_5, RG_BOMBCHU_10, RG_BOMBCHU_20, - RG_RECOVERY_HEART, RG_ICE_TRAP, RG_SOLD_OUT + RG_GREEN_RUPEE, RG_BLUE_RUPEE, RG_RED_RUPEE, RG_PURPLE_RUPEE, RG_HUGE_RUPEE, RG_ARROWS_5, RG_ARROWS_10, + RG_ARROWS_30, RG_DEKU_STICK_1, RG_DEKU_SEEDS_30, RG_DEKU_NUTS_5, RG_DEKU_NUTS_10, RG_BOMBS_5, RG_BOMBS_10, + RG_BOMBS_20, RG_BOMBCHU_5, RG_BOMBCHU_10, RG_BOMBCHU_20, RG_RECOVERY_HEART, RG_ICE_TRAP, RG_SOLD_OUT }; std::unordered_map itemImageMap = { - { RG_NONE, "ITEM_SOLD_OUT" }, - { RG_KOKIRI_SWORD, "ITEM_SWORD_KOKIRI" }, - { RG_GIANTS_KNIFE, "ITEM_SWORD_KNIFE" }, - { RG_BIGGORON_SWORD, "ITEM_SWORD_BGS" }, - { RG_DEKU_SHIELD, "ITEM_SHIELD_DEKU" }, - { RG_HYLIAN_SHIELD, "ITEM_SHIELD_HYLIAN" }, - { RG_MIRROR_SHIELD, "ITEM_SHIELD_MIRROR" }, - { RG_GORON_TUNIC, "ITEM_TUNIC_GORON" }, - { RG_ZORA_TUNIC, "ITEM_TUNIC_ZORA" }, - { RG_IRON_BOOTS, "ITEM_BOOTS_IRON" }, - { RG_HOVER_BOOTS, "ITEM_BOOTS_HOVER" }, - { RG_BOOMERANG, "ITEM_BOOMERANG" }, - { RG_LENS_OF_TRUTH, "ITEM_LENS" }, - { RG_MEGATON_HAMMER, "ITEM_HAMMER" }, - { RG_STONE_OF_AGONY, "ITEM_STONE_OF_AGONY" }, - { RG_DINS_FIRE, "ITEM_DINS_FIRE" }, - { RG_FARORES_WIND, "ITEM_FARORES_WIND" }, - { RG_NAYRUS_LOVE, "ITEM_NAYRUS_LOVE" }, - { RG_FIRE_ARROWS, "ITEM_ARROW_FIRE" }, - { RG_ICE_ARROWS, "ITEM_ARROW_ICE" }, - { RG_LIGHT_ARROWS, "ITEM_ARROW_LIGHT" }, - { RG_GERUDO_MEMBERSHIP_CARD, "ITEM_GERUDO_CARD" }, - { RG_MAGIC_BEAN, "ITEM_BEAN" }, - { RG_MAGIC_BEAN_PACK, "ITEM_BEAN" }, - { RG_DOUBLE_DEFENSE, "ITEM_HEART_CONTAINER" }, - { RG_WEIRD_EGG, "ITEM_WEIRD_EGG" }, - { RG_ZELDAS_LETTER, "ITEM_LETTER_ZELDA" }, - { RG_POCKET_EGG, "ITEM_POCKET_EGG" }, - { RG_COJIRO, "ITEM_COJIRO" }, - { RG_ODD_MUSHROOM, "ITEM_ODD_MUSHROOM" }, - { RG_ODD_POTION, "ITEM_ODD_POTION" }, - { RG_POACHERS_SAW, "ITEM_SAW" }, - { RG_BROKEN_SWORD, "ITEM_SWORD_BROKEN" }, - { RG_PRESCRIPTION, "ITEM_PRESCRIPTION" }, - { RG_EYEBALL_FROG, "ITEM_FROG" }, - { RG_EYEDROPS, "ITEM_EYEDROPS" }, - { RG_CLAIM_CHECK, "ITEM_CLAIM_CHECK" }, - { RG_GOLD_SKULLTULA_TOKEN, "ITEM_SKULL_TOKEN" }, - { RG_PROGRESSIVE_HOOKSHOT, "ITEM_HOOKSHOT" }, - { RG_PROGRESSIVE_STRENGTH, "ITEM_BRACELET" }, - { RG_PROGRESSIVE_BOMB_BAG, "ITEM_BOMB_BAG_30" }, - { RG_PROGRESSIVE_BOW, "ITEM_QUIVER_30" }, - { RG_PROGRESSIVE_SLINGSHOT, "ITEM_SLINGSHOT" }, - { RG_PROGRESSIVE_WALLET, "ITEM_WALLET_ADULT" }, - { RG_PROGRESSIVE_SCALE, "ITEM_SCALE_SILVER" }, - { RG_PROGRESSIVE_NUT_UPGRADE, "ITEM_NUT" }, - { RG_PROGRESSIVE_STICK_UPGRADE, "ITEM_STICK" }, - { RG_PROGRESSIVE_BOMBCHUS, "ITEM_BOMBCHU" }, - { RG_PROGRESSIVE_MAGIC_METER, "ITEM_MAGIC_SMALL" }, - { RG_MAGIC_SINGLE, "ITEM_MAGIC_SMALL" }, - { RG_MAGIC_DOUBLE, "ITEM_MAGIC_LARGE" }, - { RG_PROGRESSIVE_OCARINA, "ITEM_OCARINA_FAIRY" }, - { RG_PROGRESSIVE_GORONSWORD, "ITEM_SWORD_BGS" }, - { RG_EMPTY_BOTTLE, "ITEM_BOTTLE" }, - { RG_BOTTLE_WITH_MILK, "ITEM_MILK_BOTTLE" }, - { RG_BOTTLE_WITH_RED_POTION, "ITEM_POTION_RED" }, - { RG_BOTTLE_WITH_GREEN_POTION, "ITEM_POTION_GREEN" }, - { RG_BOTTLE_WITH_BLUE_POTION, "ITEM_POTION_BLUE" }, - { RG_BOTTLE_WITH_FAIRY, "ITEM_FAIRY" }, - { RG_BOTTLE_WITH_FISH, "ITEM_FISH" }, - { RG_BOTTLE_WITH_BLUE_FIRE, "ITEM_BLUE_FIRE" }, - { RG_BOTTLE_WITH_BUGS, "ITEM_BUG" }, - { RG_BOTTLE_WITH_POE, "ITEM_POE" }, - { RG_RUTOS_LETTER, "ITEM_LETTER_RUTO" }, - { RG_BOTTLE_WITH_BIG_POE, "ITEM_BIG_POE" }, - { RG_ZELDAS_LULLABY, "ITEM_SONG_LULLABY" }, - { RG_EPONAS_SONG, "ITEM_SONG_EPONA" }, - { RG_SARIAS_SONG, "ITEM_SONG_SARIA" }, - { RG_SUNS_SONG, "ITEM_SONG_SUN" }, - { RG_SONG_OF_TIME, "ITEM_SONG_TIME" }, - { RG_SONG_OF_STORMS, "ITEM_SONG_STORMS" }, - { RG_MINUET_OF_FOREST, "ITEM_SONG_MINUET" }, - { RG_BOLERO_OF_FIRE, "ITEM_SONG_BOLERO" }, - { RG_SERENADE_OF_WATER, "ITEM_SONG_SERENADE" }, - { RG_REQUIEM_OF_SPIRIT, "ITEM_SONG_REQUIEM" }, - { RG_NOCTURNE_OF_SHADOW, "ITEM_SONG_NOCTURNE" }, - { RG_PRELUDE_OF_LIGHT, "ITEM_SONG_PRELUDE" }, - { RG_DEKU_TREE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_DODONGOS_CAVERN_MAP, "ITEM_DUNGEON_MAP" }, - { RG_JABU_JABUS_BELLY_MAP, "ITEM_DUNGEON_MAP" }, - { RG_FOREST_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_FIRE_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_WATER_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_SPIRIT_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_SHADOW_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_BOTTOM_OF_THE_WELL_MAP, "ITEM_DUNGEON_MAP" }, - { RG_ICE_CAVERN_MAP, "ITEM_DUNGEON_MAP" }, - { RG_DEKU_TREE_COMPASS, "ITEM_COMPASS" }, - { RG_DODONGOS_CAVERN_COMPASS, "ITEM_COMPASS" }, - { RG_JABU_JABUS_BELLY_COMPASS, "ITEM_COMPASS" }, - { RG_FOREST_TEMPLE_COMPASS, "ITEM_COMPASS" }, - { RG_FIRE_TEMPLE_COMPASS, "ITEM_COMPASS" }, - { RG_WATER_TEMPLE_COMPASS, "ITEM_COMPASS" }, - { RG_SPIRIT_TEMPLE_COMPASS, "ITEM_COMPASS" }, - { RG_SHADOW_TEMPLE_COMPASS, "ITEM_COMPASS" }, - { RG_BOTTOM_OF_THE_WELL_COMPASS, "ITEM_COMPASS" }, - { RG_ICE_CAVERN_COMPASS, "ITEM_COMPASS" }, - { RG_FOREST_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_FIRE_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_WATER_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_SPIRIT_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_SHADOW_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_GANONS_CASTLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_FOREST_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_FIRE_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_WATER_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_SPIRIT_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_SHADOW_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_BOTTOM_OF_THE_WELL_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_NONE, "ITEM_SOLD_OUT" }, + { RG_KOKIRI_SWORD, "ITEM_SWORD_KOKIRI" }, + { RG_GIANTS_KNIFE, "ITEM_SWORD_KNIFE" }, + { RG_BIGGORON_SWORD, "ITEM_SWORD_BGS" }, + { RG_DEKU_SHIELD, "ITEM_SHIELD_DEKU" }, + { RG_HYLIAN_SHIELD, "ITEM_SHIELD_HYLIAN" }, + { RG_MIRROR_SHIELD, "ITEM_SHIELD_MIRROR" }, + { RG_GORON_TUNIC, "ITEM_TUNIC_GORON" }, + { RG_ZORA_TUNIC, "ITEM_TUNIC_ZORA" }, + { RG_IRON_BOOTS, "ITEM_BOOTS_IRON" }, + { RG_HOVER_BOOTS, "ITEM_BOOTS_HOVER" }, + { RG_BOOMERANG, "ITEM_BOOMERANG" }, + { RG_LENS_OF_TRUTH, "ITEM_LENS" }, + { RG_MEGATON_HAMMER, "ITEM_HAMMER" }, + { RG_STONE_OF_AGONY, "ITEM_STONE_OF_AGONY" }, + { RG_DINS_FIRE, "ITEM_DINS_FIRE" }, + { RG_FARORES_WIND, "ITEM_FARORES_WIND" }, + { RG_NAYRUS_LOVE, "ITEM_NAYRUS_LOVE" }, + { RG_FIRE_ARROWS, "ITEM_ARROW_FIRE" }, + { RG_ICE_ARROWS, "ITEM_ARROW_ICE" }, + { RG_LIGHT_ARROWS, "ITEM_ARROW_LIGHT" }, + { RG_GERUDO_MEMBERSHIP_CARD, "ITEM_GERUDO_CARD" }, + { RG_MAGIC_BEAN, "ITEM_BEAN" }, + { RG_MAGIC_BEAN_PACK, "ITEM_BEAN" }, + { RG_DOUBLE_DEFENSE, "ITEM_HEART_CONTAINER" }, + { RG_WEIRD_EGG, "ITEM_WEIRD_EGG" }, + { RG_ZELDAS_LETTER, "ITEM_LETTER_ZELDA" }, + { RG_POCKET_EGG, "ITEM_POCKET_EGG" }, + { RG_COJIRO, "ITEM_COJIRO" }, + { RG_ODD_MUSHROOM, "ITEM_ODD_MUSHROOM" }, + { RG_ODD_POTION, "ITEM_ODD_POTION" }, + { RG_POACHERS_SAW, "ITEM_SAW" }, + { RG_BROKEN_SWORD, "ITEM_SWORD_BROKEN" }, + { RG_PRESCRIPTION, "ITEM_PRESCRIPTION" }, + { RG_EYEBALL_FROG, "ITEM_FROG" }, + { RG_EYEDROPS, "ITEM_EYEDROPS" }, + { RG_CLAIM_CHECK, "ITEM_CLAIM_CHECK" }, + { RG_GOLD_SKULLTULA_TOKEN, "ITEM_SKULL_TOKEN" }, + { RG_PROGRESSIVE_HOOKSHOT, "ITEM_HOOKSHOT" }, + { RG_PROGRESSIVE_STRENGTH, "ITEM_BRACELET" }, + { RG_PROGRESSIVE_BOMB_BAG, "ITEM_BOMB_BAG_30" }, + { RG_PROGRESSIVE_BOW, "ITEM_QUIVER_30" }, + { RG_PROGRESSIVE_SLINGSHOT, "ITEM_SLINGSHOT" }, + { RG_PROGRESSIVE_WALLET, "ITEM_WALLET_ADULT" }, + { RG_PROGRESSIVE_SCALE, "ITEM_SCALE_SILVER" }, + { RG_PROGRESSIVE_NUT_UPGRADE, "ITEM_NUT" }, + { RG_PROGRESSIVE_STICK_UPGRADE, "ITEM_STICK" }, + { RG_PROGRESSIVE_BOMBCHUS, "ITEM_BOMBCHU" }, + { RG_PROGRESSIVE_MAGIC_METER, "ITEM_MAGIC_SMALL" }, + { RG_MAGIC_SINGLE, "ITEM_MAGIC_SMALL" }, + { RG_MAGIC_DOUBLE, "ITEM_MAGIC_LARGE" }, + { RG_PROGRESSIVE_OCARINA, "ITEM_OCARINA_FAIRY" }, + { RG_PROGRESSIVE_GORONSWORD, "ITEM_SWORD_BGS" }, + { RG_EMPTY_BOTTLE, "ITEM_BOTTLE" }, + { RG_BOTTLE_WITH_MILK, "ITEM_MILK_BOTTLE" }, + { RG_BOTTLE_WITH_RED_POTION, "ITEM_POTION_RED" }, + { RG_BOTTLE_WITH_GREEN_POTION, "ITEM_POTION_GREEN" }, + { RG_BOTTLE_WITH_BLUE_POTION, "ITEM_POTION_BLUE" }, + { RG_BOTTLE_WITH_FAIRY, "ITEM_FAIRY" }, + { RG_BOTTLE_WITH_FISH, "ITEM_FISH" }, + { RG_BOTTLE_WITH_BLUE_FIRE, "ITEM_BLUE_FIRE" }, + { RG_BOTTLE_WITH_BUGS, "ITEM_BUG" }, + { RG_BOTTLE_WITH_POE, "ITEM_POE" }, + { RG_RUTOS_LETTER, "ITEM_LETTER_RUTO" }, + { RG_BOTTLE_WITH_BIG_POE, "ITEM_BIG_POE" }, + { RG_ZELDAS_LULLABY, "ITEM_SONG_LULLABY" }, + { RG_EPONAS_SONG, "ITEM_SONG_EPONA" }, + { RG_SARIAS_SONG, "ITEM_SONG_SARIA" }, + { RG_SUNS_SONG, "ITEM_SONG_SUN" }, + { RG_SONG_OF_TIME, "ITEM_SONG_TIME" }, + { RG_SONG_OF_STORMS, "ITEM_SONG_STORMS" }, + { RG_MINUET_OF_FOREST, "ITEM_SONG_MINUET" }, + { RG_BOLERO_OF_FIRE, "ITEM_SONG_BOLERO" }, + { RG_SERENADE_OF_WATER, "ITEM_SONG_SERENADE" }, + { RG_REQUIEM_OF_SPIRIT, "ITEM_SONG_REQUIEM" }, + { RG_NOCTURNE_OF_SHADOW, "ITEM_SONG_NOCTURNE" }, + { RG_PRELUDE_OF_LIGHT, "ITEM_SONG_PRELUDE" }, + { RG_DEKU_TREE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_DODONGOS_CAVERN_MAP, "ITEM_DUNGEON_MAP" }, + { RG_JABU_JABUS_BELLY_MAP, "ITEM_DUNGEON_MAP" }, + { RG_FOREST_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_FIRE_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_WATER_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_SPIRIT_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_SHADOW_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_BOTTOM_OF_THE_WELL_MAP, "ITEM_DUNGEON_MAP" }, + { RG_ICE_CAVERN_MAP, "ITEM_DUNGEON_MAP" }, + { RG_DEKU_TREE_COMPASS, "ITEM_COMPASS" }, + { RG_DODONGOS_CAVERN_COMPASS, "ITEM_COMPASS" }, + { RG_JABU_JABUS_BELLY_COMPASS, "ITEM_COMPASS" }, + { RG_FOREST_TEMPLE_COMPASS, "ITEM_COMPASS" }, + { RG_FIRE_TEMPLE_COMPASS, "ITEM_COMPASS" }, + { RG_WATER_TEMPLE_COMPASS, "ITEM_COMPASS" }, + { RG_SPIRIT_TEMPLE_COMPASS, "ITEM_COMPASS" }, + { RG_SHADOW_TEMPLE_COMPASS, "ITEM_COMPASS" }, + { RG_BOTTOM_OF_THE_WELL_COMPASS, "ITEM_COMPASS" }, + { RG_ICE_CAVERN_COMPASS, "ITEM_COMPASS" }, + { RG_FOREST_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_FIRE_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_WATER_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_SPIRIT_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_SHADOW_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_GANONS_CASTLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_FOREST_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_FIRE_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_WATER_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_SPIRIT_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_SHADOW_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_BOTTOM_OF_THE_WELL_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_GERUDO_TRAINING_GROUND_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_GERUDO_FORTRESS_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_GANONS_CASTLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_TREASURE_GAME_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_KOKIRI_EMERALD, "ITEM_KOKIRI_EMERALD" }, - { RG_GORON_RUBY, "ITEM_GORON_RUBY" }, - { RG_ZORA_SAPPHIRE, "ITEM_ZORA_SAPPHIRE" }, - { RG_FOREST_MEDALLION, "ITEM_MEDALLION_FOREST" }, - { RG_FIRE_MEDALLION, "ITEM_MEDALLION_FIRE" }, - { RG_WATER_MEDALLION, "ITEM_MEDALLION_WATER" }, - { RG_SPIRIT_MEDALLION, "ITEM_MEDALLION_SPIRIT" }, - { RG_SHADOW_MEDALLION, "ITEM_MEDALLION_SHADOW" }, - { RG_LIGHT_MEDALLION, "ITEM_MEDALLION_LIGHT" }, - { RG_RECOVERY_HEART, "ITEM_HEART_GRAYSCALE" }, - { RG_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_GREG_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_BLUE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_RED_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_PURPLE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_HUGE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_TREASURE_GAME_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_PIECE_OF_HEART, "ITEM_HEART_PIECE" }, - { RG_HEART_CONTAINER, "ITEM_HEART_CONTAINER" }, - { RG_ICE_TRAP, "ITEM_ICE_TRAP" }, - { RG_MILK, "ITEM_MILK_BOTTLE"}, - { RG_BOMBS_5, "ITEM_BOMB" }, - { RG_BOMBS_10, "ITEM_BOMB" }, - { RG_BOMBS_20, "ITEM_BOMB" }, - { RG_BUY_BOMBS_525, "ITEM_BOMB" }, - { RG_BUY_BOMBS_535, "ITEM_BOMB" }, - { RG_BUY_BOMBS_10, "ITEM_BOMB" }, - { RG_BUY_BOMBS_20, "ITEM_BOMB" }, - { RG_BUY_BOMBS_30, "ITEM_BOMB" }, - { RG_DEKU_NUTS_5, "ITEM_NUT" }, - { RG_DEKU_NUTS_10, "ITEM_NUT" }, - { RG_BUY_DEKU_NUTS_5, "ITEM_NUT" }, - { RG_BUY_DEKU_NUTS_10, "ITEM_NUT" }, - { RG_BOMBCHU_5, "ITEM_BOMBCHU" }, - { RG_BOMBCHU_10, "ITEM_BOMBCHU" }, - { RG_BOMBCHU_20, "ITEM_BOMBCHU" }, - { RG_BUY_BOMBCHUS_20, "ITEM_BOMBCHU" }, - { RG_ARROWS_5, "ITEM_ARROWS_SMALL" }, - { RG_BUY_ARROWS_10, "ITEM_ARROWS_SMALL" }, - { RG_ARROWS_10, "ITEM_ARROWS_MEDIUM" }, - { RG_BUY_ARROWS_30, "ITEM_ARROWS_MEDIUM" }, - { RG_ARROWS_30, "ITEM_ARROWS_LARGE" }, - { RG_BUY_ARROWS_50, "ITEM_ARROWS_LARGE" }, - { RG_TREASURE_GAME_HEART, "ITEM_HEART_PIECE" }, - { RG_DEKU_SEEDS_30, "ITEM_SEEDS" }, - { RG_BUY_DEKU_SEEDS_30, "ITEM_SEEDS" }, - { RG_BUY_HEART, "ITEM_HEART_GRAYSCALE" }, - { RG_FISHING_POLE, "ITEM_FISHING_POLE" }, - { RG_SOLD_OUT, "ITEM_SOLD_OUT" }, - { RG_TRIFORCE_PIECE, "TRIFORCE_PIECE" }, - { RG_SKELETON_KEY, "ITEM_KEY_SMALL" } + { RG_GERUDO_FORTRESS_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_GANONS_CASTLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_TREASURE_GAME_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_KOKIRI_EMERALD, "ITEM_KOKIRI_EMERALD" }, + { RG_GORON_RUBY, "ITEM_GORON_RUBY" }, + { RG_ZORA_SAPPHIRE, "ITEM_ZORA_SAPPHIRE" }, + { RG_FOREST_MEDALLION, "ITEM_MEDALLION_FOREST" }, + { RG_FIRE_MEDALLION, "ITEM_MEDALLION_FIRE" }, + { RG_WATER_MEDALLION, "ITEM_MEDALLION_WATER" }, + { RG_SPIRIT_MEDALLION, "ITEM_MEDALLION_SPIRIT" }, + { RG_SHADOW_MEDALLION, "ITEM_MEDALLION_SHADOW" }, + { RG_LIGHT_MEDALLION, "ITEM_MEDALLION_LIGHT" }, + { RG_RECOVERY_HEART, "ITEM_HEART_GRAYSCALE" }, + { RG_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_GREG_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_BLUE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_RED_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_PURPLE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_HUGE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_TREASURE_GAME_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_PIECE_OF_HEART, "ITEM_HEART_PIECE" }, + { RG_HEART_CONTAINER, "ITEM_HEART_CONTAINER" }, + { RG_ICE_TRAP, "ITEM_ICE_TRAP" }, + { RG_MILK, "ITEM_MILK_BOTTLE" }, + { RG_BOMBS_5, "ITEM_BOMB" }, + { RG_BOMBS_10, "ITEM_BOMB" }, + { RG_BOMBS_20, "ITEM_BOMB" }, + { RG_BUY_BOMBS_525, "ITEM_BOMB" }, + { RG_BUY_BOMBS_535, "ITEM_BOMB" }, + { RG_BUY_BOMBS_10, "ITEM_BOMB" }, + { RG_BUY_BOMBS_20, "ITEM_BOMB" }, + { RG_BUY_BOMBS_30, "ITEM_BOMB" }, + { RG_DEKU_NUTS_5, "ITEM_NUT" }, + { RG_DEKU_NUTS_10, "ITEM_NUT" }, + { RG_BUY_DEKU_NUTS_5, "ITEM_NUT" }, + { RG_BUY_DEKU_NUTS_10, "ITEM_NUT" }, + { RG_BOMBCHU_5, "ITEM_BOMBCHU" }, + { RG_BOMBCHU_10, "ITEM_BOMBCHU" }, + { RG_BOMBCHU_20, "ITEM_BOMBCHU" }, + { RG_BUY_BOMBCHUS_20, "ITEM_BOMBCHU" }, + { RG_ARROWS_5, "ITEM_ARROWS_SMALL" }, + { RG_BUY_ARROWS_10, "ITEM_ARROWS_SMALL" }, + { RG_ARROWS_10, "ITEM_ARROWS_MEDIUM" }, + { RG_BUY_ARROWS_30, "ITEM_ARROWS_MEDIUM" }, + { RG_ARROWS_30, "ITEM_ARROWS_LARGE" }, + { RG_BUY_ARROWS_50, "ITEM_ARROWS_LARGE" }, + { RG_TREASURE_GAME_HEART, "ITEM_HEART_PIECE" }, + { RG_DEKU_SEEDS_30, "ITEM_SEEDS" }, + { RG_BUY_DEKU_SEEDS_30, "ITEM_SEEDS" }, + { RG_BUY_HEART, "ITEM_HEART_GRAYSCALE" }, + { RG_FISHING_POLE, "ITEM_FISHING_POLE" }, + { RG_SOLD_OUT, "ITEM_SOLD_OUT" }, + { RG_TRIFORCE_PIECE, "TRIFORCE_PIECE" }, + { RG_SKELETON_KEY, "ITEM_KEY_SMALL" } }; Rando::Item plandomizerRandoRetrieveItem(RandomizerGet randoGetItem) { @@ -270,70 +259,71 @@ Rando::Item plandomizerRandoRetrieveItem(RandomizerGet randoGetItem) { return randoGetItemEntry; } -void PlandoPushImageButtonStyle(){ +void PlandoPushImageButtonStyle() { ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(1.0f, 1.0f, 1.0f, 0.2f)); ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(1.0f, 1.0f, 1.0f, 0.1f)); } -void PlandoPopImageButtonStyle(){ +void PlandoPopImageButtonStyle() { ImGui::PopStyleColor(3); } ImVec4 plandomizerGetItemColor(Rando::Item randoItem) { - itemColor = ImVec4( 1.0f, 1.0f, 1.0f, 1.0f ); - if (randoItem.GetItemType() == ITEMTYPE_SMALLKEY || randoItem.GetItemType() == ITEMTYPE_FORTRESS_SMALLKEY - || randoItem.GetItemType() == ITEMTYPE_BOSSKEY) { - if (randoItem.GetRandomizerGet() == RG_FOREST_TEMPLE_SMALL_KEY || + itemColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + if (randoItem.GetItemType() == ITEMTYPE_SMALLKEY || randoItem.GetItemType() == ITEMTYPE_FORTRESS_SMALLKEY || + randoItem.GetItemType() == ITEMTYPE_BOSSKEY) { + if (randoItem.GetRandomizerGet() == RG_FOREST_TEMPLE_SMALL_KEY || randoItem.GetRandomizerGet() == RG_FOREST_TEMPLE_KEY_RING) { - itemColor = ImVec4( 0.02f, 0.76f, 0.18f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_FIRE_TEMPLE_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_FIRE_TEMPLE_KEY_RING) { - itemColor = ImVec4( 0.93f, 0.37f, 0.37f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_WATER_TEMPLE_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_WATER_TEMPLE_KEY_RING) { - itemColor = ImVec4( 0.33f, 0.71f, 0.87f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_SPIRIT_TEMPLE_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_SPIRIT_TEMPLE_KEY_RING) { - itemColor = ImVec4( 0.87f, 0.62f, 0.18f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_SHADOW_TEMPLE_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_SHADOW_TEMPLE_KEY_RING) { - itemColor = ImVec4( 0.49f, 0.06f, 0.69f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_BOTTOM_OF_THE_WELL_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_BOTTOM_OF_THE_WELL_KEY_RING) { - itemColor = ImVec4( 0.89f, 0.43f, 1.0f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_GERUDO_TRAINING_GROUND_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_GERUDO_TRAINING_GROUND_KEY_RING) { - itemColor = ImVec4( 1.0f, 1.0f, 0, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_GERUDO_FORTRESS_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_GERUDO_FORTRESS_KEY_RING) { - itemColor = ImVec4( 1.0f, 1.0f, 1.0f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_GANONS_CASTLE_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_GANONS_CASTLE_KEY_RING) { - itemColor = ImVec4( 0.5f, 0.5f, 0.5f, 1.0f ); + itemColor = ImVec4(0.02f, 0.76f, 0.18f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_FIRE_TEMPLE_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_FIRE_TEMPLE_KEY_RING) { + itemColor = ImVec4(0.93f, 0.37f, 0.37f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_WATER_TEMPLE_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_WATER_TEMPLE_KEY_RING) { + itemColor = ImVec4(0.33f, 0.71f, 0.87f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_SPIRIT_TEMPLE_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_SPIRIT_TEMPLE_KEY_RING) { + itemColor = ImVec4(0.87f, 0.62f, 0.18f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_SHADOW_TEMPLE_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_SHADOW_TEMPLE_KEY_RING) { + itemColor = ImVec4(0.49f, 0.06f, 0.69f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_BOTTOM_OF_THE_WELL_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_BOTTOM_OF_THE_WELL_KEY_RING) { + itemColor = ImVec4(0.89f, 0.43f, 1.0f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_GERUDO_TRAINING_GROUND_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_GERUDO_TRAINING_GROUND_KEY_RING) { + itemColor = ImVec4(1.0f, 1.0f, 0, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_GERUDO_FORTRESS_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_GERUDO_FORTRESS_KEY_RING) { + itemColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_GANONS_CASTLE_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_GANONS_CASTLE_KEY_RING) { + itemColor = ImVec4(0.5f, 0.5f, 0.5f, 1.0f); } return itemColor; } if (randoItem.GetItemType() == ITEMTYPE_SONG) { uint32_t questID = Rando::Logic::RandoGetToQuestItem[randoItem.GetRandomizerGet()]; - textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(songMapping.at((QuestItem)questID).name); + textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + songMapping.at((QuestItem)questID).name); itemColor = songMapping.at((QuestItem)questID).color; imageSize = ImVec2(24.0f, 32.0f); imagePadding = 6.0f; return itemColor; } if (randoItem.GetRandomizerGet() >= RG_GREEN_RUPEE && randoItem.GetRandomizerGet() <= RG_HUGE_RUPEE) { - if (randoItem.GetRandomizerGet() == RG_GREG_RUPEE || randoItem.GetRandomizerGet() == RG_GREEN_RUPEE - || randoItem.GetRandomizerGet() == RG_TREASURE_GAME_GREEN_RUPEE) { - itemColor = ImVec4( 0.02f, 0.76f, 0.18f, 1.0f ); + if (randoItem.GetRandomizerGet() == RG_GREG_RUPEE || randoItem.GetRandomizerGet() == RG_GREEN_RUPEE || + randoItem.GetRandomizerGet() == RG_TREASURE_GAME_GREEN_RUPEE) { + itemColor = ImVec4(0.02f, 0.76f, 0.18f, 1.0f); } else if (randoItem.GetRandomizerGet() == RG_BLUE_RUPEE) { - itemColor = ImVec4( 0.33f, 0.71f, 0.87f, 1.0f ); + itemColor = ImVec4(0.33f, 0.71f, 0.87f, 1.0f); } else if (randoItem.GetRandomizerGet() == RG_RED_RUPEE) { - itemColor = ImVec4( 0.93f, 0.37f, 0.37f, 1.0f ); + itemColor = ImVec4(0.93f, 0.37f, 0.37f, 1.0f); } else if (randoItem.GetRandomizerGet() == RG_PURPLE_RUPEE) { - itemColor = ImVec4( 0.89f, 0.43f, 1.0f, 1.0f ); + itemColor = ImVec4(0.89f, 0.43f, 1.0f, 1.0f); } else if (randoItem.GetRandomizerGet() == RG_HUGE_RUPEE) { - itemColor = ImVec4( 1.0f, 1.0f, 0, 1.0f ); + itemColor = ImVec4(1.0f, 1.0f, 0, 1.0f); } return itemColor; } @@ -341,18 +331,17 @@ ImVec4 plandomizerGetItemColor(Rando::Item randoItem) { if (randoItem.GetRandomizerGet() >= RG_GOHMA_SOUL && randoItem.GetRandomizerGet() <= RG_GANON_SOUL) { itemColor = bossSoulColorMapping.at(randoItem.GetRandomizerGet()); } - + return itemColor; } std::string plandomizerHintsTooltip() { std::string hintTootip; - hintTootip = - "The following options are available:\n" - "- Use \\n to create New Lines.\n" - "- Use %g to change the text color to Green,\n" - " - %r for Red, %y for Yellow, and %w for White\n" - " can also be used as color examples."; + hintTootip = "The following options are available:\n" + "- Use \\n to create New Lines.\n" + "- Use %g to change the text color to Green,\n" + " - %r for Red, %y for Yellow, and %w for White\n" + " can also be used as color examples."; return hintTootip; } @@ -382,11 +371,10 @@ void PlandomizerPopulateSeedList() { void PlandomizerItemImageCorrection(Rando::Item randoItem) { textureID = 0; - imageSize = ImVec2( 32.0f, 32.0f ); + imageSize = ImVec2(32.0f, 32.0f); imagePadding = 2.0f; - textureUV0 = ImVec2( 0, 0 ); - textureUV1 = ImVec2( 1, 1 ); - + textureUV0 = ImVec2(0, 0); + textureUV1 = ImVec2(1, 1); itemColor = plandomizerGetItemColor(randoItem); @@ -403,12 +391,12 @@ void PlandomizerItemImageCorrection(Rando::Item randoItem) { if (map.first == randoItem.GetRandomizerGet()) { textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(map.second.c_str()); if (map.second.find("ITEM_ARROWS") != std::string::npos) { - textureUV0 = ImVec2( 0, 1 ); - textureUV1 = ImVec2( 1, 0 ); + textureUV0 = ImVec2(0, 1); + textureUV1 = ImVec2(1, 0); } if (map.second == "ITEM_TRIFORCE" || map.first == RG_SKELETON_KEY) { - textureUV0 = ImVec2( 1, 1 ); - textureUV1 = ImVec2( 0, 0 ); + textureUV0 = ImVec2(1, 1); + textureUV1 = ImVec2(0, 0); } break; } @@ -418,21 +406,25 @@ void PlandomizerItemImageCorrection(Rando::Item randoItem) { textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("BOSS_SOUL"); } - if (randoItem.GetRandomizerGet() >= RG_OCARINA_A_BUTTON && randoItem.GetRandomizerGet() <= RG_OCARINA_C_RIGHT_BUTTON) { + if (randoItem.GetRandomizerGet() >= RG_OCARINA_A_BUTTON && + randoItem.GetRandomizerGet() <= RG_OCARINA_C_RIGHT_BUTTON) { textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("ITEM_OCARINA_TIME"); } if (textureID == 0) { - textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[randoItem.GetGIEntry()->itemId].name); + textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + itemMapping[randoItem.GetGIEntry()->itemId].name); } } void PlandomizerRandomizeHint(int32_t status, int32_t index) { if (status == HINT_SINGLE) { - plandoHintData[index].hintText = Rando::StaticData::hintTextTable[GetRandomJunkHint()].GetHintMessage().GetForCurrentLanguage(MF_ENCODE); + plandoHintData[index].hintText = + Rando::StaticData::hintTextTable[GetRandomJunkHint()].GetHintMessage().GetForCurrentLanguage(MF_ENCODE); } else { for (auto& hint : plandoHintData) { - hint.hintText = Rando::StaticData::hintTextTable[GetRandomJunkHint()].GetHintMessage().GetForCurrentLanguage(MF_ENCODE); + hint.hintText = + Rando::StaticData::hintTextTable[GetRandomJunkHint()].GetHintMessage().GetForCurrentLanguage(MF_ENCODE); } } } @@ -446,15 +438,14 @@ void PlandomizerRemoveAllHints() { } void PlandomizerSortDrawnItems() { - std::sort(drawnItemsList.begin(), drawnItemsList.end(), - [](const auto& a, const auto& b) { + std::sort(drawnItemsList.begin(), drawnItemsList.end(), [](const auto& a, const auto& b) { auto typeA = a.first.GetItemType(); auto typeB = b.first.GetItemType(); - if (typeA != typeB){ - return typeA < typeB; + if (typeA != typeB) { + return typeA < typeB; } return a.first.GetRandomizerGet() < b.first.GetRandomizerGet(); - }); + }); } void PlandomizerRemoveAllItems() { @@ -462,7 +453,8 @@ void PlandomizerRemoveAllItems() { drawnItemsList.clear(); } for (auto& remove : plandoLogData) { - if (std::find(infiniteItemList.begin(), infiniteItemList.end(), remove.checkRewardItem.GetRandomizerGet()) == infiniteItemList.end()) { + if (std::find(infiniteItemList.begin(), infiniteItemList.end(), remove.checkRewardItem.GetRandomizerGet()) == + infiniteItemList.end()) { bool itemExists = false; for (auto& itemToCheck : drawnItemsList) { if (itemToCheck.first.GetRandomizerGet() == remove.checkRewardItem.GetRandomizerGet()) { @@ -481,7 +473,8 @@ void PlandomizerRemoveAllItems() { } void PlandomizerRemoveFromItemList(Rando::Item randoItem) { - if (std::find(infiniteItemList.begin(), infiniteItemList.end(), randoItem.GetRandomizerGet()) == infiniteItemList.end()) { + if (std::find(infiniteItemList.begin(), infiniteItemList.end(), randoItem.GetRandomizerGet()) == + infiniteItemList.end()) { uint32_t index = 0; for (auto& itemToCheck : drawnItemsList) { if (itemToCheck.first.GetRandomizerGet() == randoItem.GetRandomizerGet()) { @@ -500,7 +493,8 @@ void PlandomizerRemoveFromItemList(Rando::Item randoItem) { } void PlandomizerAddToItemList(Rando::Item randoItem) { - if (std::find(infiniteItemList.begin(), infiniteItemList.end(), randoItem.GetRandomizerGet()) == infiniteItemList.end()) { + if (std::find(infiniteItemList.begin(), infiniteItemList.end(), randoItem.GetRandomizerGet()) == + infiniteItemList.end()) { bool itemExists = false; for (auto& itemToCheck : drawnItemsList) { if (itemToCheck.first.GetRandomizerGet() == randoItem.GetRandomizerGet()) { @@ -509,7 +503,7 @@ void PlandomizerAddToItemList(Rando::Item randoItem) { break; } } - + if (!itemExists) { drawnItemsList.push_back(std::make_pair(randoItem, 1)); } @@ -527,32 +521,24 @@ void PlandomizerSaveSpoilerLog() { inputFile.close(); } - spoilerSave["file_hash"] = { - plandoHash[0], plandoHash[1], plandoHash[2], plandoHash[3], plandoHash[4] - }; + spoilerSave["file_hash"] = { plandoHash[0], plandoHash[1], plandoHash[2], plandoHash[3], plandoHash[4] }; for (auto& import : plandoHintData) { - spoilerSave["Gossip Stone Hints"][import.hintName] = { - { "type", import.hintType.c_str() }, - { "message", import.hintText.c_str() } - }; + spoilerSave["Gossip Stone Hints"][import.hintName] = { { "type", import.hintType.c_str() }, + { "message", import.hintText.c_str() } }; } - + for (auto& import : plandoLogData) { if (import.checkRewardItem.GetRandomizerGet() == RG_ICE_TRAP) { - spoilerSave["locations"][import.checkName] = { - { "item", import.checkRewardItem.GetName().english }, - { "model", import.iceTrapModel.GetName().english }, - { "trickName", import.iceTrapName.c_str() } - }; + spoilerSave["locations"][import.checkName] = { { "item", import.checkRewardItem.GetName().english }, + { "model", import.iceTrapModel.GetName().english }, + { "trickName", import.iceTrapName.c_str() } }; if (import.shopPrice > -1) { spoilerSave["locations"][import.checkName]["price"] = import.shopPrice; } } else if (import.shopPrice > -1) { - spoilerSave["locations"][import.checkName] = { - { "item", import.checkRewardItem.GetName().english }, - { "price", import.shopPrice } - }; + spoilerSave["locations"][import.checkName] = { { "item", import.checkRewardItem.GetName().english }, + { "price", import.shopPrice } }; } else { spoilerSave["locations"][import.checkName] = import.checkRewardItem.GetName().english; } @@ -562,7 +548,7 @@ void PlandomizerSaveSpoilerLog() { if (outputFile.is_open()) { outputFile << spoilerSave.dump(4); outputFile.close(); - } + } } void PlandomizerLoadSpoilerLog(std::string logFile) { @@ -620,21 +606,24 @@ void PlandomizerLoadSpoilerLog(std::string logFile) { checkObject.checkName = key; auto type = value; if (value.is_object()) { - checkObject.checkRewardItem = plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value["item"]]); + checkObject.checkRewardItem = + plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value["item"]]); if (value["price"].is_number()) { checkObject.shopPrice = value["price"]; } else { checkObject.shopPrice = -1; } if (checkObject.checkRewardItem.GetRandomizerGet() == RG_ICE_TRAP) { - checkObject.iceTrapModel = plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value["model"]]); + checkObject.iceTrapModel = + plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value["model"]]); checkObject.iceTrapName = value["trickName"]; } } else { - checkObject.checkRewardItem = plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value.get()]); + checkObject.checkRewardItem = + plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value.get()]); checkObject.shopPrice = -1; - if (checkObject.shopPrice == -1 - && checkObject.checkRewardItem.GetName().english.find("Buy") != std::string::npos) { + if (checkObject.shopPrice == -1 && + checkObject.checkRewardItem.GetName().english.find("Buy") != std::string::npos) { checkObject.shopPrice = checkObject.checkRewardItem.GetPrice(); } } @@ -643,14 +632,14 @@ void PlandomizerLoadSpoilerLog(std::string logFile) { PlandomizerAddToItemList(plandomizerRandoRetrieveItem(RG_SOLD_OUT)); } } - } catch (nlohmann::json::parse_error& e) { + } catch (nlohmann::json::parse_error&) { Notification::Emit({ .message = "Invalid Spoiler Log Format", .remainingTime = 10.0f }); } } lastLoadedSpoiler = spoilerStr; } -void PlandomizerOverlayText(std::pair drawObject ) { +void PlandomizerOverlayText(std::pair drawObject) { // Overlay the item count text on the existing button ImVec2 imageMin = ImGui::GetItemRectMin(); ImVec2 imageMax = ImGui::GetItemRectMax(); @@ -661,15 +650,15 @@ void PlandomizerOverlayText(std::pair drawObject ) { ImGui::Text(std::to_string(drawObject.second).c_str()); // Overlay item info - if (drawObject.first.GetRandomizerGet() >= RG_PROGRESSIVE_HOOKSHOT && + if (drawObject.first.GetRandomizerGet() >= RG_PROGRESSIVE_HOOKSHOT && drawObject.first.GetRandomizerGet() <= RG_PROGRESSIVE_GORONSWORD) { textPos = ImVec2(imageMin.x + 2, imageMin.y + 2); ImGui::SetCursorScreenPos(textPos); ImGui::Text("+"); } - if (extractNumberInParentheses(drawObject.first.GetName().english.c_str()) != "" && - extractNumberInParentheses(drawObject.first.GetName().english.c_str()) != "WINNER" && + if (extractNumberInParentheses(drawObject.first.GetName().english.c_str()) != "" && + extractNumberInParentheses(drawObject.first.GetName().english.c_str()) != "WINNER" && extractNumberInParentheses(drawObject.first.GetName().english.c_str()) != "LOSER") { textPos = ImVec2(imageMin.x + 2, imageMin.y + 2); @@ -678,7 +667,7 @@ void PlandomizerOverlayText(std::pair drawObject ) { overlayText += extractNumberInParentheses(drawObject.first.GetName().english.c_str()); ImGui::Text(overlayText.c_str()); } - if (drawObject.first.GetRandomizerGet() >= RG_FOREST_TEMPLE_BOSS_KEY && + if (drawObject.first.GetRandomizerGet() >= RG_FOREST_TEMPLE_BOSS_KEY && drawObject.first.GetRandomizerGet() <= RG_GANONS_CASTLE_BOSS_KEY) { textPos = ImVec2(imageMin.x + 1, imageMin.y + 1); ImGui::SetCursorScreenPos(textPos); @@ -717,10 +706,12 @@ void PlandomizerDrawItemPopup(uint32_t index) { PlandomizerItemImageCorrection(plandomizerRandoRetrieveItem(item)); auto name = plandomizerRandoRetrieveItem(item).GetName().english; ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); + auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, + ImVec4(0, 0, 0, 0), itemColor); ImGui::PopStyleVar(); if (ret) { - if (std::find(infiniteItemList.begin(), infiniteItemList.end(), plandoLogData[index].checkRewardItem.GetRandomizerGet()) == infiniteItemList.end()) { + if (std::find(infiniteItemList.begin(), infiniteItemList.end(), + plandoLogData[index].checkRewardItem.GetRandomizerGet()) == infiniteItemList.end()) { PlandomizerAddToItemList(plandoLogData[index].checkRewardItem); } plandoLogData[index].checkRewardItem = plandomizerRandoRetrieveItem(item); @@ -730,8 +721,7 @@ void PlandomizerDrawItemPopup(uint32_t index) { PlandomizerOverlayText(std::make_pair(plandomizerRandoRetrieveItem(item), 1)); ImGui::PopID(); } - - + ImGui::EndTable(); ImGui::SeparatorText("Spoiler Log Rewards"); ImGui::BeginTable("Item Button Table", 8); @@ -746,10 +736,11 @@ void PlandomizerDrawItemPopup(uint32_t index) { PlandomizerItemImageCorrection(drawSlots.first); auto name = drawSlots.first.GetName().english; ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); + auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, + ImVec4(0, 0, 0, 0), itemColor); ImGui::PopStyleVar(); if (ret) { - if (itemToDraw.GetRandomizerGet() >= RG_PROGRESSIVE_HOOKSHOT && + if (itemToDraw.GetRandomizerGet() >= RG_PROGRESSIVE_HOOKSHOT && itemToDraw.GetRandomizerGet() <= RG_PROGRESSIVE_GORONSWORD) { plandoLogData[index].checkRewardItem = drawSlots.first; } else { @@ -795,7 +786,8 @@ void PlandomizerDrawIceTrapPopUp(uint32_t index) { auto name = Rando::StaticData::RetrieveItem(items.first).GetName().english; PlandomizerItemImageCorrection(Rando::StaticData::RetrieveItem(items.first)); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); + auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, + ImVec4(0, 0, 0, 0), itemColor); ImGui::PopStyleVar(); if (ret) { plandoLogData[index].iceTrapModel = Rando::StaticData::RetrieveItem(items.first); @@ -820,7 +812,8 @@ void PlandomizerDrawItemSlots(uint32_t index) { PlandomizerItemImageCorrection(plandoLogData[index].checkRewardItem); auto name = plandoLogData[index].checkRewardItem.GetName().english; ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); + auto ret = + ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); ImGui::PopStyleVar(); if (ret) { shouldPopup = true; @@ -836,21 +829,15 @@ void PlandomizerDrawItemSlots(uint32_t index) { void PlandomizerDrawShopSlider(uint32_t index) { ImGui::PushID(index); - ImGui::Text("Price:"); - ImGui::SameLine(); - std::string MinusBTNName = " - ##Price"; - if (ImGui::Button(MinusBTNName.c_str()) && plandoLogData[index].shopPrice > 0) { - plandoLogData[index].shopPrice--; - } - ImGui::SameLine(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - 40.0f); - ImGui::SliderInt("", &plandoLogData[index].shopPrice, 0, 999, "%d Rupees"); - ImGui::PopItemWidth(); - ImGui::SameLine(); - std::string PlusBTNName = " + ##Price"; - if (ImGui::Button(PlusBTNName.c_str()) && plandoLogData[index].shopPrice < 999) { - plandoLogData[index].shopPrice++; - } + UIWidgets::SliderInt("Price:", &plandoLogData[index].shopPrice, + UIWidgets::IntSliderOptions() + .Color(THEME_COLOR) + .Format("%d Rupees") + .Min(0) + .Max(999) + .LabelPosition(UIWidgets::LabelPositions::Near) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right) + .Size(UIWidgets::Sizes::Inline)); ImGui::PopID(); } @@ -868,7 +855,8 @@ void PlandomizerDrawIceTrapSetup(uint32_t index) { PlandoPushImageButtonStyle(); auto name = plandoLogData[index].iceTrapModel.GetName().english; ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); + auto ret = + ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); ImGui::PopStyleVar(); if (ret) { shouldTrapPopup = true; @@ -881,58 +869,90 @@ void PlandomizerDrawIceTrapSetup(uint32_t index) { ImGui::TableNextColumn(); ImGui::Text("Name: "); ImGui::SameLine(); - if (plandoLogData[index].iceTrapModel.GetRandomizerGet() != RG_NONE && + if (plandoLogData[index].iceTrapModel.GetRandomizerGet() != RG_NONE && plandoLogData[index].iceTrapModel.GetRandomizerGet() != RG_SOLD_OUT) { - if (ImGui::Button(randomizeButton.c_str())) { - plandoLogData[index].iceTrapName = - GetIceTrapName(plandoLogData[index].iceTrapModel.GetRandomizerGet()).GetForLanguage(CVarGetInteger(CVAR_SETTING("Languages"), 0)).c_str(); + if (UIWidgets::Button(randomizeButton.c_str(), UIWidgets::ButtonOptions() + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.f, 6.f)))) { + plandoLogData[index].iceTrapName = GetIceTrapName(plandoLogData[index].iceTrapModel.GetRandomizerGet()) + .GetForLanguage(CVarGetInteger(CVAR_SETTING("Languages"), 0)) + .c_str(); } ImGui::SameLine(); } - if (UIWidgets::InputString("##TrapName", &trapTextInput)) { - plandoLogData[index].iceTrapName = trapTextInput.c_str(); - } - + if (UIWidgets::InputString( + "##TrapName", &trapTextInput, + UIWidgets::InputOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::None))) { + plandoLogData[index].iceTrapName = trapTextInput.c_str(); + } + if (plandoLogData[index].shopPrice >= 0) { PlandomizerDrawShopSlider(index); } ImGui::EndTable(); - + ImGui::PopID(); } - +static std::unordered_map rcAreaNameMap = { + { RCAREA_KOKIRI_FOREST, "Kokiri Forest" }, + { RCAREA_LOST_WOODS, "Lost Woods" }, + { RCAREA_SACRED_FOREST_MEADOW, "Sacred Forest Meadow" }, + { RCAREA_HYRULE_FIELD, "Hyrule Field" }, + { RCAREA_LAKE_HYLIA, "Lake Hylia" }, + { RCAREA_GERUDO_VALLEY, "Gerudo Valley" }, + { RCAREA_GERUDO_FORTRESS, "Gerudo Fortress" }, + { RCAREA_WASTELAND, "Haunted Wasteland" }, + { RCAREA_DESERT_COLOSSUS, "Desert Colossus" }, + { RCAREA_MARKET, "Hyrule Market" }, + { RCAREA_HYRULE_CASTLE, "Hyrule Castle" }, + { RCAREA_KAKARIKO_VILLAGE, "Kakariko Village" }, + { RCAREA_GRAVEYARD, "Graveyard" }, + { RCAREA_DEATH_MOUNTAIN_TRAIL, "Death Mountain Trail" }, + { RCAREA_GORON_CITY, "Goron City" }, + { RCAREA_DEATH_MOUNTAIN_CRATER, "Death Mountain Crater" }, + { RCAREA_ZORAS_RIVER, "Zora's River" }, + { RCAREA_ZORAS_DOMAIN, "Zora's Domain" }, + { RCAREA_ZORAS_FOUNTAIN, "Zora's Fountain" }, + { RCAREA_LON_LON_RANCH, "Lon Lon Ranch" }, + { RCAREA_DEKU_TREE, "Deku Tree" }, + { RCAREA_DODONGOS_CAVERN, "Dodongo's Cavern" }, + { RCAREA_JABU_JABUS_BELLY, "Jabu Jabu's Belly" }, + { RCAREA_FOREST_TEMPLE, "Forest Temple" }, + { RCAREA_FIRE_TEMPLE, "Fire Temple" }, + { RCAREA_WATER_TEMPLE, "Water Temple" }, + { RCAREA_SPIRIT_TEMPLE, "Spirit Temple" }, + { RCAREA_SHADOW_TEMPLE, "Shadow Temple" }, + { RCAREA_BOTTOM_OF_THE_WELL, "Bottom of the Well" }, + { RCAREA_ICE_CAVERN, "Ice Cavern" }, + { RCAREA_GERUDO_TRAINING_GROUND, "Gerudo Training Ground" }, + { RCAREA_GANONS_CASTLE, "Ganon's Castle" }, + { RCAREA_INVALID, "All" }, +}; void PlandomizerDrawOptions() { if (ImGui::BeginTable("LoadSpoiler", 2)) { + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); ImGui::TableNextColumn(); ImGui::SeparatorText("Load/Save Spoiler Log"); PlandomizerPopulateSeedList(); static size_t selectedList = 0; if (existingSeedList.size() != 0) { - if (ImGui::BeginCombo("##JsonFiles", existingSeedList[selectedList].c_str())) { - for (size_t i = 0; i < existingSeedList.size(); i++) { - bool isSelected = (selectedList == i); - if (ImGui::Selectable(existingSeedList[i].c_str(), isSelected)) { - selectedList = i; - } - if (isSelected) { - ImGui::SetItemDefaultFocus(); - } - } - ImGui::EndCombo(); - } - } - else { + UIWidgets::Combobox( + "##JsonFiles", &selectedList, existingSeedList, + UIWidgets::ComboboxOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::None)); + } else { ImGui::Text("No Spoiler Logs found."); } ImGui::BeginDisabled(existingSeedList.empty()); - if (ImGui::Button("Load")) { + if (UIWidgets::Button("Load", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { logTemp = existingSeedList[selectedList].c_str(); PlandomizerLoadSpoilerLog(logTemp.c_str()); } ImGui::EndDisabled(); ImGui::BeginDisabled(spoilerLogData.empty()); ImGui::SameLine(); - if (ImGui::Button("Save")) { + if (UIWidgets::Button("Save", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { PlandomizerSaveSpoilerLog(); } ImGui::EndDisabled(); @@ -947,33 +967,36 @@ void PlandomizerDrawOptions() { } ImGui::TableNextColumn(); - size_t index = 0; + int32_t index = 0; PlandoPushImageButtonStyle(); for (auto& hash : plandoHash) { ImGui::PushID(index); - textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(gSeedTextures[hash].tex); + textureID = + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(gSeedTextures[hash].tex); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 2.0f)); - auto upRet = ImGui::ImageButton("HASH_ARROW_UP", Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("HASH_ARROW_UP"), - ImVec2(35.0f, 18.0f), ImVec2(1, 1), ImVec2(0, 0), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1)); + auto upRet = ImGui::ImageButton( + "HASH_ARROW_UP", + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("HASH_ARROW_UP"), + ImVec2(35.0f, 18.0f), ImVec2(1, 1), ImVec2(0, 0), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1)); ImGui::PopStyleVar(); if (upRet) { if (hash + 1 >= gSeedTextures.size()) { hash = 0; - } - else { + } else { hash++; } } ImGui::Image(textureID, ImVec2(35.0f, 35.0f)); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 2.0f)); - auto downRet = ImGui::ImageButton("HASH_ARROW_DWN", Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("HASH_ARROW_DWN"), - ImVec2(35.0f, 18.0f), ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1)); + auto downRet = ImGui::ImageButton( + "HASH_ARROW_DWN", + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("HASH_ARROW_DWN"), + ImVec2(35.0f, 18.0f), ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1)); ImGui::PopStyleVar(); if (downRet) { if (hash == 0) { - hash = gSeedTextures.size() - 1; - } - else { + hash = static_cast(gSeedTextures.size()) - 1; + } else { hash--; } } @@ -986,13 +1009,12 @@ void PlandomizerDrawOptions() { PlandoPopImageButtonStyle(); ImGui::EndTable(); } - } - else { + } else { ImGui::Text("No Spoiler Log Loaded"); } ImGui::EndTable(); } - + ImGui::SeparatorText("Options"); if (plandoLogData.size() == 0) { ImGui::Text("Please Load Spoiler Data..."); @@ -1000,44 +1022,28 @@ void PlandomizerDrawOptions() { } if (getTabID == TAB_HINTS) { - if (ImGui::Button("Clear All Hints")) { + if (UIWidgets::Button("Clear All Hints", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { PlandomizerRemoveAllHints(); } ImGui::SameLine(); - if (ImGui::Button("Randomize All Hints")) { + if (UIWidgets::Button("Randomize All Hints", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { PlandomizerRandomizeHint(HINT_ALL, 0); } } if (getTabID == TAB_LOCATIONS) { if (plandoLogData.size() > 0) { - const char* comboLabel = rcAreaNames[selectedArea].c_str(); - if (selectedArea == RCAREA_INVALID) { - comboLabel = "All"; - } - ImGui::Text("Filter by Area:"); + UIWidgets::Combobox("Filter by Area:##AreaFilter", &selectedArea, rcAreaNameMap, + UIWidgets::ComboboxOptions() + .Color(THEME_COLOR) + .LabelPosition(UIWidgets::LabelPositions::Near) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right)); ImGui::SameLine(); - ImGui::PushItemWidth(300.0f); - if (ImGui::BeginCombo("##AreaFilter", comboLabel)) { - for (const auto& [area, name] : rcAreaNames) { - bool isSelected = (selectedArea == area); - - const char* displayName = name.c_str(); - if (area == RCAREA_INVALID) { - displayName = "All"; - } - if (ImGui::Selectable(displayName, isSelected)) { - selectedArea = area; - } - if (isSelected) { - ImGui::SetItemDefaultFocus(); - } - } - ImGui::EndCombo(); - } - ImGui::PopItemWidth(); - - ImGui::SameLine(); - if (ImGui::Button("Empty All Rewards")) { + if (UIWidgets::Button("Empty All Rewards", UIWidgets::ButtonOptions() + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.f, 6.f)))) { PlandomizerRemoveAllItems(); } } @@ -1067,16 +1073,22 @@ void PlandomizerDrawHintsWindow() { } ImGui::Text("New Hint: "); ImGui::SameLine(); - if (ImGui::Button(randomizeButton.c_str())) { + if (UIWidgets::Button(randomizeButton.c_str(), UIWidgets::ButtonOptions() + .Color(THEME_COLOR) + .Padding(ImVec2(10.f, 6.f)) + .Size(UIWidgets::Sizes::Inline) + .Tooltip("Randomize Hint"))) { PlandomizerRandomizeHint(HINT_SINGLE, index); } - UIWidgets::Tooltip("Randomize Hint"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - 10); - if (UIWidgets::InputString("##HintMessage", &hintInputText)) { + if (UIWidgets::InputString("##HintMessage", &hintInputText, + UIWidgets::InputOptions() + .Color(THEME_COLOR) + .LabelPosition(UIWidgets::LabelPositions::None) + .Tooltip(plandomizerHintsTooltip().c_str()))) { plandoHintData[index].hintText = hintInputText.c_str(); } - UIWidgets::Tooltip(plandomizerHintsTooltip().c_str()); index++; ImGui::PopID(); } @@ -1092,7 +1104,8 @@ void PlandomizerDrawLocationsWindow(RandomizerCheckArea rcArea) { if (ImGui::BeginTable("Locations Window", 4, ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_ScrollY)) { ImGui::TableSetupColumn("Spoiler Log Check Name", ImGuiTableColumnFlags_WidthFixed, 250.0f); ImGui::TableSetupColumn("Spoiler Log Reward", ImGuiTableColumnFlags_WidthFixed, 190.0f); - ImGui::TableSetupColumn("New Reward", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHeaderLabel, 34.0f); + ImGui::TableSetupColumn("New Reward", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHeaderLabel, + 34.0f); ImGui::TableSetupColumn("Additional Options"); ImGui::TableSetupScrollFreeze(0, 1); ImGui::TableHeadersRow(); @@ -1110,8 +1123,7 @@ void PlandomizerDrawLocationsWindow(RandomizerCheckArea rcArea) { if (plandoLogData[index].checkRewardItem.GetRandomizerGet() == RG_ICE_TRAP) { ImGui::TableNextColumn(); PlandomizerDrawIceTrapSetup(index); - } - else if (spoilerData.shopPrice != -1) { + } else if (spoilerData.shopPrice != -1) { ImGui::TableNextColumn(); ImGui::BeginTable("Shops", 1, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInner); ImGui::TableSetupColumn("Shop Price"); @@ -1119,8 +1131,7 @@ void PlandomizerDrawLocationsWindow(RandomizerCheckArea rcArea) { ImGui::TableNextColumn(); PlandomizerDrawShopSlider(index); ImGui::EndTable(); - } - else { + } else { ImGui::TableNextColumn(); } } @@ -1133,6 +1144,7 @@ void PlandomizerDrawLocationsWindow(RandomizerCheckArea rcArea) { void PlandomizerDrawSpoilerTable() { ImGui::BeginChild("Main"); + UIWidgets::PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("Check Tabs")) { if (ImGui::BeginTabItem("Gossip Stones")) { getTabID = TAB_HINTS; @@ -1146,25 +1158,36 @@ void PlandomizerDrawSpoilerTable() { } } ImGui::EndTabBar(); + UIWidgets::PopStyleTabs(); ImGui::EndChild(); } void PlandomizerWindow::DrawElement() { PlandomizerDrawOptions(); - UIWidgets::PaddedSeparator(); + UIWidgets::Separator(true, true, 0.f, 0.f); PlandomizerDrawSpoilerTable(); } void PlandomizerWindow::InitElement() { - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_RUPEE_GRAYSCALE", gRupeeCounterIconTex, ImVec4(1, 1, 1, 1)); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_HEART_GRAYSCALE", gHeartFullTex, ImVec4(0.87f, 0.10f, 0.10f, 1)); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_SEEDS", gItemIconDekuSeedsTex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_SMALL", gDropArrows1Tex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_MEDIUM", gDropArrows2Tex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_LARGE", gDropArrows3Tex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ICE_TRAP", gMagicArrowEquipEffectTex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("HASH_ARROW_UP", gEmptyCDownArrowTex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("HASH_ARROW_DWN", gEmptyCDownArrowTex, ImVec4( 1, 1, 1, 1 )); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_RUPEE_GRAYSCALE", gRupeeCounterIconTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_HEART_GRAYSCALE", gHeartFullTex, + ImVec4(0.87f, 0.10f, 0.10f, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_SEEDS", gItemIconDekuSeedsTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_SMALL", gDropArrows1Tex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_MEDIUM", gDropArrows2Tex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_LARGE", gDropArrows3Tex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ICE_TRAP", gMagicArrowEquipEffectTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("HASH_ARROW_UP", gEmptyCDownArrowTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("HASH_ARROW_DWN", gEmptyCDownArrowTex, + ImVec4(1, 1, 1, 1)); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("BOSS_SOUL", gBossSoulTex, ImVec4(1, 1, 1, 1)); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("TRIFORCE_PIECE", gTriforcePieceTex, ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("TRIFORCE_PIECE", gTriforcePieceTex, + ImVec4(1, 1, 1, 1)); } diff --git a/soh/soh/Enhancements/randomizer/Plandomizer.h b/soh/soh/Enhancements/randomizer/Plandomizer.h index d337e4da6d..bfb118bbf4 100644 --- a/soh/soh/Enhancements/randomizer/Plandomizer.h +++ b/soh/soh/Enhancements/randomizer/Plandomizer.h @@ -16,7 +16,7 @@ extern "C" { #include "soh/Enhancements/randomizer/item.h" #ifdef __cplusplus -class PlandomizerWindow : public Ship::GuiWindow { +class PlandomizerWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; @@ -39,14 +39,14 @@ typedef struct { std::string hintText; } SpoilerHintObject; -typedef enum { +typedef enum PlandoTabs { TAB_HINTS, - TAB_LOCATIONS -}; + TAB_LOCATIONS, +} PlandoTabs; -typedef enum { +typedef enum PlandoHints { HINT_SINGLE, HINT_ALL, -}; +} PlandoHints; -#endif \ No newline at end of file +#endif diff --git a/soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp b/soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp new file mode 100644 index 0000000000..c94c68511c --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp @@ -0,0 +1,141 @@ +#include +#include "static_data.h" +#include "soh/ObjectExtension/ObjectExtension.h" + +extern "C" { +#include "src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h" +extern PlayState* gPlayState; +} + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +void ObjComb_RandomizerChooseItemDrop(ObjComb* objComb, PlayState* play) { + s16 params = objComb->actor.params & 0x1F; + const auto beehiveIdentity = ObjectExtension::GetInstance().Get(&objComb->actor); + + if (RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && beehiveIdentity != nullptr && + !Flags_GetRandomizerInf(beehiveIdentity->randomizerInf)) { + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &objComb->actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = beehiveIdentity->randomizerInf; + item00->itemEntry = + OTRGlobals::Instance->gRandomizer->GetItemFromKnownCheck(beehiveIdentity->randomizerCheck, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + return; + } + + if ((params > 0) || (params < 0x1A)) { + if (params == 6) { + if (Flags_GetCollectible(play, (objComb->actor.params >> 8) & 0x3F)) { + params = -1; + } else { + params = (params | (((objComb->actor.params >> 8) & 0x3F) << 8)); + } + } else if (Rand_ZeroOne() < 0.5f) { + params = -1; + } + if (params >= 0 && !CVarGetInteger(CVAR_ENHANCEMENT("NoRandomDrops"), 0)) { + Item_DropCollectible(play, &objComb->actor.world.pos, params); + } + } +} + +void ObjComb_RandomizerWait(ObjComb* objComb, PlayState* play) { + objComb->unk_1B0 -= 50; + + const auto beehiveIdentity = ObjectExtension::GetInstance().Get(&objComb->actor); + if (RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && beehiveIdentity == nullptr && + !Flags_GetRandomizerInf(beehiveIdentity->randomizerInf)) { + if (objComb->unk_1B0 <= -5000) { + objComb->unk_1B0 = 1500; + } + } else if (objComb->unk_1B0 < 0) { + objComb->unk_1B0 = 0; + } + + if ((objComb->collider.base.acFlags & AC_HIT) != 0) { + objComb->collider.base.acFlags &= ~AC_HIT; + s32 dmgFlags = objComb->collider.elements[0].info.acHitInfo->toucher.dmgFlags; + if (dmgFlags & 0x4001F866) { + objComb->unk_1B0 = 1500; + } else { + ObjComb_Break(objComb, play); + ObjComb_RandomizerChooseItemDrop(objComb, play); + Actor_Kill(&objComb->actor); + } + } else { + CollisionCheck_SetAC(play, &play->colChkCtx, &objComb->collider.base); + } + + if (objComb->actor.update != NULL) { + CollisionCheck_SetOC(play, &play->colChkCtx, &objComb->collider.base); + } +} + +void ObjComb_RandomizerInit(void* actor) { + ObjComb* objComb = static_cast(actor); + s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); + auto beehiveIdentity = OTRGlobals::Instance->gRandomizer->IdentifyBeehive( + gPlayState->sceneNum, (s16)objComb->actor.world.pos.x, respawnData); + ObjectExtension::GetInstance().Set(actor, std::move(beehiveIdentity)); + objComb->actionFunc = (ObjCombActionFunc)ObjComb_RandomizerWait; +} + +void ObjComb_RandomizerUpdate(void* actor) { + ObjComb* combActor = reinterpret_cast(actor); + combActor->actor.shape.rot.x = + static_cast(Math_SinS(combActor->unk_1B2)) * CLAMP_MIN(combActor->unk_1B0, 0) + + combActor->actor.home.rot.x; +} + +void RegisterShuffleBeehives() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES); + + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_COMB, shouldRegister, ObjComb_RandomizerInit); + COND_ID_HOOK(OnActorUpdate, ACTOR_OBJ_COMB, shouldRegister, ObjComb_RandomizerUpdate); +} + +static RegisterShipInitFunc initFunc(RegisterShuffleBeehives, { "IS_RANDO" }); + +void Rando::StaticData::RegisterBeehiveLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + locationTable[RC_KF_STORMS_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_KOKIRI_FOREST, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x2C), "Storms Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT)); + locationTable[RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_KOKIRI_FOREST, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x2C), "Storms Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_LOST_WOODS, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x14), "Tunnel Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_LOST_WOODS, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x14), "Tunnel Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT)); + locationTable[RC_LW_DEKU_SCRUB_GROTTO_BEEHIVE] = Location::Base(RC_LW_DEKU_SCRUB_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_LOST_WOODS, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(747, 0xF5), "Deku Scrub Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO)); + locationTable[RC_SFM_STORMS_GROTTO_BEEHIVE] = Location::Base(RC_SFM_STORMS_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_SACRED_FOREST_MEADOW, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2262, 0xEE), "Deku Scrub Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_SFM_STORMS_GROTTO)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x00), "Near Market Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x00), "Near Market Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT)); + locationTable[RC_HF_OPEN_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x03), "Open Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT)); + locationTable[RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x03), "Open Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT)); + locationTable[RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x22), "Southeast Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT)); + locationTable[RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x22), "Southeast Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT)); + locationTable[RC_HF_INSIDE_FENCE_GROTTO_BEEHIVE] = Location::Base(RC_HF_INSIDE_FENCE_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1410, 0xE6), "Deku Scrub Grotto Beehive", RHT_BEEHIVE_LONELY_SCRUB_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO)); + locationTable[RC_LLR_GROTTO_BEEHIVE] = Location::Base(RC_LLR_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_LON_LON_RANCH, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(5144, 0xFC), "Deku Scrub Grotto Beehive", RHT_BEEHIVE_SCRUB_TRIO_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_LLR_GROTTO)); + locationTable[RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_KAKARIKO_VILLAGE, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x28), "Open Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT)); + locationTable[RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_KAKARIKO_VILLAGE, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x28), "Open Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT)); + locationTable[RC_DMT_COW_GROTTO_BEEHIVE] = Location::Base(RC_DMT_COW_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2617, 0xF8), "Cow Grotto Beehive", RHT_BEEHIVE_COW_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMT_COW_GROTTO)); + locationTable[RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x57), "Storms Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT)); + locationTable[RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x57), "Storms Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT)); + locationTable[RC_GC_GROTTO_BEEHIVE] = Location::Base(RC_GC_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_GORON_CITY, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(5144, 0xFB), "Grotto Beehive", RHT_BEEHIVE_SCRUB_TRIO_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_GC_GROTTO)); + locationTable[RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x7A), "Upper Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT)); + locationTable[RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x7A), "Upper Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT)); + locationTable[RC_DMC_HAMMER_GROTTO_BEEHIVE] = Location::Base(RC_DMC_HAMMER_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(5144, 0xF9), "Hammer Grotto Beehive", RHT_BEEHIVE_SCRUB_TRIO_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO)); + locationTable[RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_ZORAS_RIVER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x29), "Open Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT)); + locationTable[RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_ZORAS_RIVER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x29), "Open Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT)); + locationTable[RC_ZR_STORMS_GROTTO_BEEHIVE] = Location::Base(RC_ZR_STORMS_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_ZORAS_RIVER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2262, 0xEB), "Storms Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZR_STORMS_GROTTO)); + locationTable[RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT] = Location::Base(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, ACTOR_OBJ_COMB, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(382, 0x00), "In Front of King Zora Beehive Left", RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT)); + locationTable[RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT] = Location::Base(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, ACTOR_OBJ_COMB, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(948, 0x00), "In Front of King Zora Beehive Right", RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT)); + locationTable[RC_ZD_BEHIND_KING_ZORA_BEEHIVE] = Location::Base(RC_ZD_BEHIND_KING_ZORA_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, ACTOR_OBJ_COMB, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(701, 0x00), "Behind King Zora Beehive", RHT_BEEHIVE_BEHIND_KING_ZORA, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA)); + locationTable[RC_LH_GROTTO_BEEHIVE] = Location::Base(RC_LH_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_LAKE_HYLIA, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(5144, 0xEF), "Deku Scrub Grotto Beehive", RHT_BEEHIVE_SCRUB_TRIO_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_LH_GROTTO)); + locationTable[RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE] = Location::Base(RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_GERUDO_VALLEY, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2262, 0xF0), "Deku Scrub Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO)); + locationTable[RC_COLOSSUS_GROTTO_BEEHIVE] = Location::Base(RC_COLOSSUS_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DESERT_COLOSSUS, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2262, 0xFD), "Deku Scrub Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_COLOSSUS_GROTTO)); + // clang-format-on +} + +static ObjectExtension::Register RegisterBeehiveIdentity; +static RegisterShipInitFunc registerFunc(Rando::StaticData::RegisterBeehiveLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp index 5fc86f76d2..17ae3a8345 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp @@ -19,7 +19,7 @@ void EnCow_MoveForRandomizer(EnCow* enCow, PlayState* play) { // Move left cow in lon lon tower enCow->actor.world.pos.x = -229.0f; enCow->actor.world.pos.z = 157.0f; - enCow->actor.shape.rot.y = 15783.0f; + enCow->actor.shape.rot.y = 15783; moved = true; } else if (play->sceneNum == SCENE_STABLE && enCow->actor.world.pos.x == -3 && enCow->actor.world.pos.z == -254) { // Move right cow in lon lon stable @@ -34,11 +34,13 @@ void EnCow_MoveForRandomizer(EnCow* enCow, PlayState* play) { } void RegisterShuffleCows() { - bool shouldRegister = IS_RANDO && Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_COWS).Get(); + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_COWS); COND_VB_SHOULD(VB_GIVE_ITEM_FROM_COW, shouldRegister, { EnCow* enCow = va_arg(args, EnCow*); - CowIdentity cowIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCow(gPlayState->sceneNum, enCow->actor.world.pos.x, enCow->actor.world.pos.z); + CowIdentity cowIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCow( + gPlayState->sceneNum, static_cast(enCow->actor.world.pos.x), + static_cast(enCow->actor.world.pos.z)); // Has this cow already rewarded an item? if (!Flags_GetRandomizerInf(cowIdentity.randomizerInf)) { Flags_SetRandomizerInf(cowIdentity.randomizerInf); @@ -59,6 +61,11 @@ void RegisterShuffleCows() { static RegisterShipInitFunc initFunc(RegisterShuffleCows, { "IS_RANDO" }); void Rando::StaticData::RegisterCowLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off locationTable[RC_KF_LINKS_HOUSE_COW] = Location::Base(RC_KF_LINKS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LINKS_HOUSE, 0x00, "Links House Cow", RHT_KF_LINKS_HOUSE_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW)); locationTable[RC_HF_COW_GROTTO_COW] = Location::Base(RC_HF_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_HYRULE_FIELD, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3485, -291), "Cow Grotto Cow", RHT_HF_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW)); locationTable[RC_LLR_STABLES_LEFT_COW] = Location::Base(RC_LLR_STABLES_LEFT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(-122, -254), "Stables Left Cow", RHT_LLR_STABLES_LEFT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW)); @@ -69,6 +76,7 @@ void Rando::StaticData::RegisterCowLocations() { locationTable[RC_DMT_COW_GROTTO_COW] = Location::Base(RC_DMT_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2444, -471), "Cow Grotto Cow", RHT_DMT_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW)); locationTable[RC_GV_COW] = Location::Base(RC_GV_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_GERUDO_VALLEY, 0x00, "Cow", RHT_GV_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_GV_COW)); locationTable[RC_JABU_JABUS_BELLY_MQ_COW] = Location::Base(RC_JABU_JABUS_BELLY_MQ_COW, RCQUEST_MQ, RCTYPE_COW, ACTOR_EN_COW, SCENE_JABU_JABU, 0x00, "MQ Cow", RHT_JABU_JABUS_BELLY_MQ_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW)); + // clang-format-on } -static RegisterShipInitFunc registerFunc(Rando::StaticData::RegisterCowLocations); \ No newline at end of file +static RegisterShipInitFunc registerFunc(Rando::StaticData::RegisterCowLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp new file mode 100644 index 0000000000..53a65df221 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp @@ -0,0 +1,601 @@ +#include +#include "soh_assets.h" +#include "static_data.h" +#include +#include "global.h" +#include "soh/ResourceManagerHelpers.h" +#include "soh/ObjectExtension/ObjectExtension.h" + +extern "C" { +#include "variables.h" +#include "overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h" +#include "objects/object_kibako2/object_kibako2.h" +#include "overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h" +#include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" +#include "soh/Enhancements/enhancementTypes.h" +extern PlayState* gPlayState; +} + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +extern "C" void ObjKibako2_RandomizerDraw(Actor* thisx, PlayState* play) { + GetItemCategory getItemCategory; + auto crateActor = ((ObjKibako2*)thisx); + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + int isVanilla = + csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + + if (isVanilla) { + Gfx_DrawDListOpa(play, (Gfx*)gLargeRandoCrateDL); + return; + } + + const auto crateIdentity = ObjectExtension::GetInstance().Get(thisx); + if (crateIdentity == nullptr) { + Gfx_DrawDListOpa(play, (Gfx*)gLargeRandoCrateDL); + return; + } + + GetItemEntry crateItem = + Rando::Context::GetInstance()->GetFinalGIEntry(crateIdentity->randomizerCheck, true, GI_NONE); + getItemCategory = crateItem.getItemCategory; + + // If they have bombchus, don't consider the bombchu item major + if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && + ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId == RG_PROGRESSIVE_BOMBCHUS) || + (crateItem.modIndex == MOD_NONE && + (crateItem.getItemId == GI_BOMBCHUS_5 || crateItem.getItemId == GI_BOMBCHUS_10 || + crateItem.getItemId == GI_BOMBCHUS_20)))) { + getItemCategory = ITEM_CATEGORY_JUNK; + // If it's a bottle and they already have one, consider the item lesser + } else if ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId >= RG_BOTTLE_WITH_RED_POTION && + crateItem.getItemId <= RG_BOTTLE_WITH_POE) || + (crateItem.modIndex == MOD_NONE && + (crateItem.getItemId == GI_BOTTLE || crateItem.getItemId == GI_MILK_BOTTLE))) { + if (gSaveContext.inventory.items[SLOT_BOTTLE_1] != ITEM_NONE) { + getItemCategory = ITEM_CATEGORY_LESSER; + } + } + + // Change texture + switch (getItemCategory) { + case ITEM_CATEGORY_MAJOR: + Gfx_DrawDListOpa(play, (Gfx*)gLargeMajorCrateDL); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + Gfx_DrawDListOpa(play, (Gfx*)gLargeTokenCrateDL); + break; + case ITEM_CATEGORY_SMALL_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gLargeSmallKeyCrateDL); + break; + case ITEM_CATEGORY_BOSS_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gLargeBossKeyCrateDL); + break; + case ITEM_CATEGORY_LESSER: + switch (crateItem.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + Gfx_DrawDListOpa(play, (Gfx*)gLargeHeartCrateDL); + break; + default: + Gfx_DrawDListOpa(play, (Gfx*)gLargeMinorCrateDL); + break; + } + break; + case ITEM_CATEGORY_JUNK: + default: + Gfx_DrawDListOpa(play, (Gfx*)gLargeJunkCrateDL); + break; + } +} + +extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) { + GetItemCategory getItemCategory; + auto smallCrateActor = ((ObjKibako*)thisx); + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + int isVanilla = + csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + + if (isVanilla) { + Gfx_DrawDListOpa(play, (Gfx*)gSmallRandoCrateDL); + return; + } + + const auto crateIdentity = ObjectExtension::GetInstance().Get(thisx); + if (crateIdentity == nullptr) { + Gfx_DrawDListOpa(play, (Gfx*)gSmallRandoCrateDL); + return; + } + + GetItemEntry smallCrateItem = + Rando::Context::GetInstance()->GetFinalGIEntry(crateIdentity->randomizerCheck, true, GI_NONE); + getItemCategory = smallCrateItem.getItemCategory; + + // If they have bombchus, don't consider the bombchu item major + if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && + ((smallCrateItem.modIndex == MOD_RANDOMIZER && smallCrateItem.getItemId == RG_PROGRESSIVE_BOMBCHUS) || + (smallCrateItem.modIndex == MOD_NONE && + (smallCrateItem.getItemId == GI_BOMBCHUS_5 || smallCrateItem.getItemId == GI_BOMBCHUS_10 || + smallCrateItem.getItemId == GI_BOMBCHUS_20)))) { + getItemCategory = ITEM_CATEGORY_JUNK; + // If it's a bottle and they already have one, consider the item lesser + } else if ((smallCrateItem.modIndex == MOD_RANDOMIZER && smallCrateItem.getItemId >= RG_BOTTLE_WITH_RED_POTION && + smallCrateItem.getItemId <= RG_BOTTLE_WITH_POE) || + (smallCrateItem.modIndex == MOD_NONE && + (smallCrateItem.getItemId == GI_BOTTLE || smallCrateItem.getItemId == GI_MILK_BOTTLE))) { + if (gSaveContext.inventory.items[SLOT_BOTTLE_1] != ITEM_NONE) { + getItemCategory = ITEM_CATEGORY_LESSER; + } + } + + // Change texture + switch (getItemCategory) { + case ITEM_CATEGORY_MAJOR: + Gfx_DrawDListOpa(play, (Gfx*)gSmallMajorCrateDL); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + Gfx_DrawDListOpa(play, (Gfx*)gSmallTokenCrateDL); + break; + case ITEM_CATEGORY_SMALL_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gSmallSmallKeyCrateDL); + break; + case ITEM_CATEGORY_BOSS_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gSmallBossKeyCrateDL); + break; + case ITEM_CATEGORY_LESSER: + switch (smallCrateItem.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + Gfx_DrawDListOpa(play, (Gfx*)gSmallHeartCrateDL); + break; + default: + Gfx_DrawDListOpa(play, (Gfx*)gSmallMinorCrateDL); + break; + } + break; + case ITEM_CATEGORY_JUNK: + default: + Gfx_DrawDListOpa(play, (Gfx*)gSmallJunkCrateDL); + break; + } +} + +uint8_t ObjKibako2_RandomizerHoldsItem(ObjKibako2* crateActor, PlayState* play) { + const auto crateIdentity = ObjectExtension::GetInstance().Get(&crateActor->dyna.actor); + if (crateIdentity == nullptr) { + return false; + } + + RandomizerCheck rc = crateIdentity->randomizerCheck; + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t crateSetting = RAND_GET_OPTION(RSK_SHUFFLE_CRATES); + + // Don't pull randomized item if crate isn't randomized or is already checked + if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || + (crateSetting == RO_SHUFFLE_CRATES_DUNGEONS && !isDungeon) || + Flags_GetRandomizerInf(crateIdentity->randomizerInf) || crateIdentity->randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +uint8_t ObjKibako_RandomizerHoldsItem(ObjKibako* smallCrateActor, PlayState* play) { + const auto crateIdentity = ObjectExtension::GetInstance().Get(&smallCrateActor->actor); + if (crateIdentity == nullptr) { + return false; + } + + RandomizerCheck rc = crateIdentity->randomizerCheck; + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t crateSetting = RAND_GET_OPTION(RSK_SHUFFLE_CRATES); + + // Don't pull randomized item if crate isn't randomized or is already checked + if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || + (crateSetting == RO_SHUFFLE_CRATES_DUNGEONS && !isDungeon) || + Flags_GetRandomizerInf(crateIdentity->randomizerInf) || crateIdentity->randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +void ObjKibako2_RandomizerSpawnCollectible(ObjKibako2* crateActor, PlayState* play) { + const auto crateIdentity = ObjectExtension::GetInstance().Get(&crateActor->dyna.actor); + if (crateIdentity == nullptr) { + return; + } + + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &crateActor->dyna.actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = crateIdentity->randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(crateIdentity->randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = static_cast(Rand_CenteredFloat(65536.0f)); +} + +void ObjKibako_RandomizerSpawnCollectible(ObjKibako* smallCrateActor, PlayState* play) { + const auto crateIdentity = ObjectExtension::GetInstance().Get(&smallCrateActor->actor); + if (crateIdentity == nullptr) { + return; + } + + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &smallCrateActor->actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = crateIdentity->randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(crateIdentity->randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = static_cast(Rand_CenteredFloat(65536.0f)); +} + +void ObjKibako2_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + uint8_t logicSetting = RAND_GET_OPTION(RSK_LOGIC_RULES); + + // don't shuffle two OOB crates in GF and don't shuffle child GV/GF crates when not in no logic + if (actor->id != ACTOR_OBJ_KIBAKO2 || + (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4051 && + (s16)actor->world.pos.z == -3429) || + (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4571 && + (s16)actor->world.pos.z == -3429) || + (logicSetting != RO_LOGIC_NO_LOGIC && ((gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && + (s16)actor->world.pos.x == 3443 && (s16)actor->world.pos.z == -4876) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && + (s16)actor->world.pos.x == -764 && (s16)actor->world.pos.z == 148) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && + (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -125) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && + (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -150) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && + (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -90)))) + return; + + ObjKibako2* crateActor = static_cast(actorRef); + + auto crateIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCrate(gPlayState->sceneNum, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + ObjectExtension::GetInstance().Set(actor, std::move(crateIdentity)); +} + +void ObjKibako_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + + if (actor->id != ACTOR_OBJ_KIBAKO) + return; + + ObjKibako* smallCrateActor = static_cast(actorRef); + + auto crateIdentity = OTRGlobals::Instance->gRandomizer->IdentifySmallCrate( + gPlayState->sceneNum, (s16)actor->home.pos.x, (s16)actor->home.pos.z); + ObjectExtension::GetInstance().Set(actor, std::move(crateIdentity)); +} + +void RegisterShuffleCrates() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_CRATES); + + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_KIBAKO2, shouldRegister, ObjKibako2_RandomizerInit); + + COND_VB_SHOULD(VB_CRATE_SETUP_DRAW, shouldRegister, { + ObjKibako2* crateActor = va_arg(args, ObjKibako2*); + if (ObjKibako2_RandomizerHoldsItem(crateActor, gPlayState)) { + crateActor->dyna.actor.draw = (ActorFunc)ObjKibako2_RandomizerDraw; + *should = false; + } + }); + + COND_VB_SHOULD(VB_CRATE_DROP_ITEM, shouldRegister, { + ObjKibako2* crateActor = va_arg(args, ObjKibako2*); + if (ObjKibako2_RandomizerHoldsItem(crateActor, gPlayState)) { + ObjKibako2_RandomizerSpawnCollectible(crateActor, gPlayState); + *should = false; + } else { + *should = true; + } + }); + + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_KIBAKO, shouldRegister, ObjKibako_RandomizerInit); + + COND_VB_SHOULD(VB_SMALL_CRATE_SETUP_DRAW, shouldRegister, { + ObjKibako* smallCrateActor = va_arg(args, ObjKibako*); + if (ObjKibako_RandomizerHoldsItem(smallCrateActor, gPlayState)) { + smallCrateActor->actor.draw = (ActorFunc)ObjKibako_RandomizerDraw; + *should = false; + } + }); + + COND_VB_SHOULD(VB_SMALL_CRATE_DROP_ITEM, shouldRegister, { + ObjKibako* smallCrateActor = va_arg(args, ObjKibako*); + if (ObjKibako_RandomizerHoldsItem(smallCrateActor, gPlayState)) { + ObjKibako_RandomizerSpawnCollectible(smallCrateActor, gPlayState); + *should = false; + } else { + *should = true; + } + }); +} + +void Rando::StaticData::RegisterCrateLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + // Overworld Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_GV_FREESTANDING_POH_CRATE] = Location::Crate(RC_GV_FREESTANDING_POH_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-350, 1480), "Freestanding PoH Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_FREESTANDING_POH_CRATE)); + locationTable[RC_GV_NEAR_COW_CRATE] = Location::Crate(RC_GV_NEAR_COW_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-449, 123), "Near Cow Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_NEAR_COW_CRATE)); + locationTable[RC_GF_ABOVE_JAIL_CRATE] = Location::Crate(RC_GF_ABOVE_JAIL_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(51, -2997), "Above Jail Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ABOVE_JAIL_CRATE)); + locationTable[RC_GF_SOUTHMOST_CENTER_CRATE] = Location::Crate(RC_GF_SOUTHMOST_CENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1534), "Southmost Center Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTHMOST_CENTER_CRATE)); + locationTable[RC_GF_MID_SOUTH_CENTER_CRATE] = Location::Crate(RC_GF_MID_SOUTH_CENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1594), "Middle South Center Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_MID_SOUTH_CENTER_CRATE)); + locationTable[RC_GF_MID_NORTH_CENTER_CRATE] = Location::Crate(RC_GF_MID_NORTH_CENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1782), "Middle North Center Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_MID_NORTH_CENTER_CRATE)); + locationTable[RR_GF_NORTHMOST_CENTER_CRATE] = Location::Crate(RR_GF_NORTHMOST_CENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1842), "Northmost Center Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTHMOST_CENTER_CRATE)); + locationTable[RC_GF_OUTSKIRTS_NE_CRATE] = Location::Crate(RC_GF_OUTSKIRTS_NE_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-60, -2210), "Outskirts Northeast Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSKIRTS_NE_CRATE)); + locationTable[RC_GF_OUTSKIRTS_NW_CRATE] = Location::Crate(RC_GF_OUTSKIRTS_NW_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-120, -2210), "Outskirts Northwest Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSKIRTS_NW_CRATE)); + locationTable[RC_GF_HBA_RANGE_CRATE_2] = Location::Crate(RC_GF_HBA_RANGE_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1780), "Horseback Archery Range Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_2)); + locationTable[RC_GF_HBA_RANGE_CRATE_3] = Location::Crate(RC_GF_HBA_RANGE_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2020), "Horseback Archery Range Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_3)); + locationTable[RC_GF_HBA_RANGE_CRATE_4] = Location::Crate(RC_GF_HBA_RANGE_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2260), "Horseback Archery Range Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_4)); + locationTable[RC_GF_HBA_RANGE_CRATE_1] = Location::Crate(RC_GF_HBA_RANGE_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1540), "Horseback Archery Range Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_1)); + locationTable[RC_GF_HBA_RANGE_CRATE_5] = Location::Crate(RC_GF_HBA_RANGE_CRATE_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2500), "Horseback Archery Range Crate 5", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_5)); + locationTable[RC_GF_HBA_RANGE_CRATE_6] = Location::Crate(RC_GF_HBA_RANGE_CRATE_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2740), "Horseback Archery Range Crate 6", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_6)); + locationTable[RC_GF_HBA_RANGE_CRATE_7] = Location::Crate(RC_GF_HBA_RANGE_CRATE_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2980), "Horseback Archery Range Crate 7", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_7)); + locationTable[RC_GF_HBA_CANOPY_EAST_CRATE] = Location::Crate(RC_GF_HBA_CANOPY_EAST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3727, -243), "Horseback Archery Canopy East Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_CANOPY_EAST_CRATE)); + locationTable[RC_GF_HBA_CANOPY_WEST_CRATE] = Location::Crate(RC_GF_HBA_CANOPY_WEST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3667, -243), "Horseback Archery Canopy West Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_CANOPY_WEST_CRATE)); + locationTable[RC_GF_NORTH_TARGET_EAST_CRATE] = Location::Crate(RC_GF_NORTH_TARGET_EAST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3446, -4875), "North Target East Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_TARGET_EAST_CRATE)); + locationTable[RC_GF_NORTH_TARGET_WEST_CRATE] = Location::Crate(RC_GF_NORTH_TARGET_WEST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3303, -5018), "North Target West Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_TARGET_WEST_CRATE)); + locationTable[RC_GF_SOUTH_TARGET_EAST_CRATE] = Location::Crate(RC_GF_SOUTH_TARGET_EAST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3406, 414), "South Target East Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_TARGET_EAST_CRATE)); + locationTable[RC_GF_SOUTH_TARGET_WEST_CRATE] = Location::Crate(RC_GF_SOUTH_TARGET_WEST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3330, 406), "South Target West Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_TARGET_WEST_CRATE)); + locationTable[RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE] = Location::Crate(RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1251), "Near Kitchen Leftmost Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_KITCHEN_LEFTMOST_CRATE)); + locationTable[RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE] = Location::Crate(RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1191), "Near Kitchen Middle Left Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_KITCHEN_MID_LEFT_CRATE)); + locationTable[RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE] = Location::Crate(RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -847), "Near Kitchen Middle Right Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_KITCHEN_MID_RIGHT_CRATE)); + locationTable[RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE] = Location::Crate(RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -787), "Near Kitchen Rightmost Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_KITCHEN_RIGHTMOST_CRATE)); + locationTable[RC_TH_KITCHEN_CRATE] = Location::Crate(RC_TH_KITCHEN_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1610, -624), "Kitchen Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_KITCHEN_CRATE)); + locationTable[RC_TH_BREAK_HALLWAY_OUTER_CRATE] = Location::Crate(RC_TH_BREAK_HALLWAY_OUTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1260, -3155), "Break Hallway Outer Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_HALLWAY_OUTER_CRATE)); + locationTable[RC_TH_BREAK_ROOM_LEFT_CRATE] = Location::Crate(RC_TH_BREAK_ROOM_LEFT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3550), "Break Room Left Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_ROOM_LEFT_CRATE)); + locationTable[RC_TH_BREAK_HALLWAY_INNER_CRATE] = Location::Crate(RC_TH_BREAK_HALLWAY_INNER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1360, -3325), "Break Hallway Inner Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_HALLWAY_INNER_CRATE)); + locationTable[RC_TH_BREAK_ROOM_RIGHT_CRATE] = Location::Crate(RC_TH_BREAK_ROOM_RIGHT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3502), "Break Room Right Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_ROOM_RIGHT_CRATE)); + locationTable[RC_TH_1_TORCH_CELL_CRATE] = Location::Crate(RC_TH_1_TORCH_CELL_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-510, -2213), "1 Torch Cell Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_1_TORCH_CELL_CRATE)); + locationTable[RC_TH_DEAD_END_CELL_CRATE] = Location::Crate(RC_TH_DEAD_END_CELL_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1090, -2210), "Dead End Cell Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_DEAD_END_CELL_CRATE)); + locationTable[RC_TH_DOUBLE_CELL_LEFT_CRATE] = Location::Crate(RC_TH_DOUBLE_CELL_LEFT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-49, 11), "Double Cell Left Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_DOUBLE_CELL_LEFT_CRATE)); + locationTable[RC_TH_DOUBLE_CELL_RIGHT_CRATE] = Location::Crate(RC_TH_DOUBLE_CELL_RIGHT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(11, 11), "Double Cell Right Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_DOUBLE_CELL_RIGHT_CRATE)); + locationTable[RC_HW_BEFORE_QUICKSAND_CRATE] = Location::Crate(RC_HW_BEFORE_QUICKSAND_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3832, 2840), "Before Quicksand Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_BEFORE_QUICKSAND_CRATE)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_1] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3235, 2313), "After Quicksand Crate 1", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_1)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_2] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3125, 2459), "After Quicksand Crate 2", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_2)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_3] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3026, 2631), "After Quicksand Crate 3", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_3)); + locationTable[RC_HW_NEAR_COLOSSUS_CRATE] = Location::Crate(RC_HW_NEAR_COLOSSUS_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(-1531, -976), "Near Colossus Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_NEAR_COLOSSUS_CRATE)); + locationTable[RC_MK_NEAR_BAZAAR_CRATE_1] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 338), "Near Bazaar Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_1)); + locationTable[RC_MK_NEAR_BAZAAR_CRATE_2] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 132), "Near Bazaar Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_2)); + locationTable[RC_MK_SHOOTING_GALLERY_CRATE_1] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-150, -576), "Shooting Gallery Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_1)); + locationTable[RC_MK_SHOOTING_GALLERY_CRATE_2] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-90, -576), "Shooting Gallery Crate 2", RHT_CRATE_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_2)); + locationTable[RC_MK_LOST_DOG_HOUSE_CRATE] = Location::Crate(RC_MK_LOST_DOG_HOUSE_CRATE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_DOG_LADY_HOUSE, TWO_ACTOR_PARAMS(176, 170), "Lost Dog House Crate", RHT_CRATE_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_LOST_DOG_HOUSE_CRATE)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_1] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(76, -210), "Guard House Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_1)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_2] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -210), "Guard House Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_2)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_3] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 120), "Guard House Crate 3", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_3)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_4] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 168), "Guard House Crate 4", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_4)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_5] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 216), "Guard House Crate 5", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_5)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1039, 10), "Near Open Grotto Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1099, 10), "Near Open Grotto Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(506, -358), "Near Open Grotto Adult Crate 3", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(483, -302), "Near Open Grotto Adult Crate 4", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4)); + locationTable[RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(186, -758), "Near Potion Shop Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(185, 776), "Near Shooting Gallery Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(92, 348), "Near Boarding House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(32, 348), "Near Boarding House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1518), "Near Impas House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1470), "Near Impas House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-433, -401), "Near Bazaar Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-489, -424), "Near Bazaar Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2)); + locationTable[RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE] = Location::Crate(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-724, 871), "Behind GS House Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_GY_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_GY_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1732, 1366), "Near Graveyard Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GY_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_WINDMILL_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 601), "Near Windmill Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_FENCE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_FENCE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 111), "Near Fence Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-60, -46), "Near Boarding House Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_BAZAAR_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-636, -478), "Near Bazaar Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE)); + locationTable[RC_GRAVEYARD_CRATE] = Location::Crate(RC_GRAVEYARD_CRATE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1050, -350), "Freestanding PoH Crate", RHT_CRATE_GRAVEYARD, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_CRATE)); + locationTable[RC_GC_MAZE_CRATE] = Location::Crate(RC_GC_MAZE_CRATE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1124, -1339), "Maze Crate", RHT_CRATE_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_CRATE)); + locationTable[RC_DMC_CRATE] = Location::Crate(RC_DMC_CRATE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-950, 1892), "Crate", RHT_CRATE_DEATH_MOUNTAIN_CRATER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CRATE)); + locationTable[RC_LLR_NEAR_TREE_CRATE] = Location::Crate(RC_LLR_NEAR_TREE_CRATE, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(1160, -2376), "Near Tree Crate", RHT_CRATE_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_NEAR_TREE_CRATE)); + locationTable[RC_LH_LAB_CRATE] = Location::Crate(RC_LH_LAB_CRATE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(90, -119), "Lab Crate", RHT_CRATE_LAKESIDE_LABORATORY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_CRATE)); + + // No Logic Crates + locationTable[RC_GV_CRATE_BRIDGE_1] = Location::NLCrate(RC_GV_CRATE_BRIDGE_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-764, 148), "Near Bridge Crate 1", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_1)); + locationTable[RC_GV_CRATE_BRIDGE_2] = Location::NLCrate(RC_GV_CRATE_BRIDGE_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -125), "Near Bridge Crate 2", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_2)); + locationTable[RC_GV_CRATE_BRIDGE_3] = Location::NLCrate(RC_GV_CRATE_BRIDGE_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -150), "Near Bridge Crate 3", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_3)); + locationTable[RC_GV_CRATE_BRIDGE_4] = Location::NLCrate(RC_GV_CRATE_BRIDGE_4, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -90), "Near Bridge Crate 4", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_4)); + locationTable[RC_GF_NORTH_TARGET_CHILD_CRATE] = Location::NLCrate(RC_GF_NORTH_TARGET_CHILD_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3443, -4876), "North Target Child Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_TARGET_CHILD_CRATE)); + + // MQ Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_DEKU_TREE_MQ_LOBBY_CRATE] = Location::Crate(RC_DEKU_TREE_MQ_LOBBY_CRATE, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(279, 333), "MQ Lobby Crate", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -62), "MQ Slingshot Room Crate 1", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -2), "MQ Slingshot Room Crate 2", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1886, -744), "MQ Poe Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1826, -744), "MQ Poe Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1391), "MQ Poe Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1451), "MQ Poe Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1824), "MQ Poe Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1884), "MQ Poe Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1161), "MQ Poe Room Crate 7", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1221), "MQ Poe Room Crate 8", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1730, -1836), "MQ Staircase Lower Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2190, -1835), "MQ Staircase Lower Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1510, -1837), "MQ Staircase Upper Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1511, -1084), "MQ Staircase Upper Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2410, -1084), "MQ Staircase Upper Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2411, -1836), "MQ Staircase Upper Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3191, -897), "MQ Two Flames Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2776, -810), "MQ Two Flames Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1714), "MQ Larvae Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1774), "MQ Larvae Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1871, -1976), "MQ Larvae Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1811, -1976), "MQ Larvae Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1721), "MQ Larvae Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1781), "MQ Larvae Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 769), "MQ Outside Boss Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 709), "MQ Outside Boss Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1130, -654), "MQ Outside Boss Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1211, -775), "MQ Outside Boss Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -417), "MQ Outside Boss Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -534), "MQ Outside Boss Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2249, -56), "MQ Shortcut Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2189, -56), "MQ Shortcut Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2150, 55), "MQ Shortcut Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2135, -62), "MQ Shortcut Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2090, 55), "MQ Shortcut Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2030, 55), "MQ Shortcut Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1147), "MQ Lizalfos Maze Lower Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1195), "MQ Lizalfos Maze Lower Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2124, 1154), "MQ Lizalfos Maze Lower Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1817, 1330), "MQ Lizalfos Maze Upper Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1288), "MQ Lizalfos Maze Upper Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1336), "MQ Lizalfos Maze Upper Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1407, -756), "MQ Lava Torch Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(384, 351), "MQ Lava Torch Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1409, -1176), "MQ Lava Torch Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(999, -402), "MQ Lava Torch Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-150, -336), "MQ Central Pillar Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-210, -336), "MQ Central Pillar Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(299, 485), "MQ Central Pillar Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 486), "MQ Central Pillar Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(222, 204), "MQ Central Pillar Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 425), "MQ Central Pillar Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 365), "MQ Central Pillar Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 426), "MQ Central Pillar Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 366), "MQ Central Pillar Lower Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(162, 204), "MQ Central Pillar Lower Crate 8", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(31, 636), "MQ Central Pillar Lower Crate 9", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(151, 636), "MQ Central Pillar Lower Crate 10", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(102, 204), "MQ Central Pillar Lower Crate 11", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(91, 636), "MQ Central Pillar Lower Crate 12", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 522), "MQ Central Pillar Lower Crate 13", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 582), "MQ Central Pillar Lower Crate 14", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(698, 399), "MQ Lizalfos Hallway Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(437, 576), "MQ Lizalfos Hallway Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(270, 504), "MQ Lizalfos Hallway Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(686, 1016), "MQ Lizalfos Hallway Room Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 870), "MQ Lizalfos Hallway Room Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 810), "MQ Lizalfos Hallway Room Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(524, 839), "MQ Lizalfos Hallway Room Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(525, 954), "MQ Lizalfos Hallway Room Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 570), "MQ Lizalfos Hallway Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 510), "MQ Lizalfos Hallway Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -712), "MQ Storage Room A Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -821), "MQ Storage Room A Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -922), "MQ Storage Room A Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1434, -1036), "MQ Storage Room A Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1374, -1036), "MQ Storage Room A Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1265, -1036), "MQ Storage Room A Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1205, -1036), "MQ Storage Room A Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-892, -91), "MQ GS Storage Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1149, 173), "MQ GS Storage Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1157, -221), "MQ GS Storage Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-945, -315), "MQ GS Storage Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -141), "MQ GS Storage Room Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1103, -315), "MQ GS Storage Room Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-884, 65), "MQ GS Storage Room Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, 56), "MQ GS Storage Room Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1918), "MQ Dragon Room Torches Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1978), "MQ Dragon Room Torches Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1718, -2006), "MQ Dragon Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1778, -2006), "MQ Dragon Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1912), "MQ Dragon Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1972), "MQ Dragon Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1092, -1926), "MQ Dragon Room Door Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1153, -1926), "MQ Dragon Room Door Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1257, -1567), "MQ BK Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1289, -1205), "MQ BK Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-985, -1333), "MQ BK Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1297, -1300), "MQ BK Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1069, -1402), "MQ BK Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-11, -2075), "MQ Whirlpool Front Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-371, -2077), "MQ Whirlpool Front Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-455, -2394), "MQ Whirlpool Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-498, -2661), "MQ Whirlpool Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(11, -2737), "MQ Whirlpool Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-251, -2731), "MQ Whirlpool Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-119, -2481), "MQ Whirlpool Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(126, -2485), "MQ Whirlpool Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-7, -3126), "MQ Whirlpool Behind Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-87, -3126), "MQ Whirlpool Behind Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-303, -3126), "MQ Whirlpool Behind Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-390, -3126), "MQ Whirlpool Behind Gate Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-397, -3818), "MQ Dodongo Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(30, -3215), "MQ Dodongo Room Hall Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-85, -3460), "MQ Dodongo Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-271, -3826), "MQ Dodongo Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(36, -3700), "MQ Dodongo Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2766), "MQ Storage Room B Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2866), "MQ Storage Room B Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2926), "MQ Storage Room B Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1435, -2935), "MQ Storage Room B Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2875), "MQ Storage Room B Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-994, 744), "MQ Triple Torch Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-991, 976), "MQ Triple Torch Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1511, 975), "MQ Triple Torch Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 792), "MQ Triple Torch Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 975), "MQ Triple Torch Room Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 744), "MQ Triple Torch Room Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2183, 977), "MQ Triple Torch Room Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2260, 744), "MQ Triple Torch Room Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2200, 743), "MQ Triple Torch Room Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(510, -1558), "MQ Statue Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(570, -1558), "MQ Statue Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1138), "MQ Big Mirror Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1138), "MQ Big Mirror Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1186), "MQ Big Mirror Crate 3", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1186), "MQ Big Mirror Crate 4", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE] = Location::Crate(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-59, -1598), "MQ Maze Crate", RHT_CRATE_GERUDO_TRAINING_GROUND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE)); + + // Small Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-141, -1945), "Platform Room Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-189, -1925), "Platform Room Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2030, -1172), "After Hammer Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2072, -1135), "After Hammer Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-971, -940), "Before Child Climb Small Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1151, -939), "Before Child Climb Small Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-512, -4592), "MQ Triple Hallway Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-666, -4671), "MQ Triple Hallway Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1381, -2115), "MQ Jigglies Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1341, -2116), "MQ Jigglies Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1599, -1322), "MQ Frozen Eye Switch Small Crate 1", RHT_CRATE_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "MQ Frozen Eye Switch Small Crate 2", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "MQ Frozen Eye Switch Small Crate 3", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1290), "MQ Lizalfos Maze Upper Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1332), "MQ Lizalfos Maze Upper Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(460, 370), "MQ Lava Torch Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1405, -975), "MQ Lava Torch Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(685, 183), "MQ Lava Torch Small Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Small Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1267, 200), "MQ Lava Torch Small Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1952), "MQ Dragon Room Torches Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1911), "MQ Dragon Room Torches Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1991), "MQ Dragon Room Torches Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1470, -622), "MQ Storage Room A Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1341, -621), "MQ Storage Room A Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1393, -621), "MQ Storage Room A Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1284, -621), "MQ Storage Room A Small Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1166, 97), "MQ GS Storage Room Lower Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-992, 382), "MQ GS Storage Room Upper Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(365, 52), "MQ Truth Spinner Small Crate 1", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -62), "MQ Truth Spinner Small Crate 2", RHT_CRATE_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -7), "MQ Truth Spinner Small Crate 3", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(366, 114), "MQ Truth Spinner Small Crate 4", RHT_CRATE_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-271, -983), "MQ Statue Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1382, 190), "MQ Beamos Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE)); + + // clang-format on +} + +static ObjectExtension::Register RegisterCrateIdentity; +static ObjectExtension::Register RegisterSmallCrateIdentity; +static RegisterShipInitFunc initFunc(RegisterShuffleCrates, { "IS_RANDO" }); +static RegisterShipInitFunc locFunc(Rando::StaticData::RegisterCrateLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index d771c58f3a..666ba0a21c 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -1,18 +1,28 @@ -#include "ShuffleFairies.h" +#include "soh/OTRGlobals.h" #include "randomizer_grotto.h" #include "draw.h" +#include "soh/cvar_prefixes.h" +#include "static_data.h" +#include "soh/Enhancements/item-tables/ItemTableTypes.h" +#include "soh/ObjectExtension/ObjectExtension.h" + +extern "C" { #include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" #include "src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h" #include "src/overlays/actors/ovl_En_Gs/z_en_gs.h" #include "src/overlays/actors/ovl_Shot_Sun/z_shot_sun.h" -#include "../../OTRGlobals.h" -#include "../../cvar_prefixes.h" -#include "static_data.h" +} #define FAIRY_FLAG_TIMED (1 << 8) void ShuffleFairies_DrawRandomizedItem(EnElf* enElf, PlayState* play) { - GetItemEntry randoGetItem = enElf->sohFairyIdentity.itemEntry; + const auto fairyIdentity = ObjectExtension::GetInstance().Get(&enElf->actor); + if (fairyIdentity == nullptr) { + return; + } + + GetItemEntry randoGetItem = + Rando::Context::GetInstance()->GetFinalGIEntry(fairyIdentity->randomizerCheck, true, GI_FAIRY); if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { randoGetItem = GET_ITEM_MYSTERY; } @@ -32,8 +42,8 @@ bool ShuffleFairies_FairyExists(FairyIdentity fairyIdentity) { if (actor->id != ACTOR_EN_ELF) { actor = actor->next; } else { - EnElf* enElf = (EnElf*)(actor); - if (fairyIdentity.randomizerInf == enElf->sohFairyIdentity.randomizerInf) { + const auto actorFairyIdentity = ObjectExtension::GetInstance().Get(&actor); + if (actorFairyIdentity != nullptr && fairyIdentity.randomizerInf == actorFairyIdentity->randomizerInf) { return true; } actor = actor->next; @@ -52,100 +62,108 @@ FairyIdentity ShuffleFairies_GetFairyIdentity(int32_t params) { sceneNum = SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY; } - Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, sceneNum, params); + Rando::Location* location = + OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, sceneNum, params); if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { LUSLOG_WARN("FairyGetIdentity did not receive a valid RC value (%d).", location->GetRandomizerCheck()); assert(false); } else { fairyIdentity.randomizerInf = static_cast(location->GetCollectionCheck().flag); - fairyIdentity.itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); + fairyIdentity.randomizerCheck = location->GetRandomizerCheck(); } return fairyIdentity; } -bool ShuffleFairies_SpawnFairy(f32 posX, f32 posY, f32 posZ, int32_t params) { +static bool SpawnFairy(f32 posX, f32 posY, f32 posZ, int32_t params, FairyType fairyType) { FairyIdentity fairyIdentity = ShuffleFairies_GetFairyIdentity(params); if (!Flags_GetRandomizerInf(fairyIdentity.randomizerInf)) { - EnElf* fairy = (EnElf*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, posX, posY - 30.0f, posZ, 0, - 0, 0, FAIRY_HEAL, true); - fairy->sohFairyIdentity = fairyIdentity; - fairy->actor.draw = (ActorFunc)ShuffleFairies_DrawRandomizedItem; + Actor* fairy = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, posX, posY - 30.0f, posZ, 0, 0, 0, + fairyType, true); + ObjectExtension::GetInstance().Set(fairy, std::move(fairyIdentity)); + fairy->draw = (ActorFunc)ShuffleFairies_DrawRandomizedItem; return true; } return false; } -void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { - va_list args; - va_copy(args, originalArgs); - - Actor* actor = va_arg(args, Actor*); - - va_end(args); +void RegisterShuffleFairies() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_FAIRIES); // Grant item when picking up fairy. - if (id == VB_FAIRY_HEAL) { - EnElf* enElf = (EnElf*)(actor); - if (enElf->sohFairyIdentity.randomizerInf && enElf->sohFairyIdentity.randomizerInf != RAND_INF_MAX) { - Flags_SetRandomizerInf(enElf->sohFairyIdentity.randomizerInf); + COND_VB_SHOULD(VB_FAIRY_HEAL, shouldRegister, { + EnElf* enElf = va_arg(args, EnElf*); + + const auto fairyIdentity = ObjectExtension::GetInstance().Get(&enElf->actor); + if (fairyIdentity == nullptr) { + return; } + + if (fairyIdentity != nullptr && fairyIdentity->randomizerInf && fairyIdentity->randomizerInf != RAND_INF_MAX) { + Flags_SetRandomizerInf(fairyIdentity->randomizerInf); + } + }); + // Spawn fairies in fairy fountains - } else if (id == VB_SPAWN_FOUNTAIN_FAIRIES) { + COND_VB_SHOULD(VB_SPAWN_FOUNTAIN_FAIRIES, shouldRegister, { + Actor* actor = va_arg(args, Actor*); bool fairySpawned = false; s16 grottoId = (gPlayState->sceneNum == SCENE_FAIRYS_FOUNTAIN) ? Grotto_CurrentGrotto() : 0; for (s16 index = 0; index < 8; index++) { int32_t params = (grottoId << 8) | index; - if (ShuffleFairies_SpawnFairy(actor->world.pos.x, actor->world.pos.y, actor->world.pos.z, - params)) { + if (SpawnFairy(actor->world.pos.x, actor->world.pos.y, actor->world.pos.z, params, FAIRY_HEAL)) { fairySpawned = true; } } if (fairySpawned) { *should = false; } + }); + // Spawn 3 fairies when playing Song of Storms next to a planted bean - } else if (id == VB_SPAWN_BEAN_STALK_FAIRIES) { - ObjBean* objBean = (ObjBean*)(actor); + COND_VB_SHOULD(VB_SPAWN_BEAN_STALK_FAIRIES, shouldRegister, { + ObjBean* objBean = va_arg(args, ObjBean*); bool fairySpawned = false; for (s16 index = 0; index < 3; index++) { int32_t params = ((objBean->dyna.actor.params & 0x3F) << 8) | index; - if (ShuffleFairies_SpawnFairy(objBean->dyna.actor.world.pos.x, objBean->dyna.actor.world.pos.y, - objBean->dyna.actor.world.pos.z, - params)) { + if (SpawnFairy(objBean->dyna.actor.world.pos.x, objBean->dyna.actor.world.pos.y, + objBean->dyna.actor.world.pos.z, params, FAIRY_HEAL)) { fairySpawned = true; } } if (fairySpawned) { *should = false; } + }); + // Spawn a fairy from a ShotSun when playing the right song near it - } else if (id == VB_SPAWN_SONG_FAIRY) { - ShotSun* shotSun = (ShotSun*)(actor); - if (ShuffleFairies_SpawnFairy(shotSun->actor.world.pos.x, shotSun->actor.world.pos.y, - shotSun->actor.world.pos.z, - TWO_ACTOR_PARAMS(0x1000, (int32_t)shotSun->actor.world.pos.z))) { + COND_VB_SHOULD(VB_SPAWN_SONG_FAIRY, shouldRegister, { + ShotSun* shotSun = va_arg(args, ShotSun*); + if (SpawnFairy(shotSun->actor.world.pos.x, shotSun->actor.world.pos.y, shotSun->actor.world.pos.z, + TWO_ACTOR_PARAMS(0x1000, (int32_t)shotSun->actor.world.pos.z), FAIRY_HEAL_BIG)) { *should = false; } + }); + // Handle playing both misc songs and song of storms in front of a gossip stone. - } else if (id == VB_SPAWN_GOSSIP_STONE_FAIRY) { - EnGs* gossipStone = (EnGs*)(actor); + COND_VB_SHOULD(VB_SPAWN_GOSSIP_STONE_FAIRY, shouldRegister, { + EnGs* gossipStone = va_arg(args, EnGs*); + FairyType fairyType = FAIRY_HEAL; // Mimic vanilla behaviour, only go into this path if song played is one of the ones normally spawning a fairy. // Otherwise fall back to vanilla behaviour. if (gPlayState->msgCtx.ocarinaMode == OCARINA_MODE_04 && (gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_LULLABY || - gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_SARIAS || - gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_EPONAS || - gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_SUNS || - gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_TIME || - gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_STORMS)) { + gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_SARIAS || gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_EPONAS || + gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_SUNS || gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_TIME || + gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_STORMS)) { int32_t params = (gPlayState->sceneNum == SCENE_GROTTOS) ? Grotto_CurrentGrotto() : 0; // Distinguish storms fairies from the normal song fairies if (gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_STORMS) { params |= 0x1000; + fairyType = FAIRY_HEAL_BIG; } // Combine actor + song params with position to get the right randomizer check @@ -158,8 +176,8 @@ void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, // collected, the vanilla code will handle that part automatically. FairyIdentity fairyIdentity = ShuffleFairies_GetFairyIdentity(params); if (!ShuffleFairies_FairyExists(fairyIdentity)) { - if (ShuffleFairies_SpawnFairy(gossipStone->actor.world.pos.x, gossipStone->actor.world.pos.y, - gossipStone->actor.world.pos.z, params)) { + if (SpawnFairy(gossipStone->actor.world.pos.x, gossipStone->actor.world.pos.y, + gossipStone->actor.world.pos.z, params, fairyType)) { Audio_PlayActorSound2(&gossipStone->actor, NA_SE_EV_BUTTERFRY_TO_FAIRY); // Set vanilla check for fairy spawned so it doesn't spawn the vanilla fairy afterwards as well. gossipStone->unk_19D = 0; @@ -169,241 +187,238 @@ void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, *should = false; } } - } -} - -uint32_t onVanillaBehaviorHook = 0; - -void ShuffleFairies_RegisterHooks() { - onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(ShuffleFairies_OnVanillaBehaviorHandler); -} - -void ShuffleFairies_UnregisterHooks() { - GameInteractor::Instance->UnregisterGameHook(onVanillaBehaviorHook); - - onVanillaBehaviorHook = 0; + }); } void Rando::StaticData::RegisterFairyLocations() { - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, "Grotto Fairy 1", "SFM Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1801, "Grotto Fairy 2", "SFM Grotto Fairy 2", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1802, "Grotto Fairy 3", "SFM Grotto Fairy 3", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1803, "Grotto Fairy 4", "SFM Grotto Fairy 4", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1804, "Grotto Fairy 5", "SFM Grotto Fairy 5", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1805, "Grotto Fairy 6", "SFM Grotto Fairy 6", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1806, "Grotto Fairy 7", "SFM Grotto Fairy 7", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1807, "Grotto Fairy 8", "SFM Grotto Fairy 8", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0300, "Grotto Fairy 1", "ZR Grotto Fairy 1", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0301, "Grotto Fairy 2", "ZR Grotto Fairy 2", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0302, "Grotto Fairy 3", "ZR Grotto Fairy 3", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0303, "Grotto Fairy 4", "ZR Grotto Fairy 4", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0304, "Grotto Fairy 5", "ZR Grotto Fairy 5", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0305, "Grotto Fairy 6", "ZR Grotto Fairy 6", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0306, "Grotto Fairy 7", "ZR Grotto Fairy 7", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0307, "Grotto Fairy 8", "ZR Grotto Fairy 8", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F00, "Grotto Fairy 1", "HF Grotto Fairy 1", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F01, "Grotto Fairy 2", "HF Grotto Fairy 2", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F02, "Grotto Fairy 3", "HF Grotto Fairy 3", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F03, "Grotto Fairy 4", "HF Grotto Fairy 4", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F04, "Grotto Fairy 5", "HF Grotto Fairy 5", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F05, "Grotto Fairy 6", "HF Grotto Fairy 6", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F06, "Grotto Fairy 7", "HF Grotto Fairy 7", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F07, "Grotto Fairy 8", "HF Grotto Fairy 8", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C00, "Grotto Fairy 1", "ZD Grotto Fairy 1", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C01, "Grotto Fairy 2", "ZD Grotto Fairy 2", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C02, "Grotto Fairy 3", "ZD Grotto Fairy 3", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C03, "Grotto Fairy 4", "ZD Grotto Fairy 4", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C04, "Grotto Fairy 5", "ZD Grotto Fairy 5", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C05, "Grotto Fairy 6", "ZD Grotto Fairy 6", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C06, "Grotto Fairy 7", "ZD Grotto Fairy 7", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C07, "Grotto Fairy 8", "ZD Grotto Fairy 8", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D00, "Grotto Fairy 1", "GF Grotto Fairy 1", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D01, "Grotto Fairy 2", "GF Grotto Fairy 2", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D02, "Grotto Fairy 3", "GF Grotto Fairy 3", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D03, "Grotto Fairy 4", "GF Grotto Fairy 4", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D04, "Grotto Fairy 5", "GF Grotto Fairy 5", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D05, "Grotto Fairy 6", "GF Grotto Fairy 6", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D06, "Grotto Fairy 7", "GF Grotto Fairy 7", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D07, "Grotto Fairy 8", "GF Grotto Fairy 8", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_8)); + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, "Fairy Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1801, "Fairy Grotto Fairy 2", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1802, "Fairy Grotto Fairy 3", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1803, "Fairy Grotto Fairy 4", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1804, "Fairy Grotto Fairy 5", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1805, "Fairy Grotto Fairy 6", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1806, "Fairy Grotto Fairy 7", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1807, "Fairy Grotto Fairy 8", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0300, "Fairy Grotto Fairy 1", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0301, "Fairy Grotto Fairy 2", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0302, "Fairy Grotto Fairy 3", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0303, "Fairy Grotto Fairy 4", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0304, "Fairy Grotto Fairy 5", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0305, "Fairy Grotto Fairy 6", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0306, "Fairy Grotto Fairy 7", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0307, "Fairy Grotto Fairy 8", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F00, "Fairy Grotto Fairy 1", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F01, "Fairy Grotto Fairy 2", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F02, "Fairy Grotto Fairy 3", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F03, "Fairy Grotto Fairy 4", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F04, "Fairy Grotto Fairy 5", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F05, "Fairy Grotto Fairy 6", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F06, "Fairy Grotto Fairy 7", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F07, "Fairy Grotto Fairy 8", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C00, "Fairy Grotto Fairy 1", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C01, "Fairy Grotto Fairy 2", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C02, "Fairy Grotto Fairy 3", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C03, "Fairy Grotto Fairy 4", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C04, "Fairy Grotto Fairy 5", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C05, "Fairy Grotto Fairy 6", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C06, "Fairy Grotto Fairy 7", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C07, "Fairy Grotto Fairy 8", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D00, "Fairy Grotto Fairy 1", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D01, "Fairy Grotto Fairy 2", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D02, "Fairy Grotto Fairy 3", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D03, "Fairy Grotto Fairy 4", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D04, "Fairy Grotto Fairy 5", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D05, "Fairy Grotto Fairy 6", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D06, "Fairy Grotto Fairy 7", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D07, "Fairy Grotto Fairy 8", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x00, "Shield Grave Fairy 1", "Shield Grave Fairy 1", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x01, "Shield Grave Fairy 2", "Shield Grave Fairy 2", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x02, "Shield Grave Fairy 3", "Shield Grave Fairy 3", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x03, "Shield Grave Fairy 4", "Shield Grave Fairy 4", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x04, "Shield Grave Fairy 5", "Shield Grave Fairy 5", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x05, "Shield Grave Fairy 6", "Shield Grave Fairy 6", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x06, "Shield Grave Fairy 7", "Shield Grave Fairy 7", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x07, "Shield Grave Fairy 8", "Shield Grave Fairy 8", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "Scrubs Fairy 1", "Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "Scrubs Fairy 2", "Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "Scrubs Fairy 3", "Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "Scrubs Fairy 4", "Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "Scrubs Fairy 5", "Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "Scrubs Fairy 6", "Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "Scrubs Fairy 7", "Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "Scrubs Fairy 8", "Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "MQ Scrubs Fairy 1", "MQ Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "MQ Scrubs Fairy 2", "MQ Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "MQ Scrubs Fairy 3", "MQ Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "MQ Scrubs Fairy 4", "MQ Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "MQ Scrubs Fairy 5", "MQ Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "MQ Scrubs Fairy 6", "MQ Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "MQ Scrubs Fairy 7", "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "MQ Scrubs Fairy 8", "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_1] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x00, "Oasis Fairy 1", "Oasis Fairy 1", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_1)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_2] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x01, "Oasis Fairy 2", "Oasis Fairy 2", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_2)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_3] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x02, "Oasis Fairy 3", "Oasis Fairy 3", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_3)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_4] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_4, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x03, "Oasis Fairy 4", "Oasis Fairy 4", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_4)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_5] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_5, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x04, "Oasis Fairy 5", "Oasis Fairy 5", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_5)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_6] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_6, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x05, "Oasis Fairy 6", "Oasis Fairy 6", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_6)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_7] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_7, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x06, "Oasis Fairy 7", "Oasis Fairy 7", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_7)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_8] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_8, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x07, "Oasis Fairy 8", "Oasis Fairy 8", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_8)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x00, "Shield Grave Fairy 1", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x01, "Shield Grave Fairy 2", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x02, "Shield Grave Fairy 3", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x03, "Shield Grave Fairy 4", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x04, "Shield Grave Fairy 5", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x05, "Shield Grave Fairy 6", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x06, "Shield Grave Fairy 7", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x07, "Shield Grave Fairy 8", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "MQ Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "MQ Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "MQ Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "MQ Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "MQ Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "MQ Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_1] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x00, "Oasis Fairy 1", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_1)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_2] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x01, "Oasis Fairy 2", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_2)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_3] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x02, "Oasis Fairy 3", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_3)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_4] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_4, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x03, "Oasis Fairy 4", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_4)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_5] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_5, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x04, "Oasis Fairy 5", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_5)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_6] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_6, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x05, "Oasis Fairy 6", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_6)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_7] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_7, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x06, "Oasis Fairy 7", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_7)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_8] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_8, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x07, "Oasis Fairy 8", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_8)); - locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, "Bean Sprout Fairy 1", "ZR Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, "Bean Sprout Fairy 2", "ZR Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_ZR_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0302, "Bean Sprout Fairy 3", "ZR Bean Sprout Fairy 3", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_KF_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0900, "Bean Sprout Fairy 1", "KF Bean Sprout Fairy 1", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_KF_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0901, "Bean Sprout Fairy 2", "KF Bean Sprout Fairy 2", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_KF_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0902, "Bean Sprout Fairy 3", "KF Bean Sprout Fairy 3", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0400, "Bean Sprout Near Bridge Fairy 1", "LW Bean Sprout Near Bridge Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0401, "Bean Sprout Near Bridge Fairy 2", "LW Bean Sprout Near Bridge Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0402, "Bean Sprout Near Bridge Fairy 3", "LW Bean Sprout Near Bridge Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1200, "Bean Sprout Near Theatre Fairy 1", "LW Bean Sprout Near Theatre Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1201, "Bean Sprout Near Theatre Fairy 2", "LW Bean Sprout Near Theatre Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1202, "Bean Sprout Near Theatre Fairy 3", "LW Bean Sprout Near Theatre Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3)); - locationTable[RC_LH_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0100, "Bean Sprout Fairy 1", "LH Bean Sprout Fairy 1", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_LH_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0101, "Bean Sprout Fairy 2", "LH Bean Sprout Fairy 2", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_LH_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0102, "Bean Sprout Fairy 3", "LH Bean Sprout Fairy 3", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_GV_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0300, "Bean Sprout Fairy 1", "GV Bean Sprout Fairy 1", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_GV_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0301, "Bean Sprout Fairy 2", "GV Bean Sprout Fairy 2", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_GV_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0302, "Bean Sprout Fairy 3", "GV Bean Sprout Fairy 3", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1800, "Bean Sprout Fairy 1", "Col Bean Sprout Fairy 1", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1801, "Bean Sprout Fairy 2", "Col Bean Sprout Fairy 2", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1802, "Bean Sprout Fairy 3", "Col Bean Sprout Fairy 3", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0300, "Bean Sprout Fairy 1", "GY Bean Sprout Fairy 1", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0301, "Bean Sprout Fairy 2", "GY Bean Sprout Fairy 2", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0302, "Bean Sprout Fairy 3", "GY Bean Sprout Fairy 3", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_DMC_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0300, "Bean Sprout Fairy 1", "DMC Bean Sprout Fairy 1", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_DMC_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0301, "Bean Sprout Fairy 2", "DMC Bean Sprout Fairy 2", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_DMC_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0302, "Bean Sprout Fairy 3", "DMC Bean Sprout Fairy 3", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_DMT_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0600, "Bean Sprout Fairy 1", "DMT Bean Sprout Fairy 1", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, "Bean Sprout Fairy 2", "DMT Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, "Bean Sprout Fairy 3", "DMT Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, "Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, "Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0302, "Bean Sprout Fairy 3", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0900, "Bean Sprout Fairy 1", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0901, "Bean Sprout Fairy 2", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0902, "Bean Sprout Fairy 3", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0400, "Bean Sprout Near Bridge Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0401, "Bean Sprout Near Bridge Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0402, "Bean Sprout Near Bridge Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1200, "Bean Sprout Near Theatre Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1201, "Bean Sprout Near Theatre Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1202, "Bean Sprout Near Theatre Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3)); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0100, "Bean Sprout Fairy 1", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0101, "Bean Sprout Fairy 2", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0102, "Bean Sprout Fairy 3", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0300, "Bean Sprout Fairy 1", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0301, "Bean Sprout Fairy 2", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0302, "Bean Sprout Fairy 3", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1800, "Bean Sprout Fairy 1", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1801, "Bean Sprout Fairy 2", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1802, "Bean Sprout Fairy 3", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0300, "Bean Sprout Fairy 1", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0301, "Bean Sprout Fairy 2", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0302, "Bean Sprout Fairy 3", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0300, "Bean Sprout Fairy 1", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0301, "Bean Sprout Fairy 2", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0302, "Bean Sprout Fairy 3", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0600, "Bean Sprout Fairy 1", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, "Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, "Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), "ToT Left Gossip Stone Fairy", "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -680), "ToT Left Gossip Stone Big Fairy", "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), "ToT Left Center Gossip Stone Fairy", "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -615), "ToT Left Center Gossip Stone Big Fairy", "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), "ToT Right Center Gossip Stone Fairy", "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -550), "ToT Right Center Gossip Stone Big Fairy", "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), "ToT Right Gossip Stone Fairy", "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -485), "ToT Right Gossip Stone Big Fairy", "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMC_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS( 0, 1656), "Gossip Stone Fairy", "DMC Gossip Stone Fairy", RHT_DMC_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMC_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(0x1000, 1656), "Gossip Stone Big Fairy", "DMC Gossip Stone Big Fairy", RHT_DMC_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS( 0, -3935), "Gossip Stone Fairy", "DMT Gossip Stone Fairy", RHT_DMT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, -3935), "Gossip Stone Big Fairy", "DMT Gossip Stone Big Fairy", RHT_DMT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS( 0, 1320), "Gossip Stone Fairy", "Col Gossip Stone Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY)); - locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(0x1000, 1320), "Gossip Stone Big Fairy", "Col Gossip Stone Big Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -1520), "Gossip Stone Fairy", "DC Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY)); - locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -1520), "Gossip Stone Big Fairy", "DC Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -916), "MQ Gossip Stone Fairy", "DC MQ Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY)); - locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -916), "MQ Gossip Stone Big Fairy", "DC MQ Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GV_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS( 0, -2340), "Gossip Stone Fairy", "GV Gossip Stone Fairy", RHT_GV_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY)); - locationTable[RC_GV_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(0x1000, -2340), "Gossip Stone Big Fairy", "GV Gossip Stone Big Fairy", RHT_GV_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, -1265), "Maze Gossip Stone Fairy", "GC Maze Gossip Stone Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY)); - locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, -1265), "Maze Gossip Stone Big Fairy", "GC Maze Gossip Stone Big Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, 1496), "Medigoron Gossip Stone Fairy", "GC Medigoron Gossip Stone Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY)); - locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, 1496), "Medigoron Gossip Stone Big Fairy", "GC Medigoron Gossip Stone Big Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS( 0, -75), "Gossip Stone Fairy", "GY Gossip Stone Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY)); - locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(0x1000, -75), "Gossip Stone Big Fairy", "GY Gossip Stone Big Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 3445), "Malon Gossip Stone Fairy", "HC Malon Gossip Stone Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY)); - locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 3445), "Malon Gossip Stone Big Fairy", "HC Malon Gossip Stone Big Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 1041), "Rock Wall Gossip Stone Fairy", "HC Rock Wall Gossip Stone Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY)); - locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 1041), "Rock Wall Gossip Stone Big Fairy", "HC Rock Wall Gossip Stone Big Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xC, 735), "Storms Grotto Gossip Stone Fairy", "HC Storms Grotto Gossip Stone Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100C, 735), "Storms Grotto Gossip Stone Big Fairy", "HC Storms Grotto Gossip Stone Big Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -2230), "Deku Tree Left Gossip Stone Fairy", "KF Deku Tree Left Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -2230), "Deku Tree Left Gossip Stone Big Fairy", "KF Deku Tree Left Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -700), "Deku Tree Right Gossip Stone Fairy", "KF Deku Tree Right Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -700), "Deku Tree Right Gossip Stone Big Fairy", "KF Deku Tree Right Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -1223), "Gossip Stone Fairy", "KF Gossip Stone Fairy", RHT_KF_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -1223), "Gossip Stone Big Fairy", "KF Gossip Stone Big Fairy", RHT_KF_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1B, -236), "Storms Gossip Stone Fairy", "KF Storms Gossip Stone Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101B, -236), "Storms Gossip Stone Big Fairy", "KF Storms Gossip Stone Big Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 3212), "Lab Gossip Stone Fairy", "LH Lab Gossip Stone Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY)); - locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 3212), "Lab Gossip Stone Big Fairy", "LH Lab Gossip Stone Big Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 8395), "Southeast Gossip Stone Fairy", "LH Southeast Gossip Stone Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY)); - locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 8395), "Southeast Gossip Stone Big Fairy", "LH Southeast Gossip Stone Big Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 7984), "Southwest Gossip Stone Fairy", "LH Southwest Gossip Stone Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY)); - locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7984), "Southwest Gossip Stone Big Fairy", "LH Southwest Gossip Stone Big Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LW_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS( 0, 2300), "Gossip Stone Fairy", "LW Gossip Stone Fairy", RHT_LW_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY)); - locationTable[RC_LW_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, 2300), "Gossip Stone Big Fairy", "LW Gossip Stone Big Fairy", RHT_LW_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 1370), "Maze Lower Gossip Stone Fairy", "SFM Maze Lower Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY)); - locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 1370), "Maze Lower Gossip Stone Big Fairy", "SFM Maze Lower Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 740), "Maze Upper Gossip Stone Fairy", "SFM Maze Upper Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY)); - locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 740), "Maze Upper Gossip Stone Big Fairy", "SFM Maze Upper Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, -2300), "Saria Gossip Stone Fairy", "SFM Saria Gossip Stone Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY)); - locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, -2300), "Saria Gossip Stone Big Fairy", "SFM Saria Gossip Stone Big Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS( 0, -1600), "Gossip Stone Fairy", "ZD Gossip Stone Fairy", RHT_ZD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(0x1000, -1600), "Gossip Stone Big Fairy", "ZD Gossip Stone Big Fairy", RHT_ZD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, 2205), "Fairy Gossip Stone Fairy", "ZF Fairy Gossip Stone Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, 2205), "Fairy Gossip Stone Big Fairy", "ZF Fairy Gossip Stone Big Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, -985), "Jabu Gossip Stone Fairy", "ZF Jabu Gossip Stone Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, -985), "Jabu Gossip Stone Big Fairy", "ZF Jabu Gossip Stone Big Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1070), "Near Grottos Gossip Stone Fairy", "ZR Near Grottos Gossip Stone Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1070), "Near Grottos Gossip Stone Big Fairy", "ZR Near Grottos Gossip Stone Big Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1650), "Near Domain Gossip Stone Fairy", "ZR Near Domain Gossip Stone Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1650), "Near Domain Gossip Stone Big Fairy", "ZR Near Domain Gossip Stone Big Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x11, -357), "Cow Grotto Gossip Stone Fairy", "HF Cow Grotto Gossip Stone Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1011, -357), "Cow Grotto Gossip Stone Big Fairy", "HF Cow Grotto Gossip Stone Big Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x10, -236), "Near Market Gossip Stone Fairy", "HF Near Market Gossip Stone Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1010, -236), "Near Market Gossip Stone Big Fairy", "HF Near Market Gossip Stone Big Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x14, -236), "Southeast Gossip Stone Fairy", "HF Southeast Gossip Stone Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1014, -236), "Southeast Gossip Stone Big Fairy", "HF Southeast Gossip Stone Big Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x13, -236), "Open Grotto Gossip Stone Fairy", "HF Open Grotto Gossip Stone Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1013, -236), "Open Grotto Gossip Stone Big Fairy", "HF Open Grotto Gossip Stone Big Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xA, -236), "Open Grotto Gossip Stone Fairy", "Kak Open Grotto Gossip Stone Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100A, -236), "Open Grotto Gossip Stone Big Fairy", "Kak Open Grotto Gossip Stone Big Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x4, -236), "Open Grotto Gossip Stone Fairy", "ZR Open Grotto Gossip Stone Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1004, -236), "Open Grotto Gossip Stone Big Fairy", "ZR Open Grotto Gossip Stone Big Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1A, -236), "Near Shortcuts Gossip Stone Fairy", "LW Near Shortcuts Gossip Stone Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101A, -236), "Near Shortcuts Gossip Stone Big Fairy", "LW Near Shortcuts Gossip Stone Big Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x8, -236), "Storms Grotto Gossip Stone Fairy", "DMT Storms Grotto Gossip Stone Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1008, -236), "Storms Grotto Gossip Stone Big Fairy", "DMT Storms Grotto Gossip Stone Big Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x6, -236), "Upper Grotto Gossip Stone Fairy", "DMC Upper Grotto Gossip Stone Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1006, -236), "Upper Grotto Gossip Stone Big Fairy", "DMC Upper Grotto Gossip Stone Big Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -680), "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -615), "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -550), "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -485), "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMC_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS( 0, 1656), "Gossip Stone Fairy", RHT_DMC_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMC_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(0x1000, 1656), "Gossip Stone Big Fairy", RHT_DMC_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS( 0, -3935), "Gossip Stone Fairy", RHT_DMT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, -3935), "Gossip Stone Big Fairy", RHT_DMT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS( 0, 1320), "Gossip Stone Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY)); + locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(0x1000, 1320), "Gossip Stone Big Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -1520), "Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY)); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -1520), "Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -916), "MQ Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY)); + locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -916), "MQ Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GV_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS( 0, -2340), "Gossip Stone Fairy", RHT_GV_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY)); + locationTable[RC_GV_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(0x1000, -2340), "Gossip Stone Big Fairy", RHT_GV_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, -1265), "Maze Gossip Stone Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY)); + locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, -1265), "Maze Gossip Stone Big Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, 1496), "Medigoron Gossip Stone Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY)); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, 1496), "Medigoron Gossip Stone Big Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS( 0, -75), "Gossip Stone Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY)); + locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(0x1000, -75), "Gossip Stone Big Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 3445), "Malon Gossip Stone Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY)); + locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 3445), "Malon Gossip Stone Big Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 1041), "Rock Wall Gossip Stone Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY)); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 1041), "Rock Wall Gossip Stone Big Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xC, 735), "Storms Grotto Gossip Stone Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100C, 735), "Storms Grotto Gossip Stone Big Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -2230), "Deku Tree Left Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -2230), "Deku Tree Left Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -700), "Deku Tree Right Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -700), "Deku Tree Right Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -1223), "Gossip Stone Fairy", RHT_KF_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -1223), "Gossip Stone Big Fairy", RHT_KF_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1B, -236), "Storms Gossip Stone Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101B, -236), "Storms Gossip Stone Big Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 3212), "Lab Gossip Stone Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY)); + locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 3212), "Lab Gossip Stone Big Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 8395), "Southeast Gossip Stone Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY)); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 8395), "Southeast Gossip Stone Big Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 7984), "Southwest Gossip Stone Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY)); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7984), "Southwest Gossip Stone Big Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LW_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS( 0, 2300), "Gossip Stone Fairy", RHT_LW_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY)); + locationTable[RC_LW_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, 2300), "Gossip Stone Big Fairy", RHT_LW_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 1370), "Maze Lower Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY)); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 1370), "Maze Lower Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 740), "Maze Upper Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY)); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 740), "Maze Upper Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, -2300), "Saria Gossip Stone Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY)); + locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, -2300), "Saria Gossip Stone Big Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS( 0, -1600), "Gossip Stone Fairy", RHT_ZD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(0x1000, -1600), "Gossip Stone Big Fairy", RHT_ZD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, 2205), "Fairy Gossip Stone Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, 2205), "Fairy Gossip Stone Big Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, -985), "Jabu Gossip Stone Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, -985), "Jabu Gossip Stone Big Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1070), "Near Grottos Gossip Stone Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1070), "Near Grottos Gossip Stone Big Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1650), "Near Domain Gossip Stone Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1650), "Near Domain Gossip Stone Big Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x11, -357), "Cow Grotto Gossip Stone Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1011, -357), "Cow Grotto Gossip Stone Big Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x10, -236), "Near Market Gossip Stone Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1010, -236), "Near Market Gossip Stone Big Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x14, -236), "Southeast Gossip Stone Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1014, -236), "Southeast Gossip Stone Big Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x13, -236), "Open Grotto Gossip Stone Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1013, -236), "Open Grotto Gossip Stone Big Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xA, -236), "Open Grotto Gossip Stone Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100A, -236), "Open Grotto Gossip Stone Big Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x4, -236), "Open Grotto Gossip Stone Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1004, -236), "Open Grotto Gossip Stone Big Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1A, -236), "Tunnel Grotto Gossip Stone Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101A, -236), "Tunnel Grotto Gossip Stone Big Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x8, -236), "Storms Grotto Gossip Stone Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1008, -236), "Storms Grotto Gossip Stone Big Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x6, -236), "Upper Grotto Gossip Stone Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1006, -236), "Upper Grotto Gossip Stone Big Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LH_ISLAND_SUN_FAIRY] = Location::Fairy(RC_LH_ISLAND_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7319), "Island Sun's Song Fairy", "Island Sun's Song Fairy", RHT_LH_ISLAND_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_ISLAND_SUN_FAIRY)); - locationTable[RC_HF_POND_STORMS_FAIRY] = Location::Fairy(RC_HF_POND_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(0x1000, 5012), "Pond Song of Storms Fairy", "Pond Song of Storms Fairy", RHT_HF_POND_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_POND_STORMS_FAIRY)); - locationTable[RC_HF_FENCE_GROTTO_STORMS_FAIRY] = Location::Fairy(RC_HF_FENCE_GROTTO_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, -308), "Inside Fence Storms Fairy", "Inside Fence Storms Fairy", RHT_HF_FENCE_GROTTO_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY)); - locationTable[RC_DMT_FLAG_SUN_FAIRY] = Location::Fairy(RC_DMT_FLAG_SUN_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, 464), "Flag Sun's Song Fairy", "Flag Sun's Song Fairy", RHT_DMT_FLAG_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_FLAG_SUN_FAIRY)); - locationTable[RC_DMT_COW_GROTTO_STORMS_FAIRY] = Location::Fairy(RC_DMT_COW_GROTTO_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, -311), "Cow Grotto Song of Storms Fairy", "Cow Grotto Song of Storms Fairy", RHT_DMT_COW_GROTTO_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY)); - locationTable[RC_LW_SHORTCUT_STORMS_FAIRY] = Location::Fairy(RC_LW_SHORTCUT_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, -795), "Shortcuts Song of Storms Fairy", "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_STORMS_FAIRY)); - locationTable[RC_GF_KITCHEN_SUN_FAIRY] = Location::Fairy(RC_GF_KITCHEN_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(0x1000, -621), "Kitchen Sun's Song Fairy", "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_SUN_FAIRY)); - locationTable[RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY] = Location::Fairy(RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, 741), "Scrub Grotto Sun's Song Fairy", "Scrub Grotto Sun's Song Fairy", RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY)); - locationTable[RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = Location::Fairy(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_ROYAL_FAMILYS_TOMB, TWO_ACTOR_PARAMS(0x1000, 1476), "Composer's Grave Sun's Song Fairy", "Composer's Grave Sun's Song Fairy", RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY)); + locationTable[RC_LH_ISLAND_SUN_FAIRY] = Location::Fairy(RC_LH_ISLAND_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7319), "Island Sun's Song Fairy", RHT_LH_ISLAND_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_ISLAND_SUN_FAIRY)); + locationTable[RC_HF_POND_STORMS_FAIRY] = Location::Fairy(RC_HF_POND_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(0x1000, 5012), "Pond Song of Storms Fairy", RHT_HF_POND_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_POND_STORMS_FAIRY)); + locationTable[RC_HF_FENCE_GROTTO_STORMS_FAIRY] = Location::Fairy(RC_HF_FENCE_GROTTO_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, -308), "Deku Scrub Grotto Storms Fairy", RHT_HF_FENCE_GROTTO_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY)); + locationTable[RC_DMT_FLAG_SUN_FAIRY] = Location::Fairy(RC_DMT_FLAG_SUN_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, 464), "Flag Sun's Song Fairy", RHT_DMT_FLAG_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_FLAG_SUN_FAIRY)); + locationTable[RC_DMT_COW_GROTTO_STORMS_FAIRY] = Location::Fairy(RC_DMT_COW_GROTTO_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, -311), "Cow Grotto Song of Storms Fairy", RHT_DMT_COW_GROTTO_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY)); + locationTable[RC_LW_SHORTCUT_STORMS_FAIRY] = Location::Fairy(RC_LW_SHORTCUT_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, -795), "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_STORMS_FAIRY)); + locationTable[RC_TH_KITCHEN_SUN_FAIRY] = Location::Fairy(RC_TH_KITCHEN_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(0x1000, -621), "Kitchen Sun's Song Fairy", RHT_TH_KITCHEN_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_KITCHEN_SUN_FAIRY)); + locationTable[RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY] = Location::Fairy(RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, 741), "Scrub Grotto Sun's Song Fairy", RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY)); + locationTable[RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = Location::Fairy(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_ROYAL_FAMILYS_TOMB, TWO_ACTOR_PARAMS(0x1000, 1476), "Royal Family's Tomb Sun's Song Fairy", RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY)); - locationTable[RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1896), "After Boulder Room Sun's Song Fairy", "After Boulder Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY)); - locationTable[RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), "Four Armos Room Sun's Song Fairy", "Four Armos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 54), "Beamos Song of Storms Fairy", "Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3339), "Pit Room Song of Storms Fairy", "Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "Wind Hint Sun's Song Fairy", "Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), "Basement Sun's Song Fairy", "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY)); - locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), "Entrance Song of Storms Fairy", "Ice Cavern Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY)); - locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_GERUDO_TRAINING_GROUND,SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), "Entrance Song of Storms Fairy", "GTG Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), "Spirit Trial Beamos Sun's Song Fairy", "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY)); + locationTable[RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1896), "After Boulder Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY)); + locationTable[RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), "Four Armos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 54), "Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3339), "Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY)); + locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), "Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY)); + locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_GERUDO_TRAINING_GROUND,SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), "Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY)); - locationTable[RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -551), "MQ Lower Loop Stalfos Room Sun's Song Fairy", "MQ Lower Loop Stalfos Room Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY)); - locationTable[RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1563), "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY)); - locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -540), "MQ Before Dark Link Pilar Sun's Song Fairy", "MQ Before Dark Link Pilar Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY)); - locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1501), "MQ Before Dark Link Left Song of Storms Fairy", "MQ Before Dark Link Left Song of Storms Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY)); - locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1504), "MQ Before Dark Link Right Sun's Song Fairy", "MQ Before Dark Link Right Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY)); - locationTable[RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), "MQ Dinalfos Room Sun's Song Fairy", "MQ Dinalfos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 55), "MQ Beamos Song of Storms Fairy", "MQ Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3342), "MQ Pit Room Song of Storms Fairy", "MQ Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "MQ Wind Hint Sun's Song Fairy", "MQ Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), "MQ East Cell Sun's Song Fairy", "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), "MQ Basement Sun's Song Fairy", "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY)); + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -551), "MQ Lower Loop Stalfos Room Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY)); + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1563), "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY)); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -540), "MQ Before Dark Link Pilar Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY)); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1501), "MQ Before Dark Link Left Song of Storms Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY)); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1504), "MQ Before Dark Link Right Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY)); + locationTable[RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), "MQ Dinalfos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 55), "MQ Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3342), "MQ Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "MQ Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY)); + + // clang-format on } -static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFairyLocations); +static ObjectExtension::Register RegisterFairyIdentity; +static RegisterShipInitFunc registerShuffleFairies(RegisterShuffleFairies, { "IS_RANDO" }); +static RegisterShipInitFunc registerShuffleFairiesLocations(Rando::StaticData::RegisterFairyLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.h b/soh/soh/Enhancements/randomizer/ShuffleFairies.h deleted file mode 100644 index 9fcd9ba52f..0000000000 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include -#include "soh/Enhancements/item-tables/ItemTableTypes.h" -#include "randomizer_inf.h" - -typedef struct FairyIdentity { - RandomizerInf randomizerInf; - GetItemEntry itemEntry; -} FairyIdentity; - -void ShuffleFairies_RegisterHooks(); -void ShuffleFairies_UnregisterHooks(); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp index c35cab1074..7291fdbefd 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp @@ -1,17 +1,17 @@ -#include "ShuffleFreestanding.h" +#include extern "C" { +#include "variables.h" #include "functions.h" extern PlayState* gPlayState; } extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); -void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { - va_list args; - va_copy(args, originalArgs); +void RegisterShuffleFreestanding() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_FREESTANDING); - if (id == VB_ITEM00_DESPAWN) { + COND_VB_SHOULD(VB_ITEM00_DESPAWN, shouldRegister, { EnItem00* item00 = va_arg(args, EnItem00*); // Heart pieces and small keys are handled by default non-freestanding shuffles. @@ -20,17 +20,19 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh } uint32_t params = TWO_ACTOR_PARAMS((int32_t)item00->actor.world.pos.x, (int32_t)item00->actor.world.pos.z); - Rando::Location* loc = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(item00->actor.id, gPlayState->sceneNum, params); - uint8_t isDungeon = loc->IsDungeon(); - uint8_t freestandingSetting = - Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_FREESTANDING).Get(); + Rando::Location* loc = + OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(item00->actor.id, gPlayState->sceneNum, params); RandomizerCheck randomizerCheck = loc->GetRandomizerCheck(); - bool checkObtained = Rando::Context::GetInstance()->GetItemLocation(randomizerCheck)->HasObtained(); - + if (Rando::Context::GetInstance()->GetItemLocation(randomizerCheck)->HasObtained()) { + return; + } + uint8_t isDungeon = loc->IsDungeon(); + uint8_t freestandingSetting = RAND_GET_OPTION(RSK_SHUFFLE_FREESTANDING); + // Don't change to randomized item if current freestanding item isn't shuffled or already obtained. if ((freestandingSetting == RO_SHUFFLE_FREESTANDING_OVERWORLD && isDungeon) || - (freestandingSetting == RO_SHUFFLE_FREESTANDING_DUNGEONS && !isDungeon) || - checkObtained || randomizerCheck == RC_UNKNOWN_CHECK) { + (freestandingSetting == RO_SHUFFLE_FREESTANDING_DUNGEONS && !isDungeon) || + randomizerCheck == RC_UNKNOWN_CHECK) { return; } @@ -41,10 +43,15 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; *should = false; - } + }); } void Rando::StaticData::RegisterFreestandingLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off locationTable[RC_KF_BOULDER_RUPEE_2] = Location::Collectable(RC_KF_BOULDER_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-712, 1857), "Boulder Maze Second Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_2)); locationTable[RC_KF_BOULDER_RUPEE_1] = Location::Collectable(RC_KF_BOULDER_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-1009, 1556), "Boulder Maze First Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_1)); locationTable[RC_KF_BRIDGE_RUPEE] = Location::Collectable(RC_KF_BRIDGE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(2, -45), "Bridge Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BRIDGE_RUPEE)); @@ -275,6 +282,9 @@ void Rando::StaticData::RegisterFreestandingLocations() { locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1743, -528), "MQ Water Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART)); locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2506, -1096), "MQ Light Trial Right Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART)); locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2655, -549), "MQ Light Trial Left Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART)); + + // clang-format on } -static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFreestandingLocations); \ No newline at end of file +static RegisterShipInitFunc registerShuffleFreestanding(RegisterShuffleFreestanding, { "IS_RANDO" }); +static RegisterShipInitFunc registerShuffleFreestandingLocations(Rando::StaticData::RegisterFreestandingLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.h b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.h deleted file mode 100644 index 9234f76faa..0000000000 --- a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef SHUFFLE_FREESTANDING_H -#define SHUFFLE_FREESTANDING_H - -#include -#include - -void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs); - -#endif diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp new file mode 100644 index 0000000000..27d42a148a --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp @@ -0,0 +1,534 @@ +#include +#include "soh_assets.h" +#include "static_data.h" +#include "soh/ObjectExtension/ObjectExtension.h" +#include "soh/Enhancements/enhancementTypes.h" + +extern "C" { +#include "variables.h" +#include "overlays/actors/ovl_En_Kusa/z_en_kusa.h" +#include "objects/gameplay_field_keep/gameplay_field_keep.h" +#include "objects/object_kusa/object_kusa.h" +extern PlayState* gPlayState; +} + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +void DrawTypeOfGrass(EnKusa* grassActor, Gfx* bushDList, Gfx* grassDList, PlayState* play) { + // Actor params is -255 for regrowable grass. + if (grassActor->actor.params == -255) { + Gfx_DrawDListOpa(play, grassDList); + } else { + Gfx_DrawDListOpa(play, bushDList); + } +} + +extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) { + // static Gfx* dLists[] = { (Gfx*)gRandoBushDL, (Gfx*)object_kusa_DL_000140, (Gfx*)object_kusa_DL_000140 }; + static Gfx* dLists[] = { (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, (Gfx*)gRandoCuttableGrassJunkDL }; + auto grassActor = ((EnKusa*)thisx); + + const auto grassIdentity = ObjectExtension::GetInstance().Get(thisx); + + OPEN_DISPS(play->state.gfxCtx); + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + if (grassIdentity != nullptr && grassIdentity->randomizerCheck != RC_MAX && + Flags_GetRandomizerInf(grassIdentity->randomizerInf) == 0) { + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + if ((csmc == CSMC_BOTH || csmc == CSMC_TEXTURE) && + (!requiresStoneAgony || (requiresStoneAgony && CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)))) { + auto itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(grassIdentity->randomizerCheck, true, GI_NONE); + GetItemCategory getItemCategory = itemEntry.getItemCategory; + + switch (getItemCategory) { + case ITEM_CATEGORY_JUNK: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, play); + break; + case ITEM_CATEGORY_LESSER: + switch (itemEntry.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushHeartDL, (Gfx*)gRandoCuttableGrassHeartDL, + play); + break; + default: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMinorDL, (Gfx*)gRandoCuttableGrassMinorDL, + play); + break; + } + break; + case ITEM_CATEGORY_BOSS_KEY: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushBossKeyDL, (Gfx*)gRandoCuttableGrassBossKeyDL, play); + break; + case ITEM_CATEGORY_SMALL_KEY: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushSmallKeyDL, (Gfx*)gRandoCuttableGrassSmallKeyDL, play); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushTokenDL, (Gfx*)gRandoCuttableGrassTokenDL, play); + break; + case ITEM_CATEGORY_MAJOR: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMajorDL, (Gfx*)gRandoCuttableGrassMajorDL, play); + break; + default: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushDL, (Gfx*)gRandoCuttableGrassDL, play); + break; + } + } else { + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushDL, (Gfx*)gRandoCuttableGrassDL, play); + } + } else if (grassActor->actor.flags & ACTOR_FLAG_GRASS_DESTROYED) { + Gfx_DrawDListOpa(play, (Gfx*)object_kusa_DL_0002E0); + } else { + Gfx_DrawDListOpa(play, dLists[thisx->params & 3]); + } + + CLOSE_DISPS(play->state.gfxCtx); +} + +uint8_t EnKusa_RandomizerHoldsItem(EnKusa* grassActor, PlayState* play) { + const auto grassIdentity = ObjectExtension::GetInstance().Get(&grassActor->actor); + + if (grassIdentity == nullptr || grassIdentity->randomizerCheck == RC_MAX) + return false; + + RandomizerCheck rc = grassIdentity->randomizerCheck; + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t grassSetting = RAND_GET_OPTION(RSK_SHUFFLE_GRASS); + + // Don't pull randomized item if grass isn't randomized or is already checked + if (!IS_RANDO || (grassSetting == RO_SHUFFLE_GRASS_OVERWORLD && isDungeon) || + (grassSetting == RO_SHUFFLE_GRASS_DUNGEONS && !isDungeon) || + Flags_GetRandomizerInf(grassIdentity->randomizerInf) || rc == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +void EnKusa_RandomizerSpawnCollectible(EnKusa* grassActor, PlayState* play) { + const auto grassIdentity = ObjectExtension::GetInstance().Get(&grassActor->actor); + if (grassIdentity == nullptr) { + return; + } + + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &grassActor->actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = grassIdentity->randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassIdentity->randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = static_cast(Rand_CenteredFloat(65536.0f)); +} + +void EnKusa_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + + if (actor->id != ACTOR_EN_KUSA) + return; + + EnKusa* grassActor = static_cast(actorRef); + s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); + + auto grassIdentity = OTRGlobals::Instance->gRandomizer->IdentifyGrass( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, respawnData, gPlayState->linkAgeOnLoad); + ObjectExtension::GetInstance().Set(actor, std::move(grassIdentity)); +} + +void RegisterShuffleGrass() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_GRASS); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_KUSA, shouldRegister, EnKusa_RandomizerInit); + + COND_VB_SHOULD(VB_GRASS_SETUP_DRAW, shouldRegister, { + EnKusa* grassActor = va_arg(args, EnKusa*); + if (EnKusa_RandomizerHoldsItem(grassActor, gPlayState)) { + grassActor->actor.draw = (ActorFunc)EnKusa_RandomizerDraw; + *should = false; + } else { + *should = true; + } + }); + + COND_VB_SHOULD(VB_GRASS_DROP_ITEM, shouldRegister, { + EnKusa* grassActor = va_arg(args, EnKusa*); + if (EnKusa_RandomizerHoldsItem(grassActor, gPlayState)) { + EnKusa_RandomizerSpawnCollectible(grassActor, gPlayState); + ObjectExtension::GetInstance().Set(&grassActor->actor, std::move(GrassIdentity{ + .randomizerInf = RAND_INF_MAX, + .randomizerCheck = RC_MAX, + })); + *should = false; + } else { + *should = true; + } + }); +} + +void Rando::StaticData::RegisterGrassLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + // Overworld Grass + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_KF_CHILD_GRASS_1] = Location::Grass(RC_KF_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(678, 596), "Child Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_1)); + locationTable[RC_KF_CHILD_GRASS_2] = Location::Grass(RC_KF_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(594, 542), "Child Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_2)); + locationTable[RC_KF_CHILD_GRASS_3] = Location::Grass(RC_KF_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(572, 603), "Child Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_3)); + locationTable[RC_KF_CHILD_GRASS_4] = Location::Grass(RC_KF_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(385, 643), "Child Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_4)); + locationTable[RC_KF_CHILD_GRASS_5] = Location::Grass(RC_KF_CHILD_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 696), "Child Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_5)); + locationTable[RC_KF_CHILD_GRASS_6] = Location::Grass(RC_KF_CHILD_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 771), "Child Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_6)); + locationTable[RC_KF_CHILD_GRASS_7] = Location::Grass(RC_KF_CHILD_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-612, 737), "Child Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_7)); + locationTable[RC_KF_CHILD_GRASS_8] = Location::Grass(RC_KF_CHILD_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-671, 671), "Child Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_8)); + locationTable[RC_KF_CHILD_GRASS_9] = Location::Grass(RC_KF_CHILD_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-748, 632), "Child Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_9)); + locationTable[RC_KF_CHILD_GRASS_10] = Location::Grass(RC_KF_CHILD_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-757, 708), "Child Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_10)); + locationTable[RC_KF_CHILD_GRASS_11] = Location::Grass(RC_KF_CHILD_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-823, 666), "Child Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_11)); + locationTable[RC_KF_CHILD_GRASS_12] = Location::Grass(RC_KF_CHILD_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-835, 605), "Child Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_12)); + locationTable[RC_KF_CHILD_GRASS_MAZE_1] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-995, 1531), "Child Grass Maze 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_1)); + locationTable[RC_KF_CHILD_GRASS_MAZE_2] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-701, 1882), "Child Grass Maze 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_2)); + locationTable[RC_KF_CHILD_GRASS_MAZE_3] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-295, 2297), "Child Grass Maze 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_3)); + locationTable[RC_KF_ADULT_GRASS_1] = Location::Grass(RC_KF_ADULT_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(839, 685), "Adult Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_1)); + locationTable[RC_KF_ADULT_GRASS_2] = Location::Grass(RC_KF_ADULT_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(809, 722), "Adult Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_2)); + locationTable[RC_KF_ADULT_GRASS_3] = Location::Grass(RC_KF_ADULT_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(760, 714), "Adult Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_3)); + locationTable[RC_KF_ADULT_GRASS_4] = Location::Grass(RC_KF_ADULT_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 679), "Adult Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_4)); + locationTable[RC_KF_ADULT_GRASS_5] = Location::Grass(RC_KF_ADULT_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 606), "Adult Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_5)); + locationTable[RC_KF_ADULT_GRASS_6] = Location::Grass(RC_KF_ADULT_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 563), "Adult Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_6)); + locationTable[RC_KF_ADULT_GRASS_7] = Location::Grass(RC_KF_ADULT_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(868, 606), "Adult Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_7)); + locationTable[RC_KF_ADULT_GRASS_8] = Location::Grass(RC_KF_ADULT_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 663), "Adult Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_8)); + locationTable[RC_KF_ADULT_GRASS_9] = Location::Grass(RC_KF_ADULT_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(757, 649), "Adult Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_9)); + locationTable[RC_KF_ADULT_GRASS_10] = Location::Grass(RC_KF_ADULT_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(773, 610), "Adult Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_10)); + locationTable[RC_KF_ADULT_GRASS_11] = Location::Grass(RC_KF_ADULT_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(815, 607), "Adult Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_11)); + locationTable[RC_KF_ADULT_GRASS_12] = Location::Grass(RC_KF_ADULT_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(836, 636), "Adult Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_12)); + locationTable[RC_KF_ADULT_GRASS_13] = Location::Grass(RC_KF_ADULT_GRASS_13, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-772, 654), "Adult Grass 13", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_13)); + locationTable[RC_KF_ADULT_GRASS_14] = Location::Grass(RC_KF_ADULT_GRASS_14, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-785, 611), "Adult Grass 14", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_14)); + locationTable[RC_KF_ADULT_GRASS_15] = Location::Grass(RC_KF_ADULT_GRASS_15, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-805, 691), "Adult Grass 15", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_15)); + locationTable[RC_KF_ADULT_GRASS_16] = Location::Grass(RC_KF_ADULT_GRASS_16, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-822, 644), "Adult Grass 16", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_16)); + locationTable[RC_KF_ADULT_GRASS_17] = Location::Grass(RC_KF_ADULT_GRASS_17, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-842, 601), "Adult Grass 17", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_17)); + locationTable[RC_KF_ADULT_GRASS_18] = Location::Grass(RC_KF_ADULT_GRASS_18, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-867, 674), "Adult Grass 18", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_18)); + locationTable[RC_KF_ADULT_GRASS_19] = Location::Grass(RC_KF_ADULT_GRASS_19, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 0xFF), "Adult Grass 19", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_19)); + locationTable[RC_KF_ADULT_GRASS_20] = Location::Grass(RC_KF_ADULT_GRASS_20, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 0xFF), "Adult Grass 20", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_20)); + locationTable[RC_LW_GRASS_1] = Location::Grass(RC_LW_GRASS_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(676, -651), "Near Shortcuts Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_1)); + locationTable[RC_LW_GRASS_2] = Location::Grass(RC_LW_GRASS_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(633, -676), "Near Shortcuts Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_2)); + locationTable[RC_LW_GRASS_3] = Location::Grass(RC_LW_GRASS_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(645, -638), "Near Shortcuts Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_3)); + locationTable[RC_LW_GRASS_4] = Location::Grass(RC_LW_GRASS_4, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1476, -2251), "After Mido Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_4)); + locationTable[RC_LW_GRASS_5] = Location::Grass(RC_LW_GRASS_5, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1433, -2276), "After Mido Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_5)); + locationTable[RC_LW_GRASS_6] = Location::Grass(RC_LW_GRASS_6, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1445, -2238), "After Mido Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_6)); + locationTable[RC_LW_GRASS_7] = Location::Grass(RC_LW_GRASS_7, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(926, -2232), "Near SFM Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_7)); + locationTable[RC_LW_GRASS_8] = Location::Grass(RC_LW_GRASS_8, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(965, -2241), "Near SFM Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_8)); + locationTable[RC_LW_GRASS_9] = Location::Grass(RC_LW_GRASS_9, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(952, -2275), "Near SFM Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_9)); + locationTable[RC_MARKET_GRASS_1] = Location::Grass(RC_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-106, 277), "Market Grass 1", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_1)); + locationTable[RC_MARKET_GRASS_2] = Location::Grass(RC_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-131, 225), "Market Grass 2", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_2)); + locationTable[RC_MARKET_GRASS_3] = Location::Grass(RC_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(504, -546), "Market Grass 3", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_3)); + locationTable[RC_MARKET_GRASS_4] = Location::Grass(RC_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(465, -548), "Market Grass 4", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_4)); + locationTable[RC_MARKET_GRASS_5] = Location::Grass(RC_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(432, -548), "Market Grass 5", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_5)); + locationTable[RC_MARKET_GRASS_6] = Location::Grass(RC_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(73, -428), "Market Grass 6", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_6)); + locationTable[RC_MARKET_GRASS_7] = Location::Grass(RC_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(75, -310), "Market Grass 7", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_7)); + locationTable[RC_MARKET_GRASS_8] = Location::Grass(RC_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(76, -190), "Market Grass 8", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_8)); + locationTable[RC_HC_GRASS_1] = Location::Grass(RC_HC_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1035, 882), "Near Storms Grotto Grass 1", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_1)); + locationTable[RC_HC_GRASS_2] = Location::Grass(RC_HC_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(975, 919), "Near Storms Grotto Grass 2", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_2)); + locationTable[RC_KAK_GRASS_1] = Location::Grass(RC_KAK_GRASS_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1116, 1581), "Near Graveyard Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_1)); + locationTable[RC_KAK_GRASS_2] = Location::Grass(RC_KAK_GRASS_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1103, 1532), "Near Graveyard Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_2)); + locationTable[RC_KAK_GRASS_3] = Location::Grass(RC_KAK_GRASS_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1072, 1592), "Near Graveyard Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_3)); + locationTable[RC_KAK_GRASS_4] = Location::Grass(RC_KAK_GRASS_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-800, 521), "Tree Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_4)); + locationTable[RC_KAK_GRASS_5] = Location::Grass(RC_KAK_GRASS_5, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-826, 585), "Tree Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_5)); + locationTable[RC_KAK_GRASS_6] = Location::Grass(RC_KAK_GRASS_6, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-827, 465), "Tree Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_6)); + locationTable[RC_KAK_GRASS_7] = Location::Grass(RC_KAK_GRASS_7, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-883, 582), "Tree Grass 4", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_7)); + locationTable[RC_KAK_GRASS_8] = Location::Grass(RC_KAK_GRASS_8, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-887, 467), "Tree Grass 5", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_8)); + locationTable[RC_GY_GRASS_1] = Location::Grass(RC_GY_GRASS_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1059, 732), "Graveyard Grass 1", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_1)); + locationTable[RC_GY_GRASS_2] = Location::Grass(RC_GY_GRASS_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1089, 769), "Graveyard Grass 2", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_2)); + locationTable[RC_GY_GRASS_3] = Location::Grass(RC_GY_GRASS_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1138, 761), "Graveyard Grass 3", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_3)); + locationTable[RC_GY_GRASS_4] = Location::Grass(RC_GY_GRASS_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 726), "Graveyard Grass 4", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_4)); + locationTable[RC_GY_GRASS_5] = Location::Grass(RC_GY_GRASS_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 653), "Graveyard Grass 5", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_5)); + locationTable[RC_GY_GRASS_6] = Location::Grass(RC_GY_GRASS_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 610), "Graveyard Grass 6", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_6)); + locationTable[RC_GY_GRASS_7] = Location::Grass(RC_GY_GRASS_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1030, 653), "Graveyard Grass 7", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_7)); + locationTable[RC_GY_GRASS_8] = Location::Grass(RC_GY_GRASS_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 710), "Graveyard Grass 8", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_8)); + locationTable[RC_GY_GRASS_9] = Location::Grass(RC_GY_GRASS_9, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1141, 696), "Graveyard Grass 9", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_9)); + locationTable[RC_GY_GRASS_10] = Location::Grass(RC_GY_GRASS_10, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1125, 657), "Graveyard Grass 10", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_10)); + locationTable[RC_GY_GRASS_11] = Location::Grass(RC_GY_GRASS_11, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1083, 654), "Graveyard Grass 11", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_11)); + locationTable[RC_GY_GRASS_12] = Location::Grass(RC_GY_GRASS_12, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1062, 683), "Graveyard Grass 12", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_12)); + locationTable[RC_LH_GRASS_1] = Location::Grass(RC_LH_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1637, 2796), "LH Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_1)); + locationTable[RC_LH_GRASS_2] = Location::Grass(RC_LH_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1667, 2833), "LH Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_2)); + locationTable[RC_LH_GRASS_3] = Location::Grass(RC_LH_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1716, 2825), "LH Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_3)); + locationTable[RC_LH_GRASS_4] = Location::Grass(RC_LH_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2790), "LH Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_4)); + locationTable[RC_LH_GRASS_5] = Location::Grass(RC_LH_GRASS_5, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2717), "LH Grass 5", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_5)); + locationTable[RC_LH_GRASS_6] = Location::Grass(RC_LH_GRASS_6, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2674), "LH Grass 6", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_6)); + locationTable[RC_LH_GRASS_7] = Location::Grass(RC_LH_GRASS_7, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1608, 2717), "LH Grass 7", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_7)); + locationTable[RC_LH_GRASS_8] = Location::Grass(RC_LH_GRASS_8, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2774), "LH Grass 8", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_8)); + locationTable[RC_LH_GRASS_9] = Location::Grass(RC_LH_GRASS_9, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1719, 2760), "LH Grass 9", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_9)); + locationTable[RC_LH_GRASS_10] = Location::Grass(RC_LH_GRASS_10, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1703, 2721), "LH Grass 10", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_10)); + locationTable[RC_LH_GRASS_11] = Location::Grass(RC_LH_GRASS_11, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1661, 2718), "LH Grass 11", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_11)); + locationTable[RC_LH_GRASS_12] = Location::Grass(RC_LH_GRASS_12, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1640, 2747), "LH Grass 12", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_12)); + locationTable[RC_LH_GRASS_13] = Location::Grass(RC_LH_GRASS_13, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2028, 2542), "LH Grass 13", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_13)); + locationTable[RC_LH_GRASS_14] = Location::Grass(RC_LH_GRASS_14, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2058, 2579), "LH Grass 14", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_14)); + locationTable[RC_LH_GRASS_15] = Location::Grass(RC_LH_GRASS_15, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2107, 2571), "LH Grass 15", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_15)); + locationTable[RC_LH_GRASS_16] = Location::Grass(RC_LH_GRASS_16, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2536), "LH Grass 16", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_16)); + locationTable[RC_LH_GRASS_17] = Location::Grass(RC_LH_GRASS_17, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2463), "LH Grass 17", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_17)); + locationTable[RC_LH_GRASS_18] = Location::Grass(RC_LH_GRASS_18, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2420), "LH Grass 18", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_18)); + locationTable[RC_LH_GRASS_19] = Location::Grass(RC_LH_GRASS_19, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1999, 2463), "LH Grass 19", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_19)); + locationTable[RC_LH_GRASS_20] = Location::Grass(RC_LH_GRASS_20, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2520), "LH Grass 20", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_20)); + locationTable[RC_LH_GRASS_21] = Location::Grass(RC_LH_GRASS_21, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2110, 2506), "LH Grass 21", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_21)); + locationTable[RC_LH_GRASS_22] = Location::Grass(RC_LH_GRASS_22, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2094, 2467), "LH Grass 22", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_22)); + locationTable[RC_LH_GRASS_23] = Location::Grass(RC_LH_GRASS_23, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2052, 2464), "LH Grass 23", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_23)); + locationTable[RC_LH_GRASS_24] = Location::Grass(RC_LH_GRASS_24, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2031, 2493), "LH Grass 24", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_24)); + locationTable[RC_LH_GRASS_25] = Location::Grass(RC_LH_GRASS_25, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2204, 3050), "LH Grass 25", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_25)); + locationTable[RC_LH_GRASS_26] = Location::Grass(RC_LH_GRASS_26, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2234, 3087), "LH Grass 26", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_26)); + locationTable[RC_LH_GRASS_27] = Location::Grass(RC_LH_GRASS_27, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2283, 3079), "LH Grass 27", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_27)); + locationTable[RC_LH_GRASS_28] = Location::Grass(RC_LH_GRASS_28, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 3044), "LH Grass 28", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_28)); + locationTable[RC_LH_GRASS_29] = Location::Grass(RC_LH_GRASS_29, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 2971), "LH Grass 29", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_29)); + locationTable[RC_LH_GRASS_30] = Location::Grass(RC_LH_GRASS_30, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 2928), "LH Grass 30", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_30)); + locationTable[RC_LH_GRASS_31] = Location::Grass(RC_LH_GRASS_31, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2175, 2971), "LH Grass 31", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_31)); + locationTable[RC_LH_GRASS_32] = Location::Grass(RC_LH_GRASS_32, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 3028), "LH Grass 32", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_32)); + locationTable[RC_LH_GRASS_33] = Location::Grass(RC_LH_GRASS_33, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2286, 3014), "LH Grass 33", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_33)); + locationTable[RC_LH_GRASS_34] = Location::Grass(RC_LH_GRASS_34, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2270, 2975), "LH Grass 34", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_34)); + locationTable[RC_LH_GRASS_35] = Location::Grass(RC_LH_GRASS_35, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2228, 2972), "LH Grass 35", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_35)); + locationTable[RC_LH_GRASS_36] = Location::Grass(RC_LH_GRASS_36, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2207, 3001), "LH Grass 36", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_36)); + locationTable[RC_LH_CHILD_GRASS_1] = Location::Grass(RC_LH_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(13, 2735), "LH Child Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_1)); + locationTable[RC_LH_CHILD_GRASS_2] = Location::Grass(RC_LH_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-77, 2891), "LH Child Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_2)); + locationTable[RC_LH_CHILD_GRASS_3] = Location::Grass(RC_LH_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-222, 2888), "LH Child Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_3)); + locationTable[RC_LH_CHILD_GRASS_4] = Location::Grass(RC_LH_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-295, 2973), "LH Child Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_4)); + locationTable[RC_LH_WARP_PAD_GRASS_1] = Location::Grass(RC_LH_WARP_PAD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-613, 7369), "LH Warp Pad Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_1)); + locationTable[RC_LH_WARP_PAD_GRASS_2] = Location::Grass(RC_LH_WARP_PAD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-662, 7352), "LH Warp Pad Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_2)); + locationTable[RC_HF_NEAR_KF_GRASS_1] = Location::Grass(RC_HF_NEAR_KF_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3186, 7571), "Near KF Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_1)); + locationTable[RC_HF_NEAR_KF_GRASS_2] = Location::Grass(RC_HF_NEAR_KF_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3156, 7608), "Near KF Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_2)); + locationTable[RC_HF_NEAR_KF_GRASS_3] = Location::Grass(RC_HF_NEAR_KF_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3107, 7600), "Near KF Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_3)); + locationTable[RC_HF_NEAR_KF_GRASS_4] = Location::Grass(RC_HF_NEAR_KF_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7565), "Near KF Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_4)); + locationTable[RC_HF_NEAR_KF_GRASS_5] = Location::Grass(RC_HF_NEAR_KF_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7492), "Near KF Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_5)); + locationTable[RC_HF_NEAR_KF_GRASS_6] = Location::Grass(RC_HF_NEAR_KF_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7449), "Near KF Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_6)); + locationTable[RC_HF_NEAR_KF_GRASS_7] = Location::Grass(RC_HF_NEAR_KF_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3215, 7492), "Near KF Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_7)); + locationTable[RC_HF_NEAR_KF_GRASS_8] = Location::Grass(RC_HF_NEAR_KF_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7549), "Near KF Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_8)); + locationTable[RC_HF_NEAR_KF_GRASS_9] = Location::Grass(RC_HF_NEAR_KF_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3104, 7535), "Near KF Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_9)); + locationTable[RC_HF_NEAR_KF_GRASS_10] = Location::Grass(RC_HF_NEAR_KF_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3120, 7496), "Near KF Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_10)); + locationTable[RC_HF_NEAR_KF_GRASS_11] = Location::Grass(RC_HF_NEAR_KF_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3162, 7493), "Near KF Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_11)); + locationTable[RC_HF_NEAR_KF_GRASS_12] = Location::Grass(RC_HF_NEAR_KF_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3183, 7522), "Near KF Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_12)); + locationTable[RC_HF_NEAR_MARKET_GRASS_1] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(950, 3613), "Near Market Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_1)); + locationTable[RC_HF_NEAR_MARKET_GRASS_2] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(920, 3650), "Near Market Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_2)); + locationTable[RC_HF_NEAR_MARKET_GRASS_3] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(871, 3642), "Near Market Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_3)); + locationTable[RC_HF_NEAR_MARKET_GRASS_4] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3607), "Near Market Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_4)); + locationTable[RC_HF_NEAR_MARKET_GRASS_5] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3534), "Near Market Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_5)); + locationTable[RC_HF_NEAR_MARKET_GRASS_6] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3491), "Near Market Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_6)); + locationTable[RC_HF_NEAR_MARKET_GRASS_7] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(979, 3534), "Near Market Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_7)); + locationTable[RC_HF_NEAR_MARKET_GRASS_8] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3591), "Near Market Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_8)); + locationTable[RC_HF_NEAR_MARKET_GRASS_9] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(868, 3577), "Near Market Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_9)); + locationTable[RC_HF_NEAR_MARKET_GRASS_10] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(884, 3538), "Near Market Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_10)); + locationTable[RC_HF_NEAR_MARKET_GRASS_11] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(926, 3535), "Near Market Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_11)); + locationTable[RC_HF_NEAR_MARKET_GRASS_12] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(947, 3564), "Near Market Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_12)); + locationTable[RC_HF_SOUTH_GRASS_1] = Location::Grass(RC_HF_SOUTH_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-483, 11329), "South Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_1)); + locationTable[RC_HF_SOUTH_GRASS_2] = Location::Grass(RC_HF_SOUTH_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11294), "South Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_2)); + locationTable[RC_HF_SOUTH_GRASS_3] = Location::Grass(RC_HF_SOUTH_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11221), "South Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_3)); + locationTable[RC_HF_SOUTH_GRASS_4] = Location::Grass(RC_HF_SOUTH_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11178), "South Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_4)); + locationTable[RC_HF_SOUTH_GRASS_5] = Location::Grass(RC_HF_SOUTH_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-375, 11221), "South Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_5)); + locationTable[RC_HF_SOUTH_GRASS_6] = Location::Grass(RC_HF_SOUTH_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11278), "South Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_6)); + locationTable[RC_HF_SOUTH_GRASS_7] = Location::Grass(RC_HF_SOUTH_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-486, 11264), "South Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_7)); + locationTable[RC_HF_SOUTH_GRASS_8] = Location::Grass(RC_HF_SOUTH_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-470, 11225), "South Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_8)); + locationTable[RC_HF_SOUTH_GRASS_9] = Location::Grass(RC_HF_SOUTH_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-428, 11222), "South Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_9)); + locationTable[RC_HF_SOUTH_GRASS_10] = Location::Grass(RC_HF_SOUTH_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-407, 11251), "South Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_10)); + locationTable[RC_HF_SOUTH_GRASS_11] = Location::Grass(RC_HF_SOUTH_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-404, 11300), "South Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_11)); + locationTable[RC_HF_SOUTH_GRASS_12] = Location::Grass(RC_HF_SOUTH_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-434, 11337), "South Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_12)); + locationTable[RC_HF_CENTRAL_GRASS_1] = Location::Grass(RC_HF_CENTRAL_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-948, 9981), "Central Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_1)); + locationTable[RC_HF_CENTRAL_GRASS_2] = Location::Grass(RC_HF_CENTRAL_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-978, 10018), "Central Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_2)); + locationTable[RC_HF_CENTRAL_GRASS_3] = Location::Grass(RC_HF_CENTRAL_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1027, 10010), "Central Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_3)); + locationTable[RC_HF_CENTRAL_GRASS_4] = Location::Grass(RC_HF_CENTRAL_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9975), "Central Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_4)); + locationTable[RC_HF_CENTRAL_GRASS_5] = Location::Grass(RC_HF_CENTRAL_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9902), "Central Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_5)); + locationTable[RC_HF_CENTRAL_GRASS_6] = Location::Grass(RC_HF_CENTRAL_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9859), "Central Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_6)); + locationTable[RC_HF_CENTRAL_GRASS_7] = Location::Grass(RC_HF_CENTRAL_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-919, 9902), "Central Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_7)); + locationTable[RC_HF_CENTRAL_GRASS_8] = Location::Grass(RC_HF_CENTRAL_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9959), "Central Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_8)); + locationTable[RC_HF_CENTRAL_GRASS_9] = Location::Grass(RC_HF_CENTRAL_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1030, 9945), "Central Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_9)); + locationTable[RC_HF_CENTRAL_GRASS_10] = Location::Grass(RC_HF_CENTRAL_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1014, 9906), "Central Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_10)); + locationTable[RC_HF_CENTRAL_GRASS_11] = Location::Grass(RC_HF_CENTRAL_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-972, 9903), "Central Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_11)); + locationTable[RC_HF_CENTRAL_GRASS_12] = Location::Grass(RC_HF_CENTRAL_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-951, 9932), "Central Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_12)); + locationTable[RC_ZR_GRASS_1] = Location::Grass(RC_ZR_GRASS_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1495, 1022), "Near Tree Grass 1", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_1)); + locationTable[RC_ZR_GRASS_2] = Location::Grass(RC_ZR_GRASS_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1465, 985), "Near Tree Grass 2", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_2)); + locationTable[RC_ZR_GRASS_3] = Location::Grass(RC_ZR_GRASS_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1544, 1014), "Near Tree Grass 3", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_3)); + locationTable[RC_ZR_GRASS_4] = Location::Grass(RC_ZR_GRASS_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 979), "Near Tree Grass 4", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_4)); + locationTable[RC_ZR_GRASS_5] = Location::Grass(RC_ZR_GRASS_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 906), "Near Tree Grass 5", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_5)); + locationTable[RC_ZR_GRASS_6] = Location::Grass(RC_ZR_GRASS_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 863), "Near Tree Grass 6", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_6)); + locationTable[RC_ZR_GRASS_7] = Location::Grass(RC_ZR_GRASS_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 963), "Near Tree Grass 7", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_7)); + locationTable[RC_ZR_GRASS_8] = Location::Grass(RC_ZR_GRASS_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1547, 949), "Near Tree Grass 8", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_8)); + locationTable[RC_ZR_GRASS_9] = Location::Grass(RC_ZR_GRASS_9, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1531, 910), "Near Tree Grass 9", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_9)); + locationTable[RC_ZR_GRASS_10] = Location::Grass(RC_ZR_GRASS_10, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1489, 907), "Near Tree Grass 10", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_10)); + locationTable[RC_ZR_GRASS_11] = Location::Grass(RC_ZR_GRASS_11, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1468, 936), "Near Tree Grass 11", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_11)); + locationTable[RC_ZR_GRASS_12] = Location::Grass(RC_ZR_GRASS_12, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1436, 906), "Near Tree Grass 12", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_12)); + locationTable[RC_ZR_NEAR_FREESTANDING_POH_GRASS] = Location::Grass(RC_ZR_NEAR_FREESTANDING_POH_GRASS, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(231, -1478), "Near Freestanding PoH Grass", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS)); + // Grotto Grass + locationTable[RC_KF_STORMS_GROTTO_GRASS_1] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x2C), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_1)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_2] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x2C), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_2)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_3] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x2C), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_3)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_4] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x2C), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_4)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1] = Location::Grass(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x14), "Near Shortcuts Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2] = Location::Grass(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x14), "Near Shortcuts Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3] = Location::Grass(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x14), "Near Shortcuts Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4] = Location::Grass(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x14), "Near Shortcuts Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_1] = Location::Grass(RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x00), "Near Market Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_2] = Location::Grass(RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x00), "Near Market Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_3] = Location::Grass(RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x00), "Near Market Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_4] = Location::Grass(RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x00), "Near Market Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_1] = Location::Grass(RC_HF_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x03), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_1)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_2] = Location::Grass(RC_HF_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x03), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_2)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_3] = Location::Grass(RC_HF_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x03), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_3)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_4] = Location::Grass(RC_HF_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x03), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_4)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_1] = Location::Grass(RC_HF_SOUTHEAST_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x22), "Southeast Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_2] = Location::Grass(RC_HF_SOUTHEAST_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x22), "Southeast Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_3] = Location::Grass(RC_HF_SOUTHEAST_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x22), "Southeast Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_4] = Location::Grass(RC_HF_SOUTHEAST_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x22), "Southeast Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4)); + locationTable[RC_HF_COW_GROTTO_GRASS_1] = Location::Grass(RC_HF_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3419, 0xE4), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_1)); + locationTable[RC_HF_COW_GROTTO_GRASS_2] = Location::Grass(RC_HF_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3518, 0xE4), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_2)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_1] = Location::Grass(RC_KAK_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x28), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_1)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_2] = Location::Grass(RC_KAK_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x28), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_2)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_3] = Location::Grass(RC_KAK_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x28), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_3)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_4] = Location::Grass(RC_KAK_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x28), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_4)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_1] = Location::Grass(RC_DMT_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x57), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_1)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_2] = Location::Grass(RC_DMT_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x57), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_2)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_3] = Location::Grass(RC_DMT_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x57), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_3)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_4] = Location::Grass(RC_DMT_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x57), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_4)); + locationTable[RC_DMT_COW_GROTTO_GRASS_1] = Location::Grass(RC_DMT_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2443, 0xF8), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_1)); + locationTable[RC_DMT_COW_GROTTO_GRASS_2] = Location::Grass(RC_DMT_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2494, 0xF8), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_2)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_1] = Location::Grass(RC_DMC_UPPER_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x7A), "Upper Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_1)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_2] = Location::Grass(RC_DMC_UPPER_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x7A), "Upper Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_2)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_3] = Location::Grass(RC_DMC_UPPER_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x7A), "Upper Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_3)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_4] = Location::Grass(RC_DMC_UPPER_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x7A), "Upper Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_4)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_1] = Location::Grass(RC_ZR_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x29), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_1)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_2] = Location::Grass(RC_ZR_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x29), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_2)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_3] = Location::Grass(RC_ZR_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x29), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_3)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_4] = Location::Grass(RC_ZR_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x29), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_4)); + // Dungeon Grass + locationTable[RC_DEKU_TREE_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(391, -156), "Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_1)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(355, -233), "Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_2)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(307, -289), "Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_3)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, -414), "Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_4)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_5, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(142, -399), "Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_5)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1018, 1263), "Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1005, 1216), "Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1280, 1026), "Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1229, 1006), "Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4)); + locationTable[RC_DEKU_TREE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1444, 169), "Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1516, 142), "Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 130), "Basement Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 187), "Basement Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-228, 792), "Eye Switch Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-202, 751), "Eye Switch Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(79, 794), "Eye Switch Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(49, 752), "Eye Switch Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4)); + locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1310, 840), "Spike Roller Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1361, 840), "Spike Roller Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1796, 821), "Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1919, 820), "Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1955, -296), "Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2025, -301), "Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -515), "Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -577), "Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-269, -643), "Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-760, -465), "First Bridge Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_BLADE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BLADE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1713, -1246), "Blade Room Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3189, -485), "Single Eye Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-249, -2519), "Before Boss Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-858, -1330), "Basement Behind Rocks Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-870, -1021), "Basement Behind Rocks Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-872, -1383), "Basement Behind Rocks Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-874, -1447), "Basement Behind Rocks Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-886, -1263), "Basement Behind Rocks Grass 5", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-918, -1131), "Basement Behind Rocks Grass 6", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-943, -1316), "Basement Behind Rocks Grass 7", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1377), "Basement Behind Rocks Grass 8", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1463), "Basement Behind Rocks Grass 9", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-619, -627), "Basement Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-565, -654), "Basement Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-552, -711), "Basement Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3)); + // MQ Dungeon Grass + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(392, -158), "MQ Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(356, -235), "MQ Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(308, -291), "MQ Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(81, -416), "MQ Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(143, -401), "MQ Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-11, -344), "MQ Lobby Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-159, -302), "MQ Lobby Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-636, 161), "MQ Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-693, 182), "MQ Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1443, 167), "MQ Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1515, 140), "MQ Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-753, 614), "MQ Before Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-736, 795), "MQ Before Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-575, 627), "MQ Before Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-572, 727), "MQ Before Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-788, 702), "MQ Before Compass Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-654, 582), "MQ Before Compass Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-643, 798), "MQ Before Compass Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1279, 1024), "MQ Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1228, 1004), "MQ Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1017, 1261), "MQ Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1004, 1214), "MQ Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-15, -261), "MQ Basement Lower Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-7, -328), "MQ Basement Lower Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(5, 119), "MQ Basement Lower Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-39, 118), "MQ Basement Lower Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-807, -228), "MQ Basement Upper Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-764, 280), "MQ Basement Upper Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, 237), "MQ Basement Upper Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-466, 865), "MQ Spike Roller Front Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-495, 906), "MQ Spike Roller Front Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-538, 907), "MQ Spike Roller Front Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1360, 838), "MQ Spike Roller Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1309, 838), "MQ Spike Roller Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-227, 790), "MQ Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-201, 749), "MQ Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(50, 750), "MQ Torches Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, 792), "MQ Torches Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1795, 819), "MQ Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1918, 818), "MQ Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1678, -120), "MQ Graves Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1700, 196), "MQ Graves Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2165, 350), "MQ Graves Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2215, 56), "MQ Graves Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1901, 604), "MQ Graves Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2708, -522), "MQ Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2395, -587), "MQ Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2553, -433), "MQ Back Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -517), "MQ Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -579), "MQ Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-268, -645), "MQ Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1721, -579), "MQ Compass Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1731, -45), "MQ Compass Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2218, -56), "MQ Compass Grass 3", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2230, -556), "MQ Compass Grass 4", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1765, -3940), "MQ Armos Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1285, -4693), "MQ Back Poe Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2644, -3368), "MQ Scrub Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2614, -3387), "MQ Scrub Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-219, -61), "MQ First Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(213, -398), "MQ First Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-192, -3209), "MQ Pit Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(350, -3534), "MQ Pit Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-91, -2815), "MQ Basement Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(231, -3575), "MQ Basement Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(305, -3481), "MQ Basement Grass 3", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3)); + locationTable[RC_JABU_JABUS_BELLY_MQ_JIGGLIES_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1089, -1489), "MQ Jigglies Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(652, -5687), "MQ Like Like Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1228, -2647), "MQ Basement Boomerang Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1360, -3606), "MQ After Big Octo Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1086, -3346), "MQ After Big Octo Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1477, -1366), "MQ Before Boss Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1691, -1576), "MQ Before Boss Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1604, 3), "MQ Dead Hand Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1529, 2), "MQ Dead Hand Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1492, -49), "MQ Dead Hand Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1458, -130), "MQ Dead Hand Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4)); + // Shared Dungeon Grass + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(545, -75), "Queen Gohma Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(525, -375), "Queen Gohma Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-646, 108), "Queen Gohma Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-444, 323), "Queen Gohma Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-848, -166), "Queen Gohma Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-855, -596), "Queen Gohma Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(480, -681), "Queen Gohma Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(194, -974), "Queen Gohma Grass 8", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8)); + // End Grass + // clang-format on +} + +static ObjectExtension::Register RegisterGrassIdentity; +static RegisterShipInitFunc registerShuffleGrass(RegisterShuffleGrass, { "IS_RANDO" }); +static RegisterShipInitFunc registerShuffleGrassLocations(Rando::StaticData::RegisterGrassLocations); diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index 91e44a55eb..ad23f9d26e 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -1,6 +1,7 @@ -#include "ShufflePots.h" +#include "soh/OTRGlobals.h" #include "soh_assets.h" #include "static_data.h" +#include "soh/ObjectExtension/ObjectExtension.h" extern "C" { #include "variables.h" @@ -11,7 +12,6 @@ extern PlayState* gPlayState; extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); - extern "C" void ObjTsubo_RandomizerDraw(Actor* thisx, PlayState* play) { float potSize = 1.0f; @@ -19,22 +19,26 @@ extern "C" void ObjTsubo_RandomizerDraw(Actor* thisx, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); Matrix_Scale(potSize, potSize, potSize, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gRandoPotDL); CLOSE_DISPS(play->state.gfxCtx); } uint8_t ObjTsubo_RandomizerHoldsItem(ObjTsubo* potActor, PlayState* play) { - RandomizerCheck rc = potActor->potIdentity.randomizerCheck; + const auto potIdentity = ObjectExtension::GetInstance().Get(&potActor->actor); + if (potIdentity == nullptr) { + return false; + } + + RandomizerCheck rc = potIdentity->randomizerCheck; uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); - uint8_t potSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_POTS).Get(); + uint8_t potSetting = RAND_GET_OPTION(RSK_SHUFFLE_POTS); // Don't pull randomized item if pot isn't randomized or is already checked if (!IS_RANDO || (potSetting == RO_SHUFFLE_POTS_OVERWORLD && isDungeon) || - (potSetting == RO_SHUFFLE_POTS_DUNGEONS && !isDungeon) || - Flags_GetRandomizerInf(potActor->potIdentity.randomizerInf) || - potActor->potIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + (potSetting == RO_SHUFFLE_POTS_DUNGEONS && !isDungeon) || Flags_GetRandomizerInf(potIdentity->randomizerInf) || + potIdentity->randomizerCheck == RC_UNKNOWN_CHECK) { return false; } else { return true; @@ -42,610 +46,619 @@ uint8_t ObjTsubo_RandomizerHoldsItem(ObjTsubo* potActor, PlayState* play) { } void ObjTsubo_RandomizerSpawnCollectible(ObjTsubo* potActor, PlayState* play) { + const auto potIdentity = ObjectExtension::GetInstance().Get(&potActor->actor); + if (potIdentity == nullptr) { + return; + } + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &potActor->actor.world.pos, ITEM00_SOH_DUMMY); - item00->randoInf = potActor->potIdentity.randomizerInf; - item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(potActor->potIdentity.randomizerCheck, true, GI_NONE); + item00->randoInf = potIdentity->randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(potIdentity->randomizerCheck, true, GI_NONE); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; item00->actor.velocity.y = 8.0f; item00->actor.speedXZ = 2.0f; - item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f); + item00->actor.world.rot.y = static_cast(Rand_CenteredFloat(65536.0f)); } -void ObjTsubo_RandomizerInit(void* actorRef) { - Actor* actor = static_cast(actorRef); +void RegisterShufflePots() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_POTS); - // Check for Lake Hylia specifically because the game spawns 2 pots out of bounds there for some reason. - if (actor->id != ACTOR_OBJ_TSUBO || gPlayState->sceneNum == SCENE_LAKE_HYLIA || gPlayState->sceneNum == SCENE_HYRULE_CASTLE) return; + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_TSUBO, shouldRegister, [](void* actorRef) { + Actor* actor = static_cast(actorRef); + ObjTsubo* potActor = static_cast(actorRef); - ObjTsubo* potActor = static_cast(actorRef); - - potActor->potIdentity = OTRGlobals::Instance->gRandomizer->IdentifyPot(gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); -} - -void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { - va_list args; - va_copy(args, originalArgs); + auto potIdentity = OTRGlobals::Instance->gRandomizer->IdentifyPot(gPlayState->sceneNum, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + ObjectExtension::GetInstance().Set(actor, std::move(potIdentity)); + }); // Draw custom model for pot to indicate it holding a randomized item. - if (id == VB_POT_SETUP_DRAW) { + COND_VB_SHOULD(VB_POT_SETUP_DRAW, shouldRegister, { ObjTsubo* potActor = va_arg(args, ObjTsubo*); if (ObjTsubo_RandomizerHoldsItem(potActor, gPlayState)) { potActor->actor.draw = (ActorFunc)ObjTsubo_RandomizerDraw; *should = false; } - } + }); // Do not spawn vanilla item from pot, instead spawn the ranomized item. - if (id == VB_POT_DROP_ITEM) { + COND_VB_SHOULD(VB_POT_DROP_ITEM, shouldRegister, { ObjTsubo* potActor = va_arg(args, ObjTsubo*); if (ObjTsubo_RandomizerHoldsItem(potActor, gPlayState)) { ObjTsubo_RandomizerSpawnCollectible(potActor, gPlayState); *should = false; } - } + }); // Unlock early Ganon's Boss Key doors to allow access to the pots there when pots are shuffled in dungeon - if (id == VB_LOCK_BOSS_DOOR) { + COND_VB_SHOULD(VB_LOCK_BOSS_DOOR, shouldRegister, { DoorShutter* doorActor = va_arg(args, DoorShutter*); - uint8_t shufflePotSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_POTS).Get(); + uint8_t shufflePotSetting = RAND_GET_OPTION(RSK_SHUFFLE_POTS); if (gPlayState->sceneNum == SCENE_GANONS_TOWER && doorActor->dyna.actor.world.pos.y == 800 && (shufflePotSetting == RO_SHUFFLE_POTS_DUNGEONS || shufflePotSetting == RO_SHUFFLE_POTS_ALL)) { *should = false; } - } - - va_end(args); + }); } void Rando::StaticData::RegisterPotLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off // Overworld Pots - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_KF_LINKS_HOUSE_POT] = Location::Pot(RC_KF_LINKS_HOUSE_POT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_LINKS_HOUSE, TWO_ACTOR_PARAMS(-118, 51), "Links House Pot", "KF Links House Pot", RHT_POT_KOKIRI_FOREST, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_POT)); - locationTable[RC_KF_TWINS_HOUSE_POT_2] = Location::Pot(RC_KF_TWINS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(35, 57), "Twins House Pot 2", "KF Twins House Pot 2", RHT_POT_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_2)); - locationTable[RC_KF_TWINS_HOUSE_POT_1] = Location::Pot(RC_KF_TWINS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(33, -55), "Twins House Pot 1", "KF Twins House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_1)); - locationTable[RC_KF_BROTHERS_HOUSE_POT_1] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-134, -29), "Brothers House Pot 1", "KF Brothers House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_1)); - locationTable[RC_KF_BROTHERS_HOUSE_POT_2] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-68, 114), "Brothers House Pot 2", "KF Brothers House Pot 2", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_2)); - locationTable[RC_GF_BREAK_ROOM_POT_1] = Location::Pot(RC_GF_BREAK_ROOM_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1438, -3629), "Break Room Pot 1", "GF Break Room Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_1)); - locationTable[RC_GF_BREAK_ROOM_POT_2] = Location::Pot(RC_GF_BREAK_ROOM_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1403, -3679), "Break Room Pot 2", "GF Break Room Pot 2", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_2)); - locationTable[RC_GF_KITCHEN_POT_1] = Location::Pot(RC_GF_KITCHEN_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1908, -789), "Kitchen Pot 1", "GF Kitchen Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_1)); - locationTable[RC_GF_KITCHEN_POT_2] = Location::Pot(RC_GF_KITCHEN_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1951, -850), "Kitchen Pot 2", "GF Kitchen Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_2)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-475, -2622), "North F1 Carpenter Pot 1", "GF North F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_1)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-512, -2621), "North F1 Carpenter Pot 2", "GF North F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_2)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-511, -2582), "North F1 Carpenter Pot 3", "GF North F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_3)); - locationTable[RC_GF_NORTH_F2_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(67, -1975), "North F2 Carpenter Pot 1", "GF North F2 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_1)); - locationTable[RC_GF_NORTH_F2_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(39, -1943), "North F2 Carpenter Pot 2", "GF North F2 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 48), "South F1 Carpenter Pot 1", "GF South F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 16), "South F1 Carpenter Pot 2", "GF South F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(661, 16), "South F1 Carpenter Pot 3", "GF South F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(26, 524), "South F1 Carpenter Cell Pot 1", "GF South F1 Carpenter Cell Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(61, 549), "South F1 Carpenter Cell Pot 2", "GF South F1 Carpenter Cell Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(215, 549), "South F1 Carpenter Cell Pot 3", "GF South F1 Carpenter Cell Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(254, 529), "South F1 Carpenter Cell Pot 4", "GF South F1 Carpenter Cell Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4)); - locationTable[RC_WASTELAND_NEAR_GS_POT_1] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(488, -2424), "Near GS Pot 1", "Wasteland Near GS Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_1)); - locationTable[RC_WASTELAND_NEAR_GS_POT_2] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(485, -2463), "Near GS Pot 2", "Wasteland Near GS Pot 2", RHT_POT_GERUDO_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_2)); - locationTable[RC_WASTELAND_NEAR_GS_POT_3] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(806, -2426), "Near GS Pot 3", "Wasteland Near GS Pot 3", RHT_POT_GERUDO_FORTRESS, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_3)); - locationTable[RC_WASTELAND_NEAR_GS_POT_4] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_4, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(801, -2460), "Near GS Pot 4", "Wasteland Near GS Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-60, 27), "Guard House Child Pot 1", "MK Guard House Child Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-89, 28), "Guard House Child Pot 2", "MK Guard House Child Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-110, 6), "Guard House Child Pot 3", "MK Guard House Child Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-58, -7), "Guard House Child Pot 4", "MK Guard House Child Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-80, -7), "Guard House Child Pot 5", "MK Guard House Child Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-65, -45), "Guard House Child Pot 6", "MK Guard House Child Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-85, -41), "Guard House Child Pot 7", "MK Guard House Child Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-107, -45), "Guard House Child Pot 8", "MK Guard House Child Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-66, -79), "Guard House Child Pot 9", "MK Guard House Child Pot 9", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-88, -84), "Guard House Child Pot 10", "MK Guard House Child Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, 215), "Guard House Child Pot 11", "MK Guard House Child Pot 11", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_12] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_12, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 148), "Guard House Child Pot 12", "MK Guard House Child Pot 12", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_13] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_13, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(73, 117), "Guard House Child Pot 13", "MK Guard House Child Pot 13", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_14] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_14, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 123), "Guard House Child Pot 14", "MK Guard House Child Pot 14", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_15] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_15, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(43, 89), "Guard House Child Pot 15", "MK Guard House Child Pot 15", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_16] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_16, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 81), "Guard House Child Pot 16", "MK Guard House Child Pot 16", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_17] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_17, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(21, 73), "Guard House Child Pot 17", "MK Guard House Child Pot 17", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_18] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_18, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(64, 45), "Guard House Child Pot 18", "MK Guard House Child Pot 18", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_19] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_19, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(84, 31), "Guard House Child Pot 19", "MK Guard House Child Pot 19", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_20] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_20, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, 26), "Guard House Child Pot 20", "MK Guard House Child Pot 20", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_21] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_21, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(20, 34), "Guard House Child Pot 21", "MK Guard House Child Pot 21", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_22] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_22, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(89, -2), "Guard House Child Pot 22", "MK Guard House Child Pot 22", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_23] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_23, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -12), "Guard House Child Pot 23", "MK Guard House Child Pot 23", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_24] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_24, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, -5), "Guard House Child Pot 24", "MK Guard House Child Pot 24", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_25] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_25, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(16, -6), "Guard House Child Pot 25", "MK Guard House Child Pot 25", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_26] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_26, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, -44), "Guard House Child Pot 26", "MK Guard House Child Pot 26", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_27] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_27, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(37, -40), "Guard House Child Pot 27", "MK Guard House Child Pot 27", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_28] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_28, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -80), "Guard House Child Pot 28", "MK Guard House Child Pot 28", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_29] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_29, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(50, -74), "Guard House Child Pot 29", "MK Guard House Child Pot 29", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_30] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_30, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -79), "Guard House Child Pot 30", "MK Guard House Child Pot 30", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_31] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_31, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(39, -111), "Guard House Child Pot 31", "MK Guard House Child Pot 31", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_32] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_32, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(169, 216), "Guard House Child Pot 32", "MK Guard House Child Pot 32", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_33] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_33, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 166), "Guard House Child Pot 33", "MK Guard House Child Pot 33", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_34] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_34, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, 120), "Guard House Child Pot 34", "MK Guard House Child Pot 34", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_35] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_35, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(177, 85), "Guard House Child Pot 35", "MK Guard House Child Pot 35", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_36] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_36, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(155, 39), "Guard House Child Pot 36", "MK Guard House Child Pot 36", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_37] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_37, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(184, 13), "Guard House Child Pot 37", "MK Guard House Child Pot 37", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_38] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_38, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -1), "Guard House Child Pot 38", "MK Guard House Child Pot 38", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_39] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_39, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(181, -33), "Guard House Child Pot 39", "MK Guard House Child Pot 39", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_40] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_40, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -45), "Guard House Child Pot 40", "MK Guard House Child Pot 40", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_41] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_41, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(172, -82), "Guard House Child Pot 41", "MK Guard House Child Pot 41", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_42] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_42, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -120), "Guard House Child Pot 42", "MK Guard House Child Pot 42", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_43] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_43, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -166), "Guard House Child Pot 43", "MK Guard House Child Pot 43", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_44] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_44, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -216), "Guard House Child Pot 44", "MK Guard House Child Pot 44", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(61, 204), "Guard House Adult Pot 1", "MK Guard House Adult Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, 132), "Guard House Adult Pot 2", "MK Guard House Adult Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(74, 23), "Guard House Adult Pot 3", "MK Guard House Adult Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 4), "Guard House Adult Pot 4", "MK Guard House Adult Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, -22), "Guard House Adult Pot 5", "MK Guard House Adult Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -151), "Guard House Adult Pot 6", "MK Guard House Adult Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(79, -182), "Guard House Adult Pot 7", "MK Guard House Adult Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -198), "Guard House Adult Pot 8", "MK Guard House Adult Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 210), "Guard House Adult Pot 9", "MK Guard House Adult Pot 9", RHT_POT_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -122), "Guard House Adult Pot 10", "MK Guard House Adult Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -210), "Guard House Adult Pot 11", "MK Guard House Adult Pot 11", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_1] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(100, 45), "Back Alley House Pot 1", "MK Back Alley House Pot 1", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_2] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(12, -180), "Back Alley House Pot 2", "MK Back Alley House Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_3] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(-54, -180), "Back Alley House Pot 3", "MK Back Alley House Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(222, -377), "Near Potion Shop Pot 1", "Kak Near Potion Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_1)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(255, -366), "Near Potion Shop Pot 2", "Kak Near Potion Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_2)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_3] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(284, -356), "Near Potion Shop Pot 3", "Kak Near Potion Shop Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_3)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1568), "Near Impas House Pot 1", "Kak Near Impas House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1539), "Near Impas House Pot 2", "Kak Near Impas House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1510), "Near Impas House Pot 3", "Kak Near Impas House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-392, -870), "Near Guards House Pot 1", "Kak Near Guards House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-422, -883), "Near Guards House Pot 2", "Kak Near Guards House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-450, -895), "Near Guards House Pot 3", "Kak Near Guards House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(781, 89), "Near Medicine Shop Pot 1", "Kak Near Medicine Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1)); - locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(815, 89), "Near Medicine Shop Pot 2", "Kak Near Medicine Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2)); - locationTable[RC_GY_DAMPES_GRAVE_POT_1] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1542), "Dampes Grave Pot 1", "GY Dampes Grave Pot 1", RHT_POT_GRAVEYARD, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_1)); - locationTable[RC_GY_DAMPES_GRAVE_POT_2] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1600), "Dampes Grave Pot 2", "GY Dampes Grave Pot 2", RHT_POT_GRAVEYARD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_2)); - locationTable[RC_GY_DAMPES_GRAVE_POT_3] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-364, -1571), "Dampes Grave Pot 3", "GY Dampes Grave Pot 3", RHT_POT_GRAVEYARD, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_3)); - locationTable[RC_GY_DAMPES_GRAVE_POT_4] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1540), "Dampes Grave Pot 4", "GY Dampes Grave Pot 4", RHT_POT_GRAVEYARD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_4)); - locationTable[RC_GY_DAMPES_GRAVE_POT_5] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1608), "Dampes Grave Pot 5", "GY Dampes Grave Pot 5", RHT_POT_GRAVEYARD, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_5)); - locationTable[RC_GY_DAMPES_GRAVE_POT_6] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(239, -1577), "Dampes Grave Pot 6", "GY Dampes Grave Pot 6", RHT_POT_GRAVEYARD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_6)); - locationTable[RC_GC_LOWER_STAIRCASE_POT_1] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-189, 866), "Lower Staircase Pot 1", "GC Lower Staircase Pot 1", RHT_POT_GORON_CITY, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_1)); - locationTable[RC_GC_LOWER_STAIRCASE_POT_2] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-271, 825), "Lower Staircase Pot 2", "GC Lower Staircase Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_2)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_1] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1170, 60), "Upper Staircase Pot 1", "GC Upper Staircase Pot 1", RHT_POT_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_1)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_2] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1185, 95), "Upper Staircase Pot 2", "GC Upper Staircase Pot 2", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_2)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_3] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1200, 63), "Upper Staircase Pot 3", "GC Upper Staircase Pot 3", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_3)); - locationTable[RC_GC_MEDIGORON_POT_1] = Location::Pot(RC_GC_MEDIGORON_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-694, 1196), "Medigoron Pot 1", "GC Medigoron Pot 1", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_POT_1)); - locationTable[RC_GC_DARUNIA_POT_1] = Location::Pot(RC_GC_DARUNIA_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1210), "Darunia Pot 1", "GC Darunia Pot 1", RHT_POT_GORON_CITY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_1)); - locationTable[RC_GC_DARUNIA_POT_2] = Location::Pot(RC_GC_DARUNIA_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(261, -1254), "Darunia Pot 2", "GC Darunia Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_2)); - locationTable[RC_GC_DARUNIA_POT_3] = Location::Pot(RC_GC_DARUNIA_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1386), "Darunia Pot 3", "GC Darunia Pot 3", RHT_POT_GORON_CITY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_3)); - locationTable[RC_DMC_NEAR_GC_POT_2] = Location::Pot(RC_DMC_NEAR_GC_POT_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1546, 141), "Near GC Pot 2", "DMC Near GC Pot 2", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_2)); - locationTable[RC_DMC_NEAR_GC_POT_3] = Location::Pot(RC_DMC_NEAR_GC_POT_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1641, -127), "Near GC Pot 3", "DMC Near GC Pot 3", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_3)); - locationTable[RC_DMC_NEAR_GC_POT_1] = Location::Pot(RC_DMC_NEAR_GC_POT_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1590, 132), "Near GC Pot 1", "DMC Near GC Pot 1", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_1)); - locationTable[RC_DMC_NEAR_GC_POT_4] = Location::Pot(RC_DMC_NEAR_GC_POT_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1606, -166), "Near GC Pot 4", "DMC Near GC Pot 4", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_4)); - locationTable[RC_ZD_NEAR_SHOP_POT_1] = Location::Pot(RC_ZD_NEAR_SHOP_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(676, 377), "Near Shop Pot 1", "ZD Near Shop Pot 1", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_1)); - locationTable[RC_ZD_NEAR_SHOP_POT_2] = Location::Pot(RC_ZD_NEAR_SHOP_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(614, 419), "Near Shop Pot 2", "ZD Near Shop Pot 2", RHT_POT_ZORAS_DOMAIN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_2)); - locationTable[RC_ZD_NEAR_SHOP_POT_3] = Location::Pot(RC_ZD_NEAR_SHOP_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 415), "Near Shop Pot 3", "ZD Near Shop Pot 3", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_3)); - locationTable[RC_ZD_NEAR_SHOP_POT_4] = Location::Pot(RC_ZD_NEAR_SHOP_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 289), "Near Shop Pot 4", "ZD Near Shop Pot 4", RHT_POT_ZORAS_DOMAIN, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_4)); - locationTable[RC_ZD_NEAR_SHOP_POT_5] = Location::Pot(RC_ZD_NEAR_SHOP_POT_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(220, 384), "Near Shop Pot 5", "ZD Near Shop Pot 5", RHT_POT_ZORAS_DOMAIN, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_5)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_1] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(385, 2587), "Hidden Cave Pot 1", "ZF Hidden Cave Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_1)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_2] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(418, 2609), "Hidden Cave Pot 2", "ZF Hidden Cave Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_2)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_3] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(430, 2568), "Hidden Cave Pot 3", "ZF Hidden Cave Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_3)); - locationTable[RC_ZF_NEAR_JABU_POT_1] = Location::Pot(RC_ZF_NEAR_JABU_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, 170), "Near Jabu Pot 1", "ZF Near Jabu Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_1)); - locationTable[RC_ZF_NEAR_JABU_POT_2] = Location::Pot(RC_ZF_NEAR_JABU_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, 170), "Near Jabu Pot 2", "ZF Near Jabu Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_2)); - locationTable[RC_ZF_NEAR_JABU_POT_3] = Location::Pot(RC_ZF_NEAR_JABU_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, -260), "Near Jabu Pot 3", "ZF Near Jabu Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_3)); - locationTable[RC_ZF_NEAR_JABU_POT_4] = Location::Pot(RC_ZF_NEAR_JABU_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, -260), "Near Jabu Pot 4", "ZF Near Jabu Pot 4", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_4)); - locationTable[RC_LLR_FRONT_POT_1] = Location::Pot(RC_LLR_FRONT_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3218), "Front Pot 1", "LLR Front Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_1)); - locationTable[RC_LLR_FRONT_POT_2] = Location::Pot(RC_LLR_FRONT_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3186), "Front Pot 2", "LLR Front Pot 2", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_2)); - locationTable[RC_LLR_FRONT_POT_3] = Location::Pot(RC_LLR_FRONT_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3154), "Front Pot 3", "LLR Front Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_3)); - locationTable[RC_LLR_FRONT_POT_4] = Location::Pot(RC_LLR_FRONT_POT_4, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3122), "Front Pot 4", "LLR Front Pot 4", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_4)); - locationTable[RC_LLR_RAIN_SHED_POT_1] = Location::Pot(RC_LLR_RAIN_SHED_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(852, 172), "Rain Shed Pot 1", "LLR Rain Shed Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_1)); - locationTable[RC_LLR_RAIN_SHED_POT_2] = Location::Pot(RC_LLR_RAIN_SHED_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(840, 212), "Rain Shed Pot 2", "LLR Rain Shed Pot 2", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_2)); - locationTable[RC_LLR_RAIN_SHED_POT_3] = Location::Pot(RC_LLR_RAIN_SHED_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(872, 219), "Rain Shed Pot 3", "LLR Rain Shed Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_3)); - locationTable[RC_LLR_TALONS_HOUSE_POT_1] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1255, 47), "Talons House Pot 1", "LLR Talons House Pot 1", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_1)); - locationTable[RC_LLR_TALONS_HOUSE_POT_2] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -51), "Talons House Pot 2", "LLR Talons House Pot 2", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_2)); - locationTable[RC_LLR_TALONS_HOUSE_POT_3] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -78), "Talons House Pot 3", "LLR Talons House Pot 3", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_3)); - locationTable[RC_HF_COW_GROTTO_POT_1] = Location::Pot(RC_HF_COW_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3410, -223), "Cow Grotto Pot 1", "HF Cow Grotto Pot 1", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_1)); - locationTable[RC_HF_COW_GROTTO_POT_2] = Location::Pot(RC_HF_COW_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3390, -258), "Cow Grotto Pot 2", "HF Cow Grotto Pot 2", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_2)); - locationTable[RC_HC_STORMS_GROTTO_POT_1] = Location::Pot(RC_HC_STORMS_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1843, 1014), "Storms Grotto Pot 1", "HC Storms Grotto Pot 1", RHT_POT_HYRULE_CASTLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_1)); - locationTable[RC_HC_STORMS_GROTTO_POT_2] = Location::Pot(RC_HC_STORMS_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1769, 954), "Storms Grotto Pot 2", "HC Storms Grotto Pot 2", RHT_POT_HYRULE_CASTLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_2)); - locationTable[RC_HC_STORMS_GROTTO_POT_3] = Location::Pot(RC_HC_STORMS_GROTTO_POT_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1857, 897), "Storms Grotto Pot 3", "HC Storms Grotto Pot 3", RHT_POT_HYRULE_CASTLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_3)); - locationTable[RC_HC_STORMS_GROTTO_POT_4] = Location::Pot(RC_HC_STORMS_GROTTO_POT_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1764, 847), "Storms Grotto Pot 4", "HC Storms Grotto Pot 4", RHT_POT_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_4)); + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_KF_LINKS_HOUSE_POT] = Location::Pot(RC_KF_LINKS_HOUSE_POT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_LINKS_HOUSE, TWO_ACTOR_PARAMS(-118, 51), "Links House Pot", RHT_POT_KOKIRI_FOREST, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_POT)); + locationTable[RC_KF_TWINS_HOUSE_POT_2] = Location::Pot(RC_KF_TWINS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(35, 57), "Twins House Pot 2", RHT_POT_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_2)); + locationTable[RC_KF_TWINS_HOUSE_POT_1] = Location::Pot(RC_KF_TWINS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(33, -55), "Twins House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_1)); + locationTable[RC_KF_BROTHERS_HOUSE_POT_1] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-134, -29), "Brothers House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_1)); + locationTable[RC_KF_BROTHERS_HOUSE_POT_2] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-68, 114), "Brothers House Pot 2", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_2)); + locationTable[RC_TH_BREAK_ROOM_FRONT_POT] = Location::Pot(RC_TH_BREAK_ROOM_FRONT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1438, -3629), "Break Room Front Pot", RHT_TH_BREAK_ROOM_FRONT_POT, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_ROOM_FRONT_POT)); + locationTable[RC_TH_BREAK_ROOM_BACK_POT] = Location::Pot(RC_TH_BREAK_ROOM_BACK_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1403, -3679), "Break Room Back Pot", RHT_TH_BREAK_ROOM_BACK_POT, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_ROOM_BACK_POT)); + locationTable[RC_TH_KITCHEN_POT_1] = Location::Pot(RC_TH_KITCHEN_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1908, -789), "Kitchen Pot 1", RHT_TH_KITCHEN_POT_1, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_KITCHEN_POT_1)); + locationTable[RC_TH_KITCHEN_POT_2] = Location::Pot(RC_TH_KITCHEN_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1951, -850), "Kitchen Pot 2", RHT_TH_KITCHEN_POT_2, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_KITCHEN_POT_2)); + locationTable[RC_TH_1_TORCH_CELL_RIGHT_POT] = Location::Pot(RC_TH_1_TORCH_CELL_RIGHT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-475, -2622), "1 Torch Cell Right Pot", RHT_TH_1_TORCH_CELL_RIGHT_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_1_TORCH_CELL_RIGHT_POT)); + locationTable[RC_TH_1_TORCH_CELL_MID_POT] = Location::Pot(RC_TH_1_TORCH_CELL_MID_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-512, -2621), "1 Torch Cell Middle Pot", RHT_TH_1_TORCH_CELL_MID_POT, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_1_TORCH_CELL_MID_POT)); + locationTable[RC_TH_1_TORCH_CELL_LEFT_POT] = Location::Pot(RC_TH_1_TORCH_CELL_LEFT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-511, -2582), "1 Torch Cell Left Pot", RHT_TH_1_TORCH_CELL_LEFT_POT, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_1_TORCH_CELL_LEFT_POT)); + locationTable[RC_TH_STEEP_SLOPE_RIGHT_POT] = Location::Pot(RC_TH_STEEP_SLOPE_RIGHT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(67, -1975), "Steep Slope Right Pot", RHT_TH_STEEP_SLOPE_RIGHT_POT, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_STEEP_SLOPE_RIGHT_POT)); + locationTable[RC_TH_STEEP_SLOPE_LEFT_POT] = Location::Pot(RC_TH_STEEP_SLOPE_LEFT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(39, -1943), "Steep Slope Left Pot", RHT_TH_STEEP_SLOPE_LEFT_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_STEEP_SLOPE_LEFT_POT)); + locationTable[RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT] = Location::Pot(RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 48), "Double Cell Right Pot", RHT_TH_NEAR_DOUBLE_CELL_RIGHT_POT, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_DOUBLE_CELL_RIGHT_POT)); + locationTable[RC_TH_NEAR_DOUBLE_CELL_MID_POT] = Location::Pot(RC_TH_NEAR_DOUBLE_CELL_MID_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 16), "Double Cell Middle Pot", RHT_TH_NEAR_DOUBLE_CELL_MID_POT, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_DOUBLE_CELL_MID_POT)); + locationTable[RC_TH_NEAR_DOUBLE_CELL_LEFT_POT] = Location::Pot(RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(661, 16), "Double Cell Left Pot", RHT_TH_NEAR_DOUBLE_CELL_LEFT_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_NEAR_DOUBLE_CELL_LEFT_POT)); + locationTable[RC_TH_RIGHTMOST_JAILED_POT] = Location::Pot(RC_TH_RIGHTMOST_JAILED_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(26, 524), "Rightmost Jailed Pot", RHT_TH_RIGHTMOST_JAILED_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_RIGHTMOST_JAILED_POT)); + locationTable[RC_TH_RIGHT_MIDDLE_JAILED_POT] = Location::Pot(RC_TH_RIGHT_MIDDLE_JAILED_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(61, 549), "Right Middle Jailed Pot", RHT_TH_LEFT_MIDDLE_JAILED_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_RIGHT_MIDDLE_JAILED_POT)); + locationTable[RC_TH_LEFT_MIDDLE_JAILED_POT] = Location::Pot(RC_TH_LEFT_MIDDLE_JAILED_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(215, 549), "Left Middle Jailed Pot", RHT_TH_RIGHT_MIDDLE_JAILED_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_LEFT_MIDDLE_JAILED_POT)); + locationTable[RC_TH_LEFTMOST_JAILED_POT] = Location::Pot(RC_TH_LEFTMOST_JAILED_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(254, 529), "Leftmost Jailed Pot", RHT_TH_LEFTMOST_JAILED_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_LEFTMOST_JAILED_POT)); + locationTable[RC_WASTELAND_NEAR_GS_POT_1] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(488, -2424), "Near GS Pot 1", RHT_POT_WASTELAND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_1)); + locationTable[RC_WASTELAND_NEAR_GS_POT_2] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(485, -2463), "Near GS Pot 2", RHT_POT_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_2)); + locationTable[RC_WASTELAND_NEAR_GS_POT_3] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(806, -2426), "Near GS Pot 3", RHT_POT_WASTELAND, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_3)); + locationTable[RC_WASTELAND_NEAR_GS_POT_4] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_4, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(801, -2460), "Near GS Pot 4", RHT_POT_WASTELAND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-60, 27), "Guard House Child Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-89, 28), "Guard House Child Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-110, 6), "Guard House Child Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-58, -7), "Guard House Child Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-80, -7), "Guard House Child Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-65, -45), "Guard House Child Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-85, -41), "Guard House Child Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-107, -45), "Guard House Child Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-66, -79), "Guard House Child Pot 9", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-88, -84), "Guard House Child Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, 215), "Guard House Child Pot 11", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_12] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_12, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 148), "Guard House Child Pot 12", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_13] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_13, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(73, 117), "Guard House Child Pot 13", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_14] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_14, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 123), "Guard House Child Pot 14", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_15] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_15, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(43, 89), "Guard House Child Pot 15", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_16] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_16, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 81), "Guard House Child Pot 16", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_17] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_17, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(21, 73), "Guard House Child Pot 17", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_18] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_18, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(64, 45), "Guard House Child Pot 18", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_19] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_19, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(84, 31), "Guard House Child Pot 19", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_20] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_20, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, 26), "Guard House Child Pot 20", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_21] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_21, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(20, 34), "Guard House Child Pot 21", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_22] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_22, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(89, -2), "Guard House Child Pot 22", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_23] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_23, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -12), "Guard House Child Pot 23", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_24] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_24, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, -5), "Guard House Child Pot 24", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_25] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_25, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(16, -6), "Guard House Child Pot 25", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_26] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_26, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, -44), "Guard House Child Pot 26", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_27] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_27, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(37, -40), "Guard House Child Pot 27", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_28] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_28, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -80), "Guard House Child Pot 28", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_29] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_29, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(50, -74), "Guard House Child Pot 29", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_30] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_30, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -79), "Guard House Child Pot 30", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_31] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_31, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(39, -111), "Guard House Child Pot 31", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_32] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_32, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(169, 216), "Guard House Child Pot 32", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_33] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_33, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 166), "Guard House Child Pot 33", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_34] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_34, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, 120), "Guard House Child Pot 34", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_35] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_35, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(177, 85), "Guard House Child Pot 35", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_36] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_36, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(155, 39), "Guard House Child Pot 36", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_37] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_37, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(184, 13), "Guard House Child Pot 37", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_38] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_38, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -1), "Guard House Child Pot 38", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_39] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_39, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(181, -33), "Guard House Child Pot 39", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_40] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_40, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -45), "Guard House Child Pot 40", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_41] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_41, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(172, -82), "Guard House Child Pot 41", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_42] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_42, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -120), "Guard House Child Pot 42", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_43] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_43, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -166), "Guard House Child Pot 43", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_44] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_44, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -216), "Guard House Child Pot 44", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(61, 204), "Guard House Adult Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, 132), "Guard House Adult Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(74, 23), "Guard House Adult Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 4), "Guard House Adult Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, -22), "Guard House Adult Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -151), "Guard House Adult Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(79, -182), "Guard House Adult Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -198), "Guard House Adult Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 210), "Guard House Adult Pot 9", RHT_POT_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -122), "Guard House Adult Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -210), "Guard House Adult Pot 11", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_1] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(100, 45), "Back Alley House Pot 1", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_2] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(12, -180), "Back Alley House Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_3] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(-54, -180), "Back Alley House Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(222, -377), "Near Potion Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_1)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(255, -366), "Near Potion Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_2)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_3] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(284, -356), "Near Potion Shop Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_3)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1568), "Near Impas House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1539), "Near Impas House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1510), "Near Impas House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-392, -870), "Near Guards House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-422, -883), "Near Guards House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-450, -895), "Near Guards House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(781, 89), "Near Medicine Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1)); + locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(815, 89), "Near Medicine Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2)); + locationTable[RC_GY_DAMPES_GRAVE_POT_1] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1542), "Dampes Grave Pot 1", RHT_POT_GRAVEYARD, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_1)); + locationTable[RC_GY_DAMPES_GRAVE_POT_2] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1600), "Dampes Grave Pot 2", RHT_POT_GRAVEYARD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_2)); + locationTable[RC_GY_DAMPES_GRAVE_POT_3] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-364, -1571), "Dampes Grave Pot 3", RHT_POT_GRAVEYARD, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_3)); + locationTable[RC_GY_DAMPES_GRAVE_POT_4] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1540), "Dampes Grave Pot 4", RHT_POT_GRAVEYARD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_4)); + locationTable[RC_GY_DAMPES_GRAVE_POT_5] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1608), "Dampes Grave Pot 5", RHT_POT_GRAVEYARD, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_5)); + locationTable[RC_GY_DAMPES_GRAVE_POT_6] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(239, -1577), "Dampes Grave Pot 6", RHT_POT_GRAVEYARD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_6)); + locationTable[RC_GC_LOWER_STAIRCASE_POT_1] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-189, 866), "Lower Staircase Pot 1", RHT_POT_GORON_CITY, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_1)); + locationTable[RC_GC_LOWER_STAIRCASE_POT_2] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-271, 825), "Lower Staircase Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_2)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_1] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1170, 60), "Upper Staircase Pot 1", RHT_POT_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_1)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_2] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1185, 95), "Upper Staircase Pot 2", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_2)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_3] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1200, 63), "Upper Staircase Pot 3", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_3)); + locationTable[RC_GC_MEDIGORON_POT_1] = Location::Pot(RC_GC_MEDIGORON_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-694, 1196), "Medigoron Pot 1", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_POT_1)); + locationTable[RC_GC_DARUNIA_POT_1] = Location::Pot(RC_GC_DARUNIA_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1210), "Darunia Pot 1", RHT_POT_GORON_CITY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_1)); + locationTable[RC_GC_DARUNIA_POT_2] = Location::Pot(RC_GC_DARUNIA_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(261, -1254), "Darunia Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_2)); + locationTable[RC_GC_DARUNIA_POT_3] = Location::Pot(RC_GC_DARUNIA_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1386), "Darunia Pot 3", RHT_POT_GORON_CITY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_3)); + locationTable[RC_DMC_NEAR_GC_POT_2] = Location::Pot(RC_DMC_NEAR_GC_POT_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1546, 141), "Near GC Pot 2", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_2)); + locationTable[RC_DMC_NEAR_GC_POT_3] = Location::Pot(RC_DMC_NEAR_GC_POT_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1641, -127), "Near GC Pot 3", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_3)); + locationTable[RC_DMC_NEAR_GC_POT_1] = Location::Pot(RC_DMC_NEAR_GC_POT_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1590, 132), "Near GC Pot 1", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_1)); + locationTable[RC_DMC_NEAR_GC_POT_4] = Location::Pot(RC_DMC_NEAR_GC_POT_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1606, -166), "Near GC Pot 4", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_4)); + locationTable[RC_ZD_NEAR_SHOP_POT_1] = Location::Pot(RC_ZD_NEAR_SHOP_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(676, 377), "Near Shop Pot 1", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_1)); + locationTable[RC_ZD_NEAR_SHOP_POT_2] = Location::Pot(RC_ZD_NEAR_SHOP_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(614, 419), "Near Shop Pot 2", RHT_POT_ZORAS_DOMAIN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_2)); + locationTable[RC_ZD_NEAR_SHOP_POT_3] = Location::Pot(RC_ZD_NEAR_SHOP_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 415), "Near Shop Pot 3", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_3)); + locationTable[RC_ZD_NEAR_SHOP_POT_4] = Location::Pot(RC_ZD_NEAR_SHOP_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 289), "Near Shop Pot 4", RHT_POT_ZORAS_DOMAIN, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_4)); + locationTable[RC_ZD_NEAR_SHOP_POT_5] = Location::Pot(RC_ZD_NEAR_SHOP_POT_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(220, 384), "Near Shop Pot 5", RHT_POT_ZORAS_DOMAIN, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_5)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_1] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(385, 2587), "Hidden Cave Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_1)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_2] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(418, 2609), "Hidden Cave Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_2)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_3] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(430, 2568), "Hidden Cave Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_3)); + locationTable[RC_ZF_NEAR_JABU_POT_1] = Location::Pot(RC_ZF_NEAR_JABU_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, 170), "Near Jabu Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_1)); + locationTable[RC_ZF_NEAR_JABU_POT_2] = Location::Pot(RC_ZF_NEAR_JABU_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, 170), "Near Jabu Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_2)); + locationTable[RC_ZF_NEAR_JABU_POT_3] = Location::Pot(RC_ZF_NEAR_JABU_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, -260), "Near Jabu Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_3)); + locationTable[RC_ZF_NEAR_JABU_POT_4] = Location::Pot(RC_ZF_NEAR_JABU_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, -260), "Near Jabu Pot 4", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_4)); + locationTable[RC_LLR_FRONT_POT_1] = Location::Pot(RC_LLR_FRONT_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3218), "Front Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_1)); + locationTable[RC_LLR_FRONT_POT_2] = Location::Pot(RC_LLR_FRONT_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3186), "Front Pot 2", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_2)); + locationTable[RC_LLR_FRONT_POT_3] = Location::Pot(RC_LLR_FRONT_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3154), "Front Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_3)); + locationTable[RC_LLR_FRONT_POT_4] = Location::Pot(RC_LLR_FRONT_POT_4, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3122), "Front Pot 4", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_4)); + locationTable[RC_LLR_RAIN_SHED_POT_1] = Location::Pot(RC_LLR_RAIN_SHED_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(852, 172), "Rain Shed Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_1)); + locationTable[RC_LLR_RAIN_SHED_POT_2] = Location::Pot(RC_LLR_RAIN_SHED_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(840, 212), "Rain Shed Pot 2", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_2)); + locationTable[RC_LLR_RAIN_SHED_POT_3] = Location::Pot(RC_LLR_RAIN_SHED_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(872, 219), "Rain Shed Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_3)); + locationTable[RC_LLR_TALONS_HOUSE_POT_1] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1255, 47), "Talons House Pot 1", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_1)); + locationTable[RC_LLR_TALONS_HOUSE_POT_2] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -51), "Talons House Pot 2", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_2)); + locationTable[RC_LLR_TALONS_HOUSE_POT_3] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -78), "Talons House Pot 3", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_3)); + locationTable[RC_HF_COW_GROTTO_POT_1] = Location::Pot(RC_HF_COW_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3410, -223), "Cow Grotto Pot 1", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_1)); + locationTable[RC_HF_COW_GROTTO_POT_2] = Location::Pot(RC_HF_COW_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3390, -258), "Cow Grotto Pot 2", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_2)); + locationTable[RC_HC_STORMS_GROTTO_POT_1] = Location::Pot(RC_HC_STORMS_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1843, 1014), "Storms Grotto Pot 1", RHT_POT_HYRULE_CASTLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_1)); + locationTable[RC_HC_STORMS_GROTTO_POT_2] = Location::Pot(RC_HC_STORMS_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1769, 954), "Storms Grotto Pot 2", RHT_POT_HYRULE_CASTLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_2)); + locationTable[RC_HC_STORMS_GROTTO_POT_3] = Location::Pot(RC_HC_STORMS_GROTTO_POT_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1857, 897), "Storms Grotto Pot 3", RHT_POT_HYRULE_CASTLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_3)); + locationTable[RC_HC_STORMS_GROTTO_POT_4] = Location::Pot(RC_HC_STORMS_GROTTO_POT_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1764, 847), "Storms Grotto Pot 4", RHT_POT_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_4)); // Dungeon Pots - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2673, -2060), "Lizalfos Pot 3", "Dodongos Cavern Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3526, -2574), "Lizalfos Pot 2", "Dodongos Cavern Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3579, -2574), "Lizalfos Pot 1", "Dodongos Cavern Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2653, -2031), "Lizalfos Pot 4", "Dodongos Cavern Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1708, -471), "Side Room Pot 1", "Dodongos Cavern Side Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1746, -424), "Side Room Pot 2", "Dodongos Cavern Side Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2573, -489), "Side Room Pot 3", "Dodongos Cavern Side Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2622, -489), "Side Room Pot 4", "Dodongos Cavern Side Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3507, -964), "Side Room Pot 5", "Dodongos Cavern Side Room Pot 5", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3617, -911), "Side Room Pot 6", "Dodongos Cavern Side Room Pot 6", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1846, -1879), "Torch Room Pot 1", "Dodongos Cavern Torch Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2050, -1964), "Torch Room Pot 2", "Dodongos Cavern Torch Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2281, -1799), "Torch Room Pot 3", "Dodongos Cavern Torch Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1836, -1239), "Torch Room Pot 4", "Dodongos Cavern Torch Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2414, -1823), "Staircase Pot 1", "Dodongos Cavern Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2368, -1827), "Staircase Pot 2", "Dodongos Cavern Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1574, -1831), "Staircase Pot 3", "Dodongos Cavern Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1528, -1827), "Staircase Pot 4", "Dodongos Cavern Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "Single Eye Pot 1", "Dodongos Cavern Single Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "Single Eye Pot 2", "Dodongos Cavern Single Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BLADE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1656, -531), "Blade Pot 1", "Dodongos Cavern Blade Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_BLADE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1831, -593), "Blade Pot 2", "Dodongos Cavern Blade Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3329, -753), "Double Eye Pot 1", "Dodongos Cavern Double Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2705, -1086), "Double Eye Pot 2", "Dodongos Cavern Double Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1027, -3704), "Back Room Pot 1", "Dodongos Cavern Back Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(966, -3704), "Back Room Pot 2", "Dodongos Cavern Back Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(125, -3854), "Back Room Pot 3", "Dodongos Cavern Back Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(78, -3835), "Back Room Pot 4", "Dodongos Cavern Back Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1295, -3612), "Above Big Octo Pot 1", "Jabu Jabus Belly Above Big Octo Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1355, -3612), "Above Big Octo Pot 2", "Jabu Jabus Belly Above Big Octo Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1422, -3612), "Above Big Octo Pot 3", "Jabu Jabus Belly Above Big Octo Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_1, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-551, 33), "Barinade Pot 1", "Jabu Jabus Belly Barinade Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_2, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(551, 36), "Barinade Pot 2", "Jabu Jabus Belly Barinade Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_3, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(554, -493), "Barinade Pot 3", "Jabu Jabus Belly Barinade Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_4, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-543, -496), "Barinade Pot 4", "Jabu Jabus Belly Barinade Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_5, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-268, -786), "Barinade Pot 5", "Jabu Jabus Belly Barinade Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_6] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_6, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(279, -761), "Barinade Pot 6", "Jabu Jabus Belly Barinade Pot 6", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(703, -2371), "Basement Pot 1", "Jabu Jabus Belly Basement Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(645, -2408), "Basement Pot 2", "Jabu Jabus Belly Basement Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(650, -2344), "Basement Pot 3", "Jabu Jabus Belly Basement Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1127, -2271), "Two Octorok Pot 1", "Jabu Jabus Belly Two Octorok Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1178, -2272), "Two Octorok Pot 2", "Jabu Jabus Belly Two Octorok Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1150, -2248), "Two Octorok Pot 3", "Jabu Jabus Belly Two Octorok Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1131, -2221), "Two Octorok Pot 4", "Jabu Jabus Belly Two Octorok Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1173, -2227), "Two Octorok Pot 5", "Jabu Jabus Belly Two Octorok Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "Lobby Pot 1", "Forest Temple Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_1)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "Lobby Pot 2", "Forest Temple Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_2)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "Lobby Pot 3", "Forest Temple Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_3)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "Lobby Pot 4", "Forest Temple Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_4)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_5, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "Lobby Pot 5", "Forest Temple Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_5)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_6, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "Lobby Pot 6", "Forest Temple Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_6)); - locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "Lower Stalfos Pot 1", "Forest Temple Lower Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "Lower Stalfos Pot 2", "Forest Temple Lower Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "Green Poe Pot 1", "Forest Temple Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "Green Poe Pot 2", "Forest Temple Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "Upper Stalfos Pot 1", "Forest Temple Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "Upper Stalfos Pot 2", "Forest Temple Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "Upper Stalfos Pot 3", "Forest Temple Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "Upper Stalfos Pot 4", "Forest Temple Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "Blue Poe Pot 1", "Forest Temple Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "Blue Poe Pot 2", "Forest Temple Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "Blue Poe Pot 3", "Forest Temple Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3)); - locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "Frozen Eye Pot 1", "Forest Temple Frozen Eye Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1)); - locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "Frozen Eye Pot 2", "Forest Temple Frozen Eye Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1086, -714), "Near Boss Pot 1", "Fire Temple Near Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1138, -713), "Near Boss Pot 2", "Fire Temple Near Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1087, -765), "Near Boss Pot 3", "Fire Temple Near Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1139, -766), "Near Boss Pot 4", "Fire Temple Near Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -754), "Big Lava Pot 1", "Fire Temple Big Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "Big Lava Pot 2", "Fire Temple Big Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2227, -862), "Big Lava Pot 3", "Fire Temple Big Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2388, 953), "Flame Maze Left Pot 1", "Fire Temple Flame Maze Left Pot 1", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2423, 920), "Flame Maze Left Pot 2", "Fire Temple Flame Maze Left Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2442, 715), "Flame Maze Left Pot 3", "Fire Temple Flame Maze Left Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2408, 680), "Flame Maze Left Pot 4", "Fire Temple Flame Maze Left Pot 4", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2208, -168), "Flame Maze Right Pot 1", "Fire Temple Flame Maze Right Pot 1", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2253, -167), "Flame Maze Right Pot 2", "Fire Temple Flame Maze Right Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "Flame Maze Right Pot 3", "Fire Temple Flame Maze Right Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -635), "Flame Maze Right Pot 4", "Fire Temple Flame Maze Right Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(330, -198), "Main Level 2 Pot 1", "Water Temple Main Level 2 Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(331, -168), "Main Level 2 Pot 2", "Water Temple Main Level 2 Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-241, -1193), "Main Level 1 Pot 1", "Water Temple Main Level 1 Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-117, -1192), "Main Level 1 Pot 2", "Water Temple Main Level 1 Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2)); - locationTable[RC_WATER_TEMPLE_TORCH_POT_1] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "Torch Pot 1", "Water Temple Torch Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_1)); - locationTable[RC_WATER_TEMPLE_TORCH_POT_2] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "Torch Pot 2", "Water Temple Torch Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_2)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_1] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "Near Compass Pot 1", "Water Temple Near Compass Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_2] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "Near Compass Pot 2", "Water Temple Near Compass Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_3] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "Near Compass Pot 3", "Water Temple Near Compass Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3)); - locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_1] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(688, 1008), "Central Bow Pot 1", "Water Temple Central Bow Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1)); - locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_2] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(631, 1008), "Central Bow Pot 2", "Water Temple Central Bow Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "Behind Gate Pot 1", "Water Temple Behind Gate Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "Behind Gate Pot 2", "Water Temple Behind Gate Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_3] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "Behind Gate Pot 3", "Water Temple Behind Gate Pot 3", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_4] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "Behind Gate Pot 4", "Water Temple Behind Gate Pot 4", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4)); - locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "Basement Block Puzzle Pot 1", "Water Temple Basement Block Puzzle Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1)); - locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "Basement Block Puzzle Pot 2", "Water Temple Basement Block Puzzle Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2)); - locationTable[RC_WATER_TEMPLE_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "River Pot 1", "Water Temple River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_1)); - locationTable[RC_WATER_TEMPLE_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "River Pot 2", "Water Temple River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_2)); - locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_1] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "Like Like Pot 1", "Water Temple Like Like Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1)); - locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_2] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "Like Like Pot 2", "Water Temple Like Like Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2)); - locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_1] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "Boss Key Pot 1", "Water Temple Boss Key Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1)); - locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_2] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "Boss Key Pot 2", "Water Temple Boss Key Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2)); - locationTable[RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1806, -344), "Near Dead Hand Pot 1", "Shadow Temple Near Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1721, 61), "Whispering Walls Pot 1", "Shadow Temple Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1407, 61), "Whispering Walls Pot 2", "Shadow Temple Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1614, 61), "Whispering Walls Pot 3", "Shadow Temple Whispering Walls Pot 3", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1055, -257), "Whispering Walls Pot 4", "Shadow Temple Whispering Walls Pot 4", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1050, -130), "Whispering Walls Pot 5", "Shadow Temple Whispering Walls Pot 5", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5)); - locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-665, -760), "Map Chest Pot 1", "Shadow Temple Map Chest Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-929, -748), "Map Chest Pot 2", "Shadow Temple Map Chest Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "Falling Spikes Pot 1", "Shadow Temple Falling Spikes Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "Falling Spikes Pot 2", "Shadow Temple Falling Spikes Pot 2", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "Falling Spikes Pot 3", "Shadow Temple Falling Spikes Pot 3", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "Falling Spikes Pot 4", "Shadow Temple Falling Spikes Pot 4", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4)); - locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "After Wind Pot 1", "Shadow Temple After Wind Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "After Wind Pot 2", "Shadow Temple After Wind Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2)); - locationTable[RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "Spike Walls Pot 1", "Shadow Temple Spike Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "Floormaster Pot 1", "Shadow Temple Floormaster Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "Floormaster Pot 2", "Shadow Temple Floormaster Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "After Boat Pot 1", "Shadow Temple After Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "After Boat Pot 2", "Shadow Temple After Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "After Boat Pot 3", "Shadow Temple After Boat Pot 3", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "After Boat Pot 4", "Shadow Temple After Boat Pot 4", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-181, 233), "Lobby Pot 1", "Spirit Temple Lobby Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(184, 231), "Lobby Pot 2", "Spirit Temple Lobby Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-975, -1751), "Anubis Pot 1", "Spirit Temple Anubis Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-928, -1827), "Anubis Pot 2", "Spirit Temple Anubis Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1211, -1530), "Anubis Pot 3", "Spirit Temple Anubis Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1055, -1680), "Anubis Pot 4", "Spirit Temple Anubis Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SHIELD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1101, -1305), "Child Climb Pot 1", "Spirit Temple Child Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1781, 830), "After Sun Block Pot 1", "Spirit Temple After Sun Block Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1617, 830), "After Sun Block Pot 2", "Spirit Temple After Sun Block Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-600, -1213), "Central Chamber Pot 1", "Spirit Temple Central Chamber Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-564, -1180), "Central Chamber Pot 2", "Spirit Temple Central Chamber Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-526, -1213), "Central Chamber Pot 3", "Spirit Temple Central Chamber Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "Central Chamber Pot 4", "Spirit Temple Central Chamber Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(671, -1179), "Central Chamber Pot 5", "Spirit Temple Central Chamber Pot 5", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "Central Chamber Pot 6", "Spirit Temple Central Chamber Pot 6", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6)); - locationTable[RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(819, -333), "Beamos Hall Pot 1", "Spirit Temple Beamos Hall Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1)); - locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1725, 2336), "Forest Trial Pot 1", "Ganons Castle Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1892, 2241), "Forest Trial Pot 2", "Ganons Castle Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1898, -3942), "Fire Trial Pot 2", "Ganons Castle Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2051, -3855), "Fire Trial Pot 1", "Ganons Castle Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -920), "Water Trial Pot 1", "Ganons Castle Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -761), "Water Trial Pot 2", "Ganons Castle Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2822, -507), "Water Trial Pot 3", "Ganons Castle Water Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1234, -3418), "Shadow Trial Pot 1", "Ganons Castle Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1621, -3203), "Shadow Trial Pot 2", "Ganons Castle Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2067, -4592), "Shadow Trial Pot 3", "Ganons Castle Shadow Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2224, -4506), "Shadow Trial Pot 4", "Ganons Castle Shadow Trial Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1398, 1402), "Spirit Trial Pot 1", "Ganons Castle Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1237, 1494), "Spirit Trial Pot 2", "Ganons Castle Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2581, -839), "Light Trial Boulder Pot 1", "Ganons Castle Light Trial Boulder Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -923), "Light Trial Pot 1", "Ganons Castle Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -755), "Light Trial Pot 2", "Ganons Castle Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_1] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-422, -258), "Ganons Tower Pot 1", "Ganons Castle Ganons Tower Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_2] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -300), "Ganons Tower Pot 2", "Ganons Castle Ganons Tower Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_3] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -341), "Ganons Tower Pot 3", "Ganons Castle Ganons Tower Pot 3", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_4] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-298, -383), "Ganons Tower Pot 4", "Ganons Castle Ganons Tower Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_5] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-257, -424), "Ganons Tower Pot 5", "Ganons Castle Ganons Tower Pot 5", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_6] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -259), "Ganons Tower Pot 6", "Ganons Castle Ganons Tower Pot 6", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_7] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -300), "Ganons Tower Pot 7", "Ganons Castle Ganons Tower Pot 7", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_8] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-301, -341), "Ganons Tower Pot 8", "Ganons Castle Ganons Tower Pot 8", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_9] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-258, -383), "Ganons Tower Pot 9", "Ganons Castle Ganons Tower Pot 9", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_10] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(418, -261), "Ganons Tower Pot 10", "Ganons Castle Ganons Tower Pot 10", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_11] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(377, -301), "Ganons Tower Pot 11", "Ganons Castle Ganons Tower Pot 11", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_12] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(338, -340), "Ganons Tower Pot 12", "Ganons Castle Ganons Tower Pot 12", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_13] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(300, -380), "Ganons Tower Pot 13", "Ganons Castle Ganons Tower Pot 13", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_14] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -420), "Ganons Tower Pot 14", "Ganons Castle Ganons Tower Pot 14", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_15] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(378, -261), "Ganons Tower Pot 15", "Ganons Castle Ganons Tower Pot 15", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_16] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(337, -300), "Ganons Tower Pot 16", "Ganons Castle Ganons Tower Pot 16", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_17] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(299, -340), "Ganons Tower Pot 17", "Ganons Castle Ganons Tower Pot 17", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_18] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -380), "Ganons Tower Pot 18", "Ganons Castle Ganons Tower Pot 18", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-95, -673), "Basement Pot 1", "Bottom Of The Well Basement Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(75, -598), "Basement Pot 2", "Bottom Of The Well Basement Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(270, -1151), "Basement Pot 3", "Bottom Of The Well Basement Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1254), "Basement Pot 4", "Bottom Of The Well Basement Pot 4", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(378, -1089), "Basement Pot 5", "Bottom Of The Well Basement Pot 5", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(665, -1252), "Basement Pot 6", "Bottom Of The Well Basement Pot 6", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1345), "Basement Pot 7", "Bottom Of The Well Basement Pot 7", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(562, -1304), "Basement Pot 8", "Bottom Of The Well Basement Pot 8", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(313, -1086), "Basement Pot 9", "Bottom Of The Well Basement Pot 9", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(618, -1254), "Basement Pot 10", "Bottom Of The Well Basement Pot 10", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(257, -1099), "Basement Pot 11", "Bottom Of The Well Basement Pot 11", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(296, -1206), "Basement Pot 12", "Bottom Of The Well Basement Pot 12", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-969, 55), "Left Side Pot 1", "Bottom Of The Well Left Side Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-966, 9), "Left Side Pot 2", "Bottom Of The Well Left Side Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-965, -32), "Left Side Pot 3", "Bottom Of The Well Left Side Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-41, 389), "Near Entrance Pot 1", "Bottom Of The Well Near Entrance Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(36, 389), "Near Entrance Pot 2", "Bottom Of The Well Near Entrance Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(874, -1294), "Fire Keese Pot 1", "Bottom Of The Well Fire Keese Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(3, -1641), "Underwater Pot", "Bottom Of The Well Underwater Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT)); - locationTable[RC_ICE_CAVERN_HALL_POT_1] = Location::Pot(RC_ICE_CAVERN_HALL_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-206, 449), "Hall Pot 1", "Ice Cavern Hall Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_1)); - locationTable[RC_ICE_CAVERN_HALL_POT_2] = Location::Pot(RC_ICE_CAVERN_HALL_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-203, 492), "Hall Pot 2", "Ice Cavern Hall Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_2)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_1] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "Spinning Blade Pot 1", "Ice Cavern Spinning Blade Pot 1", RHT_POT_ICE_CAVERN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_2] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "Spinning Blade Pot 2", "Ice Cavern Spinning Blade Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_3] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "Spinning Blade Pot 3", "Ice Cavern Spinning Blade Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3)); - locationTable[RC_ICE_CAVERN_NEAR_END_POT_1] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1422, 586), "Near End Pot 1", "Ice Cavern Near End Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_1)); - locationTable[RC_ICE_CAVERN_NEAR_END_POT_2] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1488, 676), "Near End Pot 2", "Ice Cavern Near End Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_2)); - locationTable[RC_ICE_CAVERN_FROZEN_POT_1] = Location::Pot(RC_ICE_CAVERN_FROZEN_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(366, -2036), "Frozen Pot 1", "Ice Cavern Frozen Pot 1", RHT_POT_ICE_CAVERN, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_FROZEN_POT_1)); - - // MQ Dungeon Pots - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2391, -1804), "MQ Staircase Pot 1", "Dodongos Cavern MQ Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2361, -1161), "MQ Staircase Pot 2", "Dodongos Cavern MQ Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1525, -1800), "MQ Staircase Pot 3", "Dodongos Cavern MQ Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1558, -1169), "MQ Staircase Pot 4", "Dodongos Cavern MQ Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1532, -1225), "MQ Torch Puzzle Middle Pot", "Dodongos Cavern MQ Torch Puzzle Middle Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "MQ Big Block Pot 1", "Dodongos Cavern MQ Big Block Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "MQ Big Block Pot 2", "Dodongos Cavern MQ Big Block Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3869, -811), "MQ Upper Lizalfos Pot 1", "Dodongos Cavern MQ Upper Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3867, -969), "MQ Upper Lizalfos Pot 2", "Dodongos Cavern MQ Upper Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4687, -1071), "MQ Upper Lizalfos Pot 3", "Dodongos Cavern MQ Upper Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4693, -1194), "MQ Upper Lizalfos Pot 4", "Dodongos Cavern MQ Upper Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3327, -805), "MQ Two Flames Pot 1", "Dodongos Cavern MQ Two Flames Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3326, -753), "MQ Two Flames Pot 2", "Dodongos Cavern MQ Two Flames Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1827, -587), "MQ Torch Puzzle Corner Pot", "Dodongos Cavern MQ Torch Puzzle Corner Pot", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1727, -151), "MQ Right Side Pot 1", "Dodongos Cavern MQ Right Side Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1815, -154), "MQ Right Side Pot 2", "Dodongos Cavern MQ Right Side Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3442, -469), "MQ Right Side Pot 3", "Dodongos Cavern MQ Right Side Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3682, -466), "MQ Right Side Pot 4", "Dodongos Cavern MQ Right Side Pot 4", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1844, -1867), "MQ Poe Room Pot 1", "Dodongos Cavern MQ Poe Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2272, -2213), "MQ Poe Room Pot 2", "Dodongos Cavern MQ Poe Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2240, -1369), "MQ Poe Room Pot 3", "Dodongos Cavern MQ Poe Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1535, -1299), "MQ Poe Room Pot 4", "Dodongos Cavern MQ Poe Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(258, -3055), "MQ Before Boss SW Pot", "Dodongos Cavern MQ Before Boss SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-265, -2499), "MQ Before Boss NE Pot", "Dodongos Cavern MQ Before Boss NE Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1758, -3194), "MQ Armos Room SE Pot", "Dodongos Cavern MQ Armos SE Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1223, -3197), "MQ Armos Room SW Pot", "Dodongos Cavern MQ Armos SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1663, -4311), "MQ Backroom Pot 1", "Dodongos Cavern MQ Backroom Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1648, -4694), "MQ Backroom Pot 2", "Dodongos Cavern MQ Backroom Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1005, -3711), "MQ Armos Room NW Pot", "Dodongos Cavern MQ Armos NW Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1066, -3711), "MQ Armos Room NE Pot", "Dodongos Cavern MQ Armos NE Pot", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-183, -449), "MQ Entrance Pot 1", "Jabu Jabus Belly MQ Entrance Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(202, -62), "MQ Entrance Pot 2", "Jabu Jabus Belly MQ Entrance Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-689, -1800), "MQ Geyser Pot 1", "Jabu Jabus Belly MQ Geyser Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-693, -1614), "MQ Geyser Pot 2", "Jabu Jabus Belly MQ Geyser Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(697, -2318), "MQ Time Block Pot 1", "Jabu Jabus Belly MQ Time Block Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(699, -2445), "MQ Time Block Pot 2", "Jabu Jabus Belly MQ Time Block Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(612, -5932), "MQ Like Likes Pot 1", "Jabu Jabus Belly MQ Like Likes Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(718, -5929), "MQ Like Likes Pot 2", "Jabu Jabus Belly MQ Like Likes Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1305, -2005), "MQ Before Boss Pot 1", "Jabu Jabus Belly MQ Before Boss Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "MQ Lobby Pot 1", "Forest Temple MQ Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "MQ Lobby Pot 2", "Forest Temple MQ Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "MQ Lobby Pot 3", "Forest Temple MQ Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "MQ Lobby Pot 4", "Forest Temple MQ Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "MQ Lobby Pot 5", "Forest Temple MQ Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "MQ Lobby Pot 6", "Forest Temple MQ Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6)); - locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "MQ Wolfos Pot 1", "Forest Temple MQ Wolfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "MQ Wolfos Pot 2", "Forest Temple MQ Wolfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "MQ Upper Stalfos Pot 1", "Forest Temple MQ Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "MQ Upper Stalfos Pot 2", "Forest Temple MQ Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "MQ Upper Stalfos Pot 3", "Forest Temple MQ Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "MQ Upper Stalfos Pot 4", "Forest Temple MQ Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "MQ Blue Poe Pot 1", "Forest Temple MQ Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "MQ Blue Poe Pot 2", "Forest Temple MQ Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "MQ Blue Poe Pot 3", "Forest Temple MQ Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "MQ Green Poe Pot 1", "Forest Temple MQ Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "MQ Green Poe Pot 2", "Forest Temple MQ Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-461, -1095), "MQ Basement Pot 1", "Forest Temple MQ Basement Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-351, -979), "MQ Basement Pot 2", "Forest Temple MQ Basement Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-387, -1018), "MQ Basement Pot 3", "Forest Temple MQ Basement Pot 3", RHT_POT_FOREST_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-424, -1057), "MQ Basement Pot 4", "Forest Temple MQ Basement Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4)); - locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1873, 2252), "MQ Forest Trial Pot 1", "Ganons Castle MQ Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1726, 2326), "MQ Forest Trial Pot 2", "Ganons Castle MQ Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3544, -931), "MQ Water Trial Pot 1", "Ganons Castle MQ Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3541, -755), "MQ Water Trial Pot 2", "Ganons Castle MQ Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2073, -4592), "MQ Shadow Trial Pot 1", "Ganons Castle MQ Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2217, -4516), "MQ Shadow Trial Pot 2", "Ganons Castle MQ Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1918, -3957), "MQ Fire Trial Pot 1", "Ganons Castle MQ Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2052, -3888), "MQ Fire Trial Pot 2", "Ganons Castle MQ Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3842, -759), "MQ Light Trial Pot 1", "Ganons Castle MQ Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3845, -933), "MQ Light Trial Pot 2", "Ganons Castle MQ Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1402, 1414), "MQ Spirit Trial Pot 1", "Ganons Castle MQ Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1256, 1500), "MQ Spirit Trial Pot 2", "Ganons Castle MQ Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -130), "MQ Whispering Walls Pot 1", "Shadow Temple MQ Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -240), "MQ Whispering Walls Pot 2", "Shadow Temple MQ Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-657, -949), "MQ Entrance Redead Pot 1", "Shadow Temple MQ Entrance Redead Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-713, -1016), "MQ Entrance Redead Pot 2", "Shadow Temple MQ Entrance Redead Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "MQ Lower Umbrella W Pot", "Shadow Temple MQ Stone Umbrella Lower West Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "MQ Lower Umbrella E Pot", "Shadow Temple MQ Stone Umbrella Lower East Pot", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "MQ Upper Umbrella S Pot", "Shadow Temple MQ Stone Umbrella Upper South Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3)); - locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "MQ Upper Umbrella N Pot", "Shadow Temple MQ Stone Umbrella Upper North Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "MQ Before Boat Pot 1", "Shadow Temple MQ Before Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "MQ Before Boat Pot 2", "Shadow Temple MQ Before Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "MQ Before Chasm W Pot", "Shadow Temple MQ Before Chasm West Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "MQ Before Chasm E Pot", "Shadow Temple MQ Before Chasm East Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "MQ After Chasm W Pot", "Shadow Temple MQ After Chasm West Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3)); - locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "MQ After Chasm E Pot", "Shadow Temple MQ After Chasm East Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4)); - locationTable[RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "MQ Spike Baricade Pot", "Shadow Temple MQ Spike Baricade Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT)); - locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "MQ Dead Hand Pot 1", "Shadow Temple MQ Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "MQ Dead Hand Pot 2", "Shadow Temple MQ Dead Hand Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(339, -377), "MQ Inner Lobby Pot 1", "Bottom Of The Well MQ Inner Lobby Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(416, -377), "MQ Inner Lobby Pot 2", "Bottom Of The Well MQ Inner Lobby Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(269, -376), "MQ Inner Lobby Pot 3", "Bottom Of The Well MQ Inner Lobby Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(421, -174), "MQ Outer Lobby Pot", "Bottom Of The Well MQ Outer Lobby Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(288, -1240), "MQ East Inner Pot 1", "Bottom Of The Well MQ East Inner Room Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(438, -1234), "MQ East Inner Pot 2", "Bottom Of The Well MQ East Inner Room Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(444, -1114), "MQ East Inner Pot 3", "Bottom Of The Well MQ East Inner Room Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-357, 957), "MQ Entrance Pot 1", "Fire Temple MQ Entrance Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(356, 959), "MQ Entrance Pot 2", "Fire Temple MQ Entrance Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(187, -1449), "MQ Before Mini Boss Pot 1", "Fire Temple MQ Before Mini Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(188, -1514), "MQ Before Mini Boss Pot 2", "Fire Temple MQ Before Mini Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(487, -1450), "MQ Before Mini Boss Pot 3", "Fire Temple MQ Before Mini Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(486, -1515), "MQ Before Mini Boss Pot 4", "Fire Temple MQ Before Mini Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(38, -1179), "MQ Before Mini Boss Pot 5", "Fire Temple MQ Before Mini Boss Pot 5", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(42, -1298), "MQ Before Mini Boss Pot 6", "Fire Temple MQ Before Mini Boss Pot 6", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(520, -943), "MQ Before Mini Boss Pot 7", "Fire Temple MQ Before Mini Boss Pot 7", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(35, -946), "MQ Before Mini Boss Pot 8", "Fire Temple MQ Before Mini Boss Pot 8", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1426, -711), "MQ Outside Boss Pot 1", "Fire Temple MQ Outside Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1425, -660), "MQ Outside Boss Pot 2", "Fire Temple MQ Outside Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1646, -1260), "MQ Lava Room North Pot", "Fire Temple MQ Lava Room North Pot", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "MQ Lava Room High Pot", "Fire Temple MQ Lava Room High Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1634, 1475), "MQ Lava Room South Pot", "Fire Temple MQ Lava Room South Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(845, -1591), "MQ Lava Torch Pot 1", "Fire Temple MQ Lava Torch Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(901, -1593), "MQ Lava Torch Pot 2", "Fire Temple MQ Lava Torch Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1756, -155), "MQ Above Lava Pot 1", "Fire Temple MQ Above Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1819, -82), "MQ Above Lava Pot 2", "Fire Temple MQ Above Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1789, -122), "MQ Above Lava Pot 3", "Fire Temple MQ Above Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1493, 386), "MQ Flame Wall Pot 1", "Fire Temple MQ Flame Wall Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1445, 445), "MQ Flame Wall Pot 2", "Fire Temple MQ Flame Wall Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2217, -163), "MQ Past Fire Maze North Pot", "Fire Temple MQ Past Fire Maze North Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "MQ Past Fire Maze South Pot", "Fire Temple MQ Past Fire Maze South Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1849, -1114), "MQ Fire Maze Northmost Pot", "Fire Temple MQ Fire Maze Northmost Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2110, -646), "MQ Fire Maze North West Pot", "Fire Temple MQ Fire Maze North West Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4)); - locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2319, 838), "MQ South Fire Maze W Pot", "Fire Temple MQ South Fire Maze West Pot", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5)); - locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2285, 803), "MQ South Fire Maze E Pot", "Fire Temple MQ South Fire Maze East Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6)); - locationTable[RC_ICE_CAVERN_MQ_ENTRANCE_POT] = Location::Pot(RC_ICE_CAVERN_MQ_ENTRANCE_POT, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(248, 2287), "MQ Entrance Pot", "Ice Cavern MQ Entrance Pot", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT)); - locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(51, 718), "MQ First Crystal Pot 1", "Ice Cavern MQ First Crystal Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(52, 768), "MQ First Crystal Pot 2", "Ice Cavern MQ First Crystal Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "MQ Early Wolfos Pot 1", "Ice Cavern MQ Early Wolfos Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "MQ Early Wolfos Pot 2", "Ice Cavern MQ Early Wolfos Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "MQ Early Wolfos Pot 3", "Ice Cavern MQ Early Wolfos Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(138, -672), "MQ Early Wolfos Pot 4", "Ice Cavern MQ Early Wolfos Pot 4", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4)); - locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1352, 639), "MQ Push Block Pot 1", "Ice Cavern MQ Push Block Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1396, 596), "MQ Push Block Pot 2", "Ice Cavern MQ Push Block Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(902, -2720), "MQ Compass Pot 1", "Ice Cavern MQ Compass Pot 1", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(451, -2726), "MQ Compass Pot 2", "Ice Cavern MQ Compass Pot 2", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-255, 742), "MQ Entrance Pot 1", "Spirit Temple MQ Entrance Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(306, 682), "MQ Entrance Pot 2", "Spirit Temple MQ Entrance Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-297, 687), "MQ Entrance Pot 3", "Spirit Temple MQ Entrance Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(260, 735), "MQ Entrance Pot 4", "Spirit Temple MQ Entrance Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-894, -50), "MQ Child Slugma Pot", "Spirit Temple MQ Child Slugma Pot", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-382, -1256), "MQ Child Gibdo Pot 1", "Spirit Temple MQ Child Gibdo Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-381, -1207), "MQ Child Gibdo Pot 2", "Spirit Temple MQ Child Gibdo Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1035, -1240), "MQ Child Like Like Pot", "Spirit Temple MQ Child Like Like Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1166, -1931), "MQ Child Stalfos Pot 1", "Spirit Temple MQ Child Stalfos Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-959, -1930), "MQ Child Stalfos Pot 2", "Spirit Temple MQ Child Stalfos Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-853, -1837), "MQ Child Stalfos Pot 3", "Spirit Temple MQ Child Stalfos Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1250, -1852), "MQ Child Stalfos Pot 4", "Spirit Temple MQ Child Stalfos Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "MQ Statue Room 2F CE Pot", "Spirit Temple MQ Statue 2F Center East Pot", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-521, -1576), "MQ Statue Room 3F E Pot", "Spirit Temple MQ Statue Room 3F East Pot", RHT_POT_SPIRIT_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-595, -1576), "MQ Statue Room 3F W Pot", "Spirit Temple MQ Statue Room 3F West Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-559, -1209), "MQ Statue Room 2F W Pot", "Spirit Temple MQ Statue 2F West Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "MQ Statue Room 2F E Pot", "Spirit Temple MQ Statue 2F Eastmost Pot", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5)); - locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1276, 432), "MQ Sun Blocks Pot 1", "Spirit Temple MQ Sun Blocks Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1635, -446), "MQ Sun Blocks Pot 2", "Spirit Temple MQ Sun Blocks Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(829, 250), "MQ Long Climb Pot 1", "Spirit Temple MQ Long Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(531, 249), "MQ Long Climb Pot 2", "Spirit Temple MQ Long Climb Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(244, -893), "MQ Big Mirror Pot 1", "Spirit Temple MQ Big Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-122, -741), "MQ Big Mirror Pot 2", "Spirit Temple MQ Big Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(250, -741), "MQ Big Mirror Pot 3", "Spirit Temple MQ Big Mirror Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-123, -892), "MQ Big Mirror Pot 4", "Spirit Temple MQ Big Mirror Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(781, -841), "MQ Before Mirror Pot 1", "Spirit Temple MQ Before Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(587, -844), "MQ Before Mirror Pot 2", "Spirit Temple MQ Before Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -910), "MQ Early Adult Pot 1", "Spirit Temple MQ Early Adult Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -1028), "MQ Early Adult Pot 2", "Spirit Temple MQ Early Adult Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "MQ Lower Torches Pot 1", "Water Temple MQ Lower Torches Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "MQ Lower Torches Pot 2", "Water Temple MQ Lower Torches Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "MQ Storage Room A Pot 1", "Water Temple MQ Storage Room A Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "MQ Storage Room A Pot 2", "Water Temple MQ Storage Room A Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "MQ Storage Room A Pot 3", "Water Temple MQ Storage Room A Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-989, 255), "MQ GS Storage Room Pot 1", "Water Temple MQ GS Storage Room Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1026, 257), "MQ GS Storage Room Pot 2", "Water Temple MQ GS Storage Room Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1062, 256), "MQ GS Storage Room Pot 3", "Water Temple MQ GS Storage Room Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(512, 579), "MQ Lizalfos Hall W Pot", "Water Temple MQ Lizalfos Hallway West Pot", RHT_POT_WATER_TEMPLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(602, 1022), "MQ Lizalfos Hall S Pot", "Water Temple MQ Lizalfos Hallway South Pot", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(789, 947), "MQ Lizalfos Hall SE Pot", "Water Temple MQ Lizalfos Hallway SE Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(768, 565), "MQ Lizalfos Cage N Pot", "Water Temple MQ Lizalfos Cage North Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(767, 517), "MQ Lizalfos Cage S Pot", "Water Temple MQ Lizalfos Cage South Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -751), "MQ Stalfos Pit Middle Pot", "Water Temple MQ Stalfos Pit Middle Pot", RHT_POT_WATER_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -686), "MQ Stalfos Pit South Pot", "Water Temple MQ Stalfos Pit South Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -810), "MQ Stalfos Pit North Pot", "Water Temple MQ Stalfos Pit North Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5)); - locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "MQ Before Dark Link Pot 1", "Water Temple MQ Before Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "MQ Before Dark Link Pot 2", "Water Temple MQ Before Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3072, -4024), "MQ After Dark Link Pot 1", "Water Temple MQ After Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3169, -4023), "MQ After Dark Link Pot 2", "Water Temple MQ After Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "MQ River Pot 1", "Water Temple MQ River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "MQ River Pot 2", "Water Temple MQ River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_BOSS_KEY_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1033, -1569), "MQ Boss Key Pot", "Water Temple MQ Boss Key Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "MQ Lowest GS Pot 1", "Water Temple MQ Lowest GS Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "MQ Lowest GS Pot 2", "Water Temple MQ Lowest GS Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "MQ Lowest GS Pot 3", "Water Temple MQ Lowest GS Pot 3", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "MQ Lowest GS Pot 4", "Water Temple MQ Lowest GS Pot 4", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "MQ Storage Room B Pot 1", "Water Temple MQ Storage Room B Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "MQ Storage Room B Pot 2", "Water Temple MQ Storage Room B Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "MQ Mini Dodongo Pot 1", "Water Temple MQ Mini Dodongo Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "MQ Mini Dodongo Pot 2", "Water Temple MQ Mini Dodongo Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -72), "MQ Lobby Left Pot 1", "Gerudo Training Ground MQ Lobby Left Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -177), "MQ Lobby Left Pot 2", "Gerudo Training Ground MQ Lobby Left Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(199, -79), "MQ Lobby Right Pot 1", "Gerudo Training Ground MQ Lobby Right Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(197, -179), "MQ Lobby Right Pot 2", "Gerudo Training Ground MQ Lobby Right Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2)); + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2673, -2060), "Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3526, -2574), "Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3579, -2574), "Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2653, -2031), "Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1708, -471), "Side Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1746, -424), "Side Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2573, -489), "Side Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2622, -489), "Side Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3507, -964), "Side Room Pot 5", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3617, -911), "Side Room Pot 6", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1846, -1879), "Torch Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2050, -1964), "Torch Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2281, -1799), "Torch Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1836, -1239), "Torch Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2414, -1823), "Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2368, -1827), "Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1574, -1831), "Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1528, -1827), "Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "Single Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "Single Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BLADE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1656, -531), "Blade Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_BLADE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1831, -593), "Blade Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3329, -753), "Double Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2705, -1086), "Double Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1027, -3704), "Back Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(966, -3704), "Back Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(125, -3854), "Back Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(78, -3835), "Back Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1295, -3612), "Above Big Octo Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1355, -3612), "Above Big Octo Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1422, -3612), "Above Big Octo Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_1, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-551, 33), "Barinade Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_2, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(551, 36), "Barinade Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_3, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(554, -493), "Barinade Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_4, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-543, -496), "Barinade Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_5, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-268, -786), "Barinade Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_6] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_6, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(279, -761), "Barinade Pot 6", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(703, -2371), "Basement Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(645, -2408), "Basement Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(650, -2344), "Basement Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1127, -2271), "Two Octorok Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1178, -2272), "Two Octorok Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1150, -2248), "Two Octorok Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1131, -2221), "Two Octorok Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1173, -2227), "Two Octorok Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_1)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_2)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_3)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_4)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_5, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_5)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_6, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_6)); + locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "Lower Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "Lower Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3)); + locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "Frozen Eye Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1)); + locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "Frozen Eye Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1086, -714), "Near Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1138, -713), "Near Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1087, -765), "Near Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1139, -766), "Near Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -754), "Big Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "Big Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2227, -862), "Big Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2388, 953), "Flame Maze Left Pot 1", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2423, 920), "Flame Maze Left Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2442, 715), "Flame Maze Left Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2408, 680), "Flame Maze Left Pot 4", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2208, -168), "Flame Maze Right Pot 1", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2253, -167), "Flame Maze Right Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "Flame Maze Right Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -635), "Flame Maze Right Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(330, -198), "Main Level 2 Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(331, -168), "Main Level 2 Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-241, -1193), "Main Level 1 Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-117, -1192), "Main Level 1 Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2)); + locationTable[RC_WATER_TEMPLE_TORCH_POT_1] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "Torch Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_1)); + locationTable[RC_WATER_TEMPLE_TORCH_POT_2] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "Torch Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_2)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_1] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "Near Compass Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_2] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "Near Compass Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_3] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "Near Compass Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3)); + locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_1] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(688, 1008), "Central Bow Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1)); + locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_2] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(631, 1008), "Central Bow Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "Behind Gate Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "Behind Gate Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_3] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "Behind Gate Pot 3", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_4] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "Behind Gate Pot 4", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4)); + locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "Basement Block Puzzle Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1)); + locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "Basement Block Puzzle Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2)); + locationTable[RC_WATER_TEMPLE_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_1)); + locationTable[RC_WATER_TEMPLE_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_2)); + locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_1] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "Like Like Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1)); + locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_2] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "Like Like Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2)); + locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_1] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "Boss Key Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1)); + locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_2] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "Boss Key Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2)); + locationTable[RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1806, -344), "Near Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1721, 61), "Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1407, 61), "Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1614, 61), "Whispering Walls Pot 3", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1055, -257), "Whispering Walls Pot 4", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1050, -130), "Whispering Walls Pot 5", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5)); + locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-665, -760), "Map Chest Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-929, -748), "Map Chest Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "Falling Spikes Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "Falling Spikes Pot 2", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "Falling Spikes Pot 3", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "Falling Spikes Pot 4", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4)); + locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "After Wind Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "After Wind Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2)); + locationTable[RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "Spike Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "Floormaster Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "Floormaster Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "After Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "After Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "After Boat Pot 3", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "After Boat Pot 4", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-181, 233), "Lobby Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(184, 231), "Lobby Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-975, -1751), "Anubis Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-928, -1827), "Anubis Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1211, -1530), "Anubis Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1055, -1680), "Anubis Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SHIELD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1101, -1305), "Child Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1781, 830), "After Sun Block Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1617, 830), "After Sun Block Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-600, -1213), "Central Chamber Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-564, -1180), "Central Chamber Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-526, -1213), "Central Chamber Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "Central Chamber Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(671, -1179), "Central Chamber Pot 5", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "Central Chamber Pot 6", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6)); + locationTable[RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(819, -333), "Beamos Hall Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1)); + locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1725, 2336), "Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1892, 2241), "Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1898, -3942), "Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2051, -3855), "Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -920), "Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -761), "Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2822, -507), "Water Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1234, -3418), "Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1621, -3203), "Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2067, -4592), "Shadow Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2224, -4506), "Shadow Trial Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1398, 1402), "Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1237, 1494), "Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2581, -839), "Light Trial Boulder Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -923), "Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -755), "Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_1] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-422, -258), "Ganons Tower Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_2] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -300), "Ganons Tower Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_3] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -341), "Ganons Tower Pot 3", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_4] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-298, -383), "Ganons Tower Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_5] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-257, -424), "Ganons Tower Pot 5", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_6] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -259), "Ganons Tower Pot 6", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_7] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -300), "Ganons Tower Pot 7", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_8] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-301, -341), "Ganons Tower Pot 8", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_9] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-258, -383), "Ganons Tower Pot 9", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_10] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(418, -261), "Ganons Tower Pot 10", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_11] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(377, -301), "Ganons Tower Pot 11", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_12] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(338, -340), "Ganons Tower Pot 12", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_13] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(300, -380), "Ganons Tower Pot 13", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_14] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -420), "Ganons Tower Pot 14", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_15] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(378, -261), "Ganons Tower Pot 15", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_16] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(337, -300), "Ganons Tower Pot 16", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_17] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(299, -340), "Ganons Tower Pot 17", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_18] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -380), "Ganons Tower Pot 18", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-95, -673), "Basement Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(75, -598), "Basement Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(270, -1151), "Basement Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1254), "Basement Pot 4", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(378, -1089), "Basement Pot 5", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(665, -1252), "Basement Pot 6", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1345), "Basement Pot 7", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(562, -1304), "Basement Pot 8", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(313, -1086), "Basement Pot 9", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(618, -1254), "Basement Pot 10", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(257, -1099), "Basement Pot 11", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(296, -1206), "Basement Pot 12", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-969, 55), "Left Side Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-966, 9), "Left Side Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-965, -32), "Left Side Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-41, 389), "Near Entrance Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(36, 389), "Near Entrance Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(874, -1294), "Fire Keese Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(3, -1641), "Underwater Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT)); + locationTable[RC_ICE_CAVERN_HALL_POT_1] = Location::Pot(RC_ICE_CAVERN_HALL_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-206, 449), "Hall Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_1)); + locationTable[RC_ICE_CAVERN_HALL_POT_2] = Location::Pot(RC_ICE_CAVERN_HALL_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-203, 492), "Hall Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_2)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_1] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "Spinning Blade Pot 1", RHT_POT_ICE_CAVERN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_2] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "Spinning Blade Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_3] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "Spinning Blade Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3)); + locationTable[RC_ICE_CAVERN_NEAR_END_POT_1] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1422, 586), "Near End Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_1)); + locationTable[RC_ICE_CAVERN_NEAR_END_POT_2] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1488, 676), "Near End Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_2)); + locationTable[RC_ICE_CAVERN_FROZEN_POT_1] = Location::Pot(RC_ICE_CAVERN_FROZEN_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(366, -2036), "Frozen Pot 1", RHT_POT_ICE_CAVERN, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_FROZEN_POT_1)); + + // MQ Dungeon Pots + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2391, -1804), "MQ Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2361, -1161), "MQ Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1525, -1800), "MQ Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1558, -1169), "MQ Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1532, -1225), "MQ Torch Puzzle Middle Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "MQ Big Block Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "MQ Big Block Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3869, -811), "MQ Upper Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3867, -969), "MQ Upper Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4687, -1071), "MQ Upper Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4693, -1194), "MQ Upper Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3327, -805), "MQ Two Flames Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3326, -753), "MQ Two Flames Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1827, -587), "MQ Torch Puzzle Corner Pot", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1727, -151), "MQ Right Side Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1815, -154), "MQ Right Side Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3442, -469), "MQ Right Side Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3682, -466), "MQ Right Side Pot 4", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1844, -1867), "MQ Poe Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2272, -2213), "MQ Poe Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2240, -1369), "MQ Poe Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1535, -1299), "MQ Poe Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(258, -3055), "MQ Before Boss SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-265, -2499), "MQ Before Boss NE Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1758, -3194), "MQ Armos Room SE Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1223, -3197), "MQ Armos Room SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1663, -4311), "MQ Backroom Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1648, -4694), "MQ Backroom Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1005, -3711), "MQ Armos Room NW Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1066, -3711), "MQ Armos Room NE Pot", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-183, -449), "MQ Entrance Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(202, -62), "MQ Entrance Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-689, -1800), "MQ Geyser Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-693, -1614), "MQ Geyser Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(697, -2318), "MQ Time Block Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(699, -2445), "MQ Time Block Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(612, -5932), "MQ Like Likes Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(718, -5929), "MQ Like Likes Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1305, -2005), "MQ Before Boss Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "MQ Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "MQ Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "MQ Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "MQ Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "MQ Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "MQ Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6)); + locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "MQ Wolfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "MQ Wolfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "MQ Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "MQ Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "MQ Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "MQ Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "MQ Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "MQ Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "MQ Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "MQ Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "MQ Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-461, -1095), "MQ Basement Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-351, -979), "MQ Basement Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-387, -1018), "MQ Basement Pot 3", RHT_POT_FOREST_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-424, -1057), "MQ Basement Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4)); + locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1873, 2252), "MQ Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1726, 2326), "MQ Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3544, -931), "MQ Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3541, -755), "MQ Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2073, -4592), "MQ Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2217, -4516), "MQ Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1918, -3957), "MQ Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2052, -3888), "MQ Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3842, -759), "MQ Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3845, -933), "MQ Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1402, 1414), "MQ Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1256, 1500), "MQ Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -130), "MQ Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -240), "MQ Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-657, -949), "MQ Entrance Redead Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-713, -1016), "MQ Entrance Redead Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "MQ Lower Umbrella W Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "MQ Lower Umbrella E Pot", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "MQ Upper Umbrella S Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "MQ Upper Umbrella N Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "MQ Before Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "MQ Before Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "MQ Before Chasm W Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "MQ Before Chasm E Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "MQ After Chasm W Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "MQ After Chasm E Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4)); + locationTable[RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "MQ Spike Baricade Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT)); + locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "MQ Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "MQ Dead Hand Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(339, -377), "MQ Inner Lobby Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(416, -377), "MQ Inner Lobby Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(269, -376), "MQ Inner Lobby Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(421, -174), "MQ Outer Lobby Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(288, -1240), "MQ East Inner Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(438, -1234), "MQ East Inner Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(444, -1114), "MQ East Inner Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-357, 957), "MQ Entrance Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(356, 959), "MQ Entrance Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(187, -1449), "MQ Before Mini Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(188, -1514), "MQ Before Mini Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(487, -1450), "MQ Before Mini Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(486, -1515), "MQ Before Mini Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(38, -1179), "MQ Before Mini Boss Pot 5", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(42, -1298), "MQ Before Mini Boss Pot 6", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(520, -943), "MQ Before Mini Boss Pot 7", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(35, -946), "MQ Before Mini Boss Pot 8", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1426, -711), "MQ Outside Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1425, -660), "MQ Outside Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1646, -1260), "MQ Lava Room North Pot", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "MQ Lava Room High Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1634, 1475), "MQ Lava Room South Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(845, -1591), "MQ Lava Torch Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(901, -1593), "MQ Lava Torch Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1756, -155), "MQ Above Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1819, -82), "MQ Above Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1789, -122), "MQ Above Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1493, 386), "MQ Flame Wall Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1445, 445), "MQ Flame Wall Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2217, -163), "MQ Past Fire Maze North Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "MQ Past Fire Maze South Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1849, -1114), "MQ Fire Maze Northmost Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2110, -646), "MQ Fire Maze North West Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4)); + locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2319, 838), "MQ South Fire Maze W Pot", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5)); + locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2285, 803), "MQ South Fire Maze E Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6)); + locationTable[RC_ICE_CAVERN_MQ_ENTRANCE_POT] = Location::Pot(RC_ICE_CAVERN_MQ_ENTRANCE_POT, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(248, 2287), "MQ Entrance Pot", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT)); + locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(51, 718), "MQ First Crystal Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(52, 768), "MQ First Crystal Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "MQ Early Wolfos Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "MQ Early Wolfos Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "MQ Early Wolfos Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(138, -672), "MQ Early Wolfos Pot 4", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4)); + locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1352, 639), "MQ Push Block Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1396, 596), "MQ Push Block Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(902, -2720), "MQ Compass Pot 1", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(451, -2726), "MQ Compass Pot 2", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-255, 742), "MQ Entrance Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(306, 682), "MQ Entrance Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-297, 687), "MQ Entrance Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(260, 735), "MQ Entrance Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-894, -50), "MQ Child Slugma Pot", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-382, -1256), "MQ Child Gibdo Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-381, -1207), "MQ Child Gibdo Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1035, -1240), "MQ Child Like Like Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1166, -1931), "MQ Child Stalfos Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-959, -1930), "MQ Child Stalfos Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-853, -1837), "MQ Child Stalfos Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1250, -1852), "MQ Child Stalfos Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "MQ Statue Room 2F CE Pot", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-521, -1576), "MQ Statue Room 3F E Pot", RHT_POT_SPIRIT_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-595, -1576), "MQ Statue Room 3F W Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-559, -1209), "MQ Statue Room 2F W Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "MQ Statue Room 2F E Pot", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5)); + locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1276, 432), "MQ Sun Blocks Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1635, -446), "MQ Sun Blocks Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(829, 250), "MQ Long Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(531, 249), "MQ Long Climb Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(244, -893), "MQ Big Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-122, -741), "MQ Big Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(250, -741), "MQ Big Mirror Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-123, -892), "MQ Big Mirror Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(781, -841), "MQ Before Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(587, -844), "MQ Before Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -910), "MQ Early Adult Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -1028), "MQ Early Adult Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "MQ Lower Torches Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "MQ Lower Torches Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "MQ Storage Room A Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "MQ Storage Room A Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "MQ Storage Room A Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-989, 255), "MQ GS Storage Room Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1026, 257), "MQ GS Storage Room Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1062, 256), "MQ GS Storage Room Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(512, 579), "MQ Lizalfos Hall W Pot", RHT_POT_WATER_TEMPLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(602, 1022), "MQ Lizalfos Hall S Pot", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(789, 947), "MQ Lizalfos Hall SE Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(768, 565), "MQ Lizalfos Cage N Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(767, 517), "MQ Lizalfos Cage S Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -751), "MQ Stalfos Pit Middle Pot", RHT_POT_WATER_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -686), "MQ Stalfos Pit South Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -810), "MQ Stalfos Pit North Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5)); + locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "MQ Before Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "MQ Before Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3072, -4024), "MQ After Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3169, -4023), "MQ After Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "MQ River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "MQ River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_BOSS_KEY_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1033, -1569), "MQ Boss Key Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "MQ Lowest GS Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "MQ Lowest GS Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "MQ Lowest GS Pot 3", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "MQ Lowest GS Pot 4", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "MQ Storage Room B Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "MQ Storage Room B Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "MQ Mini Dodongo Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "MQ Mini Dodongo Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -72), "MQ Lobby Left Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -177), "MQ Lobby Left Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(199, -79), "MQ Lobby Right Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(197, -179), "MQ Lobby Right Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2)); + + // clang-format on } -static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterPotLocations); \ No newline at end of file +static ObjectExtension::Register RegisterPotIdentity; +static RegisterShipInitFunc registerShufflePots(RegisterShufflePots, { "IS_RANDO" }); +static RegisterShipInitFunc registerShufflePotLocations(Rando::StaticData::RegisterPotLocations); diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.h b/soh/soh/Enhancements/randomizer/ShufflePots.h deleted file mode 100644 index 28c4e2f4a8..0000000000 --- a/soh/soh/Enhancements/randomizer/ShufflePots.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef SHUFFLEPOTS_H -#define SHUFFLEPOTS_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -void ObjTsubo_RandomizerInit(void* actorRef); -#ifdef __cplusplus -}; -#endif - -void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs); - -#endif //SHUFFLEPOTS_H diff --git a/soh/soh/Enhancements/randomizer/ShuffleSongs.cpp b/soh/soh/Enhancements/randomizer/ShuffleSongs.cpp new file mode 100644 index 0000000000..8bece13a1b --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleSongs.cpp @@ -0,0 +1,26 @@ +#include "soh/ShipInit.hpp" +#include "location.h" +#include "static_data.h" + +void Rando::StaticData::RegisterSongLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + locationTable[RC_SHEIK_IN_FOREST] = Location::Base(RC_SHEIK_IN_FOREST, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Sheik in Forest", "Sheik in Forest", RHT_SHEIK_IN_FOREST, RG_MINUET_OF_FOREST, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_MINUET_OF_FOREST), true); + locationTable[RC_SHEIK_IN_CRATER] = Location::Base(RC_SHEIK_IN_CRATER, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_CRATER, 0x00, "Sheik in Crater", "Sheik in Crater", RHT_SHEIK_IN_CRATER, RG_BOLERO_OF_FIRE, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_BOLERO_OF_FIRE), true); + locationTable[RC_SHEIK_IN_ICE_CAVERN] = Location::Base(RC_SHEIK_IN_ICE_CAVERN, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_ICE_CAVERN, 0x00, "Sheik in Ice Cavern", "Sheik in Ice Cavern", RHT_SHEIK_IN_ICE_CAVERN, RG_SERENADE_OF_WATER, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER), true); + locationTable[RC_SHEIK_AT_COLOSSUS] = Location::Base(RC_SHEIK_AT_COLOSSUS, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DESERT_COLOSSUS, 0x00, "Sheik at Colossus", "Sheik at Colossus", RHT_SHEIK_AT_COLOSSUS, RG_REQUIEM_OF_SPIRIT, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT), true); + locationTable[RC_SHEIK_IN_KAKARIKO] = Location::Base(RC_SHEIK_IN_KAKARIKO, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, "Sheik in Kakariko", "Sheik in Kakariko", RHT_SHEIK_IN_KAKARIKO, RG_NOCTURNE_OF_SHADOW, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL), true); + locationTable[RC_SHEIK_AT_TEMPLE] = Location::Base(RC_SHEIK_AT_TEMPLE, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, 0x00, "Sheik at Temple", "Sheik at Temple", RHT_SHEIK_AT_TEMPLE, RG_PRELUDE_OF_LIGHT, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT), true); + locationTable[RC_SONG_FROM_IMPA] = Location::Base(RC_SONG_FROM_IMPA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, "Song from Impa", "Song from Impa", RHT_SONG_FROM_IMPA, RG_ZELDAS_LULLABY, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY), true); + locationTable[RC_SONG_FROM_MALON] = Location::Base(RC_SONG_FROM_MALON, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_LON_LON_RANCH, 0x00, "Song from Malon", "Song from Malon", RHT_SONG_FROM_MALON, RG_EPONAS_SONG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LEARNED_EPONA_SONG), true); + locationTable[RC_SONG_FROM_SARIA] = Location::Base(RC_SONG_FROM_SARIA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Song from Saria", "Song from Saria", RHT_SONG_FROM_SARIA, RG_SARIAS_SONG, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SARIAS_SONG), true); + locationTable[RC_SONG_FROM_ROYAL_FAMILYS_TOMB] = Location::Base(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_ROYAL_FAMILYS_TOMB, 0x00, "Song from Royal Family's Tomb", "Song from Royal Family's Tomb", RHT_SONG_FROM_ROYAL_FAMILYS_TOMB, RG_SUNS_SONG, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SUNS_SONG), true); + locationTable[RC_SONG_FROM_OCARINA_OF_TIME] = Location::Base(RC_SONG_FROM_OCARINA_OF_TIME, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_HYRULE_FIELD, 0x00, "Song from Ocarina of Time", "Song from Ocarina of Time", RHT_SONG_FROM_OCARINA_OF_TIME, RG_SONG_OF_TIME, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SONG_OF_TIME), true); + locationTable[RC_SONG_FROM_WINDMILL] = Location::Base(RC_SONG_FROM_WINDMILL, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x00, "Song from Windmill", "Song from Windmill", RHT_SONG_FROM_WINDMILL, RG_SONG_OF_STORMS, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SONG_OF_STORMS), true); + // clang-format-on +} + +static RegisterShipInitFunc initSongLocations(Rando::StaticData::RegisterSongLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleTradeItems.c b/soh/soh/Enhancements/randomizer/ShuffleTradeItems.c index 62e0bc9f0f..8b43884e4b 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleTradeItems.c +++ b/soh/soh/Enhancements/randomizer/ShuffleTradeItems.c @@ -8,7 +8,7 @@ u8 Randomizer_GetNextChildTradeItem() { for (int i = 0; i < numTradeItems; i++) { u8 tradeIndex = (currentTradeItemIndex + i + 1) % numTradeItems; if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG)) { - return ITEM_WEIRD_EGG + tradeIndex; + return ITEM_WEIRD_EGG + tradeIndex; } } return ITEM_NONE; @@ -20,7 +20,7 @@ u8 Randomizer_GetPrevChildTradeItem() { for (int i = 0; i < numTradeItems; i++) { u8 tradeIndex = (currentTradeItemIndex - i - 1 + numTradeItems) % numTradeItems; if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG)) { - return ITEM_WEIRD_EGG + tradeIndex; + return ITEM_WEIRD_EGG + tradeIndex; } } return ITEM_NONE; @@ -32,7 +32,7 @@ u8 Randomizer_GetNextAdultTradeItem() { for (int i = 0; i < numTradeItems; i++) { u8 tradeIndex = (currentTradeItemIndex + i + 1) % numTradeItems; if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) { - return ITEM_POCKET_EGG + tradeIndex; + return ITEM_POCKET_EGG + tradeIndex; } } return ITEM_NONE; @@ -44,7 +44,7 @@ u8 Randomizer_GetPrevAdultTradeItem() { for (int i = 0; i < numTradeItems; i++) { u8 tradeIndex = (currentTradeItemIndex - i - 1 + numTradeItems) % numTradeItems; if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) { - return ITEM_POCKET_EGG + tradeIndex; + return ITEM_POCKET_EGG + tradeIndex; } } return ITEM_NONE; diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 9fcf71d55f..2ee39006d0 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -11,6 +11,7 @@ #include "fishsanity.h" #include "macros.h" #include "3drando/hints.hpp" +#include "soh/util.h" #include "../kaleido.h" #include @@ -45,6 +46,7 @@ Context::Context() { &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_FREESTANDING], &mOptions[RSK_SHUFFLE_MERCHANTS], &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], @@ -87,7 +89,7 @@ Hint* Context::GetHint(const RandomizerHint hintKey) { } void Context::AddHint(const RandomizerHint hintId, const Hint hint) { - hintTable[hintId] = hint; //RANDOTODO this should probably be an rvalue + hintTable[hintId] = hint; // RANDOTODO this should probably be an rvalue } ItemLocation* Context::GetItemLocation(const RandomizerCheck locKey) { @@ -116,12 +118,14 @@ ItemOverride& Context::GetItemOverride(size_t locKey) { return overrides.at(static_cast(locKey)); } -void Context::PlaceItemInLocation(const RandomizerCheck locKey, const RandomizerGet item, const bool applyEffectImmediately, - const bool setHidden) { +void Context::PlaceItemInLocation(const RandomizerCheck locKey, const RandomizerGet item, + const bool applyEffectImmediately, const bool setHidden) { const auto loc = GetItemLocation(locKey); - SPDLOG_DEBUG(StaticData::RetrieveItem(item).GetName().GetEnglish() + " placed at " + StaticData::GetLocation(locKey)->GetName() + "\n"); - - if (applyEffectImmediately || mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_GLITCHLESS) || mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_VANILLA)) { + SPDLOG_DEBUG(StaticData::RetrieveItem(item).GetName().GetEnglish() + " placed at " + + StaticData::GetLocation(locKey)->GetName() + "\n"); + + if (applyEffectImmediately || mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_GLITCHLESS) || + mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_VANILLA)) { StaticData::RetrieveItem(item).ApplyEffect(); } @@ -151,43 +155,42 @@ void Context::AddLocations(const Container& locations, std::vectorGetQuest() == RCQUEST_BOTH || - loc->GetQuest() == RCQUEST_MQ && mDungeons->GetDungeonFromScene(loc->GetScene())->IsMQ() || - loc->GetQuest() == RCQUEST_VANILLA && mDungeons->GetDungeonFromScene(loc->GetScene())->IsVanilla(); + loc->GetQuest() == RCQUEST_MQ && mDungeons->GetDungeonFromScene(loc->GetScene())->IsMQ() || + loc->GetQuest() == RCQUEST_VANILLA && mDungeons->GetDungeonFromScene(loc->GetScene())->IsVanilla(); } void Context::GenerateLocationPool() { allLocations.clear(); - if (mOptions[RSK_TRIFORCE_HUNT]) { - AddLocation(RC_TRIFORCE_COMPLETED); - } for (Location& location : StaticData::GetLocationTable()) { // skip RCs that shouldn't be in the pool for any reason (i.e. settings, unsupported check type, etc.) // TODO: Exclude checks for some of the older shuffles from the pool too i.e. Frog Songs, Scrubs, etc.) if (location.GetRandomizerCheck() == RC_UNKNOWN_CHECK || location.GetRandomizerCheck() == RC_TRIFORCE_COMPLETED || // already in pool - location.GetRCType() == RCTYPE_CHEST_GAME || // not supported yet - location.GetRCType() == RCTYPE_STATIC_HINT || // can't have items - location.GetRCType() == RCTYPE_GOSSIP_STONE || // can't have items + (location.GetRandomizerCheck() == RC_MASTER_SWORD_PEDESTAL && + mOptions[RSK_SHUFFLE_MASTER_SWORD].Is(RO_GENERIC_OFF)) || + (location.GetRandomizerCheck() == RC_KAK_100_GOLD_SKULLTULA_REWARD && + mOptions[RSK_SHUFFLE_100_GS_REWARD].Is(RO_GENERIC_OFF)) || + location.GetRCType() == RCTYPE_CHEST_GAME || // not supported yet + location.GetRCType() == RCTYPE_STATIC_HINT || // can't have items + location.GetRCType() == RCTYPE_GOSSIP_STONE || // can't have items + (location.GetRCType() == RCTYPE_FROG_SONG && mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES].Is(RO_GENERIC_OFF)) || (location.GetRCType() == RCTYPE_SCRUB && mOptions[RSK_SHUFFLE_SCRUBS].Is(RO_SCRUBS_OFF)) || - (location.GetRCType() == RCTYPE_SCRUB && mOptions[RSK_SHUFFLE_SCRUBS].Is(RO_SCRUBS_ONE_TIME_ONLY) && !( - location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || - location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || - location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO - )) || + (location.GetRCType() == RCTYPE_SCRUB && mOptions[RSK_SHUFFLE_SCRUBS].Is(RO_SCRUBS_ONE_TIME_ONLY) && + !(location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || + location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || + location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO)) || (location.GetRCType() == RCTYPE_ADULT_TRADE && mOptions[RSK_SHUFFLE_ADULT_TRADE].Is(RO_GENERIC_OFF)) || + (location.GetRCType() == RCTYPE_SONG_LOCATION && mOptions[RSK_SHUFFLE_SONGS].Is(RO_SONG_SHUFFLE_OFF)) || (location.GetRCType() == RCTYPE_COW && mOptions[RSK_SHUFFLE_COWS].Is(RO_GENERIC_OFF)) || - (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) || - (location.GetRCType() == RCTYPE_FISH && ( - mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_OFF) || mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_HYRULE_LOACH) || - (mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_OVERWORLD) && location.GetScene() == SCENE_FISHING_POND) || - (mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_POND) && location.GetScene() != SCENE_FISHING_POND) || - ((mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_POND) || mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_BOTH)) && - (mOptions[RSK_FISHSANITY_AGE_SPLIT].Is(RO_GENERIC_OFF) && ( - location.GetRandomizerCheck() >= RC_LH_ADULT_FISH_1 && location.GetRandomizerCheck() <= RC_LH_ADULT_LOACH) - ) - ) - )) || + (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && + mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) || + (location.GetRCType() == RCTYPE_FISH && !mFishsanity->GetFishLocationIncluded(&location)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || + (location.GetRCType() == RCTYPE_NLCRATE && (mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF) || + !mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC))) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || (location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) || @@ -197,8 +200,16 @@ void Context::GenerateLocationPool() { if (location.IsOverworld()) { // Skip stuff that is shuffled to dungeon only, i.e. tokens, pots, etc., or other checks that // should not have a shuffled item. - if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) || - (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS))) { + if ((location.GetRCType() == RCTYPE_FREESTANDING && + mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) || + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS)) || + (location.GetRCType() == RCTYPE_NLCRATE && + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS) && + mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS))) { continue; } // If we've gotten past all the conditions where an overworld location should not be @@ -210,7 +221,16 @@ void Context::GenerateLocationPool() { if (location.GetQuest() == RCQUEST_BOTH || (location.GetQuest() == RCQUEST_MQ) == dungeon->IsMQ()) { if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OVERWORLD)) || - (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD))) { + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD)) || + (location.GetRCType() == RCTYPE_GRASS && + mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD)) || + (location.GetRCType() == RCTYPE_CRATE && + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD)) || + (location.GetRCType() == RCTYPE_NLCRATE && + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD) && + mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD))) { continue; } // also add to that dungeon's location list. @@ -224,15 +244,14 @@ void Context::GenerateLocationPool() { void Context::AddExcludedOptions() { for (auto& loc : StaticData::GetLocationTable()) { // Checks of these types don't have items, skip them. - if (loc.GetRandomizerCheck() == RC_UNKNOWN_CHECK || - loc.GetRandomizerCheck() == RC_TRIFORCE_COMPLETED || loc.GetRCType() == RCTYPE_CHEST_GAME || - loc.GetRCType() == RCTYPE_STATIC_HINT || loc.GetRCType() == RCTYPE_GOSSIP_STONE) { + if (loc.GetRandomizerCheck() == RC_UNKNOWN_CHECK || loc.GetRandomizerCheck() == RC_TRIFORCE_COMPLETED || + loc.GetRCType() == RCTYPE_CHEST_GAME || loc.GetRCType() == RCTYPE_STATIC_HINT || + loc.GetRCType() == RCTYPE_GOSSIP_STONE) { continue; } AddLocation(loc.GetRandomizerCheck(), &everyPossibleLocation); bool alreadyAdded = false; - for (Option* location : Rando::Settings::GetInstance()->GetExcludeOptionsForArea(loc.GetArea())) - { + for (Option* location : Rando::Settings::GetInstance()->GetExcludeOptionsForArea(loc.GetArea())) { if (location->GetName() == loc.GetExcludedOption()->GetName()) { alreadyAdded = true; } @@ -243,7 +262,8 @@ void Context::AddExcludedOptions() { } } -std::vector Context::GetLocations(const std::vector& locationPool, const RandomizerCheckType checkType) { +std::vector Context::GetLocations(const std::vector& locationPool, + const RandomizerCheckType checkType) { std::vector locationsOfType; for (RandomizerCheck locKey : locationPool) { if (StaticData::GetLocation(locKey)->GetRCType() == checkType) { @@ -282,7 +302,7 @@ void Context::HintReset() { for (const RandomizerCheck il : StaticData::GetGossipStoneLocations()) { GetItemLocation(il)->ResetVariables(); } - for (Hint& hint : hintTable){ + for (Hint& hint : hintTable) { hint.ResetVariables(); } } @@ -325,7 +345,8 @@ void Context::SetSpoilerLoaded(const bool spoilerLoaded) { mSpoilerLoaded = spoilerLoaded; } -GetItemEntry Context::GetFinalGIEntry(const RandomizerCheck rc, const bool checkObtainability, const GetItemID ogItemId) { +GetItemEntry Context::GetFinalGIEntry(const RandomizerCheck rc, const bool checkObtainability, + const GetItemID ogItemId) { const auto itemLoc = GetItemLocation(rc); if (itemLoc->GetPlacedRandomizerGet() == RG_NONE) { if (ogItemId != GI_NONE) { @@ -350,25 +371,8 @@ GetItemEntry Context::GetFinalGIEntry(const RandomizerCheck rc, const bool check return giEntry; } -std::string sanitize(std::string stringValue) { - // Add backslashes. - for (auto i = stringValue.begin();;) { - auto const pos = - std::find_if(i, stringValue.end(), [](char const c) { return '\\' == c || '\'' == c || '"' == c; }); - if (pos == stringValue.end()) { - break; - } - i = std::next(stringValue.insert(pos, '\\'), 2); - } - - // Removes others. - std::erase_if(stringValue, [](char const c) { return '\n' == c || '\r' == c || '\0' == c || '\x1A' == c; }); - - return stringValue; -} - void Context::ParseSpoiler(const char* spoilerFileName) { - std::ifstream spoilerFileStream(sanitize(spoilerFileName)); + std::ifstream spoilerFileStream(SohUtils::Sanitize(spoilerFileName)); if (!spoilerFileStream) { return; } @@ -377,18 +381,18 @@ void Context::ParseSpoiler(const char* spoilerFileName) { try { nlohmann::json spoilerFileJson; spoilerFileStream >> spoilerFileJson; + spoilerFileStream.close(); ParseHashIconIndexesJson(spoilerFileJson); Rando::Settings::GetInstance()->ParseJson(spoilerFileJson); ParseItemLocationsJson(spoilerFileJson); - ParseHintJson(spoilerFileJson); + ParseTricksJson(spoilerFileJson); mEntranceShuffler->ParseJson(spoilerFileJson); + ParseHintJson(spoilerFileJson); mDungeons->ParseJson(spoilerFileJson); mTrials->ParseJson(spoilerFileJson); mSpoilerLoaded = true; mSeedGenerated = false; - } catch (...) { - LUSLOG_ERROR("Failed to load Spoiler File: %s", spoilerFileName); - } + } catch (...) { LUSLOG_ERROR("Failed to load Spoiler File: %s", spoilerFileName); } } void Context::ParseHashIconIndexesJson(nlohmann::json spoilerFileJson) { @@ -423,16 +427,16 @@ void Context::ParseItemLocationsJson(nlohmann::json spoilerFileJson) { } } -void Context::WriteHintJson(nlohmann::ordered_json& spoilerFileJson){ - for (Hint hint: hintTable){ +void Context::WriteHintJson(nlohmann::ordered_json& spoilerFileJson) { + for (Hint hint : hintTable) { hint.logHint(spoilerFileJson); } } -nlohmann::json getValueForMessage(std::unordered_map map, CustomMessage message){ +nlohmann::json getValueForMessage(std::unordered_map map, CustomMessage message) { std::vector strings = message.GetAllMessages(); - for (uint8_t language = 0; language < LANGUAGE_MAX; language++){ - if (map.contains(strings[language])){ + for (uint8_t language = 0; language < LANGUAGE_MAX; language++) { + if (map.contains(strings[language])) { return strings[language]; } } @@ -440,17 +444,28 @@ nlohmann::json getValueForMessage(std::unordered_mapGetRandomizerTrickByName(it); + if (rt != -1) { + mTrickOptions[rt].Set(RO_GENERIC_ON); + } + } +} + std::shared_ptr Context::GetEntranceShuffler() { return mEntranceShuffler; } @@ -506,6 +521,10 @@ RandoOptionLACSCondition Context::LACSCondition() const { return mLACSCondition; } +void Context::LACSCondition(RandoOptionLACSCondition lacsCondition) { + mLACSCondition = lacsCondition; +} + std::shared_ptr Context::GetKaleido() { if (mKaleido == nullptr) { mKaleido = std::make_shared(); diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index bd6bc17358..9689477568 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -14,6 +14,8 @@ #include #include +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() + /** * @brief Singleton for storing and accessing dynamic Randomizer-related data * @@ -53,7 +55,8 @@ class Context { void AddLocations(const Container& locations, std::vector* destination = nullptr); bool IsQuestOfLocationActive(RandomizerCheck rc); void GenerateLocationPool(); - static std::vector GetLocations(const std::vector& locationPool, const RandomizerCheckType checkType); + static std::vector GetLocations(const std::vector& locationPool, + const RandomizerCheckType checkType); void AddExcludedOptions(); void LocationReset(); void ClearItemLocations(); @@ -103,12 +106,22 @@ class Context { * @return RandoOptionLACSCondition */ RandoOptionLACSCondition LACSCondition() const; + + /** + * @brief Sets the resolved Light Arrow CutScene check condition. + * There is no direct option for this, it is inferred based on the value of a few other options. + * + * @param lacsCondition + */ + void LACSCondition(RandoOptionLACSCondition lacsCondition); + GetItemEntry GetFinalGIEntry(RandomizerCheck rc, bool checkObtainability = true, GetItemID ogItemId = GI_NONE); void ParseSpoiler(const char* spoilerFileName); void ParseHashIconIndexesJson(nlohmann::json spoilerFileJson); void ParseItemLocationsJson(nlohmann::json spoilerFileJson); void WriteHintJson(nlohmann::ordered_json& spoilerFileJson); void ParseHintJson(nlohmann::json spoilerFileJson); + void ParseTricksJson(nlohmann::json spoilerFileJson); std::map overrides = {}; std::vector> playthroughLocations = {}; std::vector everyPossibleLocation = {}; diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index 0a89e4daeb..b9cc0b10b3 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -11,6 +11,7 @@ #include "objects/object_gi_key/object_gi_key.h" #include "objects/object_gi_bosskey/object_gi_bosskey.h" #include "objects/object_gi_compass/object_gi_compass.h" +#include "objects/object_gi_map/object_gi_map.h" #include "objects/object_gi_hearts/object_gi_hearts.h" #include "objects/object_gi_scale/object_gi_scale.h" #include "objects/object_gi_fire/object_gi_fire.h" @@ -39,29 +40,19 @@ extern SaveContext gSaveContext; } const char* SmallBodyCvarValue[10] = { - CVAR_COSMETIC("Key.ForestSmallBody.Value"), - CVAR_COSMETIC("Key.FireSmallBody.Value"), - CVAR_COSMETIC("Key.WaterSmallBody.Value"), - CVAR_COSMETIC("Key.SpiritSmallBody.Value"), - CVAR_COSMETIC("Key.ShadowSmallBody.Value"), - CVAR_COSMETIC("Key.WellSmallBody.Value"), - CVAR_COSMETIC("Key.GTGSmallBody.Value"), - CVAR_COSMETIC("Key.FortSmallBody.Value"), - CVAR_COSMETIC("Key.GanonsSmallBody.Value"), - CVAR_COSMETIC("Key.ChestGameSmallBody.Value"), + CVAR_COSMETIC("Key.ForestSmallBody.Value"), CVAR_COSMETIC("Key.FireSmallBody.Value"), + CVAR_COSMETIC("Key.WaterSmallBody.Value"), CVAR_COSMETIC("Key.SpiritSmallBody.Value"), + CVAR_COSMETIC("Key.ShadowSmallBody.Value"), CVAR_COSMETIC("Key.WellSmallBody.Value"), + CVAR_COSMETIC("Key.GTGSmallBody.Value"), CVAR_COSMETIC("Key.FortSmallBody.Value"), + CVAR_COSMETIC("Key.GanonsSmallBody.Value"), CVAR_COSMETIC("Key.ChestGameSmallBody.Value"), }; const char* SmallEmblemCvarValue[10] = { - CVAR_COSMETIC("Key.ForestSmallEmblem.Value"), - CVAR_COSMETIC("Key.FireSmallEmblem.Value"), - CVAR_COSMETIC("Key.WaterSmallEmblem.Value"), - CVAR_COSMETIC("Key.SpiritSmallEmblem.Value"), - CVAR_COSMETIC("Key.ShadowSmallEmblem.Value"), - CVAR_COSMETIC("Key.WellSmallEmblem.Value"), - CVAR_COSMETIC("Key.GTGSmallEmblem.Value"), - CVAR_COSMETIC("Key.FortSmallEmblem.Value"), - CVAR_COSMETIC("Key.GanonsSmallEmblem.Value"), - CVAR_COSMETIC("Key.ChestGameEmblem.Value"), + CVAR_COSMETIC("Key.ForestSmallEmblem.Value"), CVAR_COSMETIC("Key.FireSmallEmblem.Value"), + CVAR_COSMETIC("Key.WaterSmallEmblem.Value"), CVAR_COSMETIC("Key.SpiritSmallEmblem.Value"), + CVAR_COSMETIC("Key.ShadowSmallEmblem.Value"), CVAR_COSMETIC("Key.WellSmallEmblem.Value"), + CVAR_COSMETIC("Key.GTGSmallEmblem.Value"), CVAR_COSMETIC("Key.FortSmallEmblem.Value"), + CVAR_COSMETIC("Key.GanonsSmallEmblem.Value"), CVAR_COSMETIC("Key.ChestGameEmblem.Value"), }; Color_RGB8 SmallEmblemDefaultValue[10] = { @@ -80,20 +71,15 @@ Color_RGB8 SmallEmblemDefaultValue[10] = { extern "C" u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEntry) { - s8 isCustomKeysEnabled = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), 0); + s8 isCustomKeysEnabled = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), 1); int slot = getItemEntry->drawItemId - RG_FOREST_TEMPLE_SMALL_KEY; Gfx* customIconDLs[] = { - (Gfx*)gSmallKeyIconForestTempleDL, - (Gfx*)gSmallKeyIconFireTempleDL, - (Gfx*)gSmallKeyIconWaterTempleDL, - (Gfx*)gSmallKeyIconSpiritTempleDL, - (Gfx*)gSmallKeyIconShadowTempleDL, - (Gfx*)gSmallKeyIconBottomoftheWellDL, - (Gfx*)gSmallKeyIconGerudoTrainingGroundDL, - (Gfx*)gSmallKeyIconGerudoFortressDL, - (Gfx*)gSmallKeyIconGanonsCastleDL, - (Gfx*)gSmallKeyIconTreasureChestGameDL, + (Gfx*)gSmallKeyIconForestTempleDL, (Gfx*)gSmallKeyIconFireTempleDL, + (Gfx*)gSmallKeyIconWaterTempleDL, (Gfx*)gSmallKeyIconSpiritTempleDL, + (Gfx*)gSmallKeyIconShadowTempleDL, (Gfx*)gSmallKeyIconBottomoftheWellDL, + (Gfx*)gSmallKeyIconGerudoTrainingGroundDL, (Gfx*)gSmallKeyIconGerudoFortressDL, + (Gfx*)gSmallKeyIconGanonsCastleDL, (Gfx*)gSmallKeyIconTreasureChestGameDL, }; OPEN_DISPS(play->state.gfxCtx); @@ -116,7 +102,7 @@ extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEn emblemColor = CVarGetColor24(SmallEmblemCvarValue[slot], emblemColor); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetEnvColor(POLY_XLU_DISP++, emblemColor.r, emblemColor.g, emblemColor.b, 255); gSPDisplayList(POLY_XLU_DISP++, customIconDLs[slot]); @@ -131,15 +117,36 @@ extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEn CLOSE_DISPS(play->state.gfxCtx); } -extern "C" { - void GetItem_DrawCompass(PlayState* play, s16 drawId); - void ResourceMgr_PatchGfxByName(const char* path, const char* patchName, int index, Gfx instruction); - void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName); +extern "C" void Randomizer_DrawMap(PlayState* play, GetItemEntry* getItemEntry) { + s16 color_slot = getItemEntry->drawItemId - RG_DEKU_TREE_MAP; + s16 colors[12][3] = { + { 4, 100, 46 }, // Deku Tree + { 140, 30, 30 }, // Dodongo's Cavern + { 30, 60, 255 }, // Jabu Jabu's Belly + { 4, 195, 46 }, // Forest Temple + { 237, 95, 95 }, // Fire Temple + { 85, 180, 223 }, // Water Temple + { 222, 158, 47 }, // Spirit Temple + { 126, 16, 177 }, // Shadow Temple + { 227, 110, 255 }, // Bottom of the Well + { 0, 255, 255 }, // Ice Cavern + }; + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255); + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiDungeonMapDL); + + CLOSE_DISPS(play->state.gfxCtx); } extern "C" void Randomizer_DrawCompass(PlayState* play, GetItemEntry* getItemEntry) { - - s16 color_slot = getItemEntry->getItemId - RG_DEKU_TREE_COMPASS; + s16 color_slot = getItemEntry->drawItemId - RG_DEKU_TREE_COMPASS; s16 colors[12][3] = { { 4, 100, 46 }, // Deku Tree { 140, 30, 30 }, // Dodongo's Cavern @@ -162,7 +169,8 @@ extern "C" void Randomizer_DrawCompass(PlayState* play, GetItemEntry* getItemEnt G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255); - gDPSetEnvColor(POLY_OPA_DISP++, colors[color_slot][0] / 2, colors[color_slot][1] / 2, colors[color_slot][2] / 2, 255); + gDPSetEnvColor(POLY_OPA_DISP++, colors[color_slot][0] / 2, colors[color_slot][1] / 2, colors[color_slot][2] / 2, + 255); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiCompassDL); @@ -179,21 +187,13 @@ extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEnt s16 slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_BOSS_KEY; std::string CvarValue[6] = { - "gCosmetics.Key.ForestBoss", - "gCosmetics.Key.FireBoss", - "gCosmetics.Key.WaterBoss", - "gCosmetics.Key.SpiritBoss", - "gCosmetics.Key.ShadowBoss", - "gCosmetics.Key.GanonsBoss", + "gCosmetics.Key.ForestBoss", "gCosmetics.Key.FireBoss", "gCosmetics.Key.WaterBoss", + "gCosmetics.Key.SpiritBoss", "gCosmetics.Key.ShadowBoss", "gCosmetics.Key.GanonsBoss", }; Gfx* CustomdLists[] = { - (Gfx*)gBossKeyIconForestTempleDL, - (Gfx*)gBossKeyIconFireTempleDL, - (Gfx*)gBossKeyIconWaterTempleDL, - (Gfx*)gBossKeyIconSpiritTempleDL, - (Gfx*)gBossKeyIconShadowTempleDL, - (Gfx*)gBossKeyIconGanonsCastleDL, + (Gfx*)gBossKeyIconForestTempleDL, (Gfx*)gBossKeyIconFireTempleDL, (Gfx*)gBossKeyIconWaterTempleDL, + (Gfx*)gBossKeyIconSpiritTempleDL, (Gfx*)gBossKeyIconShadowTempleDL, (Gfx*)gBossKeyIconGanonsCastleDL, }; OPEN_DISPS(play->state.gfxCtx); @@ -204,14 +204,14 @@ extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEnt G_MTX_MODELVIEW | G_MTX_LOAD); Color_RGB8 keyColor = { 255, 255, 0 }; - //Supposed to use CVAR_COSMETIC but I can't figure out the syntax + // Supposed to use CVAR_COSMETIC but I can't figure out the syntax keyColor = CVarGetColor24((CvarValue[slot] + "Body.Value").c_str(), keyColor); - - if (isCustomKeysEnabled){ + + if (isCustomKeysEnabled) { gDPSetEnvColor(POLY_OPA_DISP++, keyColor.r, keyColor.g, keyColor.b, 255); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gBossKeyCustomDL); } else { - if (CVarGetInteger((CvarValue[slot] + "Body.Changed").c_str(), false)){ + if (CVarGetInteger((CvarValue[slot] + "Body.Changed").c_str(), false)) { gDPSetGrayscaleColor(POLY_OPA_DISP++, keyColor.r, keyColor.g, keyColor.b, 255); gSPGrayscale(POLY_OPA_DISP++, true); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiBossKeyDL); @@ -228,12 +228,12 @@ extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEnt Color_RGB8 gemColor = { 255, 0, 0 }; gemColor = CVarGetColor24((CvarValue[slot] + "Gem.Value").c_str(), gemColor); - - if (isCustomKeysEnabled){ + + if (isCustomKeysEnabled) { gDPSetEnvColor(POLY_XLU_DISP++, gemColor.r, gemColor.g, gemColor.b, 255); gSPDisplayList(POLY_XLU_DISP++, CustomdLists[slot]); } else { - if (CVarGetInteger((CvarValue[slot] + "Gem.Changed").c_str(), false)){ + if (CVarGetInteger((CvarValue[slot] + "Gem.Changed").c_str(), false)) { gDPSetGrayscaleColor(POLY_XLU_DISP++, gemColor.r, gemColor.g, gemColor.b, 255); gSPGrayscale(POLY_XLU_DISP++, true); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBossKeyGemDL); @@ -247,61 +247,42 @@ extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEnt } extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEntry) { - s8 isCustomKeysEnabled = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), 0); + s8 isCustomKeysEnabled = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), 1); int slot = getItemEntry->drawItemId - RG_FOREST_TEMPLE_KEY_RING; Gfx* CustomIconDLs[] = { - (Gfx*)gKeyringIconForestTempleDL, - (Gfx*)gKeyringIconFireTempleDL, - (Gfx*)gKeyringIconWaterTempleDL, - (Gfx*)gKeyringIconSpiritTempleDL, - (Gfx*)gKeyringIconShadowTempleDL, - (Gfx*)gKeyringIconBottomoftheWellDL, - (Gfx*)gKeyringIconGerudoTrainingGroundDL, - (Gfx*)gKeyringIconGerudoFortressDL, - (Gfx*)gKeyringIconGanonsCastleDL, - (Gfx*)gKeyringIconTreasureChestGameDL, + (Gfx*)gKeyringIconForestTempleDL, (Gfx*)gKeyringIconFireTempleDL, + (Gfx*)gKeyringIconWaterTempleDL, (Gfx*)gKeyringIconSpiritTempleDL, + (Gfx*)gKeyringIconShadowTempleDL, (Gfx*)gKeyringIconBottomoftheWellDL, + (Gfx*)gKeyringIconGerudoTrainingGroundDL, (Gfx*)gKeyringIconGerudoFortressDL, + (Gfx*)gKeyringIconGanonsCastleDL, (Gfx*)gKeyringIconTreasureChestGameDL, }; Gfx* CustomKeysDLs[] = { - (Gfx*)gKeyringKeysForestTempleDL, - (Gfx*)gKeyringKeysFireTempleDL, - (Gfx*)gKeyringKeysWaterTempleDL, - (Gfx*)gKeyringKeysSpiritTempleDL, - (Gfx*)gKeyringKeysShadowTempleDL, - (Gfx*)gKeyringKeysBottomoftheWellDL, - (Gfx*)gKeyringKeysGerudoTrainingGroundDL, - (Gfx*)gKeyringKeysGerudoFortressDL, - (Gfx*)gKeyringKeysGanonsCastleDL, - (Gfx*)gKeyringKeysTreasureChestGameDL, + (Gfx*)gKeyringKeysForestTempleDL, (Gfx*)gKeyringKeysFireTempleDL, + (Gfx*)gKeyringKeysWaterTempleDL, (Gfx*)gKeyringKeysSpiritTempleDL, + (Gfx*)gKeyringKeysShadowTempleDL, (Gfx*)gKeyringKeysBottomoftheWellDL, + (Gfx*)gKeyringKeysGerudoTrainingGroundDL, (Gfx*)gKeyringKeysGerudoFortressDL, + (Gfx*)gKeyringKeysGanonsCastleDL, (Gfx*)gKeyringKeysTreasureChestGameDL, }; Gfx* CustomKeysMQDLs[] = { - (Gfx*)gKeyringKeysForestTempleMQDL, - (Gfx*)gKeyringKeysFireTempleMQDL, - (Gfx*)gKeyringKeysWaterTempleMQDL, - (Gfx*)gKeyringKeysSpiritTempleMQDL, - (Gfx*)gKeyringKeysShadowTempleMQDL, - (Gfx*)gKeyringKeysBottomoftheWellMQDL, - (Gfx*)gKeyringKeysGerudoTrainingGroundMQDL, - (Gfx*)gKeyringKeysGerudoFortressDL, - (Gfx*)gKeyringKeysGanonsCastleMQDL, - (Gfx*)gKeyringKeysTreasureChestGameDL, + (Gfx*)gKeyringKeysForestTempleMQDL, (Gfx*)gKeyringKeysFireTempleMQDL, + (Gfx*)gKeyringKeysWaterTempleMQDL, (Gfx*)gKeyringKeysSpiritTempleMQDL, + (Gfx*)gKeyringKeysShadowTempleMQDL, (Gfx*)gKeyringKeysBottomoftheWellMQDL, + (Gfx*)gKeyringKeysGerudoTrainingGroundMQDL, (Gfx*)gKeyringKeysGerudoFortressDL, + (Gfx*)gKeyringKeysGanonsCastleMQDL, (Gfx*)gKeyringKeysTreasureChestGameDL, }; - //RANDOTODO make DungeonInfo static and vanilla accessible to allow all these key model data vars to be stored there. - //(Rando::DungeonKey)0 means the keyring is not tied to a dungeon and should not be checked for an MQ variant + // RANDOTODO make DungeonInfo static and vanilla accessible to allow all these key model data vars to be stored + // there. (Rando::DungeonKey)0 means the keyring is not tied to a dungeon and should not be checked for an MQ + // variant Rando::DungeonKey SlotToDungeon[10] = { - Rando::FOREST_TEMPLE, - Rando::FIRE_TEMPLE, - Rando::WATER_TEMPLE, - Rando::SPIRIT_TEMPLE, - Rando::SHADOW_TEMPLE, - Rando::BOTTOM_OF_THE_WELL, - Rando::GERUDO_TRAINING_GROUND, - (Rando::DungeonKey)0, //Gerudo Fortress + Rando::FOREST_TEMPLE, Rando::FIRE_TEMPLE, Rando::WATER_TEMPLE, Rando::SPIRIT_TEMPLE, + Rando::SHADOW_TEMPLE, Rando::BOTTOM_OF_THE_WELL, Rando::GERUDO_TRAINING_GROUND, + (Rando::DungeonKey)0, // Gerudo Fortress Rando::GANONS_CASTLE, - (Rando::DungeonKey)0, //Treasure Chest Game + (Rando::DungeonKey)0, // Treasure Chest Game }; OPEN_DISPS(play->state.gfxCtx); @@ -313,12 +294,12 @@ extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEnt if (isCustomKeysEnabled) { gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetEnvColor(POLY_OPA_DISP++, keyColor.r, keyColor.g, keyColor.b, 255); - if (SlotToDungeon[slot] != 0 && Rando::Context::GetInstance()->GetDungeon(SlotToDungeon[slot])->IsMQ()){ + if (SlotToDungeon[slot] != 0 && Rando::Context::GetInstance()->GetDungeon(SlotToDungeon[slot])->IsMQ()) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)CustomKeysMQDLs[slot]); - } else { + } else { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)CustomKeysDLs[slot]); } @@ -332,7 +313,7 @@ extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEnt Gfx_SetupDL_25Opa(play->state.gfxCtx); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetEnvColor(POLY_OPA_DISP++, emblemColor.r, emblemColor.g, emblemColor.b, 255); gSPDisplayList(POLY_OPA_DISP++, CustomIconDLs[slot]); @@ -351,7 +332,7 @@ extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEnt Matrix_RotateZ(-(0.20f * 2), MTXMODE_APPLY); for (int i = 0; i < 5; i++) { gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + G_MTX_MODELVIEW | G_MTX_LOAD); Matrix_Translate(3.12f, -0.34f, 17.53f, MTXMODE_APPLY); Matrix_RotateX(-0.31f, MTXMODE_APPLY); Matrix_RotateY(0.19f, MTXMODE_APPLY); @@ -368,8 +349,9 @@ extern "C" void Randomizer_DrawDoubleDefense(PlayState* play, GetItemEntry* getI OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Xlu(play->state.gfxCtx); - - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetGrayscaleColor(POLY_XLU_DISP++, 255, 255, 255, 255); gSPGrayscale(POLY_XLU_DISP++, true); @@ -390,8 +372,8 @@ extern "C" void Randomizer_DrawMasterSword(PlayState* play, GetItemEntry* getIte gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 1 * (play->state.frames * 1), - 0 * (play->state.frames * 1), 32, 32, 1, 0 * (play->state.frames * 1), - 0 * (play->state.frames * 1), 32, 32)); + 0 * (play->state.frames * 1), 32, 32, 1, 0 * (play->state.frames * 1), + 0 * (play->state.frames * 1), 32, 32)); Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); Matrix_RotateZ(2.1f, MTXMODE_APPLY); @@ -400,7 +382,7 @@ extern "C" void Randomizer_DrawMasterSword(PlayState* play, GetItemEntry* getIte G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)object_toki_objects_DL_001BD0); - + CLOSE_DISPS(play->state.gfxCtx); } @@ -463,7 +445,7 @@ extern "C" void Randomizer_DrawTriforcePieceGI(PlayState* play, GetItemEntry get } else if (triforcePieceScale < 0.035f) { triforcePieceScale += 0.0005f; } - } else if (triforcePieceScale > 0.00008f && triforcePieceScale < 0.035f) { + } else if (triforcePieceScale > 0.00008f && triforcePieceScale < 0.035f) { triforcePieceScale += 0.0005f; } @@ -485,7 +467,7 @@ extern "C" void Randomizer_DrawTriforcePieceGI(PlayState* play, GetItemEntry get CLOSE_DISPS(play->state.gfxCtx); } -extern "C" void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry getItemEntry) { +extern "C" void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry* getItemEntry) { Color_RGB8 color = { 0, 60, 100 }; if (CVarGetInteger(CVAR_COSMETIC("World.MysteryItem.Changed"), 0)) { color = CVarGetColor24(CVAR_COSMETIC("World.MysteryItem.Value"), color); @@ -495,7 +477,8 @@ extern "C" void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry getItem Gfx_SetupDL_25Xlu(play->state.gfxCtx); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetGrayscaleColor(POLY_XLU_DISP++, color.r, color.g, color.b, 255); gSPGrayscale(POLY_XLU_DISP++, true); @@ -600,7 +583,8 @@ extern "C" void DrawKingDodongo(PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } -extern "C" s32 OverrideLimbDrawBarinade(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { +extern "C" s32 OverrideLimbDrawBarinade(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, + void* thisx) { OPEN_DISPS(play->state.gfxCtx); s16 unk_1AC = play->gameplayFrames * 0xC31; @@ -613,7 +597,7 @@ extern "C" s32 OverrideLimbDrawBarinade(PlayState* play, s32 limbIndex, Gfx** dL (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 8, 16, 1, 0, (play->gameplayFrames * -2) % 64, 16, 16)); gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 200); - Matrix_RotateX(-M_PI / 2, MTXMODE_APPLY); + Matrix_RotateX(-M_PIf / 2.0f, MTXMODE_APPLY); } else if ((limbIndex >= 10) && (limbIndex < 20)) { rot->x -= 0x4000; *dList = NULL; @@ -841,7 +825,8 @@ extern "C" void DrawBongoBongo(PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } -extern "C" s32 OverrideLimbDrawKotake(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { +extern "C" s32 OverrideLimbDrawKotake(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, + void* thisx) { if (limbIndex == 21) { // Head *dList = (Gfx*)gTwinrovaKotakeHeadDL; } @@ -952,18 +937,18 @@ extern "C" void Randomizer_DrawBossSoul(PlayState* play, GetItemEntry* getItemEn } else { slot = getItemEntry->drawItemId - RG_GOHMA_SOUL; } - + s16 flameColors[9][3] = { { 0, 255, 0 }, // Gohma { 255, 0, 100 }, // King Dodongo - { 50, 255, 255}, // Barinade + { 50, 255, 255 }, // Barinade { 4, 195, 46 }, // Phantom Ganon { 237, 95, 95 }, // Volvagia { 85, 180, 223 }, // Morpha { 126, 16, 177 }, // Bongo Bongo { 222, 158, 47 }, // Twinrova { 150, 150, 150 }, // Ganon/Dorf - }; + }; // Draw the blue fire DL but coloured to the boss soul. OPEN_DISPS(play->state.gfxCtx); @@ -997,7 +982,7 @@ extern "C" void Randomizer_DrawBossSoul(PlayState* play, GetItemEntry* getItemEn } gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBossSoulSkullDL); CLOSE_DISPS(play->state.gfxCtx); - // Draw the boss' skeleton + // Draw the boss' skeleton } else { switch (slot) { case 0: // Gohma @@ -1065,26 +1050,20 @@ extern "C" void Randomizer_DrawOcarinaButton(PlayState* play, GetItemEntry* getI s16 slot = getItemEntry->drawItemId - RG_OCARINA_A_BUTTON; Gfx* dLists[] = { - (Gfx*)gOcarinaAButtonDL, - (Gfx*)gOcarinaCUpButtonDL, - (Gfx*)gOcarinaCDownButtonDL, - (Gfx*)gOcarinaCLeftButtonDL, - (Gfx*)gOcarinaCRightButtonDL, + (Gfx*)gOcarinaAButtonDL, (Gfx*)gOcarinaCUpButtonDL, (Gfx*)gOcarinaCDownButtonDL, + (Gfx*)gOcarinaCLeftButtonDL, (Gfx*)gOcarinaCRightButtonDL, }; Color_RGB8 colors[] = { - aButtonColor, - cUpButtonColor, - cDownButtonColor, - cLeftButtonColor, - cRightButtonColor, + aButtonColor, cUpButtonColor, cDownButtonColor, cLeftButtonColor, cRightButtonColor, }; OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Xlu(play->state.gfxCtx); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetGrayscaleColor(POLY_XLU_DISP++, colors[slot].r, colors[slot].g, colors[slot].b, 255); gSPGrayscale(POLY_XLU_DISP++, true); @@ -1116,11 +1095,12 @@ extern "C" void Randomizer_DrawBronzeScale(PlayState* play, GetItemEntry* getIte Gfx_SetupDL_25Xlu(play->state.gfxCtx); gSPSegment(POLY_XLU_DISP++, 0x08, - (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 1 * (play->state.frames * 2), - -1 * (play->state.frames * 2), 64, 64, 1, 1 * (play->state.frames * 4), - 1 * -(play->state.frames * 4), 32, 32)); + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 1 * (play->state.frames * 2), + -1 * (play->state.frames * 2), 64, 64, 1, 1 * (play->state.frames * 4), + -1 * (play->state.frames * 4), 32, 32)); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBronzeScaleColorDL); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiScaleDL); @@ -1136,7 +1116,7 @@ extern "C" void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getI // Draw rod Gfx_SetupDL_25Opa(play->state.gfxCtx); - Matrix_Scale(0.2, 0.2, 0.2, MTXMODE_APPLY); + Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gFishingPoleGiDL); @@ -1146,8 +1126,8 @@ extern "C" void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getI Matrix_Scale(5.0f, 5.0f, 5.0f, MTXMODE_APPLY); pos = { 0.0f, -25.5f, -4.0f }; Matrix_Translate(pos.x, pos.y, pos.z, MTXMODE_APPLY); - Matrix_RotateZ(-M_PI_2, MTXMODE_APPLY); - Matrix_RotateY(-M_PI_2 - 0.2f, MTXMODE_APPLY); + Matrix_RotateZ(-M_PI_2f, MTXMODE_APPLY); + Matrix_RotateY(-M_PI_2f - 0.2f, MTXMODE_APPLY); Matrix_Scale(0.006f, 0.006f, 0.006f, MTXMODE_APPLY); Gfx_SetupDL_25Opa(play->state.gfxCtx); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), @@ -1160,7 +1140,7 @@ extern "C" void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getI gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gFishingLureHookDL); - Matrix_RotateZ(M_PI_2, MTXMODE_APPLY); + Matrix_RotateZ(M_PI_2f, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gFishingLureHookDL); @@ -1169,7 +1149,7 @@ extern "C" void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getI gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gFishingLureHookDL); - Matrix_RotateZ(M_PI / 2, MTXMODE_APPLY); + Matrix_RotateZ(M_PIf / 2.0f, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gFishingLureHookDL); @@ -1179,7 +1159,6 @@ extern "C" void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getI CLOSE_DISPS(play->state.gfxCtx); } - extern "C" void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getItemEntry) { OPEN_DISPS(play->state.gfxCtx); @@ -1196,7 +1175,7 @@ extern "C" void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getIte CLOSE_DISPS(play->state.gfxCtx); } -extern "C" void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItemEntry){ +extern "C" void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItemEntry) { OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_26Opa(play->state.gfxCtx); @@ -1218,13 +1197,13 @@ extern "C" void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItem } extern "C" void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry* getItemEntry) { - if(IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BOMBCHU_BAG)){ + if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BOMBCHU_BAG)) { Randomizer_DrawBombchuBag(play, getItemEntry); } else { OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_26Opa(play->state.gfxCtx); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiBombchuDL); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index 3fc5c86b4f..8483a7bf96 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -10,6 +10,7 @@ typedef struct PlayState PlayState; extern "C" { #endif void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEntry); +void Randomizer_DrawMap(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawCompass(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEntry); @@ -22,13 +23,16 @@ void Randomizer_DrawOcarinaButton(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBronzeScale(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getItemEntry); -void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry getItemEntry); +void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawOverworldKey(PlayState* play, GetItemEntry* getItemEntry); -#define GET_ITEM_MYSTERY \ - { ITEM_NONE_FE, 0, 0, 0, 0, MOD_RANDOMIZER, MOD_RANDOMIZER, ITEM_NONE_FE, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, ITEM_NONE_FE, MOD_RANDOMIZER, (CustomDrawFunc)Randomizer_DrawMysteryItem } +#define GET_ITEM_MYSTERY \ + { \ + ITEM_NONE_FE, 0, 0, 0, 0, MOD_RANDOMIZER, MOD_RANDOMIZER, ITEM_NONE_FE, 0, false, ITEM_FROM_NPC, \ + ITEM_CATEGORY_JUNK, ITEM_NONE_FE, MOD_RANDOMIZER, (CustomDrawFunc)Randomizer_DrawMysteryItem \ + } #ifdef __cplusplus }; #endif diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 8b749faf81..1eb88ed73a 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -6,15 +6,16 @@ namespace Rando { DungeonInfo::DungeonInfo(std::string name_, const RandomizerHintTextKey hintKey_, const RandomizerGet map_, - const RandomizerGet compass_, const RandomizerGet smallKey_, const RandomizerGet keyRing_, - const RandomizerGet bossKey_, RandomizerArea area_, const uint8_t vanillaKeyCount_, const uint8_t mqKeyCount_, - const RandomizerSettingKey mqSetting_) + const RandomizerGet compass_, const RandomizerGet smallKey_, const RandomizerGet keyRing_, + const RandomizerGet bossKey_, RandomizerArea area_, const uint8_t vanillaKeyCount_, + const uint8_t mqKeyCount_, const RandomizerSettingKey mqSetting_) : name(std::move(name_)), hintKey(hintKey_), map(map_), compass(compass_), smallKey(smallKey_), keyRing(keyRing_), bossKey(bossKey_), area(area_), vanillaKeyCount(vanillaKeyCount_), mqKeyCount(mqKeyCount_), mqSetting(mqSetting_) { } -DungeonInfo::DungeonInfo() : hintKey(RHT_NONE), map(RG_NONE), compass(RG_NONE), smallKey(RG_NONE), keyRing(RG_NONE), - bossKey(RG_NONE) {} +DungeonInfo::DungeonInfo() + : hintKey(RHT_NONE), map(RG_NONE), compass(RG_NONE), smallKey(RG_NONE), keyRing(RG_NONE), bossKey(RG_NONE) { +} DungeonInfo::~DungeonInfo() = default; const std::string& DungeonInfo::GetName() const { @@ -145,35 +146,38 @@ std::vector DungeonInfo::GetDungeonLocations() const { } Dungeons::Dungeons() { - dungeonList[DEKU_TREE] = - DungeonInfo("Deku Tree", RHT_DEKU_TREE, RG_DEKU_TREE_MAP, RG_DEKU_TREE_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_DEKU_TREE, 0, 0, RSK_MQ_DEKU_TREE); - dungeonList[DODONGOS_CAVERN] = DungeonInfo("Dodongo's Cavern", RHT_DODONGOS_CAVERN, RG_DODONGOS_CAVERN_MAP, - RG_DODONGOS_CAVERN_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_DODONGOS_CAVERN, 0, 0, RSK_MQ_DODONGOS_CAVERN); - dungeonList[JABU_JABUS_BELLY] = DungeonInfo("Jabu Jabu's Belly", RHT_JABU_JABUS_BELLY, RG_JABU_JABUS_BELLY_MAP, - RG_JABU_JABUS_BELLY_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_JABU_JABUS_BELLY, 0, 0, RSK_MQ_JABU_JABU); - dungeonList[FOREST_TEMPLE] = - DungeonInfo("Forest Temple", RHT_FOREST_TEMPLE, RG_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_COMPASS, - RG_FOREST_TEMPLE_SMALL_KEY, RG_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_BOSS_KEY, RA_FOREST_TEMPLE, 5, 6, RSK_MQ_FOREST_TEMPLE); - dungeonList[FIRE_TEMPLE] = - DungeonInfo("Fire Temple", RHT_FIRE_TEMPLE, RG_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_COMPASS, - RG_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_BOSS_KEY, RA_FIRE_TEMPLE, 8, 5, RSK_MQ_FIRE_TEMPLE); - dungeonList[WATER_TEMPLE] = - DungeonInfo("Water Temple", RHT_WATER_TEMPLE, RG_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_COMPASS, - RG_WATER_TEMPLE_SMALL_KEY, RG_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_BOSS_KEY, RA_WATER_TEMPLE, 6, 2, RSK_MQ_WATER_TEMPLE); - dungeonList[SPIRIT_TEMPLE] = - DungeonInfo("Spirit Temple", RHT_SPIRIT_TEMPLE, RG_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_COMPASS, - RG_SPIRIT_TEMPLE_SMALL_KEY, RG_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_BOSS_KEY, RA_SPIRIT_TEMPLE, 5, 7, RSK_MQ_SPIRIT_TEMPLE); - dungeonList[SHADOW_TEMPLE] = - DungeonInfo("Shadow Temple", RHT_SHADOW_TEMPLE, RG_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_COMPASS, - RG_SHADOW_TEMPLE_SMALL_KEY, RG_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_BOSS_KEY, RA_SHADOW_TEMPLE, 5, 6, RSK_MQ_SHADOW_TEMPLE); - dungeonList[BOTTOM_OF_THE_WELL] = DungeonInfo( - "Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, RG_BOTTOM_OF_THE_WELL_MAP, RG_BOTTOM_OF_THE_WELL_COMPASS, - RG_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_KEY_RING, RG_NONE, RA_BOTTOM_OF_THE_WELL, 3, 2, RSK_MQ_BOTTOM_OF_THE_WELL); + dungeonList[DEKU_TREE] = DungeonInfo("Deku Tree", RHT_DEKU_TREE, RG_DEKU_TREE_MAP, RG_DEKU_TREE_COMPASS, RG_NONE, + RG_NONE, RG_NONE, RA_DEKU_TREE, 0, 0, RSK_MQ_DEKU_TREE); + dungeonList[DODONGOS_CAVERN] = + DungeonInfo("Dodongo's Cavern", RHT_DODONGOS_CAVERN, RG_DODONGOS_CAVERN_MAP, RG_DODONGOS_CAVERN_COMPASS, + RG_NONE, RG_NONE, RG_NONE, RA_DODONGOS_CAVERN, 0, 0, RSK_MQ_DODONGOS_CAVERN); + dungeonList[JABU_JABUS_BELLY] = + DungeonInfo("Jabu Jabu's Belly", RHT_JABU_JABUS_BELLY, RG_JABU_JABUS_BELLY_MAP, RG_JABU_JABUS_BELLY_COMPASS, + RG_NONE, RG_NONE, RG_NONE, RA_JABU_JABUS_BELLY, 0, 0, RSK_MQ_JABU_JABU); + dungeonList[FOREST_TEMPLE] = DungeonInfo( + "Forest Temple", RHT_FOREST_TEMPLE, RG_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_COMPASS, RG_FOREST_TEMPLE_SMALL_KEY, + RG_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_BOSS_KEY, RA_FOREST_TEMPLE, 5, 6, RSK_MQ_FOREST_TEMPLE); + dungeonList[FIRE_TEMPLE] = DungeonInfo("Fire Temple", RHT_FIRE_TEMPLE, RG_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_COMPASS, + RG_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_BOSS_KEY, + RA_FIRE_TEMPLE, 8, 5, RSK_MQ_FIRE_TEMPLE); + dungeonList[WATER_TEMPLE] = DungeonInfo( + "Water Temple", RHT_WATER_TEMPLE, RG_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_COMPASS, RG_WATER_TEMPLE_SMALL_KEY, + RG_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_BOSS_KEY, RA_WATER_TEMPLE, 6, 2, RSK_MQ_WATER_TEMPLE); + dungeonList[SPIRIT_TEMPLE] = DungeonInfo( + "Spirit Temple", RHT_SPIRIT_TEMPLE, RG_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_COMPASS, RG_SPIRIT_TEMPLE_SMALL_KEY, + RG_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_BOSS_KEY, RA_SPIRIT_TEMPLE, 5, 7, RSK_MQ_SPIRIT_TEMPLE); + dungeonList[SHADOW_TEMPLE] = DungeonInfo( + "Shadow Temple", RHT_SHADOW_TEMPLE, RG_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_COMPASS, RG_SHADOW_TEMPLE_SMALL_KEY, + RG_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_BOSS_KEY, RA_SHADOW_TEMPLE, 5, 6, RSK_MQ_SHADOW_TEMPLE); + dungeonList[BOTTOM_OF_THE_WELL] = + DungeonInfo("Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, RG_BOTTOM_OF_THE_WELL_MAP, + RG_BOTTOM_OF_THE_WELL_COMPASS, RG_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_KEY_RING, + RG_NONE, RA_BOTTOM_OF_THE_WELL, 3, 2, RSK_MQ_BOTTOM_OF_THE_WELL); dungeonList[ICE_CAVERN] = DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_ICE_CAVERN, 0, 0, RSK_MQ_ICE_CAVERN); - dungeonList[GERUDO_TRAINING_GROUND] = - DungeonInfo("Gerudo Training Ground", RHT_GERUDO_TRAINING_GROUND, RG_NONE, RG_NONE, - RG_GERUDO_TRAINING_GROUND_SMALL_KEY, RG_GERUDO_TRAINING_GROUND_KEY_RING, RG_NONE, RA_GERUDO_TRAINING_GROUND, 9, 3, RSK_MQ_GTG); + dungeonList[GERUDO_TRAINING_GROUND] = DungeonInfo( + "Gerudo Training Ground", RHT_GERUDO_TRAINING_GROUND, RG_NONE, RG_NONE, RG_GERUDO_TRAINING_GROUND_SMALL_KEY, + RG_GERUDO_TRAINING_GROUND_KEY_RING, RG_NONE, RA_GERUDO_TRAINING_GROUND, 9, 3, RSK_MQ_GTG); dungeonList[GANONS_CASTLE] = DungeonInfo("Ganon's Castle", RHT_GANONS_CASTLE, RG_NONE, RG_NONE, RG_GANONS_CASTLE_SMALL_KEY, RG_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_BOSS_KEY, RA_GANONS_CASTLE, 2, 3, RSK_MQ_GANONS_CASTLE); diff --git a/soh/soh/Enhancements/randomizer/dungeon.h b/soh/soh/Enhancements/randomizer/dungeon.h index 5d26036eb3..ba81d289d6 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.h +++ b/soh/soh/Enhancements/randomizer/dungeon.h @@ -11,7 +11,7 @@ namespace Rando { class DungeonInfo { public: DungeonInfo(std::string name_, RandomizerHintTextKey hintKey_, RandomizerGet map_, RandomizerGet compass_, - RandomizerGet smallKey_, RandomizerGet keyRing_, RandomizerGet bossKey_, RandomizerArea area_, + RandomizerGet smallKey_, RandomizerGet keyRing_, RandomizerGet bossKey_, RandomizerArea area_, uint8_t vanillaKeyCount_, uint8_t mqKeyCount_, RandomizerSettingKey mqSetting_); DungeonInfo(); ~DungeonInfo(); @@ -86,11 +86,12 @@ class Dungeons { /// this new array can be shuffled for the purposes of randomizing MQ dungeons. /// If you want an individual DungeonInfo entry you should use the GetDungeon /// function from either here or the Context class. - /// @return + /// @return std::array GetDungeonList(); size_t GetDungeonListSize() const; void ParseJson(nlohmann::json spoilerFileJson); + private: std::array dungeonList; }; -} \ No newline at end of file +} // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 81afbf33c3..00a7a5adbf 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -11,7 +11,8 @@ namespace Rando { EntranceLinkInfo NO_RETURN_ENTRANCE = { EntranceType::None, RR_NONE, RR_NONE, -1 }; Entrance::Entrance(RandomizerRegion connectedRegion_, ConditionFn condition_function_, bool spreadsAreasWithPriority_) - : connectedRegion(connectedRegion_), condition_function(condition_function_), spreadsAreasWithPriority(spreadsAreasWithPriority_){ + : connectedRegion(connectedRegion_), condition_function(condition_function_), + spreadsAreasWithPriority(spreadsAreasWithPriority_) { originalConnectedRegion = connectedRegion_; } @@ -20,11 +21,11 @@ void Entrance::SetCondition(ConditionFn newCondition) { } bool Entrance::GetConditionsMet() const { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } - return true; + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { + return condition_function(); + } + return true; } std::string Entrance::to_string() const { @@ -60,24 +61,24 @@ void Entrance::printAgeTimeAccess() { } bool Entrance::ConditionsMet(bool allAgeTimes) const { - auto ctx = Rando::Context::GetInstance(); - StartPerformanceTimer(PT_ENTRANCE_LOGIC); - Region* parent = RegionTable(parentRegion); - int conditionsMet = 0; + auto ctx = Rando::Context::GetInstance(); + StartPerformanceTimer(PT_ENTRANCE_LOGIC); + Region* parent = RegionTable(parentRegion); + int conditionsMet = 0; - if (allAgeTimes && !parent->AllAccess()) { - StopPerformanceTimer(PT_ENTRANCE_LOGIC); - return false; - } + if (allAgeTimes && !parent->AllAccess()) { + StopPerformanceTimer(PT_ENTRANCE_LOGIC); + return false; + } - // check all possible day/night condition combinations - conditionsMet = (parent->childDay && CheckConditionAtAgeTime(logic->IsChild, logic->AtDay, allAgeTimes)) + - (parent->childNight && CheckConditionAtAgeTime(logic->IsChild, logic->AtNight, allAgeTimes)) + - (parent->adultDay && CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay, allAgeTimes)) + - (parent->adultNight && CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight, allAgeTimes)); + // check all possible day/night condition combinations + conditionsMet = (parent->childDay && CheckConditionAtAgeTime(logic->IsChild, logic->AtDay, allAgeTimes)) + + (parent->childNight && CheckConditionAtAgeTime(logic->IsChild, logic->AtNight, allAgeTimes)) + + (parent->adultDay && CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay, allAgeTimes)) + + (parent->adultNight && CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight, allAgeTimes)); - StopPerformanceTimer(PT_ENTRANCE_LOGIC); - return conditionsMet && (!allAgeTimes || conditionsMet == 4); + StopPerformanceTimer(PT_ENTRANCE_LOGIC); + return conditionsMet && (!allAgeTimes || conditionsMet == 4); } uint32_t Entrance::Getuint32_t() const { @@ -227,13 +228,13 @@ Entrance* Entrance::AssumeReachable() { return assumed; } -bool Entrance::DoesSpreadAreas(){ - return spreadsAreasWithPriority; +bool Entrance::DoesSpreadAreas() { + return spreadsAreasWithPriority; } EntranceShuffler::EntranceShuffler() { - playthroughEntrances = {}; - entranceOverrides = {}; + playthroughEntrances = {}; + entranceOverrides = {}; } bool EntranceShuffler::HasNoRandomEntrances() { @@ -249,7 +250,319 @@ std::string EntranceNameByRegions(RandomizerRegion parentRegion, RandomizerRegio return RegionTable(parentRegion)->regionName + " -> " + RegionTable(connectedRegion)->regionName; } -void SetAllEntrancesData(std::vector& entranceShuffleTable) { +std::unordered_map entranceMap; + +void SetAllEntrancesData() { + std::vector entranceShuffleTable = { + // clang-format off + // Type Parent Region Connected Region Index + { { EntranceType::Dungeon, RR_KF_OUTSIDE_DEKU_TREE, RR_DEKU_TREE_ENTRYWAY, ENTR_DEKU_TREE_ENTRANCE }, + { EntranceType::Dungeon, RR_DEKU_TREE_ENTRYWAY, RR_KF_OUTSIDE_DEKU_TREE, ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE } }, + { { EntranceType::Dungeon, RR_DEATH_MOUNTAIN_TRAIL, RR_DODONGOS_CAVERN_ENTRYWAY, ENTR_DODONGOS_CAVERN_ENTRANCE }, + { EntranceType::Dungeon, RR_DODONGOS_CAVERN_ENTRYWAY, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN } }, + { { EntranceType::Dungeon, RR_ZORAS_FOUNTAIN, RR_JABU_JABUS_BELLY_ENTRYWAY, ENTR_JABU_JABU_ENTRANCE }, + { EntranceType::Dungeon, RR_JABU_JABUS_BELLY_ENTRYWAY, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_OUTSIDE_JABU_JABU } }, + { { EntranceType::Dungeon, RR_SACRED_FOREST_MEADOW, RR_FOREST_TEMPLE_ENTRYWAY, ENTR_FOREST_TEMPLE_ENTRANCE }, + { EntranceType::Dungeon, RR_FOREST_TEMPLE_ENTRYWAY, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE } }, + { { EntranceType::Dungeon, RR_DMC_CENTRAL_LOCAL, RR_FIRE_TEMPLE_ENTRYWAY, ENTR_FIRE_TEMPLE_ENTRANCE }, + { EntranceType::Dungeon, RR_FIRE_TEMPLE_ENTRYWAY, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_OUTSIDE_TEMPLE } }, + { { EntranceType::Dungeon, RR_LH_FROM_WATER_TEMPLE, RR_WATER_TEMPLE_ENTRYWAY, ENTR_WATER_TEMPLE_ENTRANCE }, + { EntranceType::Dungeon, RR_WATER_TEMPLE_ENTRYWAY, RR_LH_FROM_WATER_TEMPLE, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE } }, + { { EntranceType::Dungeon, RR_DESERT_COLOSSUS, RR_SPIRIT_TEMPLE_ENTRYWAY, ENTR_SPIRIT_TEMPLE_ENTRANCE }, + { EntranceType::Dungeon, RR_SPIRIT_TEMPLE_ENTRYWAY, RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE } }, + { { EntranceType::Dungeon, RR_GRAVEYARD_WARP_PAD_REGION, RR_SHADOW_TEMPLE_ENTRYWAY, ENTR_SHADOW_TEMPLE_ENTRANCE }, + { EntranceType::Dungeon, RR_SHADOW_TEMPLE_ENTRYWAY, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_OUTSIDE_TEMPLE } }, + { { EntranceType::Dungeon, RR_KAK_WELL, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, ENTR_BOTTOM_OF_THE_WELL_ENTRANCE }, + { EntranceType::Dungeon, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, RR_KAK_WELL, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL } }, + { { EntranceType::Dungeon, RR_ZF_LEDGE, RR_ICE_CAVERN_ENTRYWAY, ENTR_ICE_CAVERN_ENTRANCE }, + { EntranceType::Dungeon, RR_ICE_CAVERN_ENTRYWAY, RR_ZF_LEDGE, ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN } }, + { { EntranceType::Dungeon, RR_GF_OUTSIDE_GTG, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE }, + { EntranceType::Dungeon, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, RR_GF_OUTSIDE_GTG, ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND } }, + { { EntranceType::GanonDungeon, RR_GANONS_CASTLE_LEDGE, RR_GANONS_CASTLE_ENTRYWAY, ENTR_INSIDE_GANONS_CASTLE_ENTRANCE }, + { EntranceType::GanonDungeon, RR_GANONS_CASTLE_ENTRYWAY, RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT } }, + + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_MIDOS_HOUSE, ENTR_MIDOS_HOUSE_0 }, + { EntranceType::Interior, RR_KF_MIDOS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_MIDOS_HOUSE } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_SARIAS_HOUSE, ENTR_SARIAS_HOUSE_0 }, + { EntranceType::Interior, RR_KF_SARIAS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_SARIAS_HOUSE } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_HOUSE_OF_TWINS, ENTR_TWINS_HOUSE_0 }, + { EntranceType::Interior, RR_KF_HOUSE_OF_TWINS, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_TWINS_HOUSE } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_KNOW_IT_ALL_HOUSE, ENTR_KNOW_IT_ALL_BROS_HOUSE_0 }, + { EntranceType::Interior, RR_KF_KNOW_IT_ALL_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_KNOW_IT_ALL_HOUSE } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_KOKIRI_SHOP, ENTR_KOKIRI_SHOP_0 }, + { EntranceType::Interior, RR_KF_KOKIRI_SHOP, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_SHOP } }, + { { EntranceType::Interior, RR_LAKE_HYLIA, RR_LH_LAB, ENTR_LAKESIDE_LABORATORY_0 }, + { EntranceType::Interior, RR_LH_LAB, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_OUTSIDE_LAB } }, + { { EntranceType::Interior, RR_LH_FISHING_ISLAND, RR_LH_FISHING_POND, ENTR_FISHING_POND_0 }, + { EntranceType::Interior, RR_LH_FISHING_POND, RR_LH_FISHING_ISLAND, ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND } }, + { { EntranceType::Interior, RR_GV_FORTRESS_SIDE, RR_GV_CARPENTER_TENT, ENTR_CARPENTERS_TENT_0 }, + { EntranceType::Interior, RR_GV_CARPENTER_TENT, RR_GV_FORTRESS_SIDE, ENTR_GERUDO_VALLEY_OUTSIDE_TENT } }, + { { EntranceType::Interior, RR_MARKET_ENTRANCE, RR_MARKET_GUARD_HOUSE, ENTR_MARKET_GUARD_HOUSE_0 }, + { EntranceType::Interior, RR_MARKET_GUARD_HOUSE, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_MASK_SHOP, ENTR_HAPPY_MASK_SHOP_0 }, + { EntranceType::Interior, RR_MARKET_MASK_SHOP, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_BOMBCHU_BOWLING, ENTR_BOMBCHU_BOWLING_ALLEY_0 }, + { EntranceType::Interior, RR_MARKET_BOMBCHU_BOWLING, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_POTION_SHOP, ENTR_POTION_SHOP_MARKET_0 }, + { EntranceType::Interior, RR_MARKET_POTION_SHOP, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_TREASURE_CHEST_GAME, ENTR_TREASURE_BOX_SHOP_0 }, + { EntranceType::Interior, RR_MARKET_TREASURE_CHEST_GAME, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP } }, + { { EntranceType::Interior, RR_MARKET_BACK_ALLEY, RR_MARKET_BOMBCHU_SHOP, ENTR_BOMBCHU_SHOP_1 }, + { EntranceType::Interior, RR_MARKET_BOMBCHU_SHOP, RR_MARKET_BACK_ALLEY, ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP } }, + { { EntranceType::Interior, RR_MARKET_BACK_ALLEY, RR_MARKET_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE }, + { EntranceType::Interior, RR_MARKET_MAN_IN_GREEN_HOUSE, RR_MARKET_BACK_ALLEY, ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_CARPENTER_BOSS_HOUSE, ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0 }, + { EntranceType::Interior, RR_KAK_CARPENTER_BOSS_HOUSE, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_CENTER_GUEST_HOUSE } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_HOUSE_OF_SKULLTULA, ENTR_HOUSE_OF_SKULLTULA_0 }, + { EntranceType::Interior, RR_KAK_HOUSE_OF_SKULLTULA, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SKULKLTULA_HOUSE } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_IMPAS_HOUSE, ENTR_IMPAS_HOUSE_FRONT }, + { EntranceType::Interior, RR_KAK_IMPAS_HOUSE, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_FRONT } }, + { { EntranceType::Interior, RR_KAK_IMPAS_LEDGE, RR_KAK_IMPAS_HOUSE_BACK, ENTR_IMPAS_HOUSE_BACK }, + { EntranceType::Interior, RR_KAK_IMPAS_HOUSE_BACK, RR_KAK_IMPAS_LEDGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_BACK } }, + { { EntranceType::Interior, RR_KAK_BACKYARD, RR_KAK_ODD_POTION_BUILDING, ENTR_POTION_SHOP_GRANNY_0 }, + { EntranceType::Interior, RR_KAK_ODD_POTION_BUILDING, RR_KAK_BACKYARD, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY } }, + { { EntranceType::Interior, RR_THE_GRAVEYARD, RR_GRAVEYARD_DAMPES_HOUSE, ENTR_GRAVEKEEPERS_HUT_0 }, + { EntranceType::Interior, RR_GRAVEYARD_DAMPES_HOUSE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_OUTSIDE_DAMPES_HUT } }, + { { EntranceType::Interior, RR_GORON_CITY, RR_GC_SHOP, ENTR_GORON_SHOP_0 }, + { EntranceType::Interior, RR_GC_SHOP, RR_GORON_CITY, ENTR_GORON_CITY_OUTSIDE_SHOP } }, + { { EntranceType::Interior, RR_ZORAS_DOMAIN, RR_ZD_SHOP, ENTR_ZORA_SHOP_0 }, + { EntranceType::Interior, RR_ZD_SHOP, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP } }, + { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_TALONS_HOUSE, ENTR_LON_LON_BUILDINGS_TALONS_HOUSE }, + { EntranceType::Interior, RR_LLR_TALONS_HOUSE, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE } }, + { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_STABLES, ENTR_STABLE_0 }, + { EntranceType::Interior, RR_LLR_STABLES, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_STABLES } }, + { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_TOWER, ENTR_LON_LON_BUILDINGS_TOWER }, + { EntranceType::Interior, RR_LLR_TOWER, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_TOWER } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_BAZAAR, ENTR_BAZAAR_1 }, + { EntranceType::Interior, RR_MARKET_BAZAAR, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_BAZAAR } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_1 }, + { EntranceType::Interior, RR_MARKET_SHOOTING_GALLERY, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_BAZAAR, ENTR_BAZAAR_0 }, + { EntranceType::Interior, RR_KAK_BAZAAR, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BAZAAR } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_0 }, + { EntranceType::Interior, RR_KAK_SHOOTING_GALLERY, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOOTING_GALLERY } }, + { { EntranceType::Interior, RR_DESERT_COLOSSUS, RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS }, + { EntranceType::Interior, RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT } }, + { { EntranceType::Interior, RR_HYRULE_CASTLE_GROUNDS, RR_HC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC }, + { EntranceType::Interior, RR_HC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT } }, + { { EntranceType::Interior, RR_GANONS_CASTLE_GROUNDS, RR_OGC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD }, + // 0x3E8 is an unused entrance index repruposed to differentiate between the HC and OGC fairy + // fountain exits (normally they both use 0x340) + { EntranceType::Interior, RR_OGC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, ENTR_POTION_SHOP_KAKARIKO_1 } }, + { { EntranceType::Interior, RR_DMC_LOWER_NEARBY, RR_DMC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC }, + { EntranceType::Interior, RR_DMC_GREAT_FAIRY_FOUNTAIN, RR_DMC_LOWER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT } }, + { { EntranceType::Interior, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMT_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT }, + { EntranceType::Interior, RR_DMT_GREAT_FAIRY_FOUNTAIN, RR_DEATH_MOUNTAIN_SUMMIT, ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT } }, + { { EntranceType::Interior, RR_ZORAS_FOUNTAIN, RR_ZF_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF }, + { EntranceType::Interior, RR_ZF_GREAT_FAIRY_FOUNTAIN, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY } }, + + { { EntranceType::SpecialInterior, RR_KOKIRI_FOREST, RR_KF_LINKS_HOUSE, ENTR_LINKS_HOUSE_1 }, + { EntranceType::SpecialInterior, RR_KF_LINKS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_LINKS_HOUSE } }, + { { EntranceType::SpecialInterior, RR_TOT_ENTRANCE, RR_TEMPLE_OF_TIME, ENTR_TEMPLE_OF_TIME_ENTRANCE }, + { EntranceType::SpecialInterior, RR_TEMPLE_OF_TIME, RR_TOT_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE } }, + { { EntranceType::SpecialInterior, RR_KAKARIKO_VILLAGE, RR_KAK_WINDMILL, ENTR_WINDMILL_AND_DAMPES_GRAVE_WINDMILL }, + { EntranceType::SpecialInterior, RR_KAK_WINDMILL, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_WINDMILL } }, + { { EntranceType::SpecialInterior, RR_KAKARIKO_VILLAGE, RR_KAK_POTION_SHOP_FRONT, ENTR_POTION_SHOP_KAKARIKO_FRONT }, + { EntranceType::SpecialInterior, RR_KAK_POTION_SHOP_FRONT, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_FRONT } }, + { { EntranceType::SpecialInterior, RR_KAK_BACKYARD, RR_KAK_POTION_SHOP_BACK, ENTR_POTION_SHOP_KAKARIKO_BACK }, + { EntranceType::SpecialInterior, RR_KAK_POTION_SHOP_BACK, RR_KAK_BACKYARD, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_BACK } }, + + // Grotto Loads use an entrance index of 0x0700 + their grotto id. The id is used as index for the + // grottoLoadTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c + // Grotto Returns use an entrance index of 0x0800 + their grotto id. The id is used as index for the + // grottoReturnTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c + { { EntranceType::GrottoGrave, RR_DESERT_COLOSSUS, RR_COLOSSUS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET) }, + { EntranceType::GrottoGrave, RR_COLOSSUS_GROTTO, RR_DESERT_COLOSSUS, ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_LAKE_HYLIA, RR_LH_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET) }, + { EntranceType::GrottoGrave, RR_LH_GROTTO, RR_LAKE_HYLIA, ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_ZR_STORMS_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET) }, + { EntranceType::GrottoGrave, RR_ZR_FAIRY_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET) }, + { EntranceType::GrottoGrave, RR_ZR_OPEN_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_DMC_LOWER_NEARBY, RR_DMC_HAMMER_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMC_HAMMER_OFFSET) }, + { EntranceType::GrottoGrave, RR_DMC_HAMMER_GROTTO, RR_DMC_LOWER_LOCAL, ENTRANCE_GROTTO_EXIT(GROTTO_DMC_HAMMER_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_DMC_UPPER_NEARBY, RR_DMC_UPPER_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMC_UPPER_OFFSET) }, + { EntranceType::GrottoGrave, RR_DMC_UPPER_GROTTO, RR_DMC_UPPER_LOCAL, ENTRANCE_GROTTO_EXIT(GROTTO_DMC_UPPER_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_GC_GROTTO_PLATFORM, RR_GC_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GORON_CITY_OFFSET) }, + { EntranceType::GrottoGrave, RR_GC_GROTTO, RR_GC_GROTTO_PLATFORM, ENTRANCE_GROTTO_EXIT(GROTTO_GORON_CITY_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_DEATH_MOUNTAIN_TRAIL, RR_DMT_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMT_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_DMT_STORMS_GROTTO, RR_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROTTO_EXIT(GROTTO_DMT_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMT_COW_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMT_COW_OFFSET) }, + { EntranceType::GrottoGrave, RR_DMT_COW_GROTTO, RR_DEATH_MOUNTAIN_SUMMIT, ENTRANCE_GROTTO_EXIT(GROTTO_DMT_COW_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_KAK_BACKYARD, RR_KAK_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KAK_OPEN_OFFSET) }, + { EntranceType::GrottoGrave, RR_KAK_OPEN_GROTTO, RR_KAK_BACKYARD, ENTRANCE_GROTTO_EXIT(GROTTO_KAK_OPEN_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_KAKARIKO_VILLAGE, RR_KAK_REDEAD_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KAK_REDEAD_OFFSET) }, + { EntranceType::GrottoGrave, RR_KAK_REDEAD_GROTTO, RR_KAKARIKO_VILLAGE, ENTRANCE_GROTTO_EXIT(GROTTO_KAK_REDEAD_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_CASTLE_GROUNDS, RR_HC_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HC_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_HC_STORMS_GROTTO, RR_CASTLE_GROUNDS, ENTRANCE_GROTTO_EXIT(GROTTO_HC_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_TEKTITE_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_TEKTITE_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_NEAR_KAK_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_NEAR_KAK_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_FAIRY_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_NEAR_MARKET_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_NEAR_MARKET_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_COW_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_COW_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_COW_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_COW_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_INSIDE_FENCE_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_INSIDE_FENCE_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_INSIDE_FENCE_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_INSIDE_FENCE_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_OPEN_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_OPEN_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_OPEN_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_SOUTHEAST_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_SOUTHEAST_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_SOUTHEAST_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_SOUTHEAST_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_LON_LON_RANCH, RR_LLR_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET) }, + { EntranceType::GrottoGrave, RR_LLR_GROTTO, RR_LON_LON_RANCH, ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_SFM_ENTRYWAY, RR_SFM_WOLFOS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET) }, + { EntranceType::GrottoGrave, RR_SFM_WOLFOS_GROTTO, RR_SFM_ENTRYWAY, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_SACRED_FOREST_MEADOW, RR_SFM_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_SFM_STORMS_GROTTO, RR_SACRED_FOREST_MEADOW, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_SACRED_FOREST_MEADOW, RR_SFM_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET) }, + { EntranceType::GrottoGrave, RR_SFM_FAIRY_GROTTO, RR_SACRED_FOREST_MEADOW, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_LW_BEYOND_MIDO, RR_LW_SCRUBS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET) }, + { EntranceType::GrottoGrave, RR_LW_SCRUBS_GROTTO, RR_LW_BEYOND_MIDO, ENTRANCE_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_THE_LOST_WOODS, RR_LW_NEAR_SHORTCUTS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET) }, + { EntranceType::GrottoGrave, RR_LW_NEAR_SHORTCUTS_GROTTO, RR_THE_LOST_WOODS, ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_KOKIRI_FOREST, RR_KF_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KF_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_KF_STORMS_GROTTO, RR_KOKIRI_FOREST, ENTRANCE_GROTTO_EXIT(GROTTO_KF_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_ZORAS_DOMAIN_ISLAND, RR_ZD_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_ZD_STORMS_GROTTO, RR_ZORAS_DOMAIN_ISLAND, ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_GF_NEAR_GROTTO, RR_GF_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_GF_STORMS_GROTTO, RR_GF_NEAR_GROTTO, ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_GV_FORTRESS_SIDE, RR_GV_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_GV_STORMS_GROTTO, RR_GV_FORTRESS_SIDE, ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_GV_GROTTO_LEDGE, RR_GV_OCTOROK_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET) }, + { EntranceType::GrottoGrave, RR_GV_OCTOROK_GROTTO, RR_GV_GROTTO_LEDGE, ENTRANCE_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_LW_BEYOND_MIDO, RR_DEKU_THEATER, ENTRANCE_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET) }, + { EntranceType::GrottoGrave, RR_DEKU_THEATER, RR_LW_BEYOND_MIDO, ENTRANCE_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET) } }, + + // Graves have their own specified entrance indices + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_SHIELD_GRAVE, ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0 }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_SHIELD_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_SHIELD_GRAVE_EXIT } }, + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_HEART_PIECE_GRAVE, ENTR_REDEAD_GRAVE_0 }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_HEART_PIECE_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_HEART_PIECE_GRAVE_EXIT } }, + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_COMPOSERS_GRAVE, ENTR_ROYAL_FAMILYS_TOMB_0 }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_COMPOSERS_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_ROYAL_TOMB_EXIT } }, + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_DAMPES_GRAVE, ENTR_WINDMILL_AND_DAMPES_GRAVE_GRAVE }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_DAMPES_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_DAMPES_GRAVE_EXIT } }, + + { { EntranceType::Overworld, RR_KOKIRI_FOREST, RR_LW_BRIDGE_FROM_FOREST, ENTR_LOST_WOODS_BRIDGE_EAST_EXIT }, + { EntranceType::Overworld, RR_LW_BRIDGE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_LOWER_EXIT } }, + { { EntranceType::Overworld, RR_KOKIRI_FOREST, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_SOUTH_EXIT }, + { EntranceType::Overworld, RR_LW_FOREST_EXIT, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_UPPER_EXIT } }, + { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_GC_WOODS_WARP, ENTR_GORON_CITY_TUNNEL_SHORTCUT }, + { EntranceType::Overworld, RR_GC_WOODS_WARP, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_TUNNEL_SHORTCUT } }, + { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_ZR_FROM_SHORTCUT, ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT }, + { EntranceType::Overworld, RR_ZR_FROM_SHORTCUT, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_UNDERWATER_SHORTCUT } }, + { { EntranceType::Overworld, RR_LW_BEYOND_MIDO, RR_SFM_ENTRYWAY, ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT }, + { EntranceType::Overworld, RR_SFM_ENTRYWAY, RR_LW_BEYOND_MIDO, ENTR_LOST_WOODS_NORTH_EXIT } }, + { { EntranceType::Overworld, RR_LW_BRIDGE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_WOODED_EXIT }, + { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LW_BRIDGE, ENTR_LOST_WOODS_BRIDGE_WEST_EXIT } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_NORTH_EXIT }, + { EntranceType::Overworld, RR_LAKE_HYLIA, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_FENCE_EXIT } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_GERUDO_VALLEY, ENTR_GERUDO_VALLEY_EAST_EXIT }, + { EntranceType::Overworld, RR_GERUDO_VALLEY, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_ROCKY_PATH } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT }, + { EntranceType::Overworld, RR_MARKET_ENTRANCE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_FRONT_GATE }, + { EntranceType::Overworld, RR_KAKARIKO_VILLAGE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_STAIRS_EXIT } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_ZR_FRONT, ENTR_ZORAS_RIVER_WEST_EXIT }, + { EntranceType::Overworld, RR_ZR_FRONT, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_RIVER_EXIT } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_ENTRANCE }, + { EntranceType::Overworld, RR_LON_LON_RANCH, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_CENTER_EXIT } }, + { { EntranceType::Overworld, RR_LH_FROM_SHORTCUT, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT }, + { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_LH_FROM_SHORTCUT, ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT } }, + { { EntranceType::Overworld, RR_GV_FORTRESS_SIDE, RR_GF_OUTSKIRTS, ENTR_GERUDOS_FORTRESS_EAST_EXIT }, + { EntranceType::Overworld, RR_GF_OUTSKIRTS, RR_GV_FORTRESS_SIDE, ENTR_GERUDO_VALLEY_WEST_EXIT } }, + { { EntranceType::Overworld, RR_GF_OUTSIDE_GATE, RR_WASTELAND_NEAR_FORTRESS, ENTR_HAUNTED_WASTELAND_EAST_EXIT }, + { EntranceType::Overworld, RR_WASTELAND_NEAR_FORTRESS, RR_GF_OUTSIDE_GATE, ENTR_GERUDOS_FORTRESS_GATE_EXIT } }, + { { EntranceType::Overworld, RR_WASTELAND_NEAR_COLOSSUS, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_EAST_EXIT }, + { EntranceType::Overworld, RR_DESERT_COLOSSUS, RR_WASTELAND_NEAR_COLOSSUS, ENTR_HAUNTED_WASTELAND_WEST_EXIT } }, + { { EntranceType::Overworld, RR_MARKET_ENTRANCE, RR_THE_MARKET, ENTR_MARKET_SOUTH_EXIT }, + { EntranceType::Overworld, RR_THE_MARKET, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_NORTH_EXIT } }, + { { EntranceType::Overworld, RR_THE_MARKET, RR_CASTLE_GROUNDS, ENTR_CASTLE_GROUNDS_SOUTH_EXIT }, + { EntranceType::Overworld, RR_CASTLE_GROUNDS, RR_THE_MARKET, ENTR_MARKET_DAY_CASTLE_EXIT } }, + { { EntranceType::Overworld, RR_THE_MARKET, RR_TOT_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT }, + { EntranceType::Overworld, RR_TOT_ENTRANCE, RR_THE_MARKET, ENTR_MARKET_DAY_TEMPLE_EXIT } }, + { { EntranceType::Overworld, RR_KAKARIKO_VILLAGE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_ENTRANCE }, + { EntranceType::Overworld, RR_THE_GRAVEYARD, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT } }, + { { EntranceType::Overworld, RR_KAK_BEHIND_GATE, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT }, + { EntranceType::Overworld, RR_DEATH_MOUNTAIN_TRAIL, RR_KAK_BEHIND_GATE, ENTR_KAKARIKO_VILLAGE_GUARD_GATE } }, + { { EntranceType::Overworld, RR_DEATH_MOUNTAIN_TRAIL, RR_GORON_CITY, ENTR_GORON_CITY_UPPER_EXIT }, + { EntranceType::Overworld, RR_GORON_CITY, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT } }, + { { EntranceType::Overworld, RR_GC_DARUNIAS_CHAMBER, RR_DMC_LOWER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT }, + { EntranceType::Overworld, RR_DMC_LOWER_NEARBY, RR_GC_DARUNIAS_CHAMBER, ENTR_GORON_CITY_DARUNIA_ROOM_EXIT } }, + { { EntranceType::Overworld, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMC_UPPER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT }, + { EntranceType::Overworld, RR_DMC_UPPER_NEARBY, RR_DEATH_MOUNTAIN_SUMMIT, ENTR_DEATH_MOUNTAIN_TRAIL_SUMMIT_EXIT } }, + { { EntranceType::Overworld, RR_ZR_BEHIND_WATERFALL, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_ENTRANCE }, + { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_ZR_BEHIND_WATERFALL, ENTR_ZORAS_RIVER_WATERFALL_EXIT } }, + { { EntranceType::Overworld, RR_ZD_BEHIND_KING_ZORA, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT }, + { EntranceType::Overworld, RR_ZORAS_FOUNTAIN, RR_ZD_BEHIND_KING_ZORA, ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT } }, + + { { EntranceType::Overworld, RR_GV_LOWER_STREAM, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_RIVER_EXIT }, + NO_RETURN_ENTRANCE }, + + { { EntranceType::OwlDrop, RR_LH_OWL_FLIGHT, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_OWL_DROP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::OwlDrop, RR_DMT_OWL_FLIGHT, RR_KAK_IMPAS_ROOFTOP, ENTR_KAKARIKO_VILLAGE_OWL_DROP }, + NO_RETURN_ENTRANCE }, + + { { EntranceType::Spawn, RR_CHILD_SPAWN, RR_KF_LINKS_HOUSE, ENTR_LINKS_HOUSE_CHILD_SPAWN }, + NO_RETURN_ENTRANCE }, + { { EntranceType::Spawn, RR_ADULT_SPAWN, RR_TEMPLE_OF_TIME, ENTR_HYRULE_FIELD_10 }, + NO_RETURN_ENTRANCE }, // 0x282 is an unused entrance index repurposed to differentiate between + // Adult Spawn and prelude of light (normally they both use 0x5F4) + { { EntranceType::WarpSong, RR_MINUET_OF_FOREST_WARP, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_WARP_PAD }, + NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_BOLERO_OF_FIRE_WARP, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD }, + NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_SERENADE_OF_WATER_WARP, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_WARP_PAD }, + NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_REQUIEM_OF_SPIRIT_WARP, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_WARP_PAD }, + NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_NOCTURNE_OF_SHADOW_WARP, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_WARP_PAD }, + NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_PRELUDE_OF_LIGHT_WARP, RR_TEMPLE_OF_TIME, ENTR_TEMPLE_OF_TIME_WARP_PAD }, + NO_RETURN_ENTRANCE }, + + { { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ENTRYWAY, RR_DEKU_TREE_BOSS_ROOM, ENTR_DEKU_TREE_BOSS_ENTRANCE }, + { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_EXIT, ENTR_DEKU_TREE_BOSS_DOOR } }, + { { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, RR_DODONGOS_CAVERN_BOSS_ROOM, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE }, + { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_EXIT, ENTR_DODONGOS_CAVERN_BOSS_DOOR } }, + { { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, RR_JABU_JABUS_BELLY_BOSS_ROOM, ENTR_JABU_JABU_BOSS_ENTRANCE }, + { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_EXIT, ENTR_JABU_JABU_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, RR_FOREST_TEMPLE_BOSS_ROOM, ENTR_FOREST_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, ENTR_FOREST_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, RR_FIRE_TEMPLE_BOSS_ROOM, ENTR_FIRE_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ROOM, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, ENTR_FIRE_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ENTRYWAY, RR_WATER_TEMPLE_BOSS_ROOM, ENTR_WATER_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ROOM, RR_WATER_TEMPLE_BOSS_ENTRYWAY, ENTR_WATER_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, RR_SPIRIT_TEMPLE_BOSS_ROOM, ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, ENTR_SPIRIT_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, RR_SHADOW_TEMPLE_BOSS_ROOM, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, ENTR_SHADOW_TEMPLE_BOSS_DOOR } }, + + { { EntranceType::BlueWarp, RR_DEKU_TREE_BOSS_ROOM, RR_KF_OUTSIDE_DEKU_TREE, ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_FOREST_TEMPLE_BOSS_ROOM, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_FIRE_TEMPLE_BOSS_ROOM, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_WATER_TEMPLE_BOSS_ROOM, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + // clang-format on + }; + auto ctx = Rando::Context::GetInstance(); for (auto& entrancePair : entranceShuffleTable) { @@ -261,6 +574,7 @@ void SetAllEntrancesData(std::vector& entranceShuffleTable) { forwardEntrance->SetIndex(forwardEntry.index); forwardEntrance->SetType(forwardEntry.type); forwardEntrance->SetAsPrimary(); + entranceMap[forwardEntry.index] = forwardEntrance; // When decouple entrances is on, mark the forward entrance if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) { @@ -272,6 +586,7 @@ void SetAllEntrancesData(std::vector& entranceShuffleTable) { returnEntrance->SetIndex(returnEntry.index); returnEntrance->SetType(returnEntry.type); forwardEntrance->BindTwoWay(returnEntrance); + entranceMap[returnEntry.index] = returnEntrance; // Mark reverse entrance as decoupled if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) { @@ -351,8 +666,21 @@ std::vector EntranceShuffler::AssumeEntrancePool(std::vector& rollbacks) { // Entrances shouldn't connect to their own scene, fail in this situation - if (entrance->GetParentRegion()->scene != "" && - entrance->GetParentRegion()->scene == target->GetConnectedRegion()->scene) { + if ( + // allow "special" areas to connect to eachother + entrance->GetParentRegion()->scene != SCENE_ID_MAX && + // allow grottos and fairy fountains to connect to eachother + entrance->GetParentRegion()->scene != SCENE_GROTTOS && + entrance->GetParentRegion()->scene != SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC && + entrance->GetParentRegion()->scene != SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS && + + (entrance->GetParentRegion()->scene == target->GetConnectedRegion()->scene || + + // prevent SCENE_HYRULE_CASTLE & SCENE_OUTSIDE_GANONS_CASTLE from connecting to eachother + (entrance->GetParentRegion()->scene == SCENE_HYRULE_CASTLE && + target->GetConnectedRegion()->scene == SCENE_OUTSIDE_GANONS_CASTLE) || + (entrance->GetParentRegion()->scene == SCENE_OUTSIDE_GANONS_CASTLE && + target->GetConnectedRegion()->scene == SCENE_HYRULE_CASTLE))) { auto message = "Entrance " + entrance->GetName() + " attempted to connect with own scene target " + target->to_string() + ". Connection failed.\n"; SPDLOG_DEBUG(message); @@ -440,12 +768,6 @@ static bool ValidateWorld(Entrance* entrancePlaced) { type = entrancePlaced->GetType(); } - bool checkPoeCollectorAccess = - (ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES) || - ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL)) && - (entrancePlaced == nullptr || ctx->GetOption(RSK_MIXED_ENTRANCE_POOLS) || type == EntranceType::Interior || - type == EntranceType::SpecialInterior || type == EntranceType::Overworld || type == EntranceType::Spawn || - type == EntranceType::WarpSong || type == EntranceType::OwlDrop); bool checkOtherEntranceAccess = (ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL) || @@ -458,7 +780,7 @@ static bool ValidateWorld(Entrance* entrancePlaced) { // Conditions will be checked during the search and any that fail will be figured out // afterwards ctx->GetLogic()->Reset(); - ValidateEntrances(checkPoeCollectorAccess, checkOtherEntranceAccess); + ValidateEntrances(checkOtherEntranceAccess); if (!ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) { // Unless entrances are decoupled, we don't want the player to end up through certain entrances as the wrong age @@ -532,7 +854,8 @@ static bool ValidateWorld(Entrance* entrancePlaced) { // The player should be able to get back to ToT after going through time, without having collected any items // This is important to ensure that the player never loses access to the pedestal after going through time - if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD) && !RegionTable(RR_TEMPLE_OF_TIME)->Adult()) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD) && + !RegionTable(RR_TEMPLE_OF_TIME)->Adult()) { SPDLOG_DEBUG("Path to Temple of Time as adult is not guaranteed\n"); return false; } else if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT) && @@ -542,15 +865,6 @@ static bool ValidateWorld(Entrance* entrancePlaced) { } } - // The Big Poe shop should always be accessible as adult without the need to use any bottles - // This is important to ensure that players can never lock their only bottles by filling them with Big Poes they - // can't sell - if (checkPoeCollectorAccess) { - if (!RegionTable(RR_MARKET_GUARD_HOUSE)->Adult()) { - SPDLOG_DEBUG("Big Poe Shop access is not guarenteed as adult\n"); - return false; - } - } SPDLOG_DEBUG("All Locations NOT REACHABLE\n"); return false; } @@ -855,314 +1169,6 @@ int EntranceShuffler::ShuffleAllEntrances() { mTotalRandomizableEntrances = 0; mCurNumRandomizedEntrances = 0; - std::vector entranceShuffleTable = { - // Type Parent Region Connected Region Index - { { EntranceType::Dungeon, RR_KF_OUTSIDE_DEKU_TREE, RR_DEKU_TREE_ENTRYWAY, ENTR_DEKU_TREE_ENTRANCE }, - { EntranceType::Dungeon, RR_DEKU_TREE_ENTRYWAY, RR_KF_OUTSIDE_DEKU_TREE, ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE } }, - { { EntranceType::Dungeon, RR_DEATH_MOUNTAIN_TRAIL, RR_DODONGOS_CAVERN_ENTRYWAY, ENTR_DODONGOS_CAVERN_ENTRANCE }, - { EntranceType::Dungeon, RR_DODONGOS_CAVERN_ENTRYWAY, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN } }, - { { EntranceType::Dungeon, RR_ZORAS_FOUNTAIN, RR_JABU_JABUS_BELLY_ENTRYWAY, ENTR_JABU_JABU_ENTRANCE }, - { EntranceType::Dungeon, RR_JABU_JABUS_BELLY_ENTRYWAY, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_OUTSIDE_JABU_JABU } }, - { { EntranceType::Dungeon, RR_SACRED_FOREST_MEADOW, RR_FOREST_TEMPLE_ENTRYWAY, ENTR_FOREST_TEMPLE_ENTRANCE }, - { EntranceType::Dungeon, RR_FOREST_TEMPLE_ENTRYWAY, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE } }, - { { EntranceType::Dungeon, RR_DMC_CENTRAL_LOCAL, RR_FIRE_TEMPLE_ENTRYWAY, ENTR_FIRE_TEMPLE_ENTRANCE }, - { EntranceType::Dungeon, RR_FIRE_TEMPLE_ENTRYWAY, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_OUTSIDE_TEMPLE } }, - { { EntranceType::Dungeon, RR_LAKE_HYLIA, RR_WATER_TEMPLE_ENTRYWAY, ENTR_WATER_TEMPLE_ENTRANCE }, - { EntranceType::Dungeon, RR_WATER_TEMPLE_ENTRYWAY, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE } }, - { { EntranceType::Dungeon, RR_DESERT_COLOSSUS, RR_SPIRIT_TEMPLE_ENTRYWAY, ENTR_SPIRIT_TEMPLE_ENTRANCE }, - { EntranceType::Dungeon, RR_SPIRIT_TEMPLE_ENTRYWAY, RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE } }, - { { EntranceType::Dungeon, RR_GRAVEYARD_WARP_PAD_REGION, RR_SHADOW_TEMPLE_ENTRYWAY, ENTR_SHADOW_TEMPLE_ENTRANCE }, - { EntranceType::Dungeon, RR_SHADOW_TEMPLE_ENTRYWAY, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_OUTSIDE_TEMPLE } }, - { { EntranceType::Dungeon, RR_KAK_WELL, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, ENTR_BOTTOM_OF_THE_WELL_ENTRANCE }, - { EntranceType::Dungeon, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, RR_KAK_WELL, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL } }, - { { EntranceType::Dungeon, RR_ZORAS_FOUNTAIN, RR_ICE_CAVERN_ENTRYWAY, ENTR_ICE_CAVERN_ENTRANCE }, - { EntranceType::Dungeon, RR_ICE_CAVERN_ENTRYWAY, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN } }, - { { EntranceType::Dungeon, RR_GERUDO_FORTRESS, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE }, - { EntranceType::Dungeon, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, RR_GERUDO_FORTRESS, ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND } }, - { { EntranceType::GanonDungeon, RR_GANONS_CASTLE_LEDGE, RR_GANONS_CASTLE_ENTRYWAY, ENTR_INSIDE_GANONS_CASTLE_ENTRANCE }, - { EntranceType::GanonDungeon, RR_GANONS_CASTLE_ENTRYWAY, RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT } }, - - { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_MIDOS_HOUSE, ENTR_MIDOS_HOUSE_0 }, - { EntranceType::Interior, RR_KF_MIDOS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_MIDOS_HOUSE } }, - { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_SARIAS_HOUSE, ENTR_SARIAS_HOUSE_0 }, - { EntranceType::Interior, RR_KF_SARIAS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_SARIAS_HOUSE } }, - { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_HOUSE_OF_TWINS, ENTR_TWINS_HOUSE_0 }, - { EntranceType::Interior, RR_KF_HOUSE_OF_TWINS, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_TWINS_HOUSE } }, - { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_KNOW_IT_ALL_HOUSE, ENTR_KNOW_IT_ALL_BROS_HOUSE_0 }, - { EntranceType::Interior, RR_KF_KNOW_IT_ALL_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_KNOW_IT_ALL_HOUSE } }, - { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_KOKIRI_SHOP, ENTR_KOKIRI_SHOP_0 }, - { EntranceType::Interior, RR_KF_KOKIRI_SHOP, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_SHOP } }, - { { EntranceType::Interior, RR_LAKE_HYLIA, RR_LH_LAB, ENTR_LAKESIDE_LABORATORY_0 }, - { EntranceType::Interior, RR_LH_LAB, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_OUTSIDE_LAB } }, - { { EntranceType::Interior, RR_LH_FISHING_ISLAND, RR_LH_FISHING_POND, ENTR_FISHING_POND_0 }, - { EntranceType::Interior, RR_LH_FISHING_POND, RR_LH_FISHING_ISLAND, ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND } }, - { { EntranceType::Interior, RR_GV_FORTRESS_SIDE, RR_GV_CARPENTER_TENT, ENTR_CARPENTERS_TENT_0 }, - { EntranceType::Interior, RR_GV_CARPENTER_TENT, RR_GV_FORTRESS_SIDE, ENTR_GERUDO_VALLEY_OUTSIDE_TENT } }, - { { EntranceType::Interior, RR_MARKET_ENTRANCE, RR_MARKET_GUARD_HOUSE, ENTR_MARKET_GUARD_HOUSE_0 }, - { EntranceType::Interior, RR_MARKET_GUARD_HOUSE, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_MASK_SHOP, ENTR_HAPPY_MASK_SHOP_0 }, - { EntranceType::Interior, RR_MARKET_MASK_SHOP, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_BOMBCHU_BOWLING, ENTR_BOMBCHU_BOWLING_ALLEY_0 }, - { EntranceType::Interior, RR_MARKET_BOMBCHU_BOWLING, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_POTION_SHOP, ENTR_POTION_SHOP_MARKET_0 }, - { EntranceType::Interior, RR_MARKET_POTION_SHOP, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_TREASURE_CHEST_GAME, ENTR_TREASURE_BOX_SHOP_0 }, - { EntranceType::Interior, RR_MARKET_TREASURE_CHEST_GAME, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP } }, - { { EntranceType::Interior, RR_MARKET_BACK_ALLEY, RR_MARKET_BOMBCHU_SHOP, ENTR_BOMBCHU_SHOP_1 }, - { EntranceType::Interior, RR_MARKET_BOMBCHU_SHOP, RR_MARKET_BACK_ALLEY, ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP } }, - { { EntranceType::Interior, RR_MARKET_BACK_ALLEY, RR_MARKET_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE }, - { EntranceType::Interior, RR_MARKET_MAN_IN_GREEN_HOUSE, RR_MARKET_BACK_ALLEY, ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE } }, - { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_CARPENTER_BOSS_HOUSE, ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0 }, - { EntranceType::Interior, RR_KAK_CARPENTER_BOSS_HOUSE, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_CENTER_GUEST_HOUSE } }, - { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_HOUSE_OF_SKULLTULA, ENTR_HOUSE_OF_SKULLTULA_0 }, - { EntranceType::Interior, RR_KAK_HOUSE_OF_SKULLTULA, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SKULKLTULA_HOUSE } }, - { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_IMPAS_HOUSE, ENTR_IMPAS_HOUSE_FRONT }, - { EntranceType::Interior, RR_KAK_IMPAS_HOUSE, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_FRONT } }, - { { EntranceType::Interior, RR_KAK_IMPAS_LEDGE, RR_KAK_IMPAS_HOUSE_BACK, ENTR_IMPAS_HOUSE_BACK }, - { EntranceType::Interior, RR_KAK_IMPAS_HOUSE_BACK, RR_KAK_IMPAS_LEDGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_BACK } }, - { { EntranceType::Interior, RR_KAK_BACKYARD, RR_KAK_ODD_POTION_BUILDING, ENTR_POTION_SHOP_GRANNY_0 }, - { EntranceType::Interior, RR_KAK_ODD_POTION_BUILDING, RR_KAK_BACKYARD, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY } }, - { { EntranceType::Interior, RR_THE_GRAVEYARD, RR_GRAVEYARD_DAMPES_HOUSE, ENTR_GRAVEKEEPERS_HUT_0 }, - { EntranceType::Interior, RR_GRAVEYARD_DAMPES_HOUSE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_OUTSIDE_DAMPES_HUT } }, - { { EntranceType::Interior, RR_GORON_CITY, RR_GC_SHOP, ENTR_GORON_SHOP_0 }, - { EntranceType::Interior, RR_GC_SHOP, RR_GORON_CITY, ENTR_GORON_CITY_OUTSIDE_SHOP } }, - { { EntranceType::Interior, RR_ZORAS_DOMAIN, RR_ZD_SHOP, ENTR_ZORA_SHOP_0 }, - { EntranceType::Interior, RR_ZD_SHOP, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP } }, - { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_TALONS_HOUSE, ENTR_LON_LON_BUILDINGS_TALONS_HOUSE }, - { EntranceType::Interior, RR_LLR_TALONS_HOUSE, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE } }, - { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_STABLES, ENTR_STABLE_0 }, - { EntranceType::Interior, RR_LLR_STABLES, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_STABLES } }, - { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_TOWER, ENTR_LON_LON_BUILDINGS_TOWER }, - { EntranceType::Interior, RR_LLR_TOWER, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_TOWER } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_BAZAAR, ENTR_BAZAAR_1 }, - { EntranceType::Interior, RR_MARKET_BAZAAR, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_BAZAAR } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_1 }, - { EntranceType::Interior, RR_MARKET_SHOOTING_GALLERY, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY } }, - { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_BAZAAR, ENTR_BAZAAR_0 }, - { EntranceType::Interior, RR_KAK_BAZAAR, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BAZAAR } }, - { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_0 }, - { EntranceType::Interior, RR_KAK_SHOOTING_GALLERY, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOOTING_GALLERY } }, - { { EntranceType::Interior, RR_DESERT_COLOSSUS, RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS }, - { EntranceType::Interior, RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT } }, - { { EntranceType::Interior, RR_HYRULE_CASTLE_GROUNDS, RR_HC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC }, - { EntranceType::Interior, RR_HC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT } }, - { { EntranceType::Interior, RR_GANONS_CASTLE_GROUNDS, RR_OGC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD }, - // 0x3E8 is an unused entrance index repruposed to differentiate between the HC and OGC fairy - // fountain exits (normally they both use 0x340) - { EntranceType::Interior, RR_OGC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, ENTR_POTION_SHOP_KAKARIKO_1 } }, - { { EntranceType::Interior, RR_DMC_LOWER_NEARBY, RR_DMC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC }, - { EntranceType::Interior, RR_DMC_GREAT_FAIRY_FOUNTAIN, RR_DMC_LOWER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT } }, - { { EntranceType::Interior, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMT_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT }, - { EntranceType::Interior, RR_DMT_GREAT_FAIRY_FOUNTAIN, RR_DEATH_MOUNTAIN_SUMMIT, ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT } }, - { { EntranceType::Interior, RR_ZORAS_FOUNTAIN, RR_ZF_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF }, - { EntranceType::Interior, RR_ZF_GREAT_FAIRY_FOUNTAIN, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY } }, - - { { EntranceType::SpecialInterior, RR_KOKIRI_FOREST, RR_KF_LINKS_HOUSE, ENTR_LINKS_HOUSE_1 }, - { EntranceType::SpecialInterior, RR_KF_LINKS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_LINKS_HOUSE } }, - { { EntranceType::SpecialInterior, RR_TOT_ENTRANCE, RR_TEMPLE_OF_TIME, ENTR_TEMPLE_OF_TIME_ENTRANCE }, - { EntranceType::SpecialInterior, RR_TEMPLE_OF_TIME, RR_TOT_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE } }, - { { EntranceType::SpecialInterior, RR_KAKARIKO_VILLAGE, RR_KAK_WINDMILL, ENTR_WINDMILL_AND_DAMPES_GRAVE_WINDMILL }, - { EntranceType::SpecialInterior, RR_KAK_WINDMILL, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_WINDMILL } }, - { { EntranceType::SpecialInterior, RR_KAKARIKO_VILLAGE, RR_KAK_POTION_SHOP_FRONT, ENTR_POTION_SHOP_KAKARIKO_FRONT }, - { EntranceType::SpecialInterior, RR_KAK_POTION_SHOP_FRONT, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_FRONT } }, - { { EntranceType::SpecialInterior, RR_KAK_BACKYARD, RR_KAK_POTION_SHOP_BACK, ENTR_POTION_SHOP_KAKARIKO_BACK }, - { EntranceType::SpecialInterior, RR_KAK_POTION_SHOP_BACK, RR_KAK_BACKYARD, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_BACK } }, - - // Grotto Loads use an entrance index of 0x0700 + their grotto id. The id is used as index for the - // grottoLoadTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c - // Grotto Returns use an entrance index of 0x0800 + their grotto id. The id is used as index for the - // grottoReturnTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c - { { EntranceType::GrottoGrave, RR_DESERT_COLOSSUS, RR_COLOSSUS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET) }, - { EntranceType::GrottoGrave, RR_COLOSSUS_GROTTO, RR_DESERT_COLOSSUS, ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_LAKE_HYLIA, RR_LH_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET) }, - { EntranceType::GrottoGrave, RR_LH_GROTTO, RR_LAKE_HYLIA, ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_ZR_STORMS_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET) }, - { EntranceType::GrottoGrave, RR_ZR_FAIRY_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET) }, - { EntranceType::GrottoGrave, RR_ZR_OPEN_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_DMC_LOWER_NEARBY, RR_DMC_HAMMER_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMC_HAMMER_OFFSET) }, - { EntranceType::GrottoGrave, RR_DMC_HAMMER_GROTTO, RR_DMC_LOWER_LOCAL, ENTRANCE_GROTTO_EXIT(GROTTO_DMC_HAMMER_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_DMC_UPPER_NEARBY, RR_DMC_UPPER_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMC_UPPER_OFFSET) }, - { EntranceType::GrottoGrave, RR_DMC_UPPER_GROTTO, RR_DMC_UPPER_LOCAL, ENTRANCE_GROTTO_EXIT(GROTTO_DMC_UPPER_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_GC_GROTTO_PLATFORM, RR_GC_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GORON_CITY_OFFSET) }, - { EntranceType::GrottoGrave, RR_GC_GROTTO, RR_GC_GROTTO_PLATFORM, ENTRANCE_GROTTO_EXIT(GROTTO_GORON_CITY_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_DEATH_MOUNTAIN_TRAIL, RR_DMT_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMT_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_DMT_STORMS_GROTTO, RR_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROTTO_EXIT(GROTTO_DMT_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMT_COW_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMT_COW_OFFSET) }, - { EntranceType::GrottoGrave, RR_DMT_COW_GROTTO, RR_DEATH_MOUNTAIN_SUMMIT, ENTRANCE_GROTTO_EXIT(GROTTO_DMT_COW_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_KAK_BACKYARD, RR_KAK_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KAK_OPEN_OFFSET) }, - { EntranceType::GrottoGrave, RR_KAK_OPEN_GROTTO, RR_KAK_BACKYARD, ENTRANCE_GROTTO_EXIT(GROTTO_KAK_OPEN_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_KAKARIKO_VILLAGE, RR_KAK_REDEAD_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KAK_REDEAD_OFFSET) }, - { EntranceType::GrottoGrave, RR_KAK_REDEAD_GROTTO, RR_KAKARIKO_VILLAGE, ENTRANCE_GROTTO_EXIT(GROTTO_KAK_REDEAD_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_CASTLE_GROUNDS, RR_HC_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HC_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_HC_STORMS_GROTTO, RR_CASTLE_GROUNDS, ENTRANCE_GROTTO_EXIT(GROTTO_HC_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_TEKTITE_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_TEKTITE_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_NEAR_KAK_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_NEAR_KAK_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_FAIRY_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_NEAR_MARKET_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_NEAR_MARKET_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_COW_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_COW_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_COW_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_COW_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_INSIDE_FENCE_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_INSIDE_FENCE_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_INSIDE_FENCE_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_INSIDE_FENCE_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_OPEN_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_OPEN_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_OPEN_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_SOUTHEAST_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_SOUTHEAST_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_SOUTHEAST_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_SOUTHEAST_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_LON_LON_RANCH, RR_LLR_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET) }, - { EntranceType::GrottoGrave, RR_LLR_GROTTO, RR_LON_LON_RANCH, ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_SFM_ENTRYWAY, RR_SFM_WOLFOS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET) }, - { EntranceType::GrottoGrave, RR_SFM_WOLFOS_GROTTO, RR_SFM_ENTRYWAY, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_SACRED_FOREST_MEADOW, RR_SFM_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_SFM_STORMS_GROTTO, RR_SACRED_FOREST_MEADOW, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_SACRED_FOREST_MEADOW, RR_SFM_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET) }, - { EntranceType::GrottoGrave, RR_SFM_FAIRY_GROTTO, RR_SACRED_FOREST_MEADOW, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_LW_BEYOND_MIDO, RR_LW_SCRUBS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET) }, - { EntranceType::GrottoGrave, RR_LW_SCRUBS_GROTTO, RR_LW_BEYOND_MIDO, ENTRANCE_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_THE_LOST_WOODS, RR_LW_NEAR_SHORTCUTS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET) }, - { EntranceType::GrottoGrave, RR_LW_NEAR_SHORTCUTS_GROTTO, RR_THE_LOST_WOODS, ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_KOKIRI_FOREST, RR_KF_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KF_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_KF_STORMS_GROTTO, RR_KOKIRI_FOREST, ENTRANCE_GROTTO_EXIT(GROTTO_KF_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_ZORAS_DOMAIN_ISLAND, RR_ZD_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_ZD_STORMS_GROTTO, RR_ZORAS_DOMAIN_ISLAND, ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_GERUDO_FORTRESS, RR_GF_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_GF_STORMS_GROTTO, RR_GERUDO_FORTRESS, ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_GV_FORTRESS_SIDE, RR_GV_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_GV_STORMS_GROTTO, RR_GV_FORTRESS_SIDE, ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_GV_GROTTO_LEDGE, RR_GV_OCTOROK_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET) }, - { EntranceType::GrottoGrave, RR_GV_OCTOROK_GROTTO, RR_GV_GROTTO_LEDGE, ENTRANCE_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_LW_BEYOND_MIDO, RR_DEKU_THEATER, ENTRANCE_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET) }, - { EntranceType::GrottoGrave, RR_DEKU_THEATER, RR_LW_BEYOND_MIDO, ENTRANCE_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET) } }, - - // Graves have their own specified entrance indices - { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_SHIELD_GRAVE, ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0 }, - { EntranceType::GrottoGrave, RR_GRAVEYARD_SHIELD_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_SHIELD_GRAVE_EXIT } }, - { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_HEART_PIECE_GRAVE, ENTR_REDEAD_GRAVE_0 }, - { EntranceType::GrottoGrave, RR_GRAVEYARD_HEART_PIECE_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_HEART_PIECE_GRAVE_EXIT } }, - { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_COMPOSERS_GRAVE, ENTR_ROYAL_FAMILYS_TOMB_0 }, - { EntranceType::GrottoGrave, RR_GRAVEYARD_COMPOSERS_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_ROYAL_TOMB_EXIT } }, - { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_DAMPES_GRAVE, ENTR_WINDMILL_AND_DAMPES_GRAVE_GRAVE }, - { EntranceType::GrottoGrave, RR_GRAVEYARD_DAMPES_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_DAMPES_GRAVE_EXIT } }, - - { { EntranceType::Overworld, RR_KOKIRI_FOREST, RR_LW_BRIDGE_FROM_FOREST, ENTR_LOST_WOODS_BRIDGE_EAST_EXIT }, - { EntranceType::Overworld, RR_LW_BRIDGE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_LOWER_EXIT } }, - { { EntranceType::Overworld, RR_KOKIRI_FOREST, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_SOUTH_EXIT }, - { EntranceType::Overworld, RR_LW_FOREST_EXIT, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_UPPER_EXIT } }, - { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_GC_WOODS_WARP, ENTR_GORON_CITY_TUNNEL_SHORTCUT }, - { EntranceType::Overworld, RR_GC_WOODS_WARP, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_TUNNEL_SHORTCUT } }, - { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_ZORAS_RIVER, ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT }, - { EntranceType::Overworld, RR_ZORAS_RIVER, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_UNDERWATER_SHORTCUT } }, - { { EntranceType::Overworld, RR_LW_BEYOND_MIDO, RR_SFM_ENTRYWAY, ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT }, - { EntranceType::Overworld, RR_SFM_ENTRYWAY, RR_LW_BEYOND_MIDO, ENTR_LOST_WOODS_NORTH_EXIT } }, - { { EntranceType::Overworld, RR_LW_BRIDGE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_WOODED_EXIT }, - { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LW_BRIDGE, ENTR_LOST_WOODS_BRIDGE_WEST_EXIT } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_NORTH_EXIT }, - { EntranceType::Overworld, RR_LAKE_HYLIA, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_FENCE_EXIT } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_GERUDO_VALLEY, ENTR_GERUDO_VALLEY_EAST_EXIT }, - { EntranceType::Overworld, RR_GERUDO_VALLEY, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_ROCKY_PATH } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT }, - { EntranceType::Overworld, RR_MARKET_ENTRANCE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_FRONT_GATE }, - { EntranceType::Overworld, RR_KAKARIKO_VILLAGE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_STAIRS_EXIT } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_ZR_FRONT, ENTR_ZORAS_RIVER_WEST_EXIT }, - { EntranceType::Overworld, RR_ZR_FRONT, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_RIVER_EXIT } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_ENTRANCE }, - { EntranceType::Overworld, RR_LON_LON_RANCH, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_CENTER_EXIT } }, - { { EntranceType::Overworld, RR_LAKE_HYLIA, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT }, - { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT } }, - { { EntranceType::Overworld, RR_GV_FORTRESS_SIDE, RR_GERUDO_FORTRESS, ENTR_GERUDOS_FORTRESS_EAST_EXIT }, - { EntranceType::Overworld, RR_GERUDO_FORTRESS, RR_GV_FORTRESS_SIDE, ENTR_GERUDO_VALLEY_WEST_EXIT } }, - { { EntranceType::Overworld, RR_GF_OUTSIDE_GATE, RR_WASTELAND_NEAR_FORTRESS, ENTR_HAUNTED_WASTELAND_EAST_EXIT }, - { EntranceType::Overworld, RR_WASTELAND_NEAR_FORTRESS, RR_GF_OUTSIDE_GATE, ENTR_GERUDOS_FORTRESS_GATE_EXIT } }, - { { EntranceType::Overworld, RR_WASTELAND_NEAR_COLOSSUS, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_EAST_EXIT }, - { EntranceType::Overworld, RR_DESERT_COLOSSUS, RR_WASTELAND_NEAR_COLOSSUS, ENTR_HAUNTED_WASTELAND_WEST_EXIT } }, - { { EntranceType::Overworld, RR_MARKET_ENTRANCE, RR_THE_MARKET, ENTR_MARKET_SOUTH_EXIT }, - { EntranceType::Overworld, RR_THE_MARKET, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_NORTH_EXIT } }, - { { EntranceType::Overworld, RR_THE_MARKET, RR_CASTLE_GROUNDS, ENTR_CASTLE_GROUNDS_SOUTH_EXIT }, - { EntranceType::Overworld, RR_CASTLE_GROUNDS, RR_THE_MARKET, ENTR_MARKET_DAY_CASTLE_EXIT } }, - { { EntranceType::Overworld, RR_THE_MARKET, RR_TOT_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT }, - { EntranceType::Overworld, RR_TOT_ENTRANCE, RR_THE_MARKET, ENTR_MARKET_DAY_TEMPLE_EXIT } }, - { { EntranceType::Overworld, RR_KAKARIKO_VILLAGE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_ENTRANCE }, - { EntranceType::Overworld, RR_THE_GRAVEYARD, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT } }, - { { EntranceType::Overworld, RR_KAK_BEHIND_GATE, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT }, - { EntranceType::Overworld, RR_DEATH_MOUNTAIN_TRAIL, RR_KAK_BEHIND_GATE, ENTR_KAKARIKO_VILLAGE_GUARD_GATE } }, - { { EntranceType::Overworld, RR_DEATH_MOUNTAIN_TRAIL, RR_GORON_CITY, ENTR_GORON_CITY_UPPER_EXIT }, - { EntranceType::Overworld, RR_GORON_CITY, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT } }, - { { EntranceType::Overworld, RR_GC_DARUNIAS_CHAMBER, RR_DMC_LOWER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT }, - { EntranceType::Overworld, RR_DMC_LOWER_NEARBY, RR_GC_DARUNIAS_CHAMBER, ENTR_GORON_CITY_DARUNIA_ROOM_EXIT } }, - { { EntranceType::Overworld, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMC_UPPER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT }, - { EntranceType::Overworld, RR_DMC_UPPER_NEARBY, RR_DEATH_MOUNTAIN_SUMMIT, ENTR_DEATH_MOUNTAIN_TRAIL_SUMMIT_EXIT } }, - { { EntranceType::Overworld, RR_ZR_BEHIND_WATERFALL, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_ENTRANCE }, - { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_ZR_BEHIND_WATERFALL, ENTR_ZORAS_RIVER_WATERFALL_EXIT } }, - { { EntranceType::Overworld, RR_ZD_BEHIND_KING_ZORA, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT }, - { EntranceType::Overworld, RR_ZORAS_FOUNTAIN, RR_ZD_BEHIND_KING_ZORA, ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT } }, - - { { EntranceType::Overworld, RR_GV_LOWER_STREAM, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_RIVER_EXIT }, - NO_RETURN_ENTRANCE }, - - { { EntranceType::OwlDrop, RR_LH_OWL_FLIGHT, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_OWL_DROP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::OwlDrop, RR_DMT_OWL_FLIGHT, RR_KAK_IMPAS_ROOFTOP, ENTR_KAKARIKO_VILLAGE_OWL_DROP }, - NO_RETURN_ENTRANCE }, - - { { EntranceType::Spawn, RR_CHILD_SPAWN, RR_KF_LINKS_HOUSE, ENTR_LINKS_HOUSE_CHILD_SPAWN }, - NO_RETURN_ENTRANCE }, - { { EntranceType::Spawn, RR_ADULT_SPAWN, RR_TEMPLE_OF_TIME, ENTR_HYRULE_FIELD_10 }, - NO_RETURN_ENTRANCE }, // 0x282 is an unused entrance index repurposed to differentiate between - // Adult Spawn and prelude of light (normally they both use 0x5F4) - { { EntranceType::WarpSong, RR_MINUET_OF_FOREST_WARP, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_WARP_PAD }, - NO_RETURN_ENTRANCE }, - { { EntranceType::WarpSong, RR_BOLERO_OF_FIRE_WARP, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD }, - NO_RETURN_ENTRANCE }, - { { EntranceType::WarpSong, RR_SERENADE_OF_WATER_WARP, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_WARP_PAD }, - NO_RETURN_ENTRANCE }, - { { EntranceType::WarpSong, RR_REQUIEM_OF_SPIRIT_WARP, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_WARP_PAD }, - NO_RETURN_ENTRANCE }, - { { EntranceType::WarpSong, RR_NOCTURNE_OF_SHADOW_WARP, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_WARP_PAD }, - NO_RETURN_ENTRANCE }, - { { EntranceType::WarpSong, RR_PRELUDE_OF_LIGHT_WARP, RR_TEMPLE_OF_TIME, ENTR_TEMPLE_OF_TIME_WARP_PAD }, - NO_RETURN_ENTRANCE }, - - { { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ENTRYWAY, RR_DEKU_TREE_BOSS_ROOM, ENTR_DEKU_TREE_BOSS_ENTRANCE }, - { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_ENTRYWAY, ENTR_DEKU_TREE_BOSS_DOOR } }, - { { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, RR_DODONGOS_CAVERN_BOSS_ROOM, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE }, - { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, ENTR_DODONGOS_CAVERN_BOSS_DOOR } }, - { { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, RR_JABU_JABUS_BELLY_BOSS_ROOM, ENTR_JABU_JABU_BOSS_ENTRANCE }, - { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, ENTR_JABU_JABU_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, RR_FOREST_TEMPLE_BOSS_ROOM, ENTR_FOREST_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, ENTR_FOREST_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, RR_FIRE_TEMPLE_BOSS_ROOM, ENTR_FIRE_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ROOM, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, ENTR_FIRE_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ENTRYWAY, RR_WATER_TEMPLE_BOSS_ROOM, ENTR_WATER_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ROOM, RR_WATER_TEMPLE_BOSS_ENTRYWAY, ENTR_WATER_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, RR_SPIRIT_TEMPLE_BOSS_ROOM, ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, ENTR_SPIRIT_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, RR_SHADOW_TEMPLE_BOSS_ROOM, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, ENTR_SHADOW_TEMPLE_BOSS_DOOR } }, - - { { EntranceType::BlueWarp, RR_DEKU_TREE_BOSS_ROOM, RR_KF_OUTSIDE_DEKU_TREE, ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_FOREST_TEMPLE_BOSS_ROOM, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_FIRE_TEMPLE_BOSS_ROOM, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_WATER_TEMPLE_BOSS_ROOM, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - }; - std::map priorityEntranceTable = { { "Bolero", { { RR_DMC_CENTRAL_LOCAL }, { EntranceType::OwlDrop, EntranceType::WarpSong } } }, { "Nocturne", @@ -1174,7 +1180,7 @@ int EntranceShuffler::ShuffleAllEntrances() { }; mEntranceShuffleFailure = false; - SetAllEntrancesData(entranceShuffleTable); + SetAllEntrancesData(); EntrancePools oneWayEntrancePools = {}; EntrancePools entrancePools = {}; @@ -1484,63 +1490,63 @@ int EntranceShuffler::ShuffleAllEntrances() { if (true /* ctx->GetOption(RSK_SHUFFLE_BLUEWARP_ENTRANCES).Is(RO_BLUEWARP_ENTRANCE_SHUFFLE_DUNGEON) */) { // If a boss room is inside a boss door, make the blue warp go outside the dungeon's entrance std::map bossExits = { - { EntranceNameByRegions(RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_ENTRYWAY), - GetEntrance(EntranceNameByRegions(RR_DEKU_TREE_ENTRYWAY, RR_KF_OUTSIDE_DEKU_TREE)) }, - { EntranceNameByRegions(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY), - GetEntrance(EntranceNameByRegions(RR_DODONGOS_CAVERN_ENTRYWAY, RR_DEATH_MOUNTAIN_TRAIL)) }, - { EntranceNameByRegions(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY), - GetEntrance(EntranceNameByRegions(RR_JABU_JABUS_BELLY_ENTRYWAY, RR_ZORAS_FOUNTAIN)) }, + { EntranceNameByRegions(RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_EXIT), + GetEntrance(RR_DEKU_TREE_ENTRYWAY, RR_KF_OUTSIDE_DEKU_TREE) }, + { EntranceNameByRegions(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_EXIT), + GetEntrance(RR_DODONGOS_CAVERN_ENTRYWAY, RR_DEATH_MOUNTAIN_TRAIL) }, + { EntranceNameByRegions(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_EXIT), + GetEntrance(RR_JABU_JABUS_BELLY_ENTRYWAY, RR_ZORAS_FOUNTAIN) }, { EntranceNameByRegions(RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY), - GetEntrance(EntranceNameByRegions(RR_FOREST_TEMPLE_ENTRYWAY, RR_SACRED_FOREST_MEADOW)) }, + GetEntrance(RR_FOREST_TEMPLE_ENTRYWAY, RR_SACRED_FOREST_MEADOW) }, { EntranceNameByRegions(RR_FIRE_TEMPLE_BOSS_ROOM, RR_FIRE_TEMPLE_BOSS_ENTRYWAY), - GetEntrance(EntranceNameByRegions(RR_FIRE_TEMPLE_ENTRYWAY, RR_DMC_CENTRAL_LOCAL)) }, + GetEntrance(RR_FIRE_TEMPLE_ENTRYWAY, RR_DMC_CENTRAL_LOCAL) }, { EntranceNameByRegions(RR_WATER_TEMPLE_BOSS_ROOM, RR_WATER_TEMPLE_BOSS_ENTRYWAY), - GetEntrance(EntranceNameByRegions(RR_WATER_TEMPLE_ENTRYWAY, RR_LAKE_HYLIA)) }, + GetEntrance(RR_WATER_TEMPLE_ENTRYWAY, RR_LH_FROM_WATER_TEMPLE) }, { EntranceNameByRegions(RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY), - GetEntrance(EntranceNameByRegions(RR_SPIRIT_TEMPLE_ENTRYWAY, RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE)) }, + GetEntrance(RR_SPIRIT_TEMPLE_ENTRYWAY, RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE) }, { EntranceNameByRegions(RR_SHADOW_TEMPLE_BOSS_ROOM, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY), - GetEntrance(EntranceNameByRegions(RR_SHADOW_TEMPLE_ENTRYWAY, RR_GRAVEYARD_WARP_PAD_REGION)) }, + GetEntrance(RR_SHADOW_TEMPLE_ENTRYWAY, RR_GRAVEYARD_WARP_PAD_REGION) }, }; // If a boss room is inside a dungeon entrance (or inside a dungeon which is inside a dungeon entrance), make // the blue warp go to that dungeon's blue warp target std::map dungeonExits = { { EntranceNameByRegions(RR_DEKU_TREE_ENTRYWAY, RR_KF_OUTSIDE_DEKU_TREE), - GetEntrance(EntranceNameByRegions(RR_DEKU_TREE_BOSS_ROOM, RR_KF_OUTSIDE_DEKU_TREE)) }, + GetEntrance(RR_DEKU_TREE_BOSS_ROOM, RR_KF_OUTSIDE_DEKU_TREE) }, { EntranceNameByRegions(RR_DODONGOS_CAVERN_ENTRYWAY, RR_DEATH_MOUNTAIN_TRAIL), - GetEntrance(EntranceNameByRegions(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DEATH_MOUNTAIN_TRAIL)) }, + GetEntrance(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DEATH_MOUNTAIN_TRAIL) }, { EntranceNameByRegions(RR_JABU_JABUS_BELLY_ENTRYWAY, RR_ZORAS_FOUNTAIN), - GetEntrance(EntranceNameByRegions(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_ZORAS_FOUNTAIN)) }, + GetEntrance(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_ZORAS_FOUNTAIN) }, { EntranceNameByRegions(RR_FOREST_TEMPLE_ENTRYWAY, RR_SACRED_FOREST_MEADOW), - GetEntrance(EntranceNameByRegions(RR_FOREST_TEMPLE_BOSS_ROOM, RR_SACRED_FOREST_MEADOW)) }, + GetEntrance(RR_FOREST_TEMPLE_BOSS_ROOM, RR_SACRED_FOREST_MEADOW) }, { EntranceNameByRegions(RR_FIRE_TEMPLE_ENTRYWAY, RR_DMC_CENTRAL_LOCAL), - GetEntrance(EntranceNameByRegions(RR_FIRE_TEMPLE_BOSS_ROOM, RR_DMC_CENTRAL_LOCAL)) }, - { EntranceNameByRegions(RR_WATER_TEMPLE_ENTRYWAY, RR_LAKE_HYLIA), - GetEntrance(EntranceNameByRegions(RR_WATER_TEMPLE_BOSS_ROOM, RR_LAKE_HYLIA)) }, + GetEntrance(RR_FIRE_TEMPLE_BOSS_ROOM, RR_DMC_CENTRAL_LOCAL) }, + { EntranceNameByRegions(RR_WATER_TEMPLE_ENTRYWAY, RR_LH_FROM_WATER_TEMPLE), + GetEntrance(RR_WATER_TEMPLE_BOSS_ROOM, RR_LAKE_HYLIA) }, { EntranceNameByRegions(RR_SPIRIT_TEMPLE_ENTRYWAY, RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE), - GetEntrance(EntranceNameByRegions(RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_DESERT_COLOSSUS)) }, + GetEntrance(RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_DESERT_COLOSSUS) }, { EntranceNameByRegions(RR_SHADOW_TEMPLE_ENTRYWAY, RR_GRAVEYARD_WARP_PAD_REGION), - GetEntrance(EntranceNameByRegions(RR_SHADOW_TEMPLE_BOSS_ROOM, RR_GRAVEYARD_WARP_PAD_REGION)) }, + GetEntrance(RR_SHADOW_TEMPLE_BOSS_ROOM, RR_GRAVEYARD_WARP_PAD_REGION) }, }; // Pair std::vector bossRoomExitPairs = { - { GetEntrance(EntranceNameByRegions(RR_DEKU_TREE_BOSS_ROOM, RR_KF_OUTSIDE_DEKU_TREE)), - GetEntrance(EntranceNameByRegions(RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_ENTRYWAY)) }, - { GetEntrance(EntranceNameByRegions(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DEATH_MOUNTAIN_TRAIL)), - GetEntrance(EntranceNameByRegions(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY)) }, - { GetEntrance(EntranceNameByRegions(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_ZORAS_FOUNTAIN)), - GetEntrance(EntranceNameByRegions(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY)) }, - { GetEntrance(EntranceNameByRegions(RR_FOREST_TEMPLE_BOSS_ROOM, RR_SACRED_FOREST_MEADOW)), - GetEntrance(EntranceNameByRegions(RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY)) }, - { GetEntrance(EntranceNameByRegions(RR_FIRE_TEMPLE_BOSS_ROOM, RR_DMC_CENTRAL_LOCAL)), - GetEntrance(EntranceNameByRegions(RR_FIRE_TEMPLE_BOSS_ROOM, RR_FIRE_TEMPLE_BOSS_ENTRYWAY)) }, - { GetEntrance(EntranceNameByRegions(RR_WATER_TEMPLE_BOSS_ROOM, RR_LAKE_HYLIA)), - GetEntrance(EntranceNameByRegions(RR_WATER_TEMPLE_BOSS_ROOM, RR_WATER_TEMPLE_BOSS_ENTRYWAY)) }, - { GetEntrance(EntranceNameByRegions(RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_DESERT_COLOSSUS)), - GetEntrance(EntranceNameByRegions(RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY)) }, - { GetEntrance(EntranceNameByRegions(RR_SHADOW_TEMPLE_BOSS_ROOM, RR_GRAVEYARD_WARP_PAD_REGION)), - GetEntrance(EntranceNameByRegions(RR_SHADOW_TEMPLE_BOSS_ROOM, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY)) }, + { GetEntrance(RR_DEKU_TREE_BOSS_ROOM, RR_KF_OUTSIDE_DEKU_TREE), + GetEntrance(RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_EXIT) }, + { GetEntrance(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DEATH_MOUNTAIN_TRAIL), + GetEntrance(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_EXIT) }, + { GetEntrance(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_ZORAS_FOUNTAIN), + GetEntrance(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_EXIT) }, + { GetEntrance(RR_FOREST_TEMPLE_BOSS_ROOM, RR_SACRED_FOREST_MEADOW), + GetEntrance(RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY) }, + { GetEntrance(RR_FIRE_TEMPLE_BOSS_ROOM, RR_DMC_CENTRAL_LOCAL), + GetEntrance(RR_FIRE_TEMPLE_BOSS_ROOM, RR_FIRE_TEMPLE_BOSS_ENTRYWAY) }, + { GetEntrance(RR_WATER_TEMPLE_BOSS_ROOM, RR_LAKE_HYLIA), + GetEntrance(RR_WATER_TEMPLE_BOSS_ROOM, RR_WATER_TEMPLE_BOSS_ENTRYWAY) }, + { GetEntrance(RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_DESERT_COLOSSUS), + GetEntrance(RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY) }, + { GetEntrance(RR_SHADOW_TEMPLE_BOSS_ROOM, RR_GRAVEYARD_WARP_PAD_REGION), + GetEntrance(RR_SHADOW_TEMPLE_BOSS_ROOM, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY) }, }; for (EntrancePair pair : bossRoomExitPairs) { @@ -1572,7 +1578,7 @@ int EntranceShuffler::ShuffleAllEntrances() { void EntranceShuffler::CreateEntranceOverrides() { auto ctx = Rando::Context::GetInstance(); - entranceOverrides.fill({0, 0, 0, 0, 0}); + entranceOverrides.fill({ 0, 0, 0, 0, 0 }); if (mNoRandomEntrances) { return; } @@ -1641,7 +1647,7 @@ void EntranceShuffler::ParseJson(nlohmann::json spoilerFileJson) { try { nlohmann::json entrancesJson = spoilerFileJson["entrances"]; size_t i = 0; - for (auto it = entrancesJson.begin(); it != entrancesJson.end(); ++it, i++) { + for (auto it = entrancesJson.begin(); it != entrancesJson.end() && i < entranceOverrides.size(); ++it, i++) { nlohmann::json entranceJson = *it; for (auto entranceIt = entranceJson.begin(); entranceIt != entranceJson.end(); ++entranceIt) { if (entranceIt.key() == "type") { @@ -1658,6 +1664,30 @@ void EntranceShuffler::ParseJson(nlohmann::json spoilerFileJson) { } } } catch (const std::exception& e) { throw e; } + // We may need to reset more things here or elsewhere in spoiler loading + RegionTable_Init(); + ApplyEntranceOverrides(); + SetAreas(); +} + +void EntranceShuffler::ApplyEntranceOverrides() { + SetAllEntrancesData(); + + for (size_t i = 0; i < entranceOverrides.size(); i++) { + EntranceOverride entranceOverride = entranceOverrides[i]; + + if (entranceOverride.index == 0 && entranceOverride.destination == 0 && entranceOverride.override == 0 && + entranceOverride.overrideDestination == 0) { + continue; + } + + Entrance* entrance = entranceMap[entranceOverride.index]; + Entrance* overrideEntrance = entranceMap[entranceOverride.override]; + + entrance->Disconnect(); + entrance->Connect(overrideEntrance->GetOriginalConnectedRegionKey()); + entrance->SetAsShuffled(); + } } } // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/entrance.h b/soh/soh/Enhancements/randomizer/entrance.h index 48a80c5502..5b14611fe8 100644 --- a/soh/soh/Enhancements/randomizer/entrance.h +++ b/soh/soh/Enhancements/randomizer/entrance.h @@ -90,14 +90,14 @@ class Entrance { Entrance* reverse = nullptr; Entrance* assumed = nullptr; Entrance* replacement = nullptr; - int16_t index = 0xFFFF; + int16_t index = -1; bool shuffled = false; bool primary = false; bool addedToPool = false; bool decoupled = false; std::string name = ""; - //If this is false, areas only spread to interiors through this entrance if there is no other choice - //Set to false for owl drops, the windmill path between dampe's grave and windmill and blue warps + // If this is false, areas only spread to interiors through this entrance if there is no other choice + // Set to false for owl drops, the windmill path between dampe's grave and windmill and blue warps bool spreadsAreasWithPriority = true; }; @@ -128,6 +128,8 @@ class EntranceShuffler { void CreateEntranceOverrides(); void UnshuffleAllEntrances(); void ParseJson(nlohmann::json spoilerFileJson); + void ApplyEntranceOverrides(); + private: std::vector AssumeEntrancePool(std::vector& entrancePool); bool ShuffleOneWayPriorityEntrances(std::map& oneWayPriorities, @@ -150,7 +152,7 @@ class EntranceShuffler { extern "C" { #endif - EntranceOverride* Randomizer_GetEntranceOverrides(); +EntranceOverride* Randomizer_GetEntranceOverrides(); #ifdef __cplusplus } #endif diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp index 9da52ddc21..e347991561 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.cpp +++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp @@ -15,24 +15,20 @@ extern SaveContext gSaveContext; extern PlayState* gPlayState; } -#define FSi OTRGlobals::Instance->gRandoContext->GetFishsanity() - -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() - /** * @brief Parallel list of pond fish checks for both ages -*/ + */ std::array, 17> Rando::StaticData::randomizerFishingPondFish = { { /* Child Check Adult Check */ - { RC_LH_CHILD_FISH_1, RC_LH_ADULT_FISH_1 }, - { RC_LH_CHILD_FISH_2, RC_LH_ADULT_FISH_2 }, - { RC_LH_CHILD_FISH_3, RC_LH_ADULT_FISH_3 }, - { RC_LH_CHILD_FISH_4, RC_LH_ADULT_FISH_4 }, - { RC_LH_CHILD_FISH_5, RC_LH_ADULT_FISH_5 }, - { RC_LH_CHILD_FISH_6, RC_LH_ADULT_FISH_6 }, - { RC_LH_CHILD_FISH_7, RC_LH_ADULT_FISH_7 }, - { RC_LH_CHILD_FISH_8, RC_LH_ADULT_FISH_8 }, - { RC_LH_CHILD_FISH_9, RC_LH_ADULT_FISH_9 }, + { RC_LH_CHILD_FISH_1, RC_LH_ADULT_FISH_1 }, + { RC_LH_CHILD_FISH_2, RC_LH_ADULT_FISH_2 }, + { RC_LH_CHILD_FISH_3, RC_LH_ADULT_FISH_3 }, + { RC_LH_CHILD_FISH_4, RC_LH_ADULT_FISH_4 }, + { RC_LH_CHILD_FISH_5, RC_LH_ADULT_FISH_5 }, + { RC_LH_CHILD_FISH_6, RC_LH_ADULT_FISH_6 }, + { RC_LH_CHILD_FISH_7, RC_LH_ADULT_FISH_7 }, + { RC_LH_CHILD_FISH_8, RC_LH_ADULT_FISH_8 }, + { RC_LH_CHILD_FISH_9, RC_LH_ADULT_FISH_9 }, { RC_LH_CHILD_FISH_10, RC_LH_ADULT_FISH_10 }, { RC_LH_CHILD_FISH_11, RC_LH_ADULT_FISH_11 }, { RC_LH_CHILD_FISH_12, RC_LH_ADULT_FISH_12 }, @@ -53,282 +49,288 @@ std::unordered_map Rando::StaticData::randomizerGrottoF ActorFunc drawFishing = NULL; ActorFunc drawEnFish = NULL; -Color_RGBA16 fsPulseColor = { 30, 240, 200 }; +Color_RGB8 fsPulseColor = { 30, 240, 200 }; namespace Rando { - const FishIdentity Fishsanity::defaultIdentity = { RAND_INF_MAX, RC_UNKNOWN_CHECK }; - bool Fishsanity::fishsanityHelpersInit = false; - s16 Fishsanity::fishGroupCounter = 0; - bool Fishsanity::enableAdvance = false; - std::unordered_map Fishsanity::pondFishAgeMap; - std::vector Fishsanity::childPondFish; - std::vector Fishsanity::adultPondFish; +const FishIdentity Fishsanity::defaultIdentity = { RAND_INF_MAX, RC_UNKNOWN_CHECK }; +bool Fishsanity::fishsanityHelpersInit = false; +s16 Fishsanity::fishGroupCounter = 0; +bool Fishsanity::enableAdvance = false; +std::unordered_map Fishsanity::pondFishAgeMap; +std::vector Fishsanity::childPondFish; +std::vector Fishsanity::adultPondFish; - Fishsanity::Fishsanity() { - InitializeHelpers(); - } +Fishsanity::Fishsanity() { + InitializeHelpers(); +} - Fishsanity::~Fishsanity() { - - } +Fishsanity::~Fishsanity() { +} - bool Fishsanity::GetFishLocationIncluded(Rando::Location* loc, - FishsanityOptionsSource optionsSource) { - auto [mode, numFish, ageSplit] = GetOptions(optionsSource); +bool Fishsanity::GetFishLocationIncluded(Rando::Location* loc, FishsanityOptionsSource optionsSource) { + auto [mode, numFish, ageSplit] = GetOptions(optionsSource); - if (loc->GetRCType() != RCTYPE_FISH || mode == RO_FISHSANITY_OFF) { - return false; - } - RandomizerCheck rc = loc->GetRandomizerCheck(); - // Are pond fish enabled, and is this a pond fish location? - if (mode != RO_FISHSANITY_OVERWORLD && numFish > 0 && loc->GetScene() == SCENE_FISHING_POND && - loc->GetActorID() == ACTOR_FISHING) { - // Is this a child fish location? If so, is it within the defined number of pond fish checks? - if (rc >= RC_LH_CHILD_FISH_1 && rc <= RC_LH_CHILD_LOACH_2 && numFish > (loc->GetActorParams() - 100)) { - return true; - } - // Are adult fish available, and is this an adult fish location? If so, is it within the defined number of pond - // fish checks? - if (ageSplit && rc >= RC_LH_ADULT_FISH_1 && rc <= RC_LH_ADULT_LOACH && numFish > (loc->GetActorParams() - 100)) { - return true; - } - } - // Are overworld fish enabled, and is this an overworld fish location? - if (mode != RO_FISHSANITY_POND && (loc->GetScene() == SCENE_GROTTOS || loc->GetScene() == SCENE_ZORAS_DOMAIN) - && loc->GetActorID() == ACTOR_EN_FISH && (loc->GetActorParams() >> 8)) { - return true; - } - // Must not be an included fish location! + if (loc->GetRCType() != RCTYPE_FISH || mode == RO_FISHSANITY_OFF || mode == RO_FISHSANITY_HYRULE_LOACH) { return false; } - - std::pair, std::vector> - Fishsanity::GetFishingPondLocations(FishsanityOptionsSource optionsSource) { - auto [mode, numFish, ageSplit] = GetOptions(optionsSource); - std::vector activeFish; - std::vector remainingFish; - std::vector pondFish = Rando::StaticData::GetPondFishLocations(); - - // Fishsanity_InitializeHelpers(); - remainingFish.insert(remainingFish.end(), pondFish.begin(), pondFish.end()); - - // No pond fish shuffled - if (numFish == 0) { - return std::make_pair(activeFish, remainingFish); + RandomizerCheck rc = loc->GetRandomizerCheck(); + // Are pond fish enabled, and is this a pond fish location? + if (mode != RO_FISHSANITY_OVERWORLD && numFish > 0 && loc->GetScene() == SCENE_FISHING_POND && + loc->GetActorID() == ACTOR_FISHING) { + // Is this a child fish location? If so, is it within the defined number of pond fish checks? + if (rc >= RC_LH_CHILD_FISH_1 && rc <= RC_LH_CHILD_LOACH_2 && numFish > (loc->GetActorParams() - 100)) { + return true; } - // Every pond fish is shuffled, so we can save some time - if (numFish > 16) { - // Child and adult pond fish are both shuffled, set activeFish to remainingFish and return an empty vector for - // inactive fish. - if (ageSplit) { - return std::make_pair(remainingFish, activeFish); - } - // Activate all child fish only - activeFish = FilterAndEraseFromPool( - remainingFish, [](const RandomizerCheck loc) { return pondFishAgeMap[loc] == LINK_AGE_CHILD; }); - return std::make_pair(activeFish, remainingFish); + // Are adult fish available, and is this an adult fish location? If so, is it within the defined number of pond + // fish checks? + if (ageSplit && rc >= RC_LH_ADULT_FISH_1 && rc <= RC_LH_ADULT_LOACH && + numFish > (loc->GetActorParams() - 100)) { + return true; } - // Only some pond fish are shuffled, so we have to only activate the requested number. - activeFish.insert(activeFish.end(), childPondFish.begin(), childPondFish.begin() + numFish); - // If pond is split, also add the requested number of adult fish. + } + // Are overworld fish enabled, and is this an overworld fish location? + if (mode != RO_FISHSANITY_POND && (loc->GetScene() == SCENE_GROTTOS || loc->GetScene() == SCENE_ZORAS_DOMAIN) && + loc->GetActorID() == ACTOR_EN_FISH && (loc->GetActorParams() >> 8)) { + return true; + } + // Must not be an included fish location! + return false; +} + +std::pair, std::vector> +Fishsanity::GetFishingPondLocations(FishsanityOptionsSource optionsSource) { + auto [mode, numFish, ageSplit] = GetOptions(optionsSource); + std::vector activeFish; + std::vector remainingFish; + std::vector pondFish = Rando::StaticData::GetPondFishLocations(); + + // Fishsanity_InitializeHelpers(); + remainingFish.insert(remainingFish.end(), pondFish.begin(), pondFish.end()); + + // No pond fish shuffled + if (numFish == 0) { + return std::make_pair(activeFish, remainingFish); + } + // Every pond fish is shuffled, so we can save some time + if (numFish > 16) { + // Child and adult pond fish are both shuffled, set activeFish to remainingFish and return an empty vector for + // inactive fish. if (ageSplit) { - activeFish.insert(activeFish.end(), adultPondFish.begin(), - adultPondFish.begin() + std::min(numFish, 16)); + return std::make_pair(remainingFish, activeFish); } - // NOTE: This only works because we can assume activeFish is already sorted; changes that break this assumption will - // also break this - FilterAndEraseFromPool(remainingFish, - [&](uint32_t loc) { return std::binary_search(activeFish.begin(), activeFish.end(), loc); }); - + // Activate all child fish only + activeFish = FilterAndEraseFromPool( + remainingFish, [](const RandomizerCheck loc) { return pondFishAgeMap[loc] == LINK_AGE_CHILD; }); return std::make_pair(activeFish, remainingFish); } + // Only some pond fish are shuffled, so we have to only activate the requested number. + activeFish.insert(activeFish.end(), childPondFish.begin(), childPondFish.begin() + numFish); + // If pond is split, also add the requested number of adult fish. + if (ageSplit) { + activeFish.insert(activeFish.end(), adultPondFish.begin(), + adultPondFish.begin() + std::min(numFish, 16)); + } + // NOTE: This only works because we can assume activeFish is already sorted; changes that break this assumption will + // also break this + FilterAndEraseFromPool(remainingFish, [&](RandomizerCheck loc) { + return std::binary_search(activeFish.begin(), activeFish.end(), loc); + }); - std::pair, std::vector> - Fishsanity::GetFishsanityLocations(FishsanityOptionsSource optionsSource) { - auto [mode, numFish, ageSplit] = GetOptions(optionsSource); - std::vector activeFish; - std::vector remainingFish; + return std::make_pair(activeFish, remainingFish); +} - // Add pond fish - if (mode == RO_FISHSANITY_POND || mode == RO_FISHSANITY_BOTH) { - auto pondLocations = GetFishingPondLocations(optionsSource); - activeFish.insert(activeFish.end(), pondLocations.first.begin(), pondLocations.first.end()); - remainingFish.insert(remainingFish.end(), pondLocations.second.begin(), pondLocations.second.end()); - } +std::pair, std::vector> +Fishsanity::GetFishsanityLocations(FishsanityOptionsSource optionsSource) { + auto [mode, numFish, ageSplit] = GetOptions(optionsSource); + std::vector activeFish; + std::vector remainingFish; - // Add overworld fish - if (mode == RO_FISHSANITY_OVERWORLD || mode == RO_FISHSANITY_BOTH) { - std::vector overworldFish = Rando::StaticData::GetOverworldFishLocations(); - activeFish.insert(activeFish.end(), overworldFish.begin(), overworldFish.end()); - } - - return std::make_pair(activeFish, remainingFish); + // Add pond fish + if (mode == RO_FISHSANITY_POND || mode == RO_FISHSANITY_BOTH) { + auto pondLocations = GetFishingPondLocations(optionsSource); + activeFish.insert(activeFish.end(), pondLocations.first.begin(), pondLocations.first.end()); + remainingFish.insert(remainingFish.end(), pondLocations.second.begin(), pondLocations.second.end()); } - FishIdentity Fishsanity::IdentifyPondFish(u8 fishParams) { - auto [mode, pondCount, ageSplit] = GetOptions(); - FishIdentity identity = defaultIdentity; + // Add overworld fish + if (mode == RO_FISHSANITY_OVERWORLD || mode == RO_FISHSANITY_BOTH) { + std::vector overworldFish = Rando::StaticData::GetOverworldFishLocations(); + activeFish.insert(activeFish.end(), overworldFish.begin(), overworldFish.end()); + } - if (!GetPondFishShuffled()) { - return identity; - } + return std::make_pair(activeFish, remainingFish); +} - if (pondCount > 16) { - identity = GetPondFish(fishParams, IsAdultPond()); - } else { - identity = LINK_IS_ADULT ? mCurrPondFish.second : mCurrPondFish.first; - } +FishIdentity Fishsanity::IdentifyPondFish(u8 fishParams) { + auto [mode, pondCount, ageSplit] = GetOptions(); + FishIdentity identity = defaultIdentity; + if (!GetPondFishShuffled()) { return identity; } - FishsanityPondOptions Fishsanity::GetOptions(FishsanityOptionsSource optionsSource) { - FishsanityPondOptions options{}; - switch (optionsSource) { - // Used in check tracker - case FSO_SOURCE_CVARS: - options.mode = CVarGetInteger(CVAR_RANDOMIZER_SETTING("Fishsanity"), RO_FISHSANITY_OFF); - options.numFish = CVarGetInteger(CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), 0); - options.ageSplit = CVarGetInteger(CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), 0) == 1; - break; - case FSO_SOURCE_RANDO: - default: - options.mode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); - options.numFish = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_POND_COUNT); - options.ageSplit = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_AGE_SPLIT); - break; - } - return options; + if (pondCount > 16) { + identity = GetPondFish(fishParams, IsAdultPond()); + } else { + identity = LINK_IS_ADULT ? mCurrPondFish.second : mCurrPondFish.first; } - void Fishsanity::UpdateCurrentPondFish() { - auto [mode, pondCount, ageSplit] = GetOptions(); - mCurrPondFish = std::pair(); - mCurrPondFish.first = defaultIdentity; - mCurrPondFish.second = defaultIdentity; + return identity; +} - // Initialize mCurrPondFish if we're shuffling pond fish, but if all fish are shuffled, we don't need to use this. - if ((mode == RO_FISHSANITY_BOTH || mode == RO_FISHSANITY_POND) && pondCount < 17) { - // find the first inf that isn't set yet for each age - // but don't go past the max number - std::pair tableEntry; - for (s16 i = 0, params = 100; i < pondCount; i++, params++) { - tableEntry = Rando::StaticData::randomizerFishingPondFish[i]; - if (!Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(tableEntry.first)) || i == pondCount - 1) { - // Found first child check - if (!IsFish(&mCurrPondFish.first)) { - mCurrPondFish.first = GetPondFish(params, false); - } +FishsanityPondOptions Fishsanity::GetOptions(FishsanityOptionsSource optionsSource) { + FishsanityPondOptions options{}; + switch (optionsSource) { + // Used in check tracker + case FSO_SOURCE_CVARS: + options.mode = CVarGetInteger(CVAR_RANDOMIZER_SETTING("Fishsanity"), RO_FISHSANITY_OFF); + options.numFish = CVarGetInteger(CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), 0); + options.ageSplit = CVarGetInteger(CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), 0) == 1; + break; + case FSO_SOURCE_RANDO: + default: + options.mode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); + options.numFish = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_POND_COUNT); + options.ageSplit = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_AGE_SPLIT); + break; + } + return options; +} - if (!ageSplit && !IsFish(&mCurrPondFish.second)) { - mCurrPondFish.second = GetPondFish(params, false); - // both ages are resolved! we can quit here - break; - } +void Fishsanity::UpdateCurrentPondFish() { + auto [mode, pondCount, ageSplit] = GetOptions(); + mCurrPondFish = std::pair(); + mCurrPondFish.first = defaultIdentity; + mCurrPondFish.second = defaultIdentity; + + // Initialize mCurrPondFish if we're shuffling pond fish, but if all fish are shuffled, we don't need to use this. + if ((mode == RO_FISHSANITY_BOTH || mode == RO_FISHSANITY_POND) && pondCount < 17) { + // find the first inf that isn't set yet for each age + // but don't go past the max number + std::pair tableEntry; + for (s16 i = 0, params = 100; i < pondCount; i++, params++) { + tableEntry = Rando::StaticData::randomizerFishingPondFish[i]; + if (!Flags_GetRandomizerInf( + OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(tableEntry.first)) || + i == pondCount - 1) { + // Found first child check + if (!IsFish(&mCurrPondFish.first)) { + mCurrPondFish.first = GetPondFish(params, false); } - if (ageSplit && !IsFish(&mCurrPondFish.second) && tableEntry.second != RC_UNKNOWN_CHECK && - (!Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(tableEntry.second)) || i == pondCount - 1)) { - mCurrPondFish.second = GetPondFish(params, true); + if (!ageSplit && !IsFish(&mCurrPondFish.second)) { + mCurrPondFish.second = GetPondFish(params, false); + // both ages are resolved! we can quit here + break; } } + + if (ageSplit && !IsFish(&mCurrPondFish.second) && tableEntry.second != RC_UNKNOWN_CHECK && + (!Flags_GetRandomizerInf( + OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(tableEntry.second)) || + i == pondCount - 1)) { + mCurrPondFish.second = GetPondFish(params, true); + } } } +} - void Fishsanity::InitializeFromSave() { - UpdateCurrentPondFish(); - } +void Fishsanity::InitializeFromSave() { + UpdateCurrentPondFish(); +} - bool Fishsanity::GetPondFishShuffled() { - u8 fsMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); - return OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_POND_COUNT) > 0 && - (fsMode == RO_FISHSANITY_POND || fsMode == RO_FISHSANITY_BOTH); - } +bool Fishsanity::GetPondFishShuffled() { + u8 fsMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); + return OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_POND_COUNT) > 0 && + (fsMode == RO_FISHSANITY_POND || fsMode == RO_FISHSANITY_BOTH); +} - bool Fishsanity::GetOverworldFishShuffled() { - u8 fsMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); - return fsMode == RO_FISHSANITY_OVERWORLD || fsMode == RO_FISHSANITY_BOTH; - } +bool Fishsanity::GetOverworldFishShuffled() { + u8 fsMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); + return fsMode == RO_FISHSANITY_OVERWORLD || fsMode == RO_FISHSANITY_BOTH; +} - bool Fishsanity::IsAdultPond() { - return LINK_IS_ADULT && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_AGE_SPLIT); - } +bool Fishsanity::IsAdultPond() { + return LINK_IS_ADULT && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_AGE_SPLIT); +} - bool Fishsanity::GetPondCleared() { - auto [mode, pondCount, ageSplit] = GetOptions(); - // no fish shuffled, so pond is always cleared :thumbsup: - if (pondCount == 0) { - return true; - } - - bool adultPond = LINK_IS_ADULT && ageSplit; - // if we've collected the final shuffled fish, pond is complete - if (pondCount <= 16) { - auto tableEntry = Rando::StaticData::randomizerFishingPondFish[pondCount - 1]; - return Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(adultPond ? tableEntry.second : tableEntry.first)); - } - - // the last two checks actually don't matter because logically they will never be true, but maybe one day they will - // if every fish is shuffled, check if we've collected every fish - for (auto tableEntry : Rando::StaticData::randomizerFishingPondFish) { - RandomizerCheck rc = adultPond ? tableEntry.second : tableEntry.first; - // if we haven't collected this fish, then we're not done yet! get back in there, soldier - if (rc != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(rc))) { - return false; - } - } +bool Fishsanity::GetPondCleared() { + auto [mode, pondCount, ageSplit] = GetOptions(); + // no fish shuffled, so pond is always cleared :thumbsup: + if (pondCount == 0) { return true; } - bool Fishsanity::GetDomainCleared() { - for (RandomizerInf i = RAND_INF_ZD_FISH_1; i <= RAND_INF_ZD_FISH_5; i = (RandomizerInf)(i + 1)) { - if (!Flags_GetRandomizerInf(i)) { - return false; - } - } - return true; + bool adultPond = LINK_IS_ADULT && ageSplit; + // if we've collected the final shuffled fish, pond is complete + if (pondCount <= 16) { + auto tableEntry = Rando::StaticData::randomizerFishingPondFish[pondCount - 1]; + return Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck( + adultPond ? tableEntry.second : tableEntry.first)); } - void Fishsanity::InitializeHelpers() { - if (fishsanityHelpersInit) { - return; - } - - for (auto pair : Rando::StaticData::randomizerFishingPondFish) { - pondFishAgeMap[pair.first] = LINK_AGE_CHILD; - pondFishAgeMap[pair.second] = LINK_AGE_ADULT; - childPondFish.push_back(pair.first); - adultPondFish.push_back(pair.second); + // the last two checks actually don't matter because logically they will never be true, but maybe one day they will + // if every fish is shuffled, check if we've collected every fish + for (auto tableEntry : Rando::StaticData::randomizerFishingPondFish) { + RandomizerCheck rc = adultPond ? tableEntry.second : tableEntry.first; + // if we haven't collected this fish, then we're not done yet! get back in there, soldier + if (rc != RC_UNKNOWN_CHECK && + !Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(rc))) { + return false; } } + return true; +} - FishIdentity Fishsanity::GetPondFish(s16 params, bool adultPond) { - auto pair = Rando::StaticData::randomizerFishingPondFish[params - 100]; - RandomizerCheck rc = adultPond ? pair.second : pair.first; - return { OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(rc), rc }; +bool Fishsanity::GetDomainCleared() { + for (RandomizerInf i = RAND_INF_ZD_FISH_1; i <= RAND_INF_ZD_FISH_5; i = (RandomizerInf)(i + 1)) { + if (!Flags_GetRandomizerInf(i)) { + return false; + } + } + return true; +} + +void Fishsanity::InitializeHelpers() { + if (fishsanityHelpersInit) { + return; } - FishIdentity Fishsanity::AdvancePond() { - auto [mode, pondCount, ageSplit] = GetOptions(); + for (auto pair : Rando::StaticData::randomizerFishingPondFish) { + pondFishAgeMap[pair.first] = LINK_AGE_CHILD; + pondFishAgeMap[pair.second] = LINK_AGE_ADULT; + childPondFish.push_back(pair.first); + adultPondFish.push_back(pair.second); + } +} - // No need to update state with full pond shuffle - if (pondCount > 16) { - return defaultIdentity; - } +FishIdentity Fishsanity::GetPondFish(s16 params, bool adultPond) { + auto pair = Rando::StaticData::randomizerFishingPondFish[params - 100]; + RandomizerCheck rc = adultPond ? pair.second : pair.first; + return { OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(rc), rc }; +} - UpdateCurrentPondFish(); +FishIdentity Fishsanity::AdvancePond() { + auto [mode, pondCount, ageSplit] = GetOptions(); - return IsAdultPond() ? mCurrPondFish.second : mCurrPondFish.first; + // No need to update state with full pond shuffle + if (pondCount > 16) { + return defaultIdentity; } - FishsanityCheckType Fishsanity::GetCheckType(RandomizerCheck rc) { - // if it's not RCTYPE_FISH, obviously it's not a fish - if (Rando::StaticData::GetLocation(rc)->GetRCType() != RCTYPE_FISH) { - return FSC_NONE; - } + UpdateCurrentPondFish(); - auto loc = Rando::StaticData::GetLocation(rc); - switch (loc->GetScene()) { + return IsAdultPond() ? mCurrPondFish.second : mCurrPondFish.first; +} + +FishsanityCheckType Fishsanity::GetCheckType(RandomizerCheck rc) { + // if it's not RCTYPE_FISH, obviously it's not a fish + if (Rando::StaticData::GetLocation(rc)->GetRCType() != RCTYPE_FISH) { + return FSC_NONE; + } + + auto loc = Rando::StaticData::GetLocation(rc); + switch (loc->GetScene()) { case SCENE_FISHING_POND: return FSC_POND; case SCENE_ZORAS_DOMAIN: @@ -337,249 +339,248 @@ namespace Rando { return FSC_GROTTO; default: return FSC_NONE; - } + } +} + +bool Fishsanity::IsFish(FishIdentity* fish) { + if (fish->randomizerCheck == RC_UNKNOWN_CHECK || fish->randomizerInf == RAND_INF_MAX) { + return false; } - bool Fishsanity::IsFish(FishIdentity* fish) { - if (fish->randomizerCheck == RC_UNKNOWN_CHECK || fish->randomizerInf == RAND_INF_MAX) { - return false; + return GetCheckType(fish->randomizerCheck) != FSC_NONE; +} + +void Fishsanity::OnActorInitHandler(void* refActor) { + Actor* actor = static_cast(refActor); + + auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); + FishIdentity fish; + + if (actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { + // Set fish ID for ZD fish + if (gPlayState->sceneNum == SCENE_ZORAS_DOMAIN && actor->params == -1) { + actor->params ^= fishGroupCounter++; + } else if (gPlayState->sceneNum == SCENE_GROTTOS && actor->params == 1) { + actor->params = 0x100 | gSaveContext.respawn[RESPAWN_MODE_RETURN].data; } - return GetCheckType(fish->randomizerCheck) != FSC_NONE; - } - - void Fishsanity::OnActorInitHandler(void* refActor) { - Actor* actor = static_cast(refActor); - - auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); - FishIdentity fish; - - if (actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { - // Set fish ID for ZD fish - if (gPlayState->sceneNum == SCENE_ZORAS_DOMAIN && actor->params == -1) { - actor->params ^= fishGroupCounter++; - } else if (gPlayState->sceneNum == SCENE_GROTTOS && actor->params == 1) { - actor->params = 0x100 | gSaveContext.respawn[RESPAWN_MODE_RETURN].data; + fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); + // Render fish as randomized item + if (Rando::Fishsanity::IsFish(&fish) && !Flags_GetRandomizerInf(fish.randomizerInf)) { + if (!drawEnFish) { + drawEnFish = actor->draw; } + actor->draw = Fishsanity_DrawEnFish; + } + return; + } - fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); - // Render fish as randomized item - if (Rando::Fishsanity::IsFish(&fish) && !Flags_GetRandomizerInf(fish.randomizerInf)) { - if (!drawEnFish) { - drawEnFish = actor->draw; + if (actor->id == ACTOR_FISHING && gPlayState->sceneNum == SCENE_FISHING_POND && actor->params >= 100 && + actor->params <= 117 && fs->GetPondFishShuffled()) { + // Initialize pond fish for fishsanity + // Initialize fishsanity metadata on this actor + Fishing* fishActor = static_cast(refActor); + // fishActor->fishsanityParams = actor->params; + fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); + + // With every pond fish shuffled, caught fish will not spawn unless all fish have been caught. + if (RAND_GET_OPTION(RSK_FISHSANITY_POND_COUNT) > 16 && !fs->GetPondCleared()) { + // Create effect for uncaught fish + if (!Flags_GetRandomizerInf(fish.randomizerInf)) { + actor->shape.shadowDraw = Fishsanity_DrawEffShadow; + if (!drawFishing) { + drawFishing = actor->draw; } - actor->draw = Fishsanity_DrawEnFish; + actor->draw = Fishsanity_DrawFishing; } - return; } + } +} - if (actor->id == ACTOR_FISHING && gPlayState->sceneNum == SCENE_FISHING_POND && actor->params >= 100 && - actor->params <= 117 && fs->GetPondFishShuffled()) { - // Initialize pond fish for fishsanity - // Initialize fishsanity metadata on this actor - Fishing* fishActor = static_cast(refActor); - //fishActor->fishsanityParams = actor->params; - fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); +void Fishsanity::OnActorUpdateHandler(void* refActor) { + if (gPlayState->sceneNum != SCENE_GROTTOS && gPlayState->sceneNum != SCENE_ZORAS_DOMAIN && + gPlayState->sceneNum != SCENE_FISHING_POND) { + return; + } - // With every pond fish shuffled, caught fish will not spawn unless all fish have been caught. - if (RAND_GET_OPTION(RSK_FISHSANITY_POND_COUNT) > 16 && - !fs->GetPondCleared()) { - // Create effect for uncaught fish - if (!Flags_GetRandomizerInf(fish.randomizerInf)) { - actor->shape.shadowDraw = Fishsanity_DrawEffShadow; - if (!drawFishing) { - drawFishing = actor->draw; - } - actor->draw = Fishsanity_DrawFishing; + Actor* actor = static_cast(refActor); + auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); + + // Detect fish catch + if (actor->id == ACTOR_FISHING && fs->GetPondFishShuffled()) { + Fishing* fish = static_cast(refActor); + + // State 6 -> Fish caught and hoisted + if (fish->fishState == 6) { + FishIdentity identity = + OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); + if (identity.randomizerCheck != RC_UNKNOWN_CHECK) { + Flags_SetRandomizerInf(identity.randomizerInf); + enableAdvance = true; + // Remove uncaught effect + if (actor->shape.shadowDraw != NULL) { + actor->shape.shadowDraw = NULL; + actor->draw = drawFishing; } } } } - void Fishsanity::OnActorUpdateHandler(void* refActor) { - if (gPlayState->sceneNum != SCENE_GROTTOS && gPlayState->sceneNum != SCENE_ZORAS_DOMAIN && gPlayState->sceneNum != SCENE_FISHING_POND) { - return; - } - - Actor* actor = static_cast(refActor); - auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); - - // Detect fish catch - if (actor->id == ACTOR_FISHING && fs->GetPondFishShuffled()) { - Fishing* fish = static_cast(refActor); - - // State 6 -> Fish caught and hoisted - if (fish->fishState == 6) { - FishIdentity identity = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); - if (identity.randomizerCheck != RC_UNKNOWN_CHECK) { - Flags_SetRandomizerInf(identity.randomizerInf); - enableAdvance = true; - // Remove uncaught effect - if (actor->shape.shadowDraw != NULL) { - actor->shape.shadowDraw = NULL; - actor->draw = drawFishing; - } - } + if (actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { + FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); + EnFish* fishActor = static_cast(refActor); + if (Rando::Fishsanity::IsFish(&fish) && Flags_GetRandomizerInf(fish.randomizerInf)) { + // Reset draw method + if (actor->draw == Fishsanity_DrawEnFish) { + actor->draw = drawEnFish; } } - if (actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { - FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); - EnFish* fishActor = static_cast(refActor); - if (Rando::Fishsanity::IsFish(&fish) && Flags_GetRandomizerInf(fish.randomizerInf)) { - // Reset draw method - if (actor->draw == Fishsanity_DrawEnFish) { - actor->draw = drawEnFish; - } - } - - if (((actor->params >> 8) > 0) && fishActor->respawnTimer > 0) { - Actor_Kill(actor); - } - } - - // Reset fish group counter when the group gets culled - if (actor->id == ACTOR_OBJ_MURE && gPlayState->sceneNum == SCENE_ZORAS_DOMAIN && fishGroupCounter > 0 && - !(actor->flags & ACTOR_FLAG_UPDATE_CULLING_DISABLED) && fs->GetOverworldFishShuffled()) { - fishGroupCounter = 0; + if (((actor->params >> 8) > 0) && fishActor->respawnTimer > 0) { + Actor_Kill(actor); } } - void Fishsanity::OnSceneInitHandler(int16_t sceneNum) { - if (sceneNum == SCENE_ZORAS_DOMAIN) { - fishGroupCounter = 0; + // Reset fish group counter when the group gets culled + if (actor->id == ACTOR_OBJ_MURE && gPlayState->sceneNum == SCENE_ZORAS_DOMAIN && fishGroupCounter > 0 && + !(actor->flags & ACTOR_FLAG_UPDATE_CULLING_DISABLED) && fs->GetOverworldFishShuffled()) { + fishGroupCounter = 0; + } +} + +void Fishsanity::OnSceneInitHandler(int16_t sceneNum) { + if (sceneNum == SCENE_ZORAS_DOMAIN) { + fishGroupCounter = 0; + } +} + +void Fishsanity::OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { + va_list args; + va_copy(args, originalArgs); + + Actor* actor = va_arg(args, Actor*); + auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); + + va_end(args); + + if (id == VB_BOTTLE_ACTOR && actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { + FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); + if (fish.randomizerCheck != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(fish.randomizerInf)) { + Flags_SetRandomizerInf(fish.randomizerInf); + actor->parent = &GET_PLAYER(gPlayState)->actor; + *should = false; } } +} - void Fishsanity::OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { - va_list args; - va_copy(args, originalArgs); - - Actor* actor = va_arg(args, Actor*); - auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); - - va_end(args); - - if (id == VB_BOTTLE_ACTOR && actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { - FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); - if (fish.randomizerCheck != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(fish.randomizerInf)) { - Flags_SetRandomizerInf(fish.randomizerInf); - actor->parent = &GET_PLAYER(gPlayState)->actor; - *should = false; - } - } - } - - void Fishsanity::OnItemReceiveHandler(GetItemEntry itemEntry) { - if (enableAdvance) { - enableAdvance = false; - OTRGlobals::Instance->gRandoContext->GetFishsanity()->AdvancePond(); - } +void Fishsanity::OnItemReceiveHandler(GetItemEntry itemEntry) { + if (enableAdvance) { + enableAdvance = false; + OTRGlobals::Instance->gRandoContext->GetFishsanity()->AdvancePond(); } +} } // namespace Rando // C interface extern "C" { - bool Randomizer_GetPondFishShuffled() { - return FSi->GetPondFishShuffled(); +bool Randomizer_GetPondFishShuffled() { + return Rando::Context::GetInstance()->GetFishsanity()->GetPondFishShuffled(); +} + +bool Randomizer_GetOverworldFishShuffled() { + return Rando::Context::GetInstance()->GetFishsanity()->GetOverworldFishShuffled(); +} + +bool Randomizer_IsAdultPond() { + return Rando::Context::GetInstance()->GetFishsanity()->IsAdultPond(); +} + +void Fishsanity_DrawEffShadow(Actor* actor, Lights* lights, PlayState* play) { + Vec3f pos, ripplePos; + static Vec3f velocity = { 0.0f, 0.0f, 0.0f }; + static Vec3f accel = { 0.0f, 0.0f, 0.0f }; + Color_RGBA8 primColor; + Color_RGBA8 envColor; + + // Color of the circle for the particles + static Color_RGBA8 mainColors[5][4] = { { 240, 154, 137, 200 }, + { 240, 190, 137, 200 }, + { 240, 171, 137, 200 }, + { 240, 141, 146, 200 }, + { 240, 204, 137, 200 } }; + + // Color of the faded flares stretching off the particles + static Color_RGBA8 flareColors[5][3] = { + { 128, 85, 82, 200 }, { 128, 101, 82, 200 }, { 128, 93, 82, 200 }, { 128, 82, 98, 200 }, { 128, 108, 82, 200 } + }; + + Color_RGBA8_Copy(&primColor, mainColors[ABS(actor->params) % 5]); + Color_RGBA8_Copy(&envColor, flareColors[ABS(actor->params) % 5]); + + // Spawn sparkles + pos.x = Rand_CenteredFloat(23.0f) + actor->world.pos.x; + pos.y = (Rand_Centered() * 12.0f) + actor->world.pos.y; + pos.z = Rand_CenteredFloat(23.0f) + actor->world.pos.z; + velocity.y = 0.05f; + accel.y = 0.025f; + Math_Vec3f_Copy(&ripplePos, &pos); + ripplePos.y += actor->yDistToWater; + + if (Rand_ZeroOne() < 0.3f) { + EffectSsKiraKira_SpawnDispersed(play, &pos, &velocity, &accel, &primColor, &envColor, 1800, 10); } - bool Randomizer_GetOverworldFishShuffled() { - return FSi->GetOverworldFishShuffled(); - } - - bool Randomizer_IsAdultPond() { - return FSi->IsAdultPond(); - } - - void Fishsanity_DrawEffShadow(Actor* actor, Lights* lights, PlayState* play) { - Vec3f pos, ripplePos; - static Vec3f velocity = { 0.0f, 0.0f, 0.0f }; - static Vec3f accel = { 0.0f, 0.0f, 0.0f }; - Color_RGBA8 primColor; - Color_RGBA8 envColor; - - // Color of the circle for the particles - static Color_RGBA8 mainColors[5][4] = { - { 240, 154, 137, 200 }, - { 240, 190, 137, 200 }, - { 240, 171, 137, 200 }, - { 240, 141, 146, 200 }, - { 240, 204, 137, 200 } - }; - - // Color of the faded flares stretching off the particles - static Color_RGBA8 flareColors[5][3] = { - { 128, 85, 82, 200 }, - { 128, 101, 82, 200 }, - { 128, 93, 82, 200 }, - { 128, 82, 98, 200 }, - { 128, 108, 82, 200 } - }; - - Color_RGBA8_Copy(&primColor, mainColors[ABS(actor->params) % 5]); - Color_RGBA8_Copy(&envColor, flareColors[ABS(actor->params) % 5]); - - // Spawn sparkles - pos.x = Rand_CenteredFloat(23.0f) + actor->world.pos.x; - pos.y = (Rand_Centered() * 12.0f) + actor->world.pos.y; - pos.z = Rand_CenteredFloat(23.0f) + actor->world.pos.z; - velocity.y = 0.05f; - accel.y = 0.025f; - Math_Vec3f_Copy(&ripplePos, &pos); - ripplePos.y += actor->yDistToWater; - - if (Rand_ZeroOne() < 0.3f) { - EffectSsKiraKira_SpawnDispersed(play, &pos, &velocity, &accel, &primColor, &envColor, 1800, 10); - } - - if (actor->bgCheckFlags & 0x20 && Rand_ZeroOne() < 0.15f) { - EffectSsGRipple_Spawn(play, &ripplePos, 100, 200, 2); - } - } - - void Fishsanity_DrawEnFish(struct Actor* actor, struct PlayState* play) { - FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(play->sceneNum, actor->params); - GetItemEntry randoItem = Rando::Context::GetInstance()->GetFinalGIEntry(fish.randomizerCheck, true, GI_FISH); - if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { - randoItem = GET_ITEM_MYSTERY; - } - - Matrix_Push(); - Matrix_Scale(30.0, 30.0, 30.0, MTXMODE_APPLY); - - func_8002EBCC(actor, play, 0); - func_8002ED80(actor, play, 0); - EnItem00_CustomItemsParticles(actor, play, randoItem); - GetItemEntry_Draw(play, randoItem); - - Matrix_Pop(); - } - - void Fishsanity_DrawFishing(struct Actor* actor, struct PlayState* play) { - Fishsanity_OpenGreyscaleColor(play, &fsPulseColor, (actor->params - 100) * 20); - drawFishing(actor, play); - Fishsanity_CloseGreyscaleColor(play); - } - - void Fishsanity_OpenGreyscaleColor(PlayState* play, Color_RGBA16* color, int16_t frameOffset) { - OPEN_DISPS(play->state.gfxCtx); - gDPSetGrayscaleColor( - POLY_OPA_DISP++, color->r, color->g, color->b, - // Make color pulse, offset a bit by the actor params - ABS(255.0f * Math_CosS((play->gameplayFrames + frameOffset) * 1000))); - gSPGrayscale(POLY_OPA_DISP++, true); - CLOSE_DISPS(play->state.gfxCtx); - } - - void Fishsanity_CloseGreyscaleColor(PlayState* play) { - OPEN_DISPS(play->state.gfxCtx); - gSPGrayscale(POLY_OPA_DISP++, false); - CLOSE_DISPS(play->state.gfxCtx); + if (actor->bgCheckFlags & 0x20 && Rand_ZeroOne() < 0.15f) { + EffectSsGRipple_Spawn(play, &ripplePos, 100, 200, 2); } } +void Fishsanity_DrawEnFish(struct Actor* actor, struct PlayState* play) { + FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(play->sceneNum, actor->params); + GetItemEntry randoItem = Rando::Context::GetInstance()->GetFinalGIEntry(fish.randomizerCheck, true, GI_FISH); + if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { + randoItem = GET_ITEM_MYSTERY; + } + + Matrix_Push(); + Matrix_Scale(30.0, 30.0, 30.0, MTXMODE_APPLY); + + func_8002EBCC(actor, play, 0); + func_8002ED80(actor, play, 0); + EnItem00_CustomItemsParticles(actor, play, randoItem); + GetItemEntry_Draw(play, randoItem); + + Matrix_Pop(); +} + +void Fishsanity_DrawFishing(struct Actor* actor, struct PlayState* play) { + Fishsanity_OpenGreyscaleColor(play, &fsPulseColor, (actor->params - 100) * 20); + drawFishing(actor, play); + Fishsanity_CloseGreyscaleColor(play); +} + +void Fishsanity_OpenGreyscaleColor(PlayState* play, Color_RGB8* color, int16_t frameOffset) { + OPEN_DISPS(play->state.gfxCtx); + gDPSetGrayscaleColor(POLY_OPA_DISP++, color->r, color->g, color->b, + // Make color pulse, offset a bit by the actor params + ABS(255.0f * Math_CosS((play->gameplayFrames + frameOffset) * 1000))); + gSPGrayscale(POLY_OPA_DISP++, true); + CLOSE_DISPS(play->state.gfxCtx); +} + +void Fishsanity_CloseGreyscaleColor(PlayState* play) { + OPEN_DISPS(play->state.gfxCtx); + gSPGrayscale(POLY_OPA_DISP++, false); + CLOSE_DISPS(play->state.gfxCtx); +} +} + void Rando::StaticData::RegisterFishLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off // Fishing Pond locationTable[RC_LH_CHILD_FISH_1] = Location::Fish(RC_LH_CHILD_FISH_1, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 100, RAND_INF_CHILD_FISH_1, "Child Pond Fish 1", RHT_LH_POND_FISH, RG_NONE); locationTable[RC_LH_CHILD_FISH_2] = Location::Fish(RC_LH_CHILD_FISH_2, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 101, RAND_INF_CHILD_FISH_2, "Child Pond Fish 2", RHT_LH_POND_FISH, RG_NONE); @@ -630,6 +631,7 @@ void Rando::StaticData::RegisterFishLocations() { locationTable[RC_ZD_FISH_3] = Location::Fish(RC_ZD_FISH_3, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 2, RAND_INF_ZD_FISH_3, "Fish 3", RHT_ZD_FISH, RG_FISH); locationTable[RC_ZD_FISH_4] = Location::Fish(RC_ZD_FISH_4, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 3, RAND_INF_ZD_FISH_4, "Fish 4", RHT_ZD_FISH, RG_FISH); locationTable[RC_ZD_FISH_5] = Location::Fish(RC_ZD_FISH_5, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, RAND_INF_ZD_FISH_5, "Fish 5", RHT_ZD_FISH, RG_FISH); + // clang-format on } static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFishLocations); diff --git a/soh/soh/Enhancements/randomizer/fishsanity.h b/soh/soh/Enhancements/randomizer/fishsanity.h index 91d0211570..16271f28fd 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.h +++ b/soh/soh/Enhancements/randomizer/fishsanity.h @@ -14,7 +14,7 @@ typedef struct { typedef enum { FSO_SOURCE_RANDO, - FSO_SOURCE_CVARS + FSO_SOURCE_CVARS, } FishsanityOptionsSource; typedef enum { @@ -29,7 +29,7 @@ namespace Rando { /** * @brief Class to provide an interface for and direct Fishsanity features -*/ + */ class Fishsanity { public: Fishsanity(); @@ -47,110 +47,114 @@ class Fishsanity { /** * @brief Returns true if the given FishIdentity represents an actual fish * @param fish The fish to check - */ + */ static bool IsFish(FishIdentity* fish); /** * @brief Returns true if the given fish location is active - * + * * @param loc The Location to check * @param optionsSource Optionally declare from which source to pull settings - */ + */ bool GetFishLocationIncluded(Rando::Location* loc, FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); /** * @brief Get the active and inactive locations in the fishing pond. - * + * * @param optionsSource Optionally declare from which source to pull settings - * @return A pair of vectors, where the fist is all active pond fish checks, and the second is all inactive pond fish checks. - */ - std::pair, std::vector> GetFishingPondLocations(FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); + * @return A pair of vectors, where the fist is all active pond fish checks, and the second is all inactive pond + * fish checks. + */ + std::pair, std::vector> + GetFishingPondLocations(FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); /** * @brief Get all active fishsanity locations, and all inactive fishing pond locations. - * - * @param optionsSource Optionally declare from which source to pull settings - * @return A pair of vectors, where the first is all active fishsanity checks, and the second is all inactive fishsanity checks. - */ - std::pair, std::vector> GetFishsanityLocations(FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); + * + * @param optionsSource Optionally declare from which source to pull settings + * @return A pair of vectors, where the first is all active fishsanity checks, and the second is all inactive + * fishsanity checks. + */ + std::pair, std::vector> + GetFishsanityLocations(FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); /** * @brief Returns the identity for a caught pond fish given its params. * Not for use externally from rando, use Randomizer::IdentifyFish or Randomizer_IdentifyFish for that - * + * * @param fishParams Actor parameters for the fish to identify - */ + */ FishIdentity IdentifyPondFish(u8 fishParams); /** * @brief Get fishsanity fishing pond options from the requested source - */ + */ FishsanityPondOptions GetOptions(FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); - + /** * @brief Updates current pond fish according to save data - */ + */ void UpdateCurrentPondFish(); - + /** * @brief Initializes internal state from save - */ + */ void InitializeFromSave(); /** * @brief Returns true if the fishing pond is shuffled - */ + */ bool GetPondFishShuffled(); /** - * @brief Returns true if overworld fish are shuffled - */ + * @brief Returns true if overworld fish are shuffled + */ bool GetOverworldFishShuffled(); /** * @brief Returns true if the fishing pond is currently adult (i.e., age split is enabled and Link is adult) - */ + */ bool IsAdultPond(); /** * @brief Returns true if all available pond fish checks have been collected for the current age - */ + */ bool GetPondCleared(); /** * @brief Returns true if all available Zora's Domain fish checks have been collected - */ + */ bool GetDomainCleared(); /** * @brief Advances current fishing pond check; no effect if every fish is shuffled * @return The new FishIdentity for the current pond, or default identity if every fish is shuffled - */ + */ FishIdentity AdvancePond(); /** * @brief ActorInit hook handler for fishsanity - */ + */ static void OnActorInitHandler(void* refActor); /** * @brief PlayerUpdate hook handler for fishsanity - */ + */ static void OnPlayerUpdateHandler(); /** * @brief ActorUpdate hook handler for fishsanity - */ + */ static void OnActorUpdateHandler(void* refActor); /** * @brief SceneInit hook handler for fishsanity - */ + */ static void OnSceneInitHandler(int16_t sceneNum); /** * @brief VB hook handler for fishsanity - */ + */ static void OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs); static void OnItemReceiveHandler(GetItemEntry itemEntry); @@ -158,26 +162,26 @@ class Fishsanity { private: /** * @brief Initialize helper statics if they have not been initialized yet - */ + */ void InitializeHelpers(); - + /** * @brief Resolves a pond fish's FishIdentity directly from params & pond age - * + * * @param params Params for Fishing actor * @param adultPond Whether to resolve this fish as an adult check * @return The FishIdentity for the described fish - */ + */ static FishIdentity GetPondFish(s16 params, bool adultPond); /** * @brief Current pond fish when all pond fish are not randomized - */ + */ std::pair mCurrPondFish; - + /** * @brief True if fishsanity helpers have been initialized - */ + */ static bool fishsanityHelpersInit; static s16 fishGroupCounter; @@ -189,20 +193,20 @@ class Fishsanity { /** * @brief Mapping from pond fish check to the age where that check can be collected - */ + */ static std::unordered_map pondFishAgeMap; /** * @brief List of child pond fish checks - */ + */ static std::vector childPondFish; /** * @brief List of adult pond fish checks - */ + */ static std::vector adultPondFish; }; -} +} // namespace Rando extern "C" { #endif @@ -218,7 +222,7 @@ void Fishsanity_DrawEffShadow(Actor* actor, Lights* lights, PlayState* play); void Fishsanity_DrawEnFish(struct Actor* actor, struct PlayState* play); /// Overriden actor draw function for the fishing pond void Fishsanity_DrawFishing(struct Actor* actor, struct PlayState* play); -void Fishsanity_OpenGreyscaleColor(PlayState* play, Color_RGBA16* color, int16_t frameOffset); +void Fishsanity_OpenGreyscaleColor(PlayState* play, Color_RGB8* color, int16_t frameOffset); void Fishsanity_CloseGreyscaleColor(PlayState* play); #ifdef __cplusplus } diff --git a/soh/soh/Enhancements/randomizer/hint.cpp b/soh/soh/Enhancements/randomizer/hint.cpp index 29a9a969f3..c98ecea150 100644 --- a/soh/soh/Enhancements/randomizer/hint.cpp +++ b/soh/soh/Enhancements/randomizer/hint.cpp @@ -6,638 +6,625 @@ #include "static_data.h" namespace Rando { -Hint::Hint(){} - -Hint::Hint(RandomizerHint ownKey_, - HintType hintType_, - std::string distribution_, - std::vector hintKeys_, - std::vector locations_, - std::vector areas_, - std::vector trials_) - : ownKey(ownKey_), hintType(hintType_), distribution(std::move(distribution_)), hintKeys(hintKeys_), locations(locations_), areas(areas_), trials(trials_) { - FillGapsInData(); - SetLocationsAsHinted(); - NamesChosen(); - enabled = true; +Hint::Hint() { } -Hint::Hint(RandomizerHint ownKey_, - HintType hintType_, - std::vector hintKeys_, - std::vector locations_, - std::vector areas_, - std::vector trials_, - bool yourPocket_, - int num_) - : ownKey(ownKey_), hintType(hintType_), hintKeys(hintKeys_), locations(locations_), areas(areas_), trials(trials_), yourPocket(yourPocket_), num(num_) { - FillGapsInData(); - SetLocationsAsHinted(); - NamesChosen(); - enabled = true; +Hint::Hint(RandomizerHint ownKey_, HintType hintType_, std::string distribution_, + std::vector hintKeys_, std::vector locations_, + std::vector areas_, std::vector trials_) + : ownKey(ownKey_), hintType(hintType_), distribution(std::move(distribution_)), hintKeys(hintKeys_), + locations(locations_), areas(areas_), trials(trials_) { + FillGapsInData(); + SetLocationsAsHinted(); + NamesChosen(); + enabled = true; } -Hint::Hint(RandomizerHint ownKey_, std::vector messages_) -: ownKey(ownKey_), messages(messages_){ - hintType = HINT_TYPE_MESSAGE; - enabled = true; +Hint::Hint(RandomizerHint ownKey_, HintType hintType_, std::vector hintKeys_, + std::vector locations_, std::vector areas_, std::vector trials_, + bool yourPocket_, int num_) + : ownKey(ownKey_), hintType(hintType_), hintKeys(hintKeys_), locations(locations_), areas(areas_), trials(trials_), + yourPocket(yourPocket_), num(num_) { + FillGapsInData(); + SetLocationsAsHinted(); + NamesChosen(); + enabled = true; } -Hint::Hint(RandomizerHint ownKey_, nlohmann::json json_){ - ownKey = ownKey_; - if (json_.contains("enabled") && !json_["enabled"].get()){ - return; - } - enabled = true; - - if (json_.contains("type")){ - hintType = (HintType)StaticData::hintTypeNameToEnum[json_["type"].get()]; - } - - if (hintType == HINT_TYPE_MESSAGE){ - if (json_.contains("messages")){ - for (auto message: json_["messages"]){ - messages.push_back(CustomMessage(message.get())); - } - } else if (json_.contains("message")){ - messages.push_back(CustomMessage(json_["message"].get())); - } - } - - if (json_.contains("distribution")){ - distribution = json_["distribution"].get(); - } - - if (json_.contains("locations")){ - for (auto loc: json_["locations"]){ - locations.push_back(StaticData::locationNameToEnum[loc.get()]); - } - } else if (json_.contains("location")){ - locations.push_back(StaticData::locationNameToEnum[json_["location"].get()]); - } - - if (json_.contains("itemNamesChosen")){ - for (auto name: json_["itemNamesChosen"]){ - itemNamesChosen.push_back(name.get()); - } - } else if (json_.contains("itemNameChosen")){ - itemNamesChosen.push_back(json_["itemNameChosen"].get()); - } - - if (json_.contains("areas")){ - for (auto area: json_["areas"]){ - areas.push_back((RandomizerArea)Rando::StaticData::areaNameToEnum[area]); - } - } else if (json_.contains("area")){ - areas.push_back((RandomizerArea)Rando::StaticData::areaNameToEnum[json_["area"]]); - } - - if (json_.contains("areaNamesChosen")){ - for (auto name: json_["areaNamesChosen"]){ - areaNamesChosen.push_back(name.get()); - } - } else if (json_.contains("areaNameChosen")){ - areaNamesChosen.push_back(json_["areaNameChosen"].get()); - } - - if (json_.contains("trials")){ - for (auto trial: json_["trials"]){ - trials.push_back((TrialKey)Rando::StaticData::trialNameToEnum[trial]); - } - } else if (json_.contains("trial")){ - trials.push_back((TrialKey)Rando::StaticData::trialNameToEnum[json_["trial"]]); - } - - if (json_.contains("hintKeys")){ - for (auto hintKey: json_["hintKeys"]){ - hintKeys.push_back((RandomizerHintTextKey)hintKey.get()); - } - } else if (json_.contains("hintKey")){ - hintKeys.push_back((RandomizerHintTextKey)json_["hintKey"].get()); - } - - if (json_.contains("hintTextsChosen")){ - for (auto name: json_["hintTextsChosen"]){ - hintTextsChosen.push_back(name.get()); - } - } else if (json_.contains("hintTextChosen")){ - hintTextsChosen.push_back(json_["hintTextChosen"].get()); - } - - if (json_.contains("num")){ - num = json_["num"].get(); - } - - FillGapsInData(); - SetLocationsAsHinted(); +Hint::Hint(RandomizerHint ownKey_, std::vector messages_) : ownKey(ownKey_), messages(messages_) { + hintType = HINT_TYPE_MESSAGE; + enabled = true; } -void Hint::FillGapsInData(){ - auto ctx = Rando::Context::GetInstance(); - if (locations.size() == 0 && StaticData::staticHintInfoMap.contains(ownKey)){ - locations = StaticData::staticHintInfoMap[ownKey].targetChecks; - } - bool fillAreas = true; - bool fillItems = true; - if (areas.size() > 0){ - fillAreas = false; - } - if (items.size() > 0){ - fillItems = false; - } - for(uint8_t c = 0; c < locations.size(); c++){ - //if area matters for the hint, it should be specified and not left to this - if (fillAreas){ - areas.push_back(ctx->GetItemLocation(locations[c])->GetFirstArea()); +Hint::Hint(RandomizerHint ownKey_, nlohmann::json json_) { + ownKey = ownKey_; + if (json_.contains("enabled") && !json_["enabled"].get()) { + return; } - if (fillItems){ - items.push_back(ctx->GetItemLocation(locations[c])->GetPlacedRandomizerGet()); + enabled = true; + + if (json_.contains("type")) { + hintType = (HintType)StaticData::hintTypeNameToEnum[json_["type"].get()]; + } + + if (hintType == HINT_TYPE_MESSAGE) { + if (json_.contains("messages")) { + for (auto message : json_["messages"]) { + messages.push_back(CustomMessage(message.get())); + } + } else if (json_.contains("message")) { + messages.push_back(CustomMessage(json_["message"].get())); + } + } + + if (json_.contains("distribution")) { + distribution = json_["distribution"].get(); + } + + if (json_.contains("locations")) { + for (auto loc : json_["locations"]) { + locations.push_back(StaticData::locationNameToEnum[loc.get()]); + } + } else if (json_.contains("location")) { + locations.push_back(StaticData::locationNameToEnum[json_["location"].get()]); + } + + if (json_.contains("itemNamesChosen")) { + for (auto name : json_["itemNamesChosen"]) { + itemNamesChosen.push_back(name.get()); + } + } else if (json_.contains("itemNameChosen")) { + itemNamesChosen.push_back(json_["itemNameChosen"].get()); + } + + if (json_.contains("areas")) { + for (auto area : json_["areas"]) { + areas.push_back((RandomizerArea)Rando::StaticData::areaNameToEnum[area]); + } + } else if (json_.contains("area")) { + areas.push_back((RandomizerArea)Rando::StaticData::areaNameToEnum[json_["area"]]); + } + + if (json_.contains("areaNamesChosen")) { + for (auto name : json_["areaNamesChosen"]) { + areaNamesChosen.push_back(name.get()); + } + } else if (json_.contains("areaNameChosen")) { + areaNamesChosen.push_back(json_["areaNameChosen"].get()); + } + + if (json_.contains("trials")) { + for (auto trial : json_["trials"]) { + trials.push_back((TrialKey)Rando::StaticData::trialNameToEnum[trial]); + } + } else if (json_.contains("trial")) { + trials.push_back((TrialKey)Rando::StaticData::trialNameToEnum[json_["trial"]]); + } + + if (json_.contains("hintKeys")) { + for (auto hintKey : json_["hintKeys"]) { + hintKeys.push_back((RandomizerHintTextKey)hintKey.get()); + } + } else if (json_.contains("hintKey")) { + hintKeys.push_back((RandomizerHintTextKey)json_["hintKey"].get()); + } + + if (json_.contains("hintTextsChosen")) { + for (auto name : json_["hintTextsChosen"]) { + hintTextsChosen.push_back(name.get()); + } + } else if (json_.contains("hintTextChosen")) { + hintTextsChosen.push_back(json_["hintTextChosen"].get()); + } + + if (json_.contains("num")) { + num = json_["num"].get(); + } + + FillGapsInData(); + SetLocationsAsHinted(); +} + +void Hint::FillGapsInData() { + auto ctx = Rando::Context::GetInstance(); + if (locations.size() == 0 && StaticData::staticHintInfoMap.contains(ownKey)) { + locations = StaticData::staticHintInfoMap[ownKey].targetChecks; + } + bool fillAreas = true; + bool fillItems = true; + if (areas.size() > 0) { + fillAreas = false; + } + if (items.size() > 0) { + fillItems = false; + } + for (uint8_t c = 0; c < locations.size(); c++) { + // if area matters for the hint, it should be specified and not left to this + if (fillAreas) { + areas.push_back(ctx->GetItemLocation(locations[c])->GetFirstArea()); + } + if (fillItems) { + items.push_back(ctx->GetItemLocation(locations[c])->GetPlacedRandomizerGet()); + } } - } } void Hint::SetLocationsAsHinted() const { - auto ctx = Rando::Context::GetInstance(); - for (uint8_t count = 0; count < locations.size(); count++){ - ctx->GetItemLocation(locations[count])->AddHintedBy(ownKey); - } -} - -uint8_t GetRandomHintTextEntry(const HintText hintText){ - auto ctx = Rando::Context::GetInstance(); - uint8_t size = 0; - if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_AMBIGUOUS)){ - size = hintText.GetAmbiguousSize(); - } else if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_OBSCURE)){ - size = hintText.GetObscureSize(); - } - if (size > 0){ - return Random(0, size); - } - return 0; -} - -void Hint::NamesChosen(){ - auto ctx = Rando::Context::GetInstance(); - std::vector namesTemp = {}; - bool saveNames = false; - uint8_t numMessages = GetNumberOfMessages(); - for (uint8_t c = 0; c < numMessages; c++){ - uint8_t selection = GetRandomHintTextEntry(GetHintText(c)); - if (selection > 0){ - saveNames = true; + auto ctx = Rando::Context::GetInstance(); + for (uint8_t count = 0; count < locations.size(); count++) { + ctx->GetItemLocation(locations[count])->AddHintedBy(ownKey); } - namesTemp.push_back(selection); - } - if (saveNames) { - hintTextsChosen = namesTemp; - } +} - if (hintType == HINT_TYPE_ITEM || hintType == HINT_TYPE_ITEM_AREA){ - for(uint8_t c = 0; c < locations.size(); c++){ - namesTemp = {}; - saveNames = false; - uint8_t selection = GetRandomHintTextEntry(GetItemHintText(c)); - if (selection > 0){ - saveNames = true; - } - namesTemp.push_back(selection); +uint8_t GetRandomHintTextEntry(const HintText hintText) { + auto ctx = Rando::Context::GetInstance(); + uint8_t size = 0; + if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_AMBIGUOUS)) { + size = hintText.GetAmbiguousSize(); + } else if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_OBSCURE)) { + size = hintText.GetObscureSize(); + } + if (size > 0) { + return Random(0, size); + } + return 0; +} + +void Hint::NamesChosen() { + auto ctx = Rando::Context::GetInstance(); + std::vector namesTemp = {}; + bool saveNames = false; + size_t numMessages = GetNumberOfMessages(); + for (size_t c = 0; c < numMessages; c++) { + uint8_t selection = GetRandomHintTextEntry(GetHintText(c)); + if (selection > 0) { + saveNames = true; + } + namesTemp.push_back(selection); } if (saveNames) { - itemNamesChosen = namesTemp; + hintTextsChosen = namesTemp; } - } - if (hintType == HINT_TYPE_FOOLISH || hintType == HINT_TYPE_ITEM_AREA || hintType == HINT_TYPE_WOTH || - hintType == HINT_TYPE_ALTAR_CHILD || hintType == HINT_TYPE_ALTAR_ADULT){ - namesTemp = {}; - saveNames = false; - for(uint8_t c = 0; c < areas.size(); c++){ - uint8_t selection = GetRandomHintTextEntry(GetAreaHintText(c)); - if (selection > 0){ - saveNames = true; - } - namesTemp.push_back(selection); + if (hintType == HINT_TYPE_ITEM || hintType == HINT_TYPE_ITEM_AREA) { + for (size_t c = 0; c < locations.size(); c++) { + namesTemp = {}; + saveNames = false; + uint8_t selection = GetRandomHintTextEntry(GetItemHintText(c)); + if (selection > 0) { + saveNames = true; + } + namesTemp.push_back(selection); + } + if (saveNames) { + itemNamesChosen = namesTemp; + } } - if (saveNames) { - areaNamesChosen = namesTemp; + + if (hintType == HINT_TYPE_FOOLISH || hintType == HINT_TYPE_ITEM_AREA || hintType == HINT_TYPE_WOTH || + hintType == HINT_TYPE_ALTAR_CHILD || hintType == HINT_TYPE_ALTAR_ADULT) { + namesTemp = {}; + saveNames = false; + for (uint8_t c = 0; c < areas.size(); c++) { + uint8_t selection = GetRandomHintTextEntry(GetAreaHintText(c)); + if (selection > 0) { + saveNames = true; + } + namesTemp.push_back(selection); + } + if (saveNames) { + areaNamesChosen = namesTemp; + } } - } } -uint8_t Hint::GetNumberOfMessages() const { - size_t numMessages = std::max(messages.size(), hintKeys.size()); - if (StaticData::staticHintInfoMap.contains(ownKey)){ - numMessages = std::max(StaticData::staticHintInfoMap[ownKey].hintKeys.size(), numMessages); - } - if (numMessages == 0){ - numMessages = 1; //RANDOTODO make std::max actually fucking work for 3 arguments - } - return numMessages; +size_t Hint::GetNumberOfMessages() const { + size_t numMessages = std::max(messages.size(), hintKeys.size()); + if (StaticData::staticHintInfoMap.contains(ownKey)) { + numMessages = std::max(StaticData::staticHintInfoMap[ownKey].hintKeys.size(), numMessages); + } + if (numMessages == 0) { + numMessages = 1; // RANDOTODO make std::max actually fucking work for 3 arguments + } + return numMessages; } const std::vector Hint::GetAllMessageStrings(MessageFormat format) const { - std::vector hintMessages = {}; - uint8_t numMessages = GetNumberOfMessages(); - for (int c = 0; c < numMessages; c++){ - hintMessages.push_back(GetHintMessage(format, c).GetForCurrentLanguage(format)); - } - return hintMessages; + std::vector hintMessages = {}; + size_t numMessages = GetNumberOfMessages(); + for (size_t c = 0; c < numMessages; c++) { + hintMessages.push_back(GetHintMessage(format, c).GetForCurrentLanguage(format)); + } + return hintMessages; } -const HintText Hint::GetHintText(uint8_t id) const { - auto ctx = Rando::Context::GetInstance(); - if (hintKeys.size() > id){ - return StaticData::hintTextTable[hintKeys[id]]; - } -// If a static hint, load default from staticHintInfoMap - if (StaticData::staticHintInfoMap.contains(ownKey) && StaticData::staticHintInfoMap[ownKey].hintKeys.size() > id){ - return StaticData::hintTextTable[StaticData::staticHintInfoMap[ownKey].hintKeys[id]]; - } +const HintText Hint::GetHintText(size_t id) const { + auto ctx = Rando::Context::GetInstance(); + if (hintKeys.size() > id) { + return StaticData::hintTextTable[hintKeys[id]]; + } + // If a static hint, load default from staticHintInfoMap + if (StaticData::staticHintInfoMap.contains(ownKey) && StaticData::staticHintInfoMap[ownKey].hintKeys.size() > id) { + return StaticData::hintTextTable[StaticData::staticHintInfoMap[ownKey].hintKeys[id]]; + } - switch (hintType){ - case HINT_TYPE_HINT_KEY: - return StaticData::hintTextTable[0]; - break; - case HINT_TYPE_TRIAL: - if (ctx->GetTrial(trials[0])->IsRequired()) { - return StaticData::hintTextTable[RHT_TRIAL_ON]; - } else { - return StaticData::hintTextTable[RHT_TRIAL_OFF]; - } - case HINT_TYPE_WOTH: - return StaticData::hintTextTable[RHT_WAY_OF_THE_HERO]; - case HINT_TYPE_FOOLISH: - return StaticData::hintTextTable[RHT_FOOLISH]; - case HINT_TYPE_ITEM: - if (locations.size() > 0) { - return *StaticData::GetLocation(locations[0])->GetHint(); - } else { - return CustomMessage("ERROR: ITEM HINT WITH NO LOCATIONS OR HINT KEY"); - } - case HINT_TYPE_ITEM_AREA: - if (locations.size() > 0) { - if (StaticData::GetLocation(locations[0])->IsDungeon()) { - return StaticData::hintTextTable[RHT_HOARDS]; - } else { - return StaticData::hintTextTable[RHT_CAN_BE_FOUND_AT]; + switch (hintType) { + case HINT_TYPE_HINT_KEY: + return StaticData::hintTextTable[0]; + break; + case HINT_TYPE_TRIAL: + if (ctx->GetTrial(trials[0])->IsRequired()) { + return StaticData::hintTextTable[RHT_TRIAL_ON]; + } else { + return StaticData::hintTextTable[RHT_TRIAL_OFF]; + } + case HINT_TYPE_WOTH: + return StaticData::hintTextTable[RHT_WAY_OF_THE_HERO]; + case HINT_TYPE_FOOLISH: + return StaticData::hintTextTable[RHT_FOOLISH]; + case HINT_TYPE_ITEM: + if (locations.size() > 0) { + return *StaticData::GetLocation(locations[0])->GetHint(); + } else { + return CustomMessage("ERROR: ITEM HINT WITH NO LOCATIONS OR HINT KEY"); + } + case HINT_TYPE_ITEM_AREA: + if (locations.size() > 0) { + if (StaticData::GetLocation(locations[0])->IsDungeon()) { + return StaticData::hintTextTable[RHT_HOARDS]; + } else { + return StaticData::hintTextTable[RHT_CAN_BE_FOUND_AT]; + } + } else { + return CustomMessage("ERROR: ITEM AREA HINT WITH NO LOCATION"); // RANDOTODO get isDungeon from area? + } + default: + return CustomMessage("ERROR: NO HINTKEY PROVIDED AND HINT TYPE HAS NO DEFAULT"); + } +} + +const CustomMessage Hint::GetHintMessage(MessageFormat format, size_t id) const { + auto ctx = Rando::Context::GetInstance(); + CustomMessage hintText = CustomMessage(""); + + size_t chosenMessage = 0; + if (hintTextsChosen.size() > id) { + chosenMessage = id; + } + + if (hintType == HINT_TYPE_MESSAGE) { + if (id < messages.size()) { + hintText = messages[id]; } - } else { - return CustomMessage("ERROR: ITEM AREA HINT WITH NO LOCATION"); //RANDOTODO get isDungeon from area? - } - default: - return CustomMessage("ERROR: NO HINTKEY PROVIDED AND HINT TYPE HAS NO DEFAULT"); - } -} - -const CustomMessage Hint::GetHintMessage(MessageFormat format, uint8_t id) const { - auto ctx = Rando::Context::GetInstance(); - CustomMessage hintText = CustomMessage(""); - - uint8_t chosenMessage = 0; - if (hintTextsChosen.size() > id){ - chosenMessage = id; - } - - if (hintType == HINT_TYPE_MESSAGE){ - if (id < messages.size()){ - hintText = messages[id]; - } - } else if (hintType == HINT_TYPE_ALTAR_CHILD){ - if (ctx->GetOption(RSK_TOT_ALTAR_HINT)){ - hintText = StaticData::hintTextTable[RHT_CHILD_ALTAR_STONES].GetHintMessage(); - } - if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_OPEN)) { - hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTOPEN].GetHintMessage()); - } else if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_SONGONLY)) { - hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY].GetHintMessage()); + } else if (hintType == HINT_TYPE_ALTAR_CHILD) { + if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { + hintText = StaticData::hintTextTable[RHT_CHILD_ALTAR_STONES].GetHintMessage(); + } + if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_OPEN)) { + hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTOPEN].GetHintMessage()); + } else if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_SONGONLY)) { + hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY].GetHintMessage()); + } else { + hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED].GetHintMessage()); + } + } else if (hintType == HINT_TYPE_ALTAR_ADULT) { + if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { + hintText = StaticData::hintTextTable[RHT_ADULT_ALTAR_MEDALLIONS].GetHintMessage(); + } + hintText += GetBridgeReqsText() + GetGanonBossKeyText() + + StaticData::hintTextTable[RHT_ADULT_ALTAR_TEXT_END].GetHintMessage(); } else { - hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED].GetHintMessage()); + hintText = GetHintText(id).GetHintMessage(chosenMessage); } - } else if (hintType == HINT_TYPE_ALTAR_ADULT){ - if (ctx->GetOption(RSK_TOT_ALTAR_HINT)){ - hintText = StaticData::hintTextTable[RHT_ADULT_ALTAR_MEDALLIONS].GetHintMessage(); + + std::vector toInsert = {}; + + switch (hintType) { + case HINT_TYPE_ITEM: { + // if we write items + for (uint8_t b = 0; b < locations.size(); b++) { + toInsert.push_back(GetItemName(b)); + } + break; + } + case HINT_TYPE_TRIAL: { + // If we write trials + for (uint8_t b = 0; b < trials.size(); b++) { + toInsert.push_back(ctx->GetTrial(trials[b])->GetName()); + } + break; + } + case HINT_TYPE_ITEM_AREA: { + // If we write items and areas + for (uint8_t b = 0; b < items.size(); b++) { + toInsert.push_back(GetItemName(b)); + toInsert.push_back(GetAreaName(b)); + } + break; + } + case HINT_TYPE_ALTAR_CHILD: + case HINT_TYPE_ALTAR_ADULT: + case HINT_TYPE_AREA: + case HINT_TYPE_WOTH: + case HINT_TYPE_FOOLISH: { + // If we write areas + for (uint8_t b = 0; b < areas.size(); b++) { + toInsert.push_back(GetAreaName(b)); + } + break; + } + default: + break; } - hintText += GetBridgeReqsText() + GetGanonBossKeyText() + StaticData::hintTextTable[RHT_ADULT_ALTAR_TEXT_END].GetHintMessage(); - } else { - hintText = GetHintText(id).GetHintMessage(chosenMessage); - } - std::vector toInsert = {}; + hintText.InsertNames(toInsert); + hintText.SetSingularPlural(); - switch (hintType){ - case HINT_TYPE_ITEM:{ - //if we write items - for(uint8_t b = 0; b < locations.size(); b++){ - toInsert.push_back(GetItemName(b)); - } - break;} - case HINT_TYPE_TRIAL:{ - //If we write trials - for(uint8_t b = 0; b < trials.size(); b++){ - toInsert.push_back(ctx->GetTrial(trials[b])->GetName()); - } - break;} - case HINT_TYPE_ITEM_AREA:{ - //If we write items and areas - for(uint8_t b = 0; b < items.size(); b++){ - toInsert.push_back(GetItemName(b)); - toInsert.push_back(GetAreaName(b)); - } - break;} - case HINT_TYPE_ALTAR_CHILD: - case HINT_TYPE_ALTAR_ADULT: - case HINT_TYPE_AREA: - case HINT_TYPE_WOTH: - case HINT_TYPE_FOOLISH:{ - //If we write areas - for(uint8_t b = 0; b < areas.size(); b++){ - toInsert.push_back(GetAreaName(b)); - } - break;} - default: - break; - } + if (num != 0) { + hintText.InsertNumber(num); + } - hintText.InsertNames(toInsert); + if (format == MF_FORMATTED) { + hintText.Format(); + } else if (format == MF_AUTO_FORMAT) { + hintText.AutoFormat(); + } else if (format == MF_CLEAN) { + hintText.Clean(); + } - if (num != 0){ - hintText.InsertNumber(num); - } - - if (format == MF_FORMATTED){ - hintText.Format(); - } else if (format == MF_AUTO_FORMAT){ - hintText.AutoFormat(); - } else if (format == MF_CLEAN){ - hintText.Clean(); - } - - return hintText; + return hintText; } oJson Hint::toJSON() { - auto ctx = Rando::Context::GetInstance(); - nlohmann::ordered_json log = {}; - if (enabled){ - log["type"] = StaticData::hintTypeNames[hintType].GetForCurrentLanguage(MF_CLEAN); - - std::vector hintMessages = GetAllMessageStrings(MF_CLEAN); - if (hintMessages.size() == 1){ - log["message"] = hintMessages[0]; - } else if (hintMessages.size() > 1){ - log["messages"] = hintMessages; - } + auto ctx = Rando::Context::GetInstance(); + nlohmann::ordered_json log = {}; + if (enabled) { + log["type"] = StaticData::hintTypeNames[hintType].GetForCurrentLanguage(MF_CLEAN); - if (distribution != ""){ - log["distribution"] = distribution; - } - - if (hintType != HINT_TYPE_FOOLISH){ - if (!(StaticData::staticHintInfoMap.contains(ownKey) && - StaticData::staticHintInfoMap[ownKey].targetChecks.size() > 0)){ - if (locations.size() == 1){ - log["location"] = StaticData::GetLocation(locations[0])->GetName();//RANDOTODO change to CustomMessage when VB is done; - } else if (locations.size() > 1){ - //If we have defaults, no need to write more - std::vector locStrings = {}; - for (size_t c = 0; c < locations.size(); c++){ - locStrings.push_back(StaticData::GetLocation(locations[c])->GetName());//RANDOTODO change to CustomMessage when VB is done - } - log["locations"] = locStrings; + std::vector hintMessages = GetAllMessageStrings(MF_CLEAN); + if (hintMessages.size() == 1) { + log["message"] = hintMessages[0]; + } else if (hintMessages.size() > 1) { + log["messages"] = hintMessages; } - } - - if (!(StaticData::staticHintInfoMap.contains(ownKey) && - StaticData::staticHintInfoMap[ownKey].targetItems.size() > 0)){ - if (items.size() == 1){ - log["item"] = StaticData::GetItemTable()[items[0]].GetName().GetEnglish();//RANDOTODO change to CustomMessage; - } else if (items.size() > 1){ - std::vector itemStrings = {}; - for (size_t c = 0; c < items.size(); c++){ - itemStrings.push_back(StaticData::GetItemTable()[items[c]].GetName().GetEnglish());//RANDOTODO change to CustomMessage - } - log["items"] = itemStrings; + + if (distribution != "") { + log["distribution"] = distribution; } - } - if (itemNamesChosen.size() == 1){ - log["itemNameChosen"] = itemNamesChosen[0]; - } else if (itemNamesChosen.size() > 1){ - std::vector nameNums = {}; - for (size_t c = 0; c < itemNamesChosen.size(); c++){ - nameNums.push_back(itemNamesChosen[c]); + if (hintType != HINT_TYPE_FOOLISH) { + if (!(StaticData::staticHintInfoMap.contains(ownKey) && + StaticData::staticHintInfoMap[ownKey].targetChecks.size() > 0)) { + if (locations.size() == 1) { + log["location"] = StaticData::GetLocation(locations[0]) + ->GetName(); // RANDOTODO change to CustomMessage when VB is done; + } else if (locations.size() > 1) { + // If we have defaults, no need to write more + std::vector locStrings = {}; + for (size_t c = 0; c < locations.size(); c++) { + locStrings.push_back(StaticData::GetLocation(locations[c]) + ->GetName()); // RANDOTODO change to CustomMessage when VB is done + } + log["locations"] = locStrings; + } + } + + if (!(StaticData::staticHintInfoMap.contains(ownKey) && + StaticData::staticHintInfoMap[ownKey].targetItems.size() > 0)) { + if (items.size() == 1) { + log["item"] = StaticData::GetItemTable()[items[0]] + .GetName() + .GetEnglish(); // RANDOTODO change to CustomMessage; + } else if (items.size() > 1) { + std::vector itemStrings = {}; + for (size_t c = 0; c < items.size(); c++) { + itemStrings.push_back(StaticData::GetItemTable()[items[c]] + .GetName() + .GetEnglish()); // RANDOTODO change to CustomMessage + } + log["items"] = itemStrings; + } + } + + if (itemNamesChosen.size() == 1) { + log["itemNameChosen"] = itemNamesChosen[0]; + } else if (itemNamesChosen.size() > 1) { + std::vector nameNums = {}; + for (size_t c = 0; c < itemNamesChosen.size(); c++) { + nameNums.push_back(itemNamesChosen[c]); + } + log["itemNamesChosen"] = nameNums; + } + } + if (areas.size() == 1) { + log["area"] = + StaticData::hintTextTable[StaticData::areaNames[areas[0]]].GetClear().GetForCurrentLanguage(MF_CLEAN); + } else if (areas.size() > 0 && !(StaticData::staticHintInfoMap.contains(ownKey) && + StaticData::staticHintInfoMap[ownKey].targetChecks.size() > 0)) { + // If we got locations from defaults, areas are derived from them and don't need logging + std::vector areaStrings = {}; + for (size_t c = 0; c < areas.size(); c++) { + areaStrings.push_back( + StaticData::hintTextTable[StaticData::areaNames[areas[c]]].GetClear().GetForCurrentLanguage( + MF_CLEAN)); + } + log["areas"] = areaStrings; } - log["itemNamesChosen"] = nameNums; - } - } - if (areas.size() == 1){ - log["area"] = StaticData::hintTextTable[StaticData::areaNames[areas[0]]].GetClear().GetForCurrentLanguage(MF_CLEAN); - } else if (areas.size() > 0 && - !(StaticData::staticHintInfoMap.contains(ownKey) && StaticData::staticHintInfoMap[ownKey].targetChecks.size() > 0)){ - // If we got locations from defaults, areas are derived from them and don't need logging - std::vector areaStrings = {}; - for (size_t c = 0; c < areas.size(); c++){ - areaStrings.push_back(StaticData::hintTextTable[StaticData::areaNames[areas[c]]].GetClear().GetForCurrentLanguage(MF_CLEAN)); - } - log["areas"] = areaStrings; - } - if (areaNamesChosen.size() == 1){ - log["areaNameChosen"] = areaNamesChosen[0]; - } else if (areaNamesChosen.size() > 1){ - std::vector nameNums = {}; - for (size_t c = 0; c < areaNamesChosen.size(); c++){ - nameNums.push_back(areaNamesChosen[c]); - } - log["areaNamesChosen"] = nameNums; - } + if (areaNamesChosen.size() == 1) { + log["areaNameChosen"] = areaNamesChosen[0]; + } else if (areaNamesChosen.size() > 1) { + std::vector nameNums = {}; + for (size_t c = 0; c < areaNamesChosen.size(); c++) { + nameNums.push_back(areaNamesChosen[c]); + } + log["areaNamesChosen"] = nameNums; + } - if (trials.size() == 1){ - log["trial"] = ctx->GetTrial(trials[0])->GetName().GetForCurrentLanguage(MF_CLEAN); - } else if (trials.size() > 0){ - std::vector trialStrings = {}; - for (size_t c = 0; c < trials.size(); c++){ - trialStrings.push_back(ctx->GetTrial(trials[c])->GetName().GetForCurrentLanguage(MF_CLEAN)); - } - log["trials"] = trialStrings; - } + if (trials.size() == 1) { + log["trial"] = ctx->GetTrial(trials[0])->GetName().GetForCurrentLanguage(MF_CLEAN); + } else if (trials.size() > 0) { + std::vector trialStrings = {}; + for (size_t c = 0; c < trials.size(); c++) { + trialStrings.push_back(ctx->GetTrial(trials[c])->GetName().GetForCurrentLanguage(MF_CLEAN)); + } + log["trials"] = trialStrings; + } - if (hintKeys.size() == 1){ - log["hintKey"] = hintKeys[0]; - } else if (hintKeys.size() > 1){ - std::vector hintKeyNums = {}; - for (size_t c = 0; c < hintKeys.size(); c++){ - hintKeyNums.push_back(hintKeys[c]); - } - log["hintKeys"] = hintKeyNums; - } + if (hintKeys.size() == 1) { + log["hintKey"] = hintKeys[0]; + } else if (hintKeys.size() > 1) { + std::vector hintKeyNums = {}; + for (size_t c = 0; c < hintKeys.size(); c++) { + hintKeyNums.push_back(hintKeys[c]); + } + log["hintKeys"] = hintKeyNums; + } - if (hintTextsChosen.size() == 1){ - log["hintTextChosen"] = hintTextsChosen[0]; - } else if (hintTextsChosen.size() > 1){ - std::vector nameNums = {}; - for (size_t c = 0; c < hintTextsChosen.size(); c++){ - nameNums.push_back(hintTextsChosen[c]); - } - log["hintTextsChosen"] = nameNums; - } + if (hintTextsChosen.size() == 1) { + log["hintTextChosen"] = hintTextsChosen[0]; + } else if (hintTextsChosen.size() > 1) { + std::vector nameNums = {}; + for (size_t c = 0; c < hintTextsChosen.size(); c++) { + nameNums.push_back(hintTextsChosen[c]); + } + log["hintTextsChosen"] = nameNums; + } - if (num != 0){ - log["num"] = num; + if (num != 0) { + log["num"] = num; + } } - - } - return log; + return log; } -void Hint::logHint(oJson& jsonData){ - auto ctx = Rando::Context::GetInstance(); - std::string logMap = "Static Hints"; - bool staticHint = true; - if (ownKey < RH_GANONDORF_HINT){ - logMap = "Gossip Stone Hints"; - staticHint = false; - } - if (enabled && - (!(staticHint && (hintType == HINT_TYPE_ITEM) && ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_CLEAR)))){ - //skip if not enabled or if a static hint with no possible variance - jsonData[logMap][Rando::StaticData::hintNames[ownKey].GetForCurrentLanguage(MF_CLEAN)] = toJSON(); - } +void Hint::logHint(oJson& jsonData) { + auto ctx = Rando::Context::GetInstance(); + std::string logMap = "Static Hints"; + bool staticHint = true; + if (ownKey < RH_GANONDORF_HINT) { + logMap = "Gossip Stone Hints"; + staticHint = false; + } + if (enabled && + (!(staticHint && (hintType == HINT_TYPE_ITEM) && ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_CLEAR)))) { + // skip if not enabled or if a static hint with no possible variance + jsonData[logMap][Rando::StaticData::hintNames[ownKey].GetForCurrentLanguage(MF_CLEAN)] = toJSON(); + } } const HintText Hint::GetItemHintText(uint8_t slot, bool mysterious) const { - //RANDOTODO make unreliant on locations, or make Hint accept ItemLocation - auto ctx = Rando::Context::GetInstance(); - RandomizerCheck hintedCheck = locations[slot]; - RandomizerGet targetRG = ctx->GetItemLocation(hintedCheck)->GetPlacedRandomizerGet(); - if (mysterious){ - return StaticData::hintTextTable[RHT_MYSTERIOUS_ITEM]; - } else if (!ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_AMBIGUOUS) && targetRG == RG_ICE_TRAP) { //RANDOTODO store in item hint instead of item - return HintText(CustomMessage({ctx->overrides[hintedCheck].GetTrickName()})); - } else { - return ctx->GetItemLocation(hintedCheck)->GetPlacedItem().GetHint(); - } + // RANDOTODO make unreliant on locations, or make Hint accept ItemLocation + auto ctx = Rando::Context::GetInstance(); + RandomizerCheck hintedCheck = locations[slot]; + RandomizerGet targetRG = ctx->GetItemLocation(hintedCheck)->GetPlacedRandomizerGet(); + if (mysterious) { + return StaticData::hintTextTable[RHT_MYSTERIOUS_ITEM]; + } else if (!ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_AMBIGUOUS) && + targetRG == RG_ICE_TRAP) { // RANDOTODO store in item hint instead of item + return HintText(CustomMessage({ ctx->overrides[hintedCheck].GetTrickName() })); + } else { + return ctx->GetItemLocation(hintedCheck)->GetPlacedItem().GetHint(); + } } -const HintText Hint::GetAreaHintText(uint8_t slot) const { - CustomMessage areaText; - if (yourPocket && areas[slot] == RA_LINKS_POCKET){ - return StaticData::hintTextTable[RHT_YOUR_POCKET]; - } else { - return StaticData::hintTextTable[Rando::StaticData::areaNames[areas[slot]]]; - } +const HintText Hint::GetAreaHintText(uint8_t slot) const { + CustomMessage areaText; + if (yourPocket && areas[slot] == RA_LINKS_POCKET) { + return StaticData::hintTextTable[RHT_YOUR_POCKET]; + } else { + return StaticData::hintTextTable[Rando::StaticData::areaNames[areas[slot]]]; + } } - -const CustomMessage Hint::GetItemName(uint8_t slot, bool mysterious) const { - uint8_t nameNum = 0; - if (itemNamesChosen.size() > slot){ - nameNum = itemNamesChosen[slot]; - } - return GetItemHintText(slot, mysterious).GetHintMessage(nameNum); +const CustomMessage Hint::GetItemName(uint8_t slot, bool mysterious) const { + uint8_t nameNum = 0; + if (itemNamesChosen.size() > slot) { + nameNum = itemNamesChosen[slot]; + } + return GetItemHintText(slot, mysterious).GetHintMessage(nameNum); } -const CustomMessage Hint::GetAreaName(uint8_t slot) const { - uint8_t nameNum = 0; - if (areaNamesChosen.size() > slot){ - nameNum = areaNamesChosen[slot]; - } - return GetAreaHintText(slot).GetHintMessage(nameNum); +const CustomMessage Hint::GetAreaName(uint8_t slot) const { + uint8_t nameNum = 0; + if (areaNamesChosen.size() > slot) { + nameNum = areaNamesChosen[slot]; + } + return GetAreaHintText(slot).GetHintMessage(nameNum); } - CustomMessage Hint::GetBridgeReqsText() { - auto ctx = Rando::Context::GetInstance(); - CustomMessage bridgeMessage; + auto ctx = Rando::Context::GetInstance(); + CustomMessage bridgeMessage; - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_ALWAYS_OPEN)) { - return StaticData::hintTextTable[RHT_BRIDGE_OPEN_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_VANILLA)) { - return StaticData::hintTextTable[RHT_BRIDGE_VANILLA_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES)) { - bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_STONES_HINT].GetHintMessage(); - bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).Get()); - } - else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS)) { - bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_MEDALLIONS_HINT].GetHintMessage(); - bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).Get()); - } - else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { - bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_REWARDS_HINT].GetHintMessage(); - bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Get()); - } - else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS)) { - bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_DUNGEONS_HINT].GetHintMessage(); - bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Get()); - } - else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { - bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_TOKENS_HINT].GetHintMessage(); - bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Get()); - } - else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)) { - return StaticData::hintTextTable[RHT_BRIDGE_GREG_HINT].GetHintMessage(); - } - return bridgeMessage; + if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_ALWAYS_OPEN)) { + return StaticData::hintTextTable[RHT_BRIDGE_OPEN_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_VANILLA)) { + return StaticData::hintTextTable[RHT_BRIDGE_VANILLA_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES)) { + bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_STONES_HINT].GetHintMessage(); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).Get()); + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS)) { + bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_MEDALLIONS_HINT].GetHintMessage(); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).Get()); + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { + bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_REWARDS_HINT].GetHintMessage(); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Get()); + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS)) { + bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_DUNGEONS_HINT].GetHintMessage(); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Get()); + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { + bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_TOKENS_HINT].GetHintMessage(); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Get()); + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)) { + return StaticData::hintTextTable[RHT_BRIDGE_GREG_HINT].GetHintMessage(); + } + return bridgeMessage; } CustomMessage Hint::GetGanonBossKeyText() { - auto ctx = Rando::Context::GetInstance(); - CustomMessage ganonBossKeyMessage; + auto ctx = Rando::Context::GetInstance(); + CustomMessage ganonBossKeyMessage; - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH)) { - return StaticData::hintTextTable[RHT_GANON_BK_START_WITH_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA)) { - return StaticData::hintTextTable[RHT_GANON_BK_VANILLA_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON)) { - return StaticData::hintTextTable[RHT_GANON_BK_OWN_DUNGEON_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON)) { - return StaticData::hintTextTable[RHT_GANON_BK_ANY_DUNGEON_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { - return StaticData::hintTextTable[RHT_GANON_BK_OVERWORLD_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANYWHERE)) { - return StaticData::hintTextTable[RHT_GANON_BK_ANYWHERE_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { - return StaticData::hintTextTable[RHT_GANON_BK_SKULLTULA_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_VANILLA)) { - return StaticData::hintTextTable[RHT_LACS_VANILLA_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { - ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_STONES_HINT].GetHintMessage(); - ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_STONE_COUNT).Get()); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_MEDALLIONS)) { - ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_MEDALLIONS_HINT].GetHintMessage(); - ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_MEDALLION_COUNT).Get()); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_REWARDS)) { - ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_REWARDS_HINT].GetHintMessage(); - ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_REWARD_COUNT).Get()); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS)) { - ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_DUNGEONS_HINT].GetHintMessage(); - ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get()); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_TOKENS)) { - ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_TOKENS_HINT].GetHintMessage(); - ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_TOKEN_COUNT).Get()); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_TRIFORCE_HUNT)) { - return StaticData::hintTextTable[RHT_GANON_BK_TRIFORCE_HINT].GetHintMessage(); - } - return ganonBossKeyMessage; + if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { + return StaticData::hintTextTable[RHT_GANON_BK_TRIFORCE_HINT].GetHintMessage(); + } + + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH)) { + return StaticData::hintTextTable[RHT_GANON_BK_START_WITH_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA)) { + return StaticData::hintTextTable[RHT_GANON_BK_VANILLA_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON)) { + return StaticData::hintTextTable[RHT_GANON_BK_OWN_DUNGEON_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON)) { + return StaticData::hintTextTable[RHT_GANON_BK_ANY_DUNGEON_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { + return StaticData::hintTextTable[RHT_GANON_BK_OVERWORLD_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANYWHERE)) { + return StaticData::hintTextTable[RHT_GANON_BK_ANYWHERE_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { + return StaticData::hintTextTable[RHT_GANON_BK_SKULLTULA_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_VANILLA)) { + return StaticData::hintTextTable[RHT_LACS_VANILLA_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { + ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_STONES_HINT].GetHintMessage(); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_STONE_COUNT).Get()); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_MEDALLIONS)) { + ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_MEDALLIONS_HINT].GetHintMessage(); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_MEDALLION_COUNT).Get()); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_REWARDS)) { + ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_REWARDS_HINT].GetHintMessage(); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_REWARD_COUNT).Get()); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS)) { + ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_DUNGEONS_HINT].GetHintMessage(); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get()); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_TOKENS)) { + ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_TOKENS_HINT].GetHintMessage(); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_TOKEN_COUNT).Get()); + } + return ganonBossKeyMessage; } - void Hint::AddHintedLocation(RandomizerCheck location) { locations.push_back(location); } @@ -670,53 +657,53 @@ const std::string& Hint::GetDistribution() const { return distribution; } -bool Hint::IsEnabled() const{ - return enabled; +bool Hint::IsEnabled() const { + return enabled; } -std::vector Hint::GetHintTextKeys() const{ - return hintKeys; +std::vector Hint::GetHintTextKeys() const { + return hintKeys; } -std::vector Hint::GetHintedItems() const{ - return items; +std::vector Hint::GetHintedItems() const { + return items; } -std::vector Hint::GetItemNamesChosen() const{ - return itemNamesChosen; +std::vector Hint::GetItemNamesChosen() const { + return itemNamesChosen; } -std::vector Hint::GetHintTextsChosen() const{ - return hintTextsChosen; +std::vector Hint::GetHintTextsChosen() const { + return hintTextsChosen; } -std::vector Hint::GetAreaTextsChosen() const{ - return areaNamesChosen; +std::vector Hint::GetAreaTextsChosen() const { + return areaNamesChosen; } -std::vector Hint::GetHintedTrials() const{ - return trials; +std::vector Hint::GetHintedTrials() const { + return trials; } -int Hint::GetNum(){ - return num; +int Hint::GetNum() { + return num; } void Hint::ResetVariables() { - ownKey = RH_NONE; - num = 0; - yourPocket = false; - messages = {}; - hintKeys = {}; - locations = {}; - items = {}; - trials = {}; - hintType = HINT_TYPE_HINT_KEY; - areas = {}; - distribution = ""; - enabled = false; - itemNamesChosen = {}; - hintTextsChosen = {}; - areaNamesChosen = {}; + ownKey = RH_NONE; + num = 0; + yourPocket = false; + messages = {}; + hintKeys = {}; + locations = {}; + items = {}; + trials = {}; + hintType = HINT_TYPE_HINT_KEY; + areas = {}; + distribution = ""; + enabled = false; + itemNamesChosen = {}; + hintTextsChosen = {}; + areaNamesChosen = {}; } -} \ No newline at end of file +} // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/hint.h b/soh/soh/Enhancements/randomizer/hint.h index 03e1af850e..7ff46a104a 100644 --- a/soh/soh/Enhancements/randomizer/hint.h +++ b/soh/soh/Enhancements/randomizer/hint.h @@ -10,73 +10,64 @@ using oJson = nlohmann::ordered_json; namespace Rando { class Hint { - public: - Hint(); - Hint(RandomizerHint ownKey_, - HintType hintType_, - std::string distributionName_, - std::vector hintKeys_, - std::vector locations_, - std::vector areas_ = {}, - std::vector trials_ = {}); - Hint(RandomizerHint ownKey_, - HintType hintType_, - std::vector hintKeys_, - std::vector locations_ = {}, - std::vector areas_ = {}, - std::vector trials_ = {}, - bool yourPocket_ = false, - int num_ = 0); - Hint(RandomizerHint ownKey_, std::vector messages_); - Hint(RandomizerHint ownKey_, nlohmann::json json_); - void FillGapsInData(); - void SetLocationsAsHinted() const; - void NamesChosen(); - uint8_t GetNumberOfMessages() const; - const std::vector GetAllMessageStrings(MessageFormat format = MF_AUTO_FORMAT) const ; - const CustomMessage GetHintMessage(MessageFormat format = MF_AUTO_FORMAT, uint8_t id = 0) const ; - const HintText GetHintText(uint8_t id = 0) const; - oJson toJSON(); - void logHint(oJson& jsonData); - const HintText GetItemHintText(uint8_t slot, bool mysterious = false) const; - const HintText GetAreaHintText(uint8_t slot) const; - const CustomMessage GetItemName(uint8_t slot, bool mysterious = false) const; - const CustomMessage GetAreaName(uint8_t slot) const; - static CustomMessage GetBridgeReqsText(); - static CustomMessage GetGanonBossKeyText(); - void AddHintedLocation (RandomizerCheck location); - std::vector GetHintedLocations() const; - void SetHintType (HintType type); - HintType GetHintType() const; - void AddHintedArea (RandomizerArea area); - std::vector GetHintedAreas() const; - void SetDistribution (std::string distribution); - const std::string& GetDistribution() const; - bool IsEnabled() const; - std::vector GetHintTextKeys() const; - std::vector GetHintedItems() const; - std::vector GetItemNamesChosen() const; - std::vector GetHintTextsChosen() const; - std::vector GetAreaTextsChosen() const; - std::vector GetHintedTrials() const; - int GetNum(); - void ResetVariables(); + public: + Hint(); + Hint(RandomizerHint ownKey_, HintType hintType_, std::string distributionName_, + std::vector hintKeys_, std::vector locations_, + std::vector areas_ = {}, std::vector trials_ = {}); + Hint(RandomizerHint ownKey_, HintType hintType_, std::vector hintKeys_, + std::vector locations_ = {}, std::vector areas_ = {}, + std::vector trials_ = {}, bool yourPocket_ = false, int num_ = 0); + Hint(RandomizerHint ownKey_, std::vector messages_); + Hint(RandomizerHint ownKey_, nlohmann::json json_); + void FillGapsInData(); + void SetLocationsAsHinted() const; + void NamesChosen(); + size_t GetNumberOfMessages() const; + const std::vector GetAllMessageStrings(MessageFormat format = MF_AUTO_FORMAT) const; + const CustomMessage GetHintMessage(MessageFormat format = MF_AUTO_FORMAT, size_t id = 0) const; + const HintText GetHintText(size_t id = 0) const; + oJson toJSON(); + void logHint(oJson& jsonData); + const HintText GetItemHintText(uint8_t slot, bool mysterious = false) const; + const HintText GetAreaHintText(uint8_t slot) const; + const CustomMessage GetItemName(uint8_t slot, bool mysterious = false) const; + const CustomMessage GetAreaName(uint8_t slot) const; + static CustomMessage GetBridgeReqsText(); + static CustomMessage GetGanonBossKeyText(); + void AddHintedLocation(RandomizerCheck location); + std::vector GetHintedLocations() const; + void SetHintType(HintType type); + HintType GetHintType() const; + void AddHintedArea(RandomizerArea area); + std::vector GetHintedAreas() const; + void SetDistribution(std::string distribution); + const std::string& GetDistribution() const; + bool IsEnabled() const; + std::vector GetHintTextKeys() const; + std::vector GetHintedItems() const; + std::vector GetItemNamesChosen() const; + std::vector GetHintTextsChosen() const; + std::vector GetAreaTextsChosen() const; + std::vector GetHintedTrials() const; + int GetNum(); + void ResetVariables(); - private: - RandomizerHint ownKey = RH_NONE; - HintType hintType = HINT_TYPE_HINT_KEY; - std::string distribution = ""; - std::vector hintKeys = {}; - std::vector locations = {}; - std::vector areas = {}; - std::vector trials = {}; - bool yourPocket = false; - int num = 0; - std::vector messages = {}; - std::vector items = {}; - bool enabled = false; - std::vector itemNamesChosen = {}; - std::vector hintTextsChosen = {}; - std::vector areaNamesChosen = {}; + private: + RandomizerHint ownKey = RH_NONE; + HintType hintType = HINT_TYPE_HINT_KEY; + std::string distribution = ""; + std::vector hintKeys = {}; + std::vector locations = {}; + std::vector areas = {}; + std::vector trials = {}; + bool yourPocket = false; + int num = 0; + std::vector messages = {}; + std::vector items = {}; + bool enabled = false; + std::vector itemNamesChosen = {}; + std::vector hintTextsChosen = {}; + std::vector areaNamesChosen = {}; }; -} \ No newline at end of file +} // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index f48b7da5a9..92d210300d 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -8,14 +8,11 @@ #include "soh/Enhancements/randomizer/dungeon.h" #include "soh/Enhancements/randomizer/fishsanity.h" #include "soh/Enhancements/randomizer/static_data.h" -#include "soh/Enhancements/randomizer/ShufflePots.h" -#include "soh/Enhancements/randomizer/ShuffleFreestanding.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/SohGui/ImGuiUtils.h" #include "soh/Notification/Notification.h" #include "soh/SaveManager.h" -#include "soh/Enhancements/randomizer/ShuffleFairies.h" extern "C" { #include "macros.h" @@ -29,6 +26,7 @@ extern "C" { #include "src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.h" #include "src/overlays/actors/ovl_En_Dns/z_en_dns.h" #include "src/overlays/actors/ovl_En_Gb/z_en_gb.h" +#include "src/overlays/actors/ovl_En_Po_Field/z_en_po_field.h" #include "src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h" #include "src/overlays/actors/ovl_En_Ko/z_en_ko.h" #include "src/overlays/actors/ovl_En_Mk/z_en_mk.h" @@ -43,9 +41,9 @@ extern "C" { #include "src/overlays/actors/ovl_En_Box/z_en_box.h" #include "src/overlays/actors/ovl_En_Skj/z_en_skj.h" #include "src/overlays/actors/ovl_En_Hy/z_en_hy.h" -#include "src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h" #include "src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h" #include "src/overlays/actors/ovl_En_Ge1/z_en_ge1.h" +#include "src/overlays/actors/ovl_En_Ge2/z_en_ge2.h" #include "src/overlays/actors/ovl_En_Ds/z_en_ds.h" #include "src/overlays/actors/ovl_En_Gm/z_en_gm.h" #include "src/overlays/actors/ovl_En_Js/z_en_js.h" @@ -60,34 +58,38 @@ extern "C" { extern SaveContext gSaveContext; extern PlayState* gPlayState; extern void func_8084DFAC(PlayState* play, Player* player); -extern void Player_SetupActionPreserveAnimMovement(PlayState* play, Player* player, PlayerActionFunc actionFunc, s32 flags); +extern void Player_SetupActionPreserveAnimMovement(PlayState* play, Player* player, PlayerActionFunc actionFunc, + s32 flags); extern s32 Player_SetupWaitForPutAway(PlayState* play, Player* player, AfterPutAwayFunc func); -extern void Play_InitEnvironment(PlayState * play, s16 skyboxId); +extern void Play_InitEnvironment(PlayState* play, s16 skyboxId); extern void EnMk_Wait(EnMk* enMk, PlayState* play); extern void func_80ABA778(EnNiwLady* enNiwLady, PlayState* play); +extern void EnGe1_Wait_Archery(EnGe1* enGe1, PlayState* play); +extern void EnGe1_SetAnimationIdle(EnGe1* enGe1); +extern void EnGe1_SetAnimationIdle(EnGe1* enGe1); +extern void EnGe2_SetupCapturePlayer(EnGe2* enGe2, PlayState* play); } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() - bool LocMatchesQuest(Rando::Location loc) { if (loc.GetQuest() == RCQUEST_BOTH) { return true; } else { auto dungeon = OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene()); - return (dungeon->IsMQ() && loc.GetQuest() == RCQUEST_MQ) || (dungeon->IsVanilla() && loc.GetQuest() == RCQUEST_VANILLA); + return (dungeon->IsMQ() && loc.GetQuest() == RCQUEST_MQ) || + (dungeon->IsVanilla() && loc.GetQuest() == RCQUEST_VANILLA); } } RandomizerCheck GetRandomizerCheckFromFlag(int16_t flagType, int16_t flag) { for (auto& loc : Rando::StaticData::GetLocationTable()) { - if ((loc.GetCollectionCheck().flag == flag && ( - (flagType == FLAG_INF_TABLE && loc.GetCollectionCheck().type == SPOILER_CHK_INF_TABLE) || - (flagType == FLAG_EVENT_CHECK_INF && loc.GetCollectionCheck().type == SPOILER_CHK_EVENT_CHK_INF) || - (flagType == FLAG_ITEM_GET_INF && loc.GetCollectionCheck().type == SPOILER_CHK_ITEM_GET_INF) || - (flagType == FLAG_RANDOMIZER_INF && loc.GetCollectionCheck().type == SPOILER_CHK_RANDOMIZER_INF) - ) || - (loc.GetActorParams() == flag && flagType == FLAG_GS_TOKEN && loc.GetCollectionCheck().type == SPOILER_CHK_GOLD_SKULLTULA) - ) && LocMatchesQuest(loc)) { + if ((loc.GetCollectionCheck().flag == flag && + ((flagType == FLAG_INF_TABLE && loc.GetCollectionCheck().type == SPOILER_CHK_INF_TABLE) || + (flagType == FLAG_EVENT_CHECK_INF && loc.GetCollectionCheck().type == SPOILER_CHK_EVENT_CHK_INF) || + (flagType == FLAG_ITEM_GET_INF && loc.GetCollectionCheck().type == SPOILER_CHK_ITEM_GET_INF) || + (flagType == FLAG_RANDOMIZER_INF && loc.GetCollectionCheck().type == SPOILER_CHK_RANDOMIZER_INF)) || + (loc.GetActorParams() == flag && flagType == FLAG_GS_TOKEN && + loc.GetCollectionCheck().type == SPOILER_CHK_GOLD_SKULLTULA)) && + LocMatchesQuest(loc)) { return loc.GetRandomizerCheck(); } } @@ -97,11 +99,11 @@ RandomizerCheck GetRandomizerCheckFromFlag(int16_t flagType, int16_t flag) { RandomizerCheck GetRandomizerCheckFromSceneFlag(int16_t sceneNum, int16_t flagType, int16_t flag) { for (auto& loc : Rando::StaticData::GetLocationTable()) { - if (loc.GetCollectionCheck().scene == sceneNum && loc.GetCollectionCheck().flag == flag && ( - (flagType == FLAG_SCENE_TREASURE && loc.GetCollectionCheck().type == SPOILER_CHK_CHEST) || - (flagType == FLAG_SCENE_COLLECTIBLE && loc.GetCollectionCheck().type == SPOILER_CHK_COLLECTABLE) || - (flagType == FLAG_GS_TOKEN && loc.GetCollectionCheck().type == SPOILER_CHK_GOLD_SKULLTULA) - ) && LocMatchesQuest(loc)) { + if (loc.GetCollectionCheck().scene == sceneNum && loc.GetCollectionCheck().flag == flag && + ((flagType == FLAG_SCENE_TREASURE && loc.GetCollectionCheck().type == SPOILER_CHK_CHEST) || + (flagType == FLAG_SCENE_COLLECTIBLE && loc.GetCollectionCheck().type == SPOILER_CHK_COLLECTABLE) || + (flagType == FLAG_GS_TOKEN && loc.GetCollectionCheck().type == SPOILER_CHK_GOLD_SKULLTULA)) && + LocMatchesQuest(loc)) { return loc.GetRandomizerCheck(); } } @@ -122,7 +124,8 @@ bool MeetsLACSRequirements() { } break; case RO_GANON_BOSS_KEY_LACS_REWARDS: - if ((CheckMedallionCount() + CheckStoneCount() + CheckLACSRewardCount()) >= RAND_GET_OPTION(RSK_LACS_REWARD_COUNT)) { + if ((CheckMedallionCount() + CheckStoneCount() + CheckLACSRewardCount()) >= + RAND_GET_OPTION(RSK_LACS_REWARD_COUNT)) { return true; } break; @@ -171,13 +174,15 @@ bool MeetsRainbowBridgeRequirements() { break; } case RO_BRIDGE_MEDALLIONS: { - if ((CheckMedallionCount() + CheckBridgeRewardCount()) >= RAND_GET_OPTION(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT)) { + if ((CheckMedallionCount() + CheckBridgeRewardCount()) >= + RAND_GET_OPTION(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT)) { return true; } break; } case RO_BRIDGE_DUNGEON_REWARDS: { - if ((CheckMedallionCount() + CheckStoneCount() + CheckBridgeRewardCount()) >= RAND_GET_OPTION(RSK_RAINBOW_BRIDGE_REWARD_COUNT)) { + if ((CheckMedallionCount() + CheckStoneCount() + CheckBridgeRewardCount()) >= + RAND_GET_OPTION(RSK_RAINBOW_BRIDGE_REWARD_COUNT)) { return true; } break; @@ -229,15 +234,24 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) { } if (flagType == FLAG_EVENT_CHECK_INF && flag == EVENTCHKINF_TALON_WOKEN_IN_CASTLE) { - //remove chicken as this is the only use for it + // remove chicken as this is the only use for it Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_CHICKEN); } - RandomizerCheck rc = GetRandomizerCheckFromFlag(flagType, flag); - if (rc == RC_UNKNOWN_CHECK) return; + if (flagType == FLAG_EVENT_CHECK_INF && flag == EVENTCHKINF_OBTAINED_ZELDAS_LETTER) { + Flags_SetRandomizerInf(RAND_INF_ZELDAS_LETTER); + } + RandomizerCheck rc = GetRandomizerCheckFromFlag(flagType, flag); + if (rc == RC_UNKNOWN_CHECK) + return; + + if (flagType == FLAG_GS_TOKEN && + Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OFF)) + return; auto loc = Rando::Context::GetInstance()->GetItemLocation(rc); - if (loc == nullptr || loc->HasObtained() || loc->GetPlacedRandomizerGet() == RG_NONE) return; + if (loc == nullptr || loc->HasObtained() || loc->GetPlacedRandomizerGet() == RG_NONE) + return; SPDLOG_INFO("Queuing RC: {}", static_cast(rc)); randomizerQueuedChecks.push(rc); @@ -245,17 +259,17 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) { void RandomizerOnSceneFlagSetHandler(int16_t sceneNum, int16_t flagType, int16_t flag) { if (RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF && - sceneNum == SCENE_GERUDOS_FORTRESS && - flagType == FLAG_SCENE_SWITCH && - flag == 0x3A) { + sceneNum == SCENE_GERUDOS_FORTRESS && flagType == FLAG_SCENE_SWITCH && flag == 0x3A) { Flags_SetRandomizerInf(RAND_INF_GF_GTG_GATE_PERMANENTLY_OPEN); } RandomizerCheck rc = GetRandomizerCheckFromSceneFlag(sceneNum, flagType, flag); - if (rc == RC_UNKNOWN_CHECK) return; + if (rc == RC_UNKNOWN_CHECK) + return; auto loc = Rando::Context::GetInstance()->GetItemLocation(rc); - if (loc == nullptr || loc->HasObtained() || loc->GetPlacedRandomizerGet() == RG_NONE) return; + if (loc == nullptr || loc->HasObtained() || loc->GetPlacedRandomizerGet() == RG_NONE) + return; SPDLOG_INFO("Queuing RC: {}", static_cast(rc)); randomizerQueuedChecks.push(rc); @@ -265,14 +279,17 @@ static Vec3f spawnPos = { 0.0f, -999.0f, 0.0f }; void RandomizerOnPlayerUpdateForRCQueueHandler() { // If we're already queued, don't queue again - if (randomizerQueuedCheck != RC_UNKNOWN_CHECK) return; + if (randomizerQueuedCheck != RC_UNKNOWN_CHECK) + return; // If there's nothing to queue, don't queue - if (randomizerQueuedChecks.size() < 1) return; + if (randomizerQueuedChecks.size() < 1) + return; // If we're in a cutscene, don't queue Player* player = GET_PLAYER(gPlayState); - if (Player_InBlockingCsMode(gPlayState, player) || player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { + if (Player_InBlockingCsMode(gPlayState, player) || player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || + player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { return; } @@ -280,7 +297,8 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() { auto loc = Rando::Context::GetInstance()->GetItemLocation(rc); RandomizerGet vanillaRandomizerGet = Rando::StaticData::GetLocation(rc)->GetVanillaItem(); GetItemID vanillaItem = (GetItemID)Rando::StaticData::RetrieveItem(vanillaRandomizerGet).GetItemID(); - GetItemEntry getItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)vanillaRandomizerGet); + GetItemEntry getItemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)vanillaRandomizerGet); if (loc->HasObtained()) { SPDLOG_INFO("RC {} already obtained, skipping", static_cast(rc)); @@ -288,28 +306,26 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() { iceTrapScale = 0.0f; randomizerQueuedCheck = rc; randomizerQueuedItemEntry = getItemEntry; - SPDLOG_INFO("Queueing Item mod {} item {} from RC {}", getItemEntry.modIndex, getItemEntry.itemId, static_cast(rc)); + SPDLOG_INFO("Queueing Item mod {} item {} from RC {}", getItemEntry.modIndex, getItemEntry.itemId, + static_cast(rc)); if ( // Skipping ItemGet animation incompatible with checks that require closing a text box to finish - rc != RC_HF_OCARINA_OF_TIME_ITEM && - rc != RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST && - rc != RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE && - rc != RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE && + rc != RC_HF_OCARINA_OF_TIME_ITEM && rc != RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST && + rc != RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE && rc != RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE && // Always show ItemGet animation for ice traps !(getItemEntry.modIndex == MOD_RANDOMIZER && getItemEntry.getItemId == RG_ICE_TRAP) && - ( - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_ALL || - ( - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_JUNK && - ( - getItemEntry.getItemCategory == ITEM_CATEGORY_JUNK || - getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN || - getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER - ) - ) - ) - ) { - Item_DropCollectible(gPlayState, &spawnPos, ITEM00_SOH_GIVE_ITEM_ENTRY | 0x8000); + // Always show ItemGet animation outside of randomizer to keep behaviour consistent in vanilla + IS_RANDO && + (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK) == SGIA_ALL || + (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK) == SGIA_JUNK && + ( + // crude fix to ensure map hints are readable. Ideally replace with better hint tracking. + !(getItemEntry.getItemId >= RG_DEKU_TREE_MAP && getItemEntry.getItemId <= RG_ICE_CAVERN_MAP && + getItemEntry.modIndex == MOD_RANDOMIZER) && + (getItemEntry.getItemCategory == ITEM_CATEGORY_JUNK || + getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN || + getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER))))) { + Item_DropCollectible(gPlayState, &spawnPos, static_cast(ITEM00_SOH_GIVE_ITEM_ENTRY | 0x8000)); } } @@ -317,14 +333,18 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() { } void RandomizerOnPlayerUpdateForItemQueueHandler() { - if (randomizerQueuedCheck == RC_UNKNOWN_CHECK) return; + if (randomizerQueuedCheck == RC_UNKNOWN_CHECK) + return; Player* player = GET_PLAYER(gPlayState); - if (player == NULL || Player_InBlockingCsMode(gPlayState, player) || player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { + if (player == NULL || Player_InBlockingCsMode(gPlayState, player) || + player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || + player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { return; } - SPDLOG_INFO("Attempting to give Item mod {} item {} from RC {}", randomizerQueuedItemEntry.modIndex, randomizerQueuedItemEntry.itemId, static_cast(randomizerQueuedCheck)); + SPDLOG_INFO("Attempting to give Item mod {} item {} from RC {}", randomizerQueuedItemEntry.modIndex, + randomizerQueuedItemEntry.itemId, static_cast(randomizerQueuedCheck)); GiveItemEntryWithoutActor(gPlayState, randomizerQueuedItemEntry); if (player->stateFlags1 & PLAYER_STATE1_IN_WATER) { // Allow the player to receive the item while swimming @@ -334,26 +354,26 @@ void RandomizerOnPlayerUpdateForItemQueueHandler() { } void RandomizerOnItemReceiveHandler(GetItemEntry receivedItemEntry) { - if (randomizerQueuedCheck == RC_UNKNOWN_CHECK) return; + if (randomizerQueuedCheck == RC_UNKNOWN_CHECK) + return; auto loc = Rando::Context::GetInstance()->GetItemLocation(randomizerQueuedCheck); - if (randomizerQueuedItemEntry.modIndex == receivedItemEntry.modIndex && randomizerQueuedItemEntry.itemId == receivedItemEntry.itemId) { - SPDLOG_INFO("Item received mod {} item {} from RC {}", receivedItemEntry.modIndex, receivedItemEntry.itemId, static_cast(randomizerQueuedCheck)); + if (randomizerQueuedItemEntry.modIndex == receivedItemEntry.modIndex && + randomizerQueuedItemEntry.itemId == receivedItemEntry.itemId) { + SPDLOG_INFO("Item received mod {} item {} from RC {}", receivedItemEntry.modIndex, receivedItemEntry.itemId, + static_cast(randomizerQueuedCheck)); loc->SetCheckStatus(RCSHOW_COLLECTED); CheckTracker::SpoilAreaFromCheck(randomizerQueuedCheck); CheckTracker::RecalculateAllAreaTotals(); + CheckTracker::RecalculateAvailableChecks(); SaveManager::Instance->SaveSection(gSaveContext.fileNum, SECTION_ID_TRACKER_DATA, true); randomizerQueuedCheck = RC_UNKNOWN_CHECK; randomizerQueuedItemEntry = GET_ITEM_NONE; } - if ( - receivedItemEntry.modIndex == MOD_NONE && ( - receivedItemEntry.itemId == ITEM_HEART_PIECE || - receivedItemEntry.itemId == ITEM_HEART_PIECE_2 || - receivedItemEntry.itemId == ITEM_HEART_CONTAINER - ) - ) { + if (receivedItemEntry.modIndex == MOD_NONE && + (receivedItemEntry.itemId == ITEM_HEART_PIECE || receivedItemEntry.itemId == ITEM_HEART_PIECE_2 || + receivedItemEntry.itemId == ITEM_HEART_CONTAINER)) { gSaveContext.healthAccumulator = 0x140; // Refill 20 hearts if ((s32)(gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000) { gSaveContext.inventory.questItems ^= 0x40000000; @@ -362,11 +382,14 @@ void RandomizerOnItemReceiveHandler(GetItemEntry receivedItemEntry) { } } - if (loc->GetRandomizerCheck() == RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST && !CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { + if (loc->GetRandomizerCheck() == RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST && + !CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { static uint32_t updateHook; updateHook = GameInteractor::Instance->RegisterGameHook([]() { Player* player = GET_PLAYER(gPlayState); - if (player == NULL || Player_InBlockingCsMode(gPlayState, player) || player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { + if (player == NULL || Player_InBlockingCsMode(gPlayState, player) || + player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || + player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { return; } @@ -397,7 +420,7 @@ void EnExItem_WaitForObjectRandomized(EnExItem* enExItem, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, enExItem->objectIdx)) { enExItem->actor.draw = (ActorFunc)EnExItem_DrawRandomizedItem; Actor_SetScale(&enExItem->actor, enExItem->scale); - + // for now we're just using this to not have items float // below the bowling counter, but it would be nice to use // this to not draw gigantic skull tokens etc. @@ -411,7 +434,7 @@ void EnExItem_WaitForObjectRandomized(EnExItem* enExItem, PlayState* play) { } void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play) { - f32 mtxScale = CVarGetFloat(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimationScale"), 10.0f); + f32 mtxScale = CVarGetFloat(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimationScale"), 10.0f); Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); GetItemEntry randoItem = enItem00->itemEntry; if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0) && @@ -464,8 +487,7 @@ void ItemEtcetera_DrawRandomizedItemThroughLens(ItemEtcetera* itemEtcetera, Play } void ItemEtcetera_func_80B858B4_Randomized(ItemEtcetera* itemEtcetera, PlayState* play) { - if (itemEtcetera->actor.xzDistToPlayer < 30.0f && - fabsf(itemEtcetera->actor.yDistToPlayer) < 50.0f) { + if (itemEtcetera->actor.xzDistToPlayer < 30.0f && fabsf(itemEtcetera->actor.yDistToPlayer) < 50.0f) { if ((itemEtcetera->actor.params & 0xFF) == 1) { Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER); Flags_SetSwitch(play, 0xB); @@ -484,8 +506,7 @@ void ItemEtcetera_func_80B85824_Randomized(ItemEtcetera* itemEtcetera, PlayState return; } - if (itemEtcetera->actor.xzDistToPlayer < 30.0f && - fabsf(itemEtcetera->actor.yDistToPlayer) < 50.0f) { + if (itemEtcetera->actor.xzDistToPlayer < 30.0f && fabsf(itemEtcetera->actor.yDistToPlayer) < 50.0f) { Flags_SetTreasure(play, 0x1F); Actor_Kill(&itemEtcetera->actor); @@ -524,43 +545,21 @@ u8 EnDs_RandoCanGetGrannyItem() { // Traded odd mushroom when adult trade is on ((RAND_GET_OPTION(RSK_SHUFFLE_ADULT_TRADE) && Flags_GetItemGetInf(ITEMGETINF_30)) || // Found claim check when adult trade is off - (!RAND_GET_OPTION(RSK_SHUFFLE_ADULT_TRADE) && - INV_CONTENT(ITEM_CLAIM_CHECK) == ITEM_CLAIM_CHECK)); + (!RAND_GET_OPTION(RSK_SHUFFLE_ADULT_TRADE) && INV_CONTENT(ITEM_CLAIM_CHECK) == ITEM_CLAIM_CHECK)); } u8 EnJs_RandoCanGetCarpetMerchantItem() { - return (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL || - RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) && - // If the rando check has already been awarded, use vanilla behavior. - !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN); + return (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL || + RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) && + // If the rando check has already been awarded, use vanilla behavior. + !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN); } u8 EnGm_RandoCanGetMedigoronItem() { - return (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL || - RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) && - // If the rando check has already been awarded, use vanilla behavior. - !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_MEDIGORON); -} - -RandomizerCheck EnFr_RandomizerCheckFromSongIndex(u16 songIndex) { - switch (songIndex) { - case FROG_ZL: - return RC_ZR_FROGS_ZELDAS_LULLABY; - case FROG_EPONA: - return RC_ZR_FROGS_EPONAS_SONG; - case FROG_SARIA: - return RC_ZR_FROGS_SARIAS_SONG; - case FROG_SUNS: - return RC_ZR_FROGS_SUNS_SONG; - case FROG_SOT: - return RC_ZR_FROGS_SONG_OF_TIME; - case FROG_STORMS: - return RC_ZR_FROGS_IN_THE_RAIN; - case FROG_CHOIR_SONG: - return RC_ZR_FROGS_OCARINA_GAME; - default: - return RC_UNKNOWN_CHECK; - } + return (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL || + RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) && + // If the rando check has already been awarded, use vanilla behavior. + !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_MEDIGORON); } void RandomizerSetChestGameRandomizerInf(RandomizerCheck rc) { @@ -611,44 +610,50 @@ void func_8083A434_override(PlayState* play, Player* player) { player->stateFlags1 |= PLAYER_STATE1_GETTING_ITEM | PLAYER_STATE1_IN_CUTSCENE; } -bool ShouldGiveFishingPrize(f32 sFishOnHandLength){ +bool ShouldGiveFishingPrize(f32 sFishOnHandLength) { // RANDOTODO: update the enhancement sliders to not allow // values above rando fish weight values when rando'd - if(LINK_IS_CHILD) { - int32_t weight = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) ? CVarGetInteger(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 10) : 10; + if (LINK_IS_CHILD) { + int32_t weight = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) + ? CVarGetInteger(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 10) + : 10; f32 score = sqrt(((f32)weight - 0.5f) / 0.0036f); - return sFishOnHandLength >= score && (IS_RANDO ? !Flags_GetRandomizerInf(RAND_INF_CHILD_FISHING) : !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_CHILD)); - } else - { - int32_t weight = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) ? CVarGetInteger(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 13) : 13; + return sFishOnHandLength >= score && (IS_RANDO ? !Flags_GetRandomizerInf(RAND_INF_CHILD_FISHING) + : !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_CHILD)); + } else { + int32_t weight = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) + ? CVarGetInteger(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 13) + : 13; f32 score = sqrt(((f32)weight - 0.5f) / 0.0036f); - return sFishOnHandLength >= score && (IS_RANDO ? !Flags_GetRandomizerInf(RAND_INF_ADULT_FISHING) : !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_ADULT)); + return sFishOnHandLength >= score && (IS_RANDO ? !Flags_GetRandomizerInf(RAND_INF_ADULT_FISHING) + : !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_ADULT)); } } void RandomizerOnDialogMessageHandler() { - MessageContext *msgCtx = &gPlayState->msgCtx; - Actor *actor = msgCtx->talkActor; + MessageContext* msgCtx = &gPlayState->msgCtx; + Actor* actor = msgCtx->talkActor; auto ctx = Rando::Context::GetInstance(); bool revealMerchant = ctx->GetOption(RSK_MERCHANT_TEXT_HINT).Get() != RO_GENERIC_OFF; bool nonBeanMerchants = ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL); + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL); RandomizerCheck reveal = RC_UNKNOWN_CHECK; - if (ctx->GetOption(RSK_CHICKENS_HINT) && (msgCtx->textId >= TEXT_ANJU_PLEASE_BRING_MY_CUCCOS_BACK && msgCtx->textId <= TEXT_ANJU_PLEASE_BRING_1_CUCCO)) { + if (ctx->GetOption(RSK_CHICKENS_HINT) && + (msgCtx->textId >= TEXT_ANJU_PLEASE_BRING_MY_CUCCOS_BACK && msgCtx->textId <= TEXT_ANJU_PLEASE_BRING_1_CUCCO)) { reveal = RC_KAK_ANJU_AS_CHILD; } else { switch (msgCtx->textId) { case TEXT_SKULLTULA_PEOPLE_IM_CURSED: - if (actor->params == 1 && ctx->GetOption(RSK_KAK_10_SKULLS_HINT)){ + if (actor->params == 1 && ctx->GetOption(RSK_KAK_10_SKULLS_HINT)) { reveal = RC_KAK_10_GOLD_SKULLTULA_REWARD; - } else if (actor->params == 2 && ctx->GetOption(RSK_KAK_20_SKULLS_HINT)){ + } else if (actor->params == 2 && ctx->GetOption(RSK_KAK_20_SKULLS_HINT)) { reveal = RC_KAK_20_GOLD_SKULLTULA_REWARD; - } else if (actor->params == 3 && ctx->GetOption(RSK_KAK_30_SKULLS_HINT)){ + } else if (actor->params == 3 && ctx->GetOption(RSK_KAK_30_SKULLS_HINT)) { reveal = RC_KAK_30_GOLD_SKULLTULA_REWARD; - } else if (actor->params == 4 && ctx->GetOption(RSK_KAK_40_SKULLS_HINT)){ + } else if (actor->params == 4 && ctx->GetOption(RSK_KAK_40_SKULLS_HINT)) { reveal = RC_KAK_40_GOLD_SKULLTULA_REWARD; - } else if (ctx->GetOption(RSK_KAK_50_SKULLS_HINT)){ + } else if (ctx->GetOption(RSK_KAK_50_SKULLS_HINT)) { reveal = RC_KAK_50_GOLD_SKULLTULA_REWARD; } break; @@ -701,20 +706,21 @@ void RandomizerOnDialogMessageHandler() { case TEXT_SCRUB_RANDOM: if (ctx->GetOption(RSK_SCRUB_TEXT_HINT).Get() != RO_GENERIC_OFF) { EnDns* enDns = (EnDns*)actor; - reveal = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf((RandomizerInf)enDns->sohScrubIdentity.randomizerInf); + reveal = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf( + (RandomizerInf)enDns->sohScrubIdentity.randomizerInf); } break; case TEXT_BEAN_SALESMAN_BUY_FOR_10: if (revealMerchant && (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_BEANS_ONLY) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL))) { + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL))) { reveal = RC_ZR_MAGIC_BEAN_SALESMAN; } break; case TEXT_GRANNYS_SHOP: if (revealMerchant && nonBeanMerchants && - (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE) || INV_CONTENT(ITEM_CLAIM_CHECK) == ITEM_CLAIM_CHECK)) { - reveal = RC_KAK_GRANNYS_SHOP; - } + (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE) || INV_CONTENT(ITEM_CLAIM_CHECK) == ITEM_CLAIM_CHECK)) { + reveal = RC_KAK_GRANNYS_SHOP; + } break; case TEXT_MEDIGORON: if (revealMerchant && nonBeanMerchants) { @@ -737,7 +743,7 @@ void RandomizerOnDialogMessageHandler() { case TEXT_SHEIK_NEED_HOOK: case TEXT_SHEIK_HAVE_HOOK: if (ctx->GetOption(RSK_OOT_HINT) && gPlayState->sceneNum == SCENE_TEMPLE_OF_TIME && - !ctx->GetItemLocation(RC_SONG_FROM_OCARINA_OF_TIME)->HasObtained()) { + !ctx->GetItemLocation(RC_SONG_FROM_OCARINA_OF_TIME)->HasObtained()) { auto itemoot_loc = ctx->GetItemLocation(RC_HF_OCARINA_OF_TIME_ITEM); if (itemoot_loc->GetCheckStatus() == RCSHOW_UNCHECKED) { itemoot_loc->SetCheckStatus(RCSHOW_IDENTIFIED); @@ -782,15 +788,17 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_PLAY_SLOW_CHEST_CS: { - // We force fast chests if SkipGetItemAnimation is enabled because the camera in the CS looks pretty wonky otherwise - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED)) { + // We force fast chests if SkipGetItemAnimation is enabled because the camera in the CS looks pretty wonky + // otherwise + if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK)) { *should = false; } break; } case VB_GIVE_ITEM_FROM_CHEST: { EnBox* chest = va_arg(args, EnBox*); - RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor(chest->dyna.actor.id, gPlayState->sceneNum, chest->dyna.actor.params); + RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor( + chest->dyna.actor.id, gPlayState->sceneNum, chest->dyna.actor.params); if (!OTRGlobals::Instance->gRandoContext->IsLocationShuffled(rc)) { break; } @@ -812,17 +820,21 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l *should = false; break; case VB_SHIEK_PREPARE_TO_GIVE_SERENADE_OF_WATER: { - *should = !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) && !Flags_GetTreasure(gPlayState, 0x2); + *should = + !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) && !Flags_GetTreasure(gPlayState, 0x2); break; } case VB_BE_ELIGIBLE_FOR_SERENADE_OF_WATER: - *should = !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) && Flags_GetTreasure(gPlayState, 0x2); + *should = + !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) && Flags_GetTreasure(gPlayState, 0x2); break; case VB_BE_ELIGIBLE_FOR_PRELUDE_OF_LIGHT: - *should = !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST); + *should = + !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST); break; case VB_MIDO_SPAWN: - if (RAND_GET_OPTION(RSK_FOREST) != RO_CLOSED_FOREST_OFF && !Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD)) { + if (RAND_GET_OPTION(RSK_FOREST) != RO_CLOSED_FOREST_OFF && + !Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD)) { *should = true; } break; @@ -835,26 +847,22 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l *should = Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_KOKIRI_EMERALD_DEKU_TREE_DEAD); break; case VB_OPEN_KOKIRI_FOREST: - *should = Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_KOKIRI_EMERALD_DEKU_TREE_DEAD) || RAND_GET_OPTION(RSK_FOREST) != RO_CLOSED_FOREST_ON; + *should = Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_KOKIRI_EMERALD_DEKU_TREE_DEAD) || + RAND_GET_OPTION(RSK_FOREST) != RO_CLOSED_FOREST_ON; break; case VB_BE_ELIGIBLE_FOR_DARUNIAS_JOY_REWARD: *should = !Flags_GetRandomizerInf(RAND_INF_DARUNIAS_JOY); break; case VB_BE_ELIGIBLE_FOR_LIGHT_ARROWS: - *should = - LINK_IS_ADULT && - (gEntranceTable[gSaveContext.entranceIndex].scene == SCENE_TEMPLE_OF_TIME) && - !Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) && - MeetsLACSRequirements(); + *should = LINK_IS_ADULT && (gEntranceTable[gSaveContext.entranceIndex].scene == SCENE_TEMPLE_OF_TIME) && + !Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) && + MeetsLACSRequirements(); break; case VB_BE_ELIGIBLE_FOR_NOCTURNE_OF_SHADOW: - *should = - !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL) && - LINK_IS_ADULT && - gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_KAKARIKO_VILLAGE && - CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && - CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && - CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER); + *should = !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL) && LINK_IS_ADULT && + gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_KAKARIKO_VILLAGE && + CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && + CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER); break; case VB_BE_ELIGIBLE_FOR_CHILD_ROLLING_GORON_REWARD: { // Don't require a bomb bag to get prize in rando @@ -864,7 +872,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_BE_ELIGIBLE_FOR_MAGIC_BEANS_PURCHASE: { if (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_BEANS_ONLY || RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL) { - *should = gSaveContext.rupees >= OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetPrice(); + *should = gSaveContext.rupees >= + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetPrice(); } break; } @@ -900,9 +909,11 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_ITEM_B_HEART_DESPAWN: { ItemBHeart* itemBHeart = va_arg(args, ItemBHeart*); - RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor(itemBHeart->actor.id, gPlayState->sceneNum, itemBHeart->actor.params); + RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor( + itemBHeart->actor.id, gPlayState->sceneNum, itemBHeart->actor.params); if (rc != RC_UNKNOWN_CHECK) { - itemBHeart->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); + itemBHeart->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( + rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); itemBHeart->actor.draw = (ActorFunc)ItemBHeart_DrawRandomizedItem; itemBHeart->actor.update = (ActorFunc)ItemBHeart_UpdateRandomizedItem; *should = Rando::Context::GetInstance()->GetItemLocation(rc)->HasObtained(); @@ -913,13 +924,6 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l *should = Flags_GetRandomizerInf(RAND_INF_LEARNED_EPONA_SONG); break; } - case VB_SET_CUCCO_COUNT: { - EnNiwLady* enNiwLady = va_arg(args, EnNiwLady*); - // Override starting Cucco count using setting value - enNiwLady->cuccosInPen = 7 - RAND_GET_OPTION(RSK_CUCCO_COUNT); - *should = false; - break; - } case VB_KING_ZORA_THANK_CHILD: { // Allow turning in Ruto's letter even if you have already rescued her if (!Flags_GetEventChkInf(EVENTCHKINF_KING_ZORA_MOVED)) { @@ -964,8 +968,9 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_BIGGORON_CONSIDER_TRADE_COMPLETE: { - // This being true will prevent other biggoron trades, there are already safegaurds in place to prevent - // claim check from being traded multiple times, so we don't really need the quest to ever be considered "complete" + // This being true will prevent other biggoron trades, there are already safeguards in place to prevent + // claim check from being traded multiple times, so we don't really need the quest to ever be considered + // "complete" *should = false; break; } @@ -992,12 +997,13 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l Actor_Kill(&item00->actor); *should = false; } else if (item00->actor.params == ITEM00_SOH_GIVE_ITEM_ENTRY) { - Audio_PlaySoundGeneral(NA_SE_SY_GET_ITEM, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Audio_PlaySoundGeneral(NA_SE_SY_GET_ITEM, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); if (item00->itemEntry.modIndex == MOD_NONE) { if (item00->itemEntry.getItemId == GI_SWORD_BGS) { gSaveContext.bgsFlag = true; } - Item_Give(gPlayState, item00->itemEntry.itemId); + Item_Give(gPlayState, static_cast(item00->itemEntry.itemId)); } else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) { if (item00->itemEntry.getItemId == RG_ICE_TRAP) { gSaveContext.ship.pendingIceTrapCount++; @@ -1015,7 +1021,9 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) { Notification::Emit({ .message = "You found ", - .suffix = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId).GetName().english, + .suffix = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId) + .GetName() + .english, }); } @@ -1062,26 +1070,53 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l *should = false; break; } + case VB_BOTTLE_BIG_POE: { + EnPoField* enPoe = va_arg(args, EnPoField*); + enPoe->actor.textId = 0x5090; + Flags_SetSwitch(gPlayState, enPoe->actor.params & 0xFF); + HIGH_SCORE(HS_POE_POINTS) += 100; + if (HIGH_SCORE(HS_POE_POINTS) > 1100) { + HIGH_SCORE(HS_POE_POINTS) = 1100; + } + *should = false; + break; + } + case VB_SELL_POES_TO_POE_COLLECTOR: { + if (!Flags_GetRandomizerInf(RAND_INF_10_BIG_POES) && HIGH_SCORE(HS_POE_POINTS) >= 1000) { + EnGb* enGb = va_arg(args, EnGb*); + enGb->textId = 0x70F8; + Message_ContinueTextbox(gPlayState, enGb->textId); + enGb->actionFunc = func_80A2FB40; + *should = false; + } + break; + } case VB_GIVE_ITEM_FROM_POE_COLLECTOR: { EnGb* enGb = va_arg(args, EnGb*); if (!Flags_GetRandomizerInf(RAND_INF_10_BIG_POES)) { + Flags_SetInfTable(INFTABLE_SPOKE_TO_POE_COLLECTOR_IN_RUINED_MARKET); Flags_SetRandomizerInf(RAND_INF_10_BIG_POES); + enGb->textId = 0x70F5; enGb->dyna.actor.parent = NULL; - enGb->actionFunc = func_80A2FC0C; + enGb->actionFunc = func_80A2F83C; *should = false; } break; } case VB_CHECK_RANDO_PRICE_OF_CARPET_SALESMAN: { - if (EnJs_RandoCanGetCarpetMerchantItem()){ - *should = gSaveContext.rupees < OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPrice(); + if (EnJs_RandoCanGetCarpetMerchantItem()) { + *should = + gSaveContext.rupees < + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPrice(); } break; } case VB_GIVE_ITEM_FROM_CARPET_SALESMAN: { EnJs* enJs = va_arg(args, EnJs*); - if (EnJs_RandoCanGetCarpetMerchantItem()){ - Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPrice() * -1); + if (EnJs_RandoCanGetCarpetMerchantItem()) { + Rupees_ChangeBy( + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPrice() * + -1); enJs->actor.parent = NULL; enJs->actor.textId = TEXT_CARPET_SALESMAN_ARMS_DEALER; enJs->actionFunc = (EnJsActionFunc)func_80A890C0; @@ -1096,15 +1131,15 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_CHECK_RANDO_PRICE_OF_MEDIGORON: { - if (EnGm_RandoCanGetMedigoronItem()){ - *should = gSaveContext.rupees < OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_GC_MEDIGORON)->GetPrice(); + if (EnGm_RandoCanGetMedigoronItem()) { + *should = gSaveContext.rupees < + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_GC_MEDIGORON)->GetPrice(); } break; } - case VB_GIVE_ITEM_FROM_MEDIGORON: { - // fallthrough - case VB_BE_ELIGIBLE_FOR_GIANTS_KNIFE_PURCHASE: + case VB_GIVE_ITEM_FROM_MEDIGORON: + case VB_BE_ELIGIBLE_FOR_GIANTS_KNIFE_PURCHASE: { if (EnGm_RandoCanGetMedigoronItem()) { if (id == VB_GIVE_ITEM_FROM_MEDIGORON) { EnGm* enGm = va_arg(args, EnGm*); @@ -1112,7 +1147,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l Flags_SetRandomizerInf(RAND_INF_MERCHANTS_MEDIGORON); enGm->actor.parent = NULL; enGm->actionFunc = (EnGmActionFunc)func_80A3DC44; - Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_GC_MEDIGORON)->GetPrice() * -1); + Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_GC_MEDIGORON)->GetPrice() * + -1); *should = false; } else { // Resets "Talked to Medigoron" flag in infTable to restore initial conversation state @@ -1126,7 +1162,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l EnMs* enMs = va_arg(args, EnMs*); if (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_BEANS_ONLY || RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL) { - Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetPrice() * -1); + Rupees_ChangeBy( + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetPrice() * -1); BEANS_BOUGHT = 10; // Only set inf for buying rando check Flags_SetRandomizerInf(RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN); @@ -1138,10 +1175,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_FROGS_GO_TO_IDLE: { EnFr* enFr = va_arg(args, EnFr*); - if ( - (enFr->songIndex >= FROG_STORMS && enFr->reward == GI_HEART_PIECE) || - (enFr->songIndex < FROG_STORMS && enFr->reward == GI_RUPEE_PURPLE) - ) { + if ((enFr->songIndex >= FROG_STORMS && enFr->reward == GI_HEART_PIECE) || + (enFr->songIndex < FROG_STORMS && enFr->reward == GI_RUPEE_PURPLE)) { *should = true; } break; @@ -1229,7 +1264,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_BUSINESS_SCRUB_DESPAWN: { EnShopnuts* enShopnuts = va_arg(args, EnShopnuts*); s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); - ScrubIdentity scrubIdentity = OTRGlobals::Instance->gRandomizer->IdentifyScrub(gPlayState->sceneNum, enShopnuts->actor.params, respawnData); + ScrubIdentity scrubIdentity = OTRGlobals::Instance->gRandomizer->IdentifyScrub( + gPlayState->sceneNum, enShopnuts->actor.params, respawnData); if (scrubIdentity.isShuffled) { *should = Flags_GetRandomizerInf(scrubIdentity.randomizerInf); @@ -1284,16 +1320,18 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_GRANNY_SAY_INSUFFICIENT_RUPEES: { - if (EnDs_RandoCanGetGrannyItem()){ - *should = gSaveContext.rupees < OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPrice(); + if (EnDs_RandoCanGetGrannyItem()) { + *should = gSaveContext.rupees < + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPrice(); } break; } case VB_GRANNY_TAKE_MONEY: { - if (EnDs_RandoCanGetGrannyItem()){ - *should = false; - Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPrice() * -1); - } + if (EnDs_RandoCanGetGrannyItem()) { + *should = false; + Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPrice() * + -1); + } break; } case VB_NEED_BOTTLE_FOR_GRANNYS_ITEM: { @@ -1322,20 +1360,26 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_BE_ELIGIBLE_TO_OPEN_DOT: { - bool eligible = RAND_GET_OPTION(RSK_DOOR_OF_TIME) != RO_DOOROFTIME_CLOSED || ( - INV_CONTENT(ITEM_OCARINA_FAIRY) == ITEM_OCARINA_TIME && - CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && - CHECK_QUEST_ITEM(QUEST_GORON_RUBY) && - CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE) - ); + bool eligible = + RAND_GET_OPTION(RSK_DOOR_OF_TIME) != RO_DOOROFTIME_CLOSED || + (INV_CONTENT(ITEM_OCARINA_FAIRY) == ITEM_OCARINA_TIME && CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && + CHECK_QUEST_ITEM(QUEST_GORON_RUBY) && CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE)); *should = eligible; break; } case VB_GIVE_ITEM_FROM_HORSEBACK_ARCHERY: { + EnGe1* enGe1 = va_arg(args, EnGe1*); // give both rewards at the same time + if (gSaveContext.minigameScore >= 1000) { + Flags_SetInfTable(INFTABLE_190); + } if (gSaveContext.minigameScore >= 1500) { Flags_SetItemGetInf(ITEMGETINF_0F); } + // move gerudo actor onto her wait loop + enGe1->actionFunc = EnGe1_Wait_Archery; + EnGe1_SetAnimationIdle(enGe1); + // skip the vanilla gives. *should = false; break; } @@ -1357,7 +1401,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l // we're giving the 100 GS rando reward! set the rando inf Flags_SetRandomizerInf(RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD); - + // also set the actionfunc so this doesn't immediately get // called again (and lead to a vanilla+rando item give // because the flag check will pass next time) @@ -1384,11 +1428,19 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_GIVE_ITEM_FROM_BOMBCHU_BOWLING: { EnBomBowlPit* enBomBowlPit = va_arg(args, EnBomBowlPit*); - if (enBomBowlPit->prizeIndex == EXITEM_BOMB_BAG_BOWLING || enBomBowlPit->prizeIndex == EXITEM_HEART_PIECE_BOWLING) { + if (enBomBowlPit->prizeIndex == EXITEM_BOMB_BAG_BOWLING || + enBomBowlPit->prizeIndex == EXITEM_HEART_PIECE_BOWLING) { *should = false; } break; } + case VB_GERUDO_GUARD_SET_ACTION_AFTER_TALK: + if (gPlayState->msgCtx.choiceIndex == 0) { + EnGe2* enGe2 = va_arg(args, EnGe2*); + EnGe2_SetupCapturePlayer(enGe2, gPlayState); + *should = false; + } + break; case VB_GERUDOS_BE_FRIENDLY: { *should = CHECK_QUEST_ITEM(QUEST_GERUDO_CARD); break; @@ -1400,7 +1452,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_GIVE_ITEM_GERUDO_MEMBERSHIP_CARD: { - Flags_SetRandomizerInf(RAND_INF_GF_ITEM_FROM_LEADER_OF_FORTRESS); + Flags_SetRandomizerInf(RAND_INF_TH_ITEM_FROM_LEADER_OF_FORTRESS); *should = false; break; } @@ -1420,17 +1472,17 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_DRAW_AMMO_COUNT: { s16 item = *va_arg(args, s16*); // don't draw ammo count if you have the infinite upgrade - if ( - (item == ITEM_NUT && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE)) || + if ((item == ITEM_NUT && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE)) || (item == ITEM_STICK && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE)) || (item == ITEM_BOMB && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG)) || - ( - (item == ITEM_BOW || item == ITEM_BOW_ARROW_FIRE || item == ITEM_BOW_ARROW_ICE || item == ITEM_BOW_ARROW_LIGHT) && - Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER) && gPlayState->shootingGalleryStatus < 2 && gSaveContext.minigameState != 1 - ) || - (item == ITEM_SLINGSHOT && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG) && gPlayState->shootingGalleryStatus < 2) || - (item == ITEM_BOMBCHU && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS) && gPlayState->bombchuBowlingStatus < 1) - ) { + ((item == ITEM_BOW || item == ITEM_BOW_ARROW_FIRE || item == ITEM_BOW_ARROW_ICE || + item == ITEM_BOW_ARROW_LIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER) && gPlayState->shootingGalleryStatus < 2 && + gSaveContext.minigameState != 1) || + (item == ITEM_SLINGSHOT && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG) && + gPlayState->shootingGalleryStatus < 2) || + (item == ITEM_BOMBCHU && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS) && + gPlayState->bombchuBowlingStatus < 1)) { *should = false; } break; @@ -1516,7 +1568,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_SHOULD_SET_FISHING_RECORD: { VBFishingData* fishData = va_arg(args, VBFishingData*); *should = (s16)fishData->sFishingRecordLength < (s16)fishData->fishWeight; - if (!*should){ + if (!*should) { *fishData->sFishOnHandLength = 0.0f; } break; @@ -1527,19 +1579,20 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_GIVE_RANDO_FISHING_PRIZE: { - if (IS_RANDO){ + if (IS_RANDO) { VBFishingData* fishData = va_arg(args, VBFishingData*); if (*fishData->sFishOnHandIsLoach) { if (!Flags_GetRandomizerInf(RAND_INF_CAUGHT_LOACH) && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY) == RO_FISHSANITY_HYRULE_LOACH){ + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY) == + RO_FISHSANITY_HYRULE_LOACH) { Flags_SetRandomizerInf(RAND_INF_CAUGHT_LOACH); Message_StartTextbox(gPlayState, TEXT_FISHING_RELEASE_THIS_ONE, NULL); *should = true; fishData->actor->stateAndTimer = 20; } } else { - if (ShouldGiveFishingPrize(fishData->fishWeight)){ - if (LINK_IS_CHILD){ + if (ShouldGiveFishingPrize(fishData->fishWeight)) { + if (LINK_IS_CHILD) { Flags_SetRandomizerInf(RAND_INF_CHILD_FISHING); HIGH_SCORE(HS_FISHING) |= HS_FISH_PRIZE_CHILD; } else { @@ -1554,7 +1607,18 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } break; } - case VB_TRADE_TIMER_EYEDROPS:{ + case VB_GIVE_RANDO_GLITCH_FISHING_PRIZE: { + if (IS_RANDO) { + Fishing* fishing = va_arg(args, Fishing*); + if (!Flags_GetRandomizerInf(RAND_INF_ADULT_FISHING)) { + Flags_SetRandomizerInf(RAND_INF_ADULT_FISHING); + } + *should = true; + fishing->stateAndTimer = 0; + } + break; + } + case VB_TRADE_TIMER_EYEDROPS: { EnMk* enMk = va_arg(args, EnMk*); Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_LH_TRADE_FROG); enMk->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; @@ -1563,8 +1627,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l *should = false; break; } - // We need to override the vanilla behavior here because the player might sequence break and get Ruto kidnapped before accessing other - // checks that require Ruto. So if she's kidnapped we allow her to spawn again + // We need to override the vanilla behavior here because the player might sequence break and get Ruto kidnapped + // before accessing other checks that require Ruto. So if she's kidnapped we allow her to spawn again case VB_RUTO_BE_CONSIDERED_NOT_KIDNAPPED: { *should = !Flags_GetInfTable(INFTABLE_145) || Flags_GetInfTable(INFTABLE_146); break; @@ -1586,7 +1650,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l if (*should == true && RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES)) { // Check for dungeon special entrances that are randomized to a new location if (std::find(entrPersistTempFlags.begin(), entrPersistTempFlags.end(), originalEntrance) != - entrPersistTempFlags.end() && originalEntrance != gPlayState->nextEntranceIndex) { + entrPersistTempFlags.end() && + originalEntrance != gPlayState->nextEntranceIndex) { // Normally dungeons use a special voidout between scenes so that entering/exiting a boss room, // or leaving via Spirit Hands and going back in persist temp flags across scenes. // For ER, the temp flags should be wiped out so that they aren't transferred to the new location. @@ -1594,7 +1659,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l gPlayState->actorCtx.flags.tempCollect = 0; // If the respawnFlag is set for a grotto return, we don't want the void out to happen. - // Set the data flag to one to prevent the respawn point from being overriden by dungeon doors. + // Set the data flag to one to prevent the respawn point from being overridden by dungeon doors. if (gSaveContext.respawnFlag == 2) { gSaveContext.respawn[RESPAWN_MODE_DOWN].data = 1; *should = false; @@ -1611,7 +1676,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_HEISHI2_ACCEPT_ITEM_AS_ZELDAS_LETTER: { if (*should) { - //remove zelda's letter as this is the only use for it + // remove zelda's letter as this is the only use for it Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); } break; @@ -1626,7 +1691,6 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_GIVE_ITEM_FROM_LAB_DIVE: case VB_GIVE_ITEM_FROM_SKULL_KID_SARIAS_SONG: case VB_GIVE_ITEM_FROM_MAN_ON_ROOF: - case VB_GIVE_ITEM_SKULL_TOKEN: case VB_GIVE_ITEM_FROM_BLUE_WARP: case VB_GIVE_ITEM_FAIRY_OCARINA: case VB_GIVE_ITEM_WEIRD_EGG: @@ -1642,6 +1706,9 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_GIVE_ITEM_SHADOW_MEDALLION: *should = false; break; + case VB_GIVE_ITEM_SKULL_TOKEN: + *should = (Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OFF)); + break; default: break; } @@ -1655,25 +1722,45 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) { // probably need to do something different when we implement shuffle if (sceneNum == SCENE_TREASURE_BOX_SHOP) { Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_1); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_2); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_3); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_4); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_5); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_1); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_1)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_1) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_2); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_2)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_2) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_3); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_3)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_3) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_4); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_4)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_4) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_5); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_5)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_5) + ->SetCheckStatus(RCSHOW_UNCHECKED); CheckTracker::RecalculateAllAreaTotals(); } @@ -1694,10 +1781,6 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) { // Handle updated link spawn positions Entrance_OverrideSpawnScene(sceneNum, gPlayState->curSpawn); - - Entrance_OverrideWeatherState(); - // Need to reinitialize the environment after replacing the weather mode - Play_InitEnvironment(gPlayState, gPlayState->skyboxId); } // LACs & Prelude checks @@ -1708,17 +1791,16 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) { updateHook = 0; } - // If we're not in the Temple of Time or we've already learned the Prelude of Light and received LACs, we don't need to do anything - if ( - sceneNum != SCENE_TEMPLE_OF_TIME || - ( - Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && - Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) - ) - ) return; + // If we're not in the Temple of Time or we've already learned the Prelude of Light and received LACs, we don't need + // to do anything + if (sceneNum != SCENE_TEMPLE_OF_TIME || + (Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && + Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS))) + return; updateHook = GameInteractor::Instance->RegisterGameHook([]() { - if (!Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && LINK_IS_ADULT && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && gPlayState->roomCtx.curRoom.num == 0) { + if (!Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && LINK_IS_ADULT && + CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && gPlayState->roomCtx.curRoom.num == 0) { Flags_SetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT); } @@ -1727,17 +1809,23 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) { Flags_SetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS); } - // If both awards have been given, we can unregister the hook, otherwise it will get unregistered when the player leaves the area - if ( - Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && - Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) - ) { + // If both awards have been given, we can unregister the hook, otherwise it will get unregistered when the + // player leaves the area + if (Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && + Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS)) { GameInteractor::Instance->UnregisterGameHook(updateHook); updateHook = 0; } }); } +void RandomizerAfterSceneCommandsHandler(int16_t sceneNum) { + // ENTRTODO: Move all entrance rando handling to a dedicated file + if (RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES)) { + Entrance_OverrideWeatherState(); + } +} + void EnSi_DrawRandomizedItem(EnSi* enSi, PlayState* play) { GetItemEntry randoItem = enSi->sohGetItemEntry; if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { @@ -1764,78 +1852,16 @@ void EnDns_RandomizerPurchase(EnDns* enDns) { Flags_SetRandomizerInf(enDns->sohScrubIdentity.randomizerInf); } -void ObjComb_RandomizerChooseItemDrop(ObjComb* objComb, PlayState* play) { - s16 params = objComb->actor.params & 0x1F; - - if ( - RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && - !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf) - ) { - EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &objComb->actor.world.pos, ITEM00_SOH_DUMMY); - item00->randoInf = objComb->beehiveIdentity.randomizerInf; - item00->itemEntry = OTRGlobals::Instance->gRandomizer->GetItemFromKnownCheck(objComb->beehiveIdentity.randomizerCheck, GI_NONE); - item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; - return; - } - - if ((params > 0) || (params < 0x1A)) { - if (params == 6) { - if (Flags_GetCollectible(play, (objComb->actor.params >> 8) & 0x3F)) { - params = -1; - } else { - params = (params | (((objComb->actor.params >> 8) & 0x3F) << 8)); - } - } else if (Rand_ZeroOne() < 0.5f) { - params = -1; - } - if (params >= 0 && !CVarGetInteger(CVAR_ENHANCEMENT("NoRandomDrops"), 0)) { - Item_DropCollectible(play, &objComb->actor.world.pos, params); - } - } -} - -void ObjComb_RandomizerWait(ObjComb* objComb, PlayState* play) { - s32 dmgFlags; - - objComb->unk_1B0 -= 50; - if ( - RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && - !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf) - ) { - if (objComb->unk_1B0 <= -5000) { - objComb->unk_1B0 = 1500; - } - } else if (objComb->unk_1B0 < 0) { - objComb->unk_1B0 = 0; - } - - if ((objComb->collider.base.acFlags & AC_HIT) != 0) { - objComb->collider.base.acFlags &= ~AC_HIT; - dmgFlags = objComb->collider.elements[0].info.acHitInfo->toucher.dmgFlags; - if (dmgFlags & 0x4001F866) { - objComb->unk_1B0 = 1500; - } else { - ObjComb_Break(objComb, play); - ObjComb_RandomizerChooseItemDrop(objComb, play); - Actor_Kill(&objComb->actor); - } - } else { - CollisionCheck_SetAC(play, &play->colChkCtx, &objComb->collider.base); - } - - if (objComb->actor.update != NULL) { - CollisionCheck_SetOC(play, &play->colChkCtx, &objComb->collider.base); - } -} - void RandomizerOnActorInitHandler(void* actorRef) { Actor* actor = static_cast(actorRef); if (actor->id == ACTOR_EN_SI) { - RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor(actor->id, gPlayState->sceneNum, actor->params); + RandomizerCheck rc = + OTRGlobals::Instance->gRandomizer->GetCheckFromActor(actor->id, gPlayState->sceneNum, actor->params); if (rc != RC_UNKNOWN_CHECK) { EnSi* enSi = static_cast(actorRef); - enSi->sohGetItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); + enSi->sohGetItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( + rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); actor->draw = (ActorFunc)EnSi_DrawRandomizedItem; } } @@ -1843,15 +1869,13 @@ void RandomizerOnActorInitHandler(void* actorRef) { if (actor->id == ACTOR_EN_DNS) { EnDns* enDns = static_cast(actorRef); s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); - enDns->sohScrubIdentity = OTRGlobals::Instance->gRandomizer->IdentifyScrub(gPlayState->sceneNum, enDns->actor.params, respawnData); + enDns->sohScrubIdentity = + OTRGlobals::Instance->gRandomizer->IdentifyScrub(gPlayState->sceneNum, enDns->actor.params, respawnData); if (enDns->sohScrubIdentity.isShuffled) { // DNS uses pointers so we're creating our own entry instead of modifying the original enDns->sohDnsItemEntry = { - enDns->dnsItemEntry->itemPrice, - 1, - enDns->sohScrubIdentity.getItemId, - EnDns_RandomizerPurchaseableCheck, + enDns->dnsItemEntry->itemPrice, 1, enDns->sohScrubIdentity.getItemId, EnDns_RandomizerPurchaseableCheck, EnDns_RandomizerPurchase, }; enDns->dnsItemEntry = &enDns->sohDnsItemEntry; @@ -1865,30 +1889,34 @@ void RandomizerOnActorInitHandler(void* actorRef) { static uint32_t enDnsUpdateHook = 0; static uint32_t enDnsKillHook = 0; if (!enDnsUpdateHook) { - enDnsUpdateHook = GameInteractor::Instance->RegisterGameHook([](void* innerActorRef) { - Actor* innerActor = static_cast(innerActorRef); - if (innerActor->id == ACTOR_EN_DNS) { - EnDns* innerEnDns = static_cast(innerActorRef); - if (innerEnDns->sohScrubIdentity.isShuffled) { - innerActor->textId = TEXT_SCRUB_RANDOM; + enDnsUpdateHook = + GameInteractor::Instance->RegisterGameHook([](void* innerActorRef) { + Actor* innerActor = static_cast(innerActorRef); + if (innerActor->id == ACTOR_EN_DNS) { + EnDns* innerEnDns = static_cast(innerActorRef); + if (innerEnDns->sohScrubIdentity.isShuffled) { + innerActor->textId = TEXT_SCRUB_RANDOM; + } } - } - }); - enDnsKillHook = GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { - GameInteractor::Instance->UnregisterGameHook(enDnsUpdateHook); - GameInteractor::Instance->UnregisterGameHook(enDnsKillHook); - enDnsUpdateHook = 0; - enDnsKillHook = 0; - }); + }); + enDnsKillHook = + GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { + GameInteractor::Instance->UnregisterGameHook(enDnsUpdateHook); + GameInteractor::Instance->UnregisterGameHook(enDnsKillHook); + enDnsUpdateHook = 0; + enDnsKillHook = 0; + }); } } } if (actor->id == ACTOR_ITEM_ETCETERA) { ItemEtcetera* itemEtcetera = static_cast(actorRef); - RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor(itemEtcetera->actor.id, gPlayState->sceneNum, itemEtcetera->actor.params); + RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor( + itemEtcetera->actor.id, gPlayState->sceneNum, itemEtcetera->actor.params); if (rc != RC_UNKNOWN_CHECK) { - itemEtcetera->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); + itemEtcetera->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( + rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); itemEtcetera->drawFunc = (ActorFunc)ItemEtcetera_DrawRandomizedItem; } @@ -1916,16 +1944,9 @@ void RandomizerOnActorInitHandler(void* actorRef) { } } - if (actor->id == ACTOR_OBJ_COMB) { - ObjComb* objComb = static_cast(actorRef); - s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); - objComb->beehiveIdentity = OTRGlobals::Instance->gRandomizer->IdentifyBeehive(gPlayState->sceneNum, (s16)actor->world.pos.x, respawnData); - objComb->actionFunc = (ObjCombActionFunc)ObjComb_RandomizerWait; - } - if (actor->id == ACTOR_EN_EX_ITEM) { EnExItem* enExItem = static_cast(actorRef); - + RandomizerCheck rc = RC_UNKNOWN_CHECK; switch (enExItem->type) { case EXITEM_BOMB_BAG_COUNTER: @@ -1938,14 +1959,16 @@ void RandomizerOnActorInitHandler(void* actorRef) { break; case EXITEM_BOMBCHUS_COUNTER: case EXITEM_BOMBCHUS_BOWLING: - //RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS was removed as a 3DS holdover not in anyones near term plans due to being pretty useless. + // RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS was removed as a 3DS holdover not in anyones near term plans due + // to being pretty useless. break; case EXITEM_BULLET_BAG: rc = RC_LW_TARGET_IN_WOODS; break; } if (rc != RC_UNKNOWN_CHECK) { - enExItem->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); + enExItem->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( + rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); enExItem->actionFunc = (EnExItemActionFunc)EnExItem_WaitForObjectRandomized; } } @@ -1956,6 +1979,10 @@ void RandomizerOnActorInitHandler(void* actorRef) { if (ge1Type == GE1_TYPE_TRAINING_GROUND_GUARD && Flags_GetRandomizerInf(RAND_INF_GF_GTG_GATE_PERMANENTLY_OPEN)) { enGe1->actionFunc = (EnGe1ActionFunc)EnGe1_SetNormalText; + } else if (ge1Type == GE1_TYPE_GATE_OPERATOR && enGe1->actor.world.pos.x != -1358.0f) { + // When spawning the gate operator, also spawn an extra gate operator on the wasteland side + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_GE1, -1358.0f, 88.0f, -3018.0f, 0, 0x95B0, 0, + 0x0300 | GE1_TYPE_GATE_OPERATOR, true); } } @@ -1968,34 +1995,23 @@ void RandomizerOnActorInitHandler(void* actorRef) { if (actor->id == ACTOR_BG_TREEMOUTH && LINK_IS_ADULT && RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF && (RAND_GET_OPTION(RSK_FOREST) == RO_CLOSED_FOREST_OFF || - Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD))) { + Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD))) { BgTreemouth* bgTreemouth = static_cast(actorRef); bgTreemouth->unk_168 = 1.0f; } - //consumable bags - if ( - actor->id == ACTOR_EN_ITEM00 && - ( - ( - RAND_GET_OPTION(RSK_SHUFFLE_DEKU_STICK_BAG) && - CUR_UPG_VALUE(UPG_STICKS) == 0 && - actor->params == ITEM00_STICK - ) || - ( - RAND_GET_OPTION(RSK_SHUFFLE_DEKU_NUT_BAG) && - CUR_UPG_VALUE(UPG_NUTS) == 0 && - actor->params == ITEM00_NUTS - ) - ) - ) { + // consumable bags + if (actor->id == ACTOR_EN_ITEM00 && + ((RAND_GET_OPTION(RSK_SHUFFLE_DEKU_STICK_BAG) && CUR_UPG_VALUE(UPG_STICKS) == 0 && + actor->params == ITEM00_STICK) || + (RAND_GET_OPTION(RSK_SHUFFLE_DEKU_NUT_BAG) && CUR_UPG_VALUE(UPG_NUTS) == 0 && actor->params == ITEM00_NUTS))) { Actor_Kill(actor); } if (RAND_GET_OPTION(RSK_SHUFFLE_BOSS_SOULS)) { - //Boss souls require an additional item (represented by a RAND_INF) to spawn a boss in a particular lair + // Boss souls require an additional item (represented by a RAND_INF) to spawn a boss in a particular lair RandomizerInf currentBossSoulRandInf = RAND_INF_MAX; - switch (gPlayState->sceneNum){ + switch (gPlayState->sceneNum) { case SCENE_DEKU_TREE_BOSS: currentBossSoulRandInf = RAND_INF_GOHMA_SOUL; break; @@ -2030,15 +2046,17 @@ void RandomizerOnActorInitHandler(void* actorRef) { break; } - //Deletes all actors in the boss category if the soul isn't found. - //Some actors, like Dark Link, Arwings, and Zora's Sapphire...?, are in this category despite not being actual bosses, - //so ignore any "boss" if `currentBossSoulRandInf` doesn't change from RAND_INF_MAX. + // Deletes all actors in the boss category if the soul isn't found. + // Some actors, like Dark Link, Arwings, and Zora's Sapphire...?, are in this category despite not being actual + // bosses, so ignore any "boss" if `currentBossSoulRandInf` doesn't change from RAND_INF_MAX. Iron Knuckle + // (Nabooru) in Twinrova's room is a special exception, so exclude knuckles too. if (currentBossSoulRandInf != RAND_INF_MAX) { - if (!Flags_GetRandomizerInf(currentBossSoulRandInf) && actor->category == ACTORCAT_BOSS) { + if (!Flags_GetRandomizerInf(currentBossSoulRandInf) && actor->category == ACTORCAT_BOSS && + actor->id != ACTOR_EN_IK) { Actor_Delete(&gPlayState->actorCtx, actor, gPlayState); } - //Special case for Phantom Ganon's horse (and fake), as they're considered "background actors", - //but still control the boss fight flow. + // Special case for Phantom Ganon's horse (and fake), as they're considered "background actors", + // but still control the boss fight flow. if (!Flags_GetRandomizerInf(RAND_INF_PHANTOM_GANON_SOUL) && actor->id == ACTOR_EN_FHG) { Actor_Delete(&gPlayState->actorCtx, actor, gPlayState); } @@ -2047,26 +2065,23 @@ void RandomizerOnActorInitHandler(void* actorRef) { // In MQ Spirit, remove the large silver block in the hole as child so the chest in the silver block hallway // can be guaranteed accessible - if ( - actor->id == ACTOR_OBJ_OSHIHIKI && - LINK_IS_CHILD && - ResourceMgr_IsGameMasterQuest() && + if (actor->id == ACTOR_OBJ_OSHIHIKI && LINK_IS_CHILD && ResourceMgr_IsGameMasterQuest() && gPlayState->sceneNum == SCENE_SPIRIT_TEMPLE && actor->room == 6 && // Spirit Temple silver block hallway - actor->params == 0x9C7 // Silver block that is marked as in the hole + actor->params == 0x9C7 // Silver block that is marked as in the hole ) { Actor_Kill(actor); return; } - if ( - // If child is in the adult shooting gallery or adult in the child shooting gallery, then despawn the shooting gallery man - actor->id == ACTOR_EN_SYATEKI_MAN && - RAND_GET_OPTION(RSK_SHUFFLE_INTERIOR_ENTRANCES) && - ( - (LINK_IS_CHILD && Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x00)) || //Kakariko Village -> Adult Shooting Gallery, index 003B in the entrance table - (LINK_IS_ADULT && Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x01)) //Market -> Child Shooting Gallery, index 016D in the entrance table - ) - ) { + // If child is in the adult shooting gallery or adult in the child shooting gallery, then despawn the shooting + // gallery man + if (actor->id == ACTOR_EN_SYATEKI_MAN && RAND_GET_OPTION(RSK_SHUFFLE_INTERIOR_ENTRANCES) && + ((LINK_IS_CHILD && + // Kakariko Village -> Adult Shooting Gallery, index 003B in the entrance table + Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x00)) || + (LINK_IS_ADULT && + // Market -> Child Shooting Gallery, index 016D in the entrance table + Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x01)))) { Actor_Kill(actor); return; } @@ -2079,27 +2094,27 @@ void RandomizerOnActorInitHandler(void* actorRef) { void RandomizerOnGameFrameUpdateHandler() { if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER)) { - AMMO(ITEM_BOW) = CUR_CAPACITY(UPG_QUIVER); + AMMO(ITEM_BOW) = static_cast(CUR_CAPACITY(UPG_QUIVER)); } if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG)) { - AMMO(ITEM_BOMB) = CUR_CAPACITY(UPG_BOMB_BAG); + AMMO(ITEM_BOMB) = static_cast(CUR_CAPACITY(UPG_BOMB_BAG)); } if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG)) { - AMMO(ITEM_SLINGSHOT) = CUR_CAPACITY(UPG_BULLET_BAG); + AMMO(ITEM_SLINGSHOT) = static_cast(CUR_CAPACITY(UPG_BULLET_BAG)); } if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE)) { - AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS); + AMMO(ITEM_STICK) = static_cast(CUR_CAPACITY(UPG_STICKS)); } if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE)) { - AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS); + AMMO(ITEM_NUT) = static_cast(CUR_CAPACITY(UPG_NUTS)); } if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER)) { - gSaveContext.magic = gSaveContext.magicCapacity; + gSaveContext.magic = static_cast(gSaveContext.magicCapacity); } if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS)) { @@ -2107,7 +2122,7 @@ void RandomizerOnGameFrameUpdateHandler() { } if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MONEY)) { - gSaveContext.rupees = CUR_CAPACITY(UPG_WALLET); + gSaveContext.rupees = static_cast(CUR_CAPACITY(UPG_WALLET)); } if (!Flags_GetRandomizerInf(RAND_INF_HAS_WALLET)) { @@ -2130,92 +2145,62 @@ void RandomizerOnActorUpdateHandler(void* refActor) { shutterDoor->unk_16E = 0; } } else if (actor->id == ACTOR_DOOR_GERUDO) { - DoorGerudo* gerudoDoor = (DoorGerudo*)actor; + DoorGerudo* gerudoDoor = reinterpret_cast(actor); gerudoDoor->actionFunc = func_8099485C; gerudoDoor->dyna.actor.world.pos.y = gerudoDoor->dyna.actor.home.pos.y + 200.0f; } } // In ER, override the warp song locations. Also removes the warp song cutscene - if (RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES) && actor->id == ACTOR_DEMO_KANKYO && actor->params == 0x000F) { // Warp Song particles + if (RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES) && actor->id == ACTOR_DEMO_KANKYO && + actor->params == 0x000F) { // Warp Song particles Entrance_SetWarpSongEntrance(); } - - if (actor->id == ACTOR_OBJ_COMB) { - ObjComb* combActor = reinterpret_cast(actor); - combActor->actor.shape.rot.x = Math_SinS(combActor->unk_1B2) * CLAMP_MIN(combActor->unk_1B0, 0) + combActor->actor.home.rot.x; - } } -//from z_player.c +// from z_player.c typedef struct { /* 0x00 */ Vec3f pos; /* 0x0C */ s16 yaw; } SpecialRespawnInfo; // size = 0x10 -//special respawns used when voided out without swim to prevent infinite loops +// special respawns used when voided out without swim to prevent infinite loops std::map swimSpecialRespawnInfo = { - { - ENTR_ZORAS_RIVER_3,//hf to zr in water - { { -1455.443, -20, 1384.826 }, 28761 } - }, - { - ENTR_HYRULE_FIELD_14,//zr to hf in water - { { 5730.209, -20, 3725.911 }, -20025 } - }, - { - ENTR_LOST_WOODS_UNDERWATER_SHORTCUT,//zr to lw - { { 1978.718, -36.908, -855 }, -16384 } - }, - { - ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT,//lw to zr - { { 4082.366, 860.442, -1018.949 }, -32768 } - }, - { - ENTR_LAKE_HYLIA_RIVER_EXIT,//gv to lh - { { -3276.416, -1033, 2908.421 }, 11228 } - }, - { - ENTR_WATER_TEMPLE_ENTRANCE,//lh to water temple - { { -182, 780, 759.5 }, -32768 } - }, - { - ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE,//water temple to lh - { { -955.028, -1306.9, 6768.954 }, -32768 } - }, - { - ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT,//lh to zd - { { -109.86, 11.396, -9.933 }, -29131 } - }, - { - ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT,//zd to lh - { { -912, -1326.967, 3391 }, 0 } - }, - { - ENTR_GERUDO_VALLEY_1,//caught by gerudos as child - { { -424, -2051, -74 }, 16384 } - }, - { - ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN,//mk to hf (can be a problem when it then turns night) - { { 0, 0, 1100 }, 0 } - }, - { - ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP,//jabu blue warp to zf - { { -1580, 150, 1670 }, 8000 } - }, + { ENTR_ZORAS_RIVER_3, // hf to zr in water + { { -1455.443f, -20.0f, 1384.826f }, 28761 } }, + { ENTR_HYRULE_FIELD_14, // zr to hf in water + { { 5730.209f, -20.0f, 3725.911f }, -20025 } }, + { ENTR_LOST_WOODS_UNDERWATER_SHORTCUT, // zr to lw + { { 1978.718f, -36.908f, -855.0f }, -16384 } }, + { ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT, // lw to zr + { { 4082.366f, 860.442f, -1018.949f }, -32768 } }, + { ENTR_LAKE_HYLIA_RIVER_EXIT, // gv to lh + { { -3276.416f, -1033.0f, 2908.421f }, 11228 } }, + { ENTR_WATER_TEMPLE_ENTRANCE, // lh to water temple + { { -182.0f, 780.0f, 759.5f }, -32768 } }, + { ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, // water temple to lh + { { -955.028f, -1306.9f, 6768.954f }, -32768 } }, + { ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT, // lh to zd + { { -109.86f, 11.396f, -9.933f }, -29131 } }, + { ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT, // zd to lh + { { -912.0f, -1326.967f, 3391.0f }, 0 } }, + { ENTR_GERUDO_VALLEY_1, // caught by gerudos as child + { { -424.0f, -2051.0f, -74.0f }, 16384 } }, + { ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, // mk to hf (can be a problem when it then turns night) + { { 0.0f, 0.0f, 1100.0f }, 0 } }, + { ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP, // jabu blue warp to zf + { { -1580.0f, 150.0f, 1670.0f }, 8000 } }, }; f32 triforcePieceScale; void RandomizerOnPlayerUpdateHandler() { - if ( - (GET_PLAYER(gPlayState)->stateFlags1 & PLAYER_STATE1_IN_WATER) && - !Flags_GetRandomizerInf(RAND_INF_CAN_SWIM) && - CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) != EQUIP_VALUE_BOOTS_IRON - ) { - //if you void out in water temple without swim you get instantly kicked out to prevent softlocks + if ((GET_PLAYER(gPlayState)->stateFlags1 & PLAYER_STATE1_IN_WATER) && !Flags_GetRandomizerInf(RAND_INF_CAN_SWIM) && + CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) != EQUIP_VALUE_BOOTS_IRON) { + // if you void out in water temple without swim you get instantly kicked out to prevent softlocks if (gPlayState->sceneNum == SCENE_WATER_TEMPLE) { - GameInteractor::RawAction::TeleportPlayer(Entrance_OverrideNextIndex(ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE));//lake hylia from water temple + GameInteractor::RawAction::TeleportPlayer( + Entrance_OverrideNextIndex(ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE)); // lake hylia from water temple } else { if (swimSpecialRespawnInfo.find(gSaveContext.entranceIndex) != swimSpecialRespawnInfo.end()) { SpecialRespawnInfo* respawnInfo = &swimSpecialRespawnInfo.at(gSaveContext.entranceIndex); @@ -2230,19 +2215,14 @@ void RandomizerOnPlayerUpdateHandler() { } // Triforce Hunt needs the check if the player isn't being teleported to the credits scene. - if ( - !GameInteractor::IsGameplayPaused() && - Flags_GetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY) && + if (!GameInteractor::IsGameplayPaused() && Flags_GetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY) && gPlayState->transitionTrigger != TRANS_TRIGGER_START && - (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0 - ) { - GiveItemEntryWithoutActor(gPlayState, *Rando::StaticData::GetItemTable().at(RG_GANONS_CASTLE_BOSS_KEY).GetGIEntry()); + (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0) { + GiveItemEntryWithoutActor(gPlayState, + *Rando::StaticData::GetItemTable().at(RG_GANONS_CASTLE_BOSS_KEY).GetGIEntry()); } - if ( - !GameInteractor::IsGameplayPaused() && - RAND_GET_OPTION(RSK_TRIFORCE_HUNT) - ) { + if (!GameInteractor::IsGameplayPaused() && RAND_GET_OPTION(RSK_TRIFORCE_HUNT)) { // Warp to credits if (GameInteractor::State::TriforceHuntCreditsWarpActive) { gPlayState->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; @@ -2269,12 +2249,14 @@ void RandomizerOnSceneSpawnActorsHandler() { switch (gPlayState->sceneNum) { case SCENE_TEMPLE_OF_TIME: if (gPlayState->roomCtx.curRoom.num == 1) { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, -104, -40, 2382, 0, 0x8000, 0, SHEIK_TYPE_RANDO, false); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, -104, -40, 2382, 0, + static_cast(0x8000), 0, SHEIK_TYPE_RANDO, false); } break; case SCENE_INSIDE_GANONS_CASTLE: if (gPlayState->roomCtx.curRoom.num == 1) { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, 101, 150, 137, 0, 0, 0, SHEIK_TYPE_RANDO, false); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, 101, 150, 137, 0, 0, 0, + SHEIK_TYPE_RANDO, false); } break; default: @@ -2330,6 +2312,7 @@ void RandomizerRegisterHooks() { static uint32_t onDialogMessageHook = 0; static uint32_t onVanillaBehaviorHook = 0; static uint32_t onSceneInitHook = 0; + static uint32_t afterSceneCommandsHook = 0; static uint32_t onActorInitHook = 0; static uint32_t onActorUpdateHook = 0; static uint32_t onPlayerUpdateHook = 0; @@ -2346,11 +2329,6 @@ void RandomizerRegisterHooks() { static uint32_t fishsanityOnVanillaBehaviorHook = 0; static uint32_t fishsanityOnItemReceiveHook = 0; - static uint32_t shufflePotsOnActorInitHook = 0; - static uint32_t shufflePotsOnVanillaBehaviorHook = 0; - - static uint32_t shuffleFreestandingOnVanillaBehaviorHook = 0; - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { ShipInit::Init("IS_RANDO"); @@ -2366,6 +2344,7 @@ void RandomizerRegisterHooks() { GameInteractor::Instance->UnregisterGameHook(onDialogMessageHook); GameInteractor::Instance->UnregisterGameHook(onVanillaBehaviorHook); GameInteractor::Instance->UnregisterGameHook(onSceneInitHook); + GameInteractor::Instance->UnregisterGameHook(afterSceneCommandsHook); GameInteractor::Instance->UnregisterGameHook(onActorInitHook); GameInteractor::Instance->UnregisterGameHook(onActorUpdateHook); GameInteractor::Instance->UnregisterGameHook(onPlayerUpdateHook); @@ -2379,14 +2358,10 @@ void RandomizerRegisterHooks() { GameInteractor::Instance->UnregisterGameHook(fishsanityOnActorInitHook); GameInteractor::Instance->UnregisterGameHook(fishsanityOnActorUpdateHook); GameInteractor::Instance->UnregisterGameHook(fishsanityOnSceneInitHook); - GameInteractor::Instance->UnregisterGameHook(fishsanityOnVanillaBehaviorHook); + GameInteractor::Instance->UnregisterGameHook( + fishsanityOnVanillaBehaviorHook); GameInteractor::Instance->UnregisterGameHook(fishsanityOnItemReceiveHook); - GameInteractor::Instance->UnregisterGameHook(shufflePotsOnActorInitHook); - GameInteractor::Instance->UnregisterGameHook(shufflePotsOnVanillaBehaviorHook); - - GameInteractor::Instance->UnregisterGameHook(shuffleFreestandingOnVanillaBehaviorHook); - onFlagSetHook = 0; onSceneFlagSetHook = 0; onPlayerUpdateForRCQueueHook = 0; @@ -2395,6 +2370,7 @@ void RandomizerRegisterHooks() { onDialogMessageHook = 0; onVanillaBehaviorHook = 0; onSceneInitHook = 0; + afterSceneCommandsHook = 0; onActorInitHook = 0; onActorUpdateHook = 0; onPlayerUpdateHook = 0; @@ -2411,14 +2387,8 @@ void RandomizerRegisterHooks() { fishsanityOnVanillaBehaviorHook = 0; fishsanityOnItemReceiveHook = 0; - shufflePotsOnActorInitHook = 0; - shufflePotsOnVanillaBehaviorHook = 0; - - shuffleFreestandingOnVanillaBehaviorHook = 0; - - ShuffleFairies_UnregisterHooks(); - - if (!IS_RANDO) return; + if (!IS_RANDO) + return; // ENTRTODO: Move all entrance rando handling to a dedicated file // Setup the modified entrance table and entrance shuffle table for rando @@ -2429,45 +2399,57 @@ void RandomizerRegisterHooks() { Entrance_SetSavewarpEntrance(); } - onFlagSetHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnFlagSetHandler); - onSceneFlagSetHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneFlagSetHandler); - onPlayerUpdateForRCQueueHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayerUpdateForRCQueueHandler); - onPlayerUpdateForItemQueueHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayerUpdateForItemQueueHandler); - onItemReceiveHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnItemReceiveHandler); - onDialogMessageHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnDialogMessageHandler); - onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnVanillaBehaviorHandler); - onSceneInitHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneInitHandler); - onActorInitHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnActorInitHandler); - onActorUpdateHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnActorUpdateHandler); - onPlayerUpdateHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayerUpdateHandler); - onGameFrameUpdateHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnGameFrameUpdateHandler); - onSceneSpawnActorsHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneSpawnActorsHandler); - onPlayDestroyHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayDestroyHandler); - onExitGameHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnExitGameHandler); - onKaleidoUpdateHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnKaleidoscopeUpdateHandler); - onCuccoOrChickenHatchHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnCuccoOrChickenHatch); + onFlagSetHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnFlagSetHandler); + onSceneFlagSetHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneFlagSetHandler); + onPlayerUpdateForRCQueueHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnPlayerUpdateForRCQueueHandler); + onPlayerUpdateForItemQueueHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnPlayerUpdateForItemQueueHandler); + onItemReceiveHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnItemReceiveHandler); + onDialogMessageHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnDialogMessageHandler); + onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnVanillaBehaviorHandler); + onSceneInitHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneInitHandler); + afterSceneCommandsHook = GameInteractor::Instance->RegisterGameHook( + RandomizerAfterSceneCommandsHandler); + onActorInitHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnActorInitHandler); + onActorUpdateHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnActorUpdateHandler); + onPlayerUpdateHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayerUpdateHandler); + onGameFrameUpdateHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnGameFrameUpdateHandler); + onSceneSpawnActorsHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnSceneSpawnActorsHandler); + onPlayDestroyHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayDestroyHandler); + onExitGameHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnExitGameHandler); + onKaleidoUpdateHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnKaleidoscopeUpdateHandler); + onCuccoOrChickenHatchHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnCuccoOrChickenHatch); if (RAND_GET_OPTION(RSK_FISHSANITY) != RO_FISHSANITY_OFF) { OTRGlobals::Instance->gRandoContext->GetFishsanity()->InitializeFromSave(); - fishsanityOnActorInitHook = GameInteractor::Instance->RegisterGameHook(Rando::Fishsanity::OnActorInitHandler); - fishsanityOnActorUpdateHook = GameInteractor::Instance->RegisterGameHook(Rando::Fishsanity::OnActorUpdateHandler); - fishsanityOnSceneInitHook = GameInteractor::Instance->RegisterGameHook(Rando::Fishsanity::OnSceneInitHandler); - fishsanityOnVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(Rando::Fishsanity::OnVanillaBehaviorHandler); - fishsanityOnItemReceiveHook = GameInteractor::Instance->RegisterGameHook(Rando::Fishsanity::OnItemReceiveHandler); - } - - if (RAND_GET_OPTION(RSK_SHUFFLE_POTS) != RO_SHUFFLE_POTS_OFF) { - shufflePotsOnActorInitHook = GameInteractor::Instance->RegisterGameHook(ObjTsubo_RandomizerInit); - shufflePotsOnVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(ShufflePots_OnVanillaBehaviorHandler); - } - - if (RAND_GET_OPTION(RSK_SHUFFLE_FREESTANDING) != RO_SHUFFLE_FREESTANDING_OFF) { - shuffleFreestandingOnVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(ShuffleFreestanding_OnVanillaBehaviorHandler); - } - - if (RAND_GET_OPTION(RSK_SHUFFLE_FAIRIES)) { - ShuffleFairies_RegisterHooks(); + fishsanityOnActorInitHook = GameInteractor::Instance->RegisterGameHook( + Rando::Fishsanity::OnActorInitHandler); + fishsanityOnActorUpdateHook = GameInteractor::Instance->RegisterGameHook( + Rando::Fishsanity::OnActorUpdateHandler); + fishsanityOnSceneInitHook = GameInteractor::Instance->RegisterGameHook( + Rando::Fishsanity::OnSceneInitHandler); + fishsanityOnVanillaBehaviorHook = + GameInteractor::Instance->RegisterGameHook( + Rando::Fishsanity::OnVanillaBehaviorHandler); + fishsanityOnItemReceiveHook = GameInteractor::Instance->RegisterGameHook( + Rando::Fishsanity::OnItemReceiveHandler); } }); } diff --git a/soh/soh/Enhancements/randomizer/item.cpp b/soh/soh/Enhancements/randomizer/item.cpp index 6f03092239..3b75a0c954 100644 --- a/soh/soh/Enhancements/randomizer/item.cpp +++ b/soh/soh/Enhancements/randomizer/item.cpp @@ -11,42 +11,55 @@ #include "../../OTRGlobals.h" namespace Rando { -Item::Item() : randomizerGet(RG_NONE), type(ITEMTYPE_ITEM), getItemId(GI_NONE), advancement(false), hintKey(RHT_NONE), - progressive(false), price(0) {} +Item::Item() + : randomizerGet(RG_NONE), type(ITEMTYPE_ITEM), getItemId(GI_NONE), advancement(false), hintKey(RHT_NONE), + progressive(false), price(0) { +} Item::Item(const RandomizerGet randomizerGet_, Text name_, const ItemType type_, const int16_t getItemId_, - const bool advancement_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const uint16_t itemId_, - const uint16_t objectId_, const uint16_t gid_, const uint16_t textId_, const uint16_t field_, - const int16_t chestAnimation_, const GetItemCategory category_, const uint16_t modIndex_, - const bool progressive_, const uint16_t price_) + const bool advancement_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const uint16_t itemId_, + const uint16_t objectId_, const uint16_t gid_, const uint16_t textId_, const uint16_t field_, + const int16_t chestAnimation_, const GetItemCategory category_, const uint16_t modIndex_, + const bool progressive_, const uint16_t price_) : randomizerGet(randomizerGet_), name(std::move(name_)), type(type_), getItemId(getItemId_), - advancement(advancement_), logicVal(logicVal_), hintKey(hintKey_), progressive(progressive_), price(price_) { + advancement(advancement_), logicVal(logicVal_), hintKey(hintKey_), progressive(progressive_), price(price_) { if (modIndex_ == MOD_RANDOMIZER || getItemId > 0x7D) { - giEntry = std::make_shared(GetItemEntry{ itemId_, field_, static_cast((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_, objectId_, modIndex_, TABLE_RANDOMIZER, static_cast(randomizerGet_), gid_, true, ITEM_FROM_NPC, category_, static_cast(randomizerGet_), MOD_RANDOMIZER, NULL }); - } - else { - giEntry = std::make_shared(GetItemEntry{ itemId_, field_, static_cast((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_, objectId_, modIndex_, TABLE_VANILLA, getItemId_, gid_, true, ITEM_FROM_NPC, category_, itemId_, modIndex_, NULL }); + giEntry = std::make_shared(GetItemEntry{ + itemId_, field_, static_cast((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_, + objectId_, modIndex_, TABLE_RANDOMIZER, static_cast(randomizerGet_), gid_, true, ITEM_FROM_NPC, + category_, static_cast(randomizerGet_), MOD_RANDOMIZER, NULL }); + } else { + giEntry = std::make_shared(GetItemEntry{ + itemId_, field_, static_cast((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_, + objectId_, modIndex_, TABLE_VANILLA, getItemId_, gid_, true, ITEM_FROM_NPC, category_, itemId_, modIndex_, + NULL }); } } Item::Item(const RandomizerGet randomizerGet_, Text name_, const ItemType type_, const int16_t getItemId_, - const bool advancement_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const bool progressive_, - const uint16_t price_) + const bool advancement_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const bool progressive_, + const uint16_t price_) : randomizerGet(randomizerGet_), name(std::move(name_)), type(type_), getItemId(getItemId_), - advancement(advancement_), logicVal(logicVal_), hintKey(hintKey_), progressive(progressive_), price(price_) { + advancement(advancement_), logicVal(logicVal_), hintKey(hintKey_), progressive(progressive_), price(price_) { } - Item::~Item() = default; +Item::~Item() = default; void Item::ApplyEffect() const { auto ctx = Rando::Context::GetInstance(); - ctx->GetLogic()->ApplyItemEffect(StaticData::RetrieveItem(randomizerGet), true); - ctx->GetLogic()->SetInLogic(logicVal, true); + auto logic = ctx->GetLogic(); + if (!logic->CalculatingAvailableChecks) { + logic->ApplyItemEffect(StaticData::RetrieveItem(randomizerGet), true); + } + logic->SetInLogic(logicVal, true); } void Item::UndoEffect() const { auto ctx = Rando::Context::GetInstance(); - ctx->GetLogic()->ApplyItemEffect(StaticData::RetrieveItem(randomizerGet), false); - ctx->GetLogic()->SetInLogic(logicVal, false); + auto logic = ctx->GetLogic(); + if (!logic->CalculatingAvailableChecks) { + logic->ApplyItemEffect(StaticData::RetrieveItem(randomizerGet), false); + } + logic->SetInLogic(logicVal, false); } const Text& Item::GetName() const { @@ -94,6 +107,7 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio actual = RG_DEKU_STICK_BAG; break; } + [[fallthrough]]; case 1: if (infiniteUpgrades == RO_INF_UPGRADES_CONDENSED_PROGRESSIVE) { actual = RG_STICK_UPGRADE_INF; @@ -123,6 +137,7 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio actual = RG_DEKU_NUT_BAG; break; } + [[fallthrough]]; case 1: if (infiniteUpgrades == RO_INF_UPGRADES_CONDENSED_PROGRESSIVE) { actual = RG_NUT_UPGRADE_INF; @@ -281,11 +296,11 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio actual = RG_GIANT_WALLET; break; case 2: - if(tycoonWallet){ + if (tycoonWallet) { actual = RG_TYCOON_WALLET; break; } - //fallthrough + // fallthrough case 3: case 4: if (infiniteUpgrades != RO_INF_UPGRADES_OFF) { @@ -336,8 +351,8 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio } break; case RG_PROGRESSIVE_GORONSWORD: // todo progressive? - actual = RG_BIGGORON_SWORD; - break; + actual = RG_BIGGORON_SWORD; + break; case RG_PROGRESSIVE_BOMBCHUS: if (logic->CurrentInventory(ITEM_BOMBCHU) == ITEM_NONE) { actual = RG_BOMBCHU_BAG; @@ -391,7 +406,8 @@ bool Item::IsMajorItem() const { return false; } - if (type == ITEMTYPE_DUNGEONREWARD && ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { + if (type == ITEMTYPE_DUNGEONREWARD && + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { return false; } @@ -405,7 +421,8 @@ bool Item::IsMajorItem() const { return false; } - if (type == ITEMTYPE_SMALLKEY && (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA) || ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON))) { + if (type == ITEMTYPE_SMALLKEY && (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA) || + ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON))) { return false; } @@ -414,11 +431,13 @@ bool Item::IsMajorItem() const { } if (type == ITEMTYPE_BOSSKEY && getItemId != 0xAD && - (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA) || ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON))) { + (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA) || + ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON))) { return false; } // Ganons Castle Boss Key - if (getItemId == 0xAD && (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA) || ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON))) { + if (getItemId == 0xAD && (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA) || + ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON))) { return false; } @@ -444,4 +463,4 @@ bool Item::operator==(const Item& right) const { bool Item::operator!=(const Item& right) const { return !operator==(right); } -} +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/item.h b/soh/soh/Enhancements/randomizer/item.h index f0df0f1bf0..da86321518 100644 --- a/soh/soh/Enhancements/randomizer/item.h +++ b/soh/soh/Enhancements/randomizer/item.h @@ -31,17 +31,16 @@ class Item { public: Item(); Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int16_t getItemId_, bool advancement_, - LogicVal logicVal_, RandomizerHintTextKey hintKey_, uint16_t itemId_, uint16_t objectId_, uint16_t gid_, - uint16_t textId_, uint16_t field_, int16_t chestAnimation_, GetItemCategory category_, uint16_t modIndex_, - bool progressive_ = false, uint16_t price_ = 0); + LogicVal logicVal_, RandomizerHintTextKey hintKey_, uint16_t itemId_, uint16_t objectId_, uint16_t gid_, + uint16_t textId_, uint16_t field_, int16_t chestAnimation_, GetItemCategory category_, uint16_t modIndex_, + bool progressive_ = false, uint16_t price_ = 0); Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int16_t getItemId_, bool advancement_, - LogicVal logicVal_, RandomizerHintTextKey hintKey_, bool progressive_ = false, uint16_t price_ = 0); + LogicVal logicVal_, RandomizerHintTextKey hintKey_, bool progressive_ = false, uint16_t price_ = 0); ~Item(); void ApplyEffect() const; void UndoEffect() const; - const Text& GetName() const; bool IsAdvancement() const; int GetItemID() const; @@ -75,4 +74,4 @@ class Item { bool playthrough = false; std::shared_ptr giEntry; }; -} +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 0b94aab39d..786717c809 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -12,18 +12,20 @@ std::unordered_map Rando::StaticData::itemNameToEnum void Rando::StaticData::InitItemTable() { auto logic = Context::GetInstance()->GetLogic(); + + // clang-format off itemTable[RG_NONE] = Item(RG_NONE, Text{ "No Item", "Rien", "Kein Artikel" }, ITEMTYPE_EVENT, GI_RUPEE_GREEN, false, LOGIC_NONE, RHT_NONE, ITEM_NONE, 0, 0, 0, 0, 0, ITEM_CATEGORY_JUNK, MOD_NONE); // Randomizer Get Randomizer Get Name Text Type Get Item ID Adv. Logic Value Hint Text Key Item ID Object ID Draw ID Text ID field Chest Animation Item Category Mod Index itemTable[RG_KOKIRI_SWORD] = Item(RG_KOKIRI_SWORD, Text{ "Kokiri Sword", "Épée Kokiri", "Kokiri-Schwert" }, ITEMTYPE_EQUIP, GI_SWORD_KOKIRI, true, LOGIC_KOKIRI_SWORD, RHT_KOKIRI_SWORD, ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_MASTER_SWORD] = Item(RG_MASTER_SWORD, Text{ "Master Sword", "Épée de Legende", "Master-Schwert"}, ITEMTYPE_EQUIP, 0xE0, true, LOGIC_MASTER_SWORD, RHT_MASTER_SWORD, ITEM_SWORD_MASTER, OBJECT_TOKI_OBJECTS, GID_SWORD_BGS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MASTER_SWORD] = Item(RG_MASTER_SWORD, Text{ "Master Sword", "Épée de Legende", "Master-Schwert" }, ITEMTYPE_EQUIP, 0xE0, true, LOGIC_MASTER_SWORD, RHT_MASTER_SWORD, ITEM_SWORD_MASTER, OBJECT_TOKI_OBJECTS, GID_SWORD_BGS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_MASTER_SWORD].SetCustomDrawFunc(Randomizer_DrawMasterSword); itemTable[RG_GIANTS_KNIFE] = Item(RG_GIANTS_KNIFE, Text{ "Giant's Knife", "Lame des Géants", "Langschwert" }, ITEMTYPE_EQUIP, GI_SWORD_KNIFE, true, LOGIC_NONE, RHT_GIANTS_KNIFE, ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_BIGGORON_SWORD] = Item(RG_BIGGORON_SWORD, Text{ "Biggoron's Sword", "Épée de Biggoron", "Biggoron-Schwert" }, ITEMTYPE_EQUIP, GI_SWORD_BGS, true, LOGIC_BIGGORON_SWORD, RHT_BIGGORON_SWORD, ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_DEKU_SHIELD] = Item(RG_DEKU_SHIELD, Text{ "Deku Shield", "Bouclier Mojo", "Deku-Schild" }, ITEMTYPE_EQUIP, GI_SHIELD_DEKU, false, LOGIC_DEKU_SHIELD, RHT_DEKU_SHIELD, ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_HYLIAN_SHIELD] = Item(RG_HYLIAN_SHIELD, Text{ "Hylian Shield", "Bouclier Hylien", "Hylia-Schild" }, ITEMTYPE_EQUIP, GI_SHIELD_HYLIAN, false, LOGIC_HYLIAN_SHIELD, RHT_HYLIAN_SHIELD, ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_MIRROR_SHIELD] = Item(RG_MIRROR_SHIELD, Text{ "Mirror Shield", "Bouclier Miroir", "Spiegelschild" }, ITEMTYPE_EQUIP, GI_SHIELD_MIRROR, true, LOGIC_MIRROR_SHIELD, RHT_MIRROR_SHIELD, ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_GORON_TUNIC] = Item(RG_GORON_TUNIC, Text{ "Goron Tunic", "Tunique Goron", "Goronen-Tunika" }, ITEMTYPE_EQUIP, GI_TUNIC_GORON, true, LOGIC_GORON_TUNIC, RHT_GORON_TUNIC, ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_ZORA_TUNIC] = Item(RG_ZORA_TUNIC, Text{ "Zora Tunic", "Tunique Zora", "Zora-Tunika" }, ITEMTYPE_EQUIP, GI_TUNIC_ZORA, true, LOGIC_ZORA_TUNIC, RHT_ZORA_TUNIC, ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_MIRROR_SHIELD] = Item(RG_MIRROR_SHIELD, Text{ "Mirror Shield", "Bouclier Miroir", "Spiegel-Schild" }, ITEMTYPE_EQUIP, GI_SHIELD_MIRROR, true, LOGIC_MIRROR_SHIELD, RHT_MIRROR_SHIELD, ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GORON_TUNIC] = Item(RG_GORON_TUNIC, Text{ "Goron Tunic", "Tunique Goron", "Goronen-Rüstung" }, ITEMTYPE_EQUIP, GI_TUNIC_GORON, true, LOGIC_GORON_TUNIC, RHT_GORON_TUNIC, ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_ZORA_TUNIC] = Item(RG_ZORA_TUNIC, Text{ "Zora Tunic", "Tunique Zora", "Zora-Rüstung" }, ITEMTYPE_EQUIP, GI_TUNIC_ZORA, true, LOGIC_ZORA_TUNIC, RHT_ZORA_TUNIC, ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_IRON_BOOTS] = Item(RG_IRON_BOOTS, Text{ "Iron Boots", "Bottes de plomb", "Eisenstiefel" }, ITEMTYPE_EQUIP, GI_BOOTS_IRON, true, LOGIC_IRON_BOOTS, RHT_IRON_BOOTS, ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_HOVER_BOOTS] = Item(RG_HOVER_BOOTS, Text{ "Hover Boots", "Bottes de airs", "Gleitstiefel" }, ITEMTYPE_EQUIP, GI_BOOTS_HOVER, true, LOGIC_HOVER_BOOTS, RHT_HOVER_BOOTS, ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_BOOMERANG] = Item(RG_BOOMERANG, Text{ "Boomerang", "Boomerang", "Bumerang" }, ITEMTYPE_ITEM, GI_BOOMERANG, true, LOGIC_BOOMERANG, RHT_BOOMERANG, ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); @@ -33,9 +35,9 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_DINS_FIRE] = Item(RG_DINS_FIRE, Text{ "Din's Fire", "Feu de Din", "Dins Feuerinferno" }, ITEMTYPE_ITEM, GI_DINS_FIRE, true, LOGIC_DINS_FIRE, RHT_DINS_FIRE, ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_FARORES_WIND] = Item(RG_FARORES_WIND, Text{ "Farore's Wind", "Vent de Farore", "Farores Donnersturm" }, ITEMTYPE_ITEM, GI_FARORES_WIND, true, LOGIC_FARORES_WIND, RHT_FARORES_WIND, ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_NAYRUS_LOVE] = Item(RG_NAYRUS_LOVE, Text{ "Nayru's Love", "Amour de Nayru", "Nayrus Umarmung" }, ITEMTYPE_ITEM, GI_NAYRUS_LOVE, true, LOGIC_NAYRUS_LOVE, RHT_NAYRUS_LOVE, ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_FIRE_ARROWS] = Item(RG_FIRE_ARROWS, Text{ "Fire Arrow", "Flèche de Feu", "Feuerpfeil" }, ITEMTYPE_ITEM, GI_ARROW_FIRE, true, LOGIC_FIRE_ARROWS, RHT_FIRE_ARROWS, ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_ICE_ARROWS] = Item(RG_ICE_ARROWS, Text{ "Ice Arrow", "Flèche de Glace", "Eispfeil" }, ITEMTYPE_ITEM, GI_ARROW_ICE, true, LOGIC_ICE_ARROWS, RHT_ICE_ARROWS, ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_LIGHT_ARROWS] = Item(RG_LIGHT_ARROWS, Text{ "Light Arrow", "Flèche de Lumière", "Lichtpfeil" }, ITEMTYPE_ITEM, GI_ARROW_LIGHT, true, LOGIC_LIGHT_ARROWS, RHT_LIGHT_ARROWS, ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_FIRE_ARROWS] = Item(RG_FIRE_ARROWS, Text{ "Fire Arrow", "Flèche de Feu", "Feuer-Pfeile" }, ITEMTYPE_ITEM, GI_ARROW_FIRE, true, LOGIC_FIRE_ARROWS, RHT_FIRE_ARROWS, ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_ICE_ARROWS] = Item(RG_ICE_ARROWS, Text{ "Ice Arrow", "Flèche de Glace", "Eis-Pfeile" }, ITEMTYPE_ITEM, GI_ARROW_ICE, true, LOGIC_ICE_ARROWS, RHT_ICE_ARROWS, ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_LIGHT_ARROWS] = Item(RG_LIGHT_ARROWS, Text{ "Light Arrow", "Flèche de Lumière", "Licht-Pfeile" }, ITEMTYPE_ITEM, GI_ARROW_LIGHT, true, LOGIC_LIGHT_ARROWS, RHT_LIGHT_ARROWS, ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_GERUDO_MEMBERSHIP_CARD] = Item(RG_GERUDO_MEMBERSHIP_CARD, Text{ "Gerudo Membership Card", "Carte Gerudo", "Gerudo-Pass" }, ITEMTYPE_ITEM, GI_GERUDO_CARD, true, LOGIC_GERUDO_CARD, RHT_GERUDO_MEMBERSHIP_CARD, ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_MAGIC_BEAN] = Item(RG_MAGIC_BEAN, Text{ "Magic Bean", "Haricots Magiques", "Wundererbse" }, ITEMTYPE_ITEM, GI_BEAN, true, LOGIC_MAGIC_BEAN, RHT_MAGIC_BEAN, ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_MAGIC_BEAN_PACK] = Item(RG_MAGIC_BEAN_PACK, Text{ "Magic Bean Pack", "Paquet de Haricots Magiques", "Wundererbsen-Packung" }, ITEMTYPE_ITEM, RG_MAGIC_BEAN_PACK, true, LOGIC_MAGIC_BEAN, RHT_MAGIC_BEAN_PACK, RG_MAGIC_BEAN_PACK, OBJECT_GI_BEAN, GID_BEAN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); @@ -49,40 +51,40 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_ODD_MUSHROOM] = Item(RG_ODD_MUSHROOM, Text{ "Odd Mushroom", "Champigon Suspect", "Schimmelpilz" }, ITEMTYPE_ITEM, GI_ODD_MUSHROOM, true, LOGIC_ODD_MUSHROOM, RHT_ODD_MUSHROOM, ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_ODD_POTION] = Item(RG_ODD_POTION, Text{ "Odd Potion", "Mixture Suspecte", "Modertrank" }, ITEMTYPE_ITEM, GI_ODD_POTION, true, LOGIC_ODD_POULTICE, RHT_ODD_POTION, ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_POACHERS_SAW] = Item(RG_POACHERS_SAW, Text{ "Poacher's Saw", "Scie du Chasseur", "Säge" }, ITEMTYPE_ITEM, GI_SAW, true, LOGIC_POACHERS_SAW, RHT_POACHERS_SAW, ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_BROKEN_SWORD] = Item(RG_BROKEN_SWORD, Text{ "Broken Goron's Sword", "Épée Brisée de Goron", "Zerbrochenes Goronen-Schwert" }, ITEMTYPE_ITEM, GI_SWORD_BROKEN, true, LOGIC_BROKEN_SWORD, RHT_BROKEN_SWORD, ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BROKEN_SWORD] = Item(RG_BROKEN_SWORD, Text{ "Broken Goron's Sword", "Épée Brisée de Goron", "zerbr. Goronen-Schwert" }, ITEMTYPE_ITEM, GI_SWORD_BROKEN, true, LOGIC_BROKEN_SWORD, RHT_BROKEN_SWORD, ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_PRESCRIPTION] = Item(RG_PRESCRIPTION, Text{ "Prescription", "Ordonnance", "Rezept" }, ITEMTYPE_ITEM, GI_PRESCRIPTION, true, LOGIC_PRESCRIPTION, RHT_PRESCRIPTION, ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_EYEBALL_FROG] = Item(RG_EYEBALL_FROG, Text{ "Eyeball Frog", "Crapaud-qui-louche", "Glotzfrosch" }, ITEMTYPE_ITEM, GI_FROG, true, LOGIC_EYEBALL_FROG, RHT_EYEBALL_FROG, ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_EYEDROPS] = Item(RG_EYEDROPS, Text{ "World's Finest Eyedrops", "Super Gouttes", "Augentropfen" }, ITEMTYPE_ITEM, GI_EYEDROPS, true, LOGIC_EYEDROPS, RHT_EYEDROPS, ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_CLAIM_CHECK] = Item(RG_CLAIM_CHECK, Text{ "Claim Check", "Certificat", "Zertifikat" }, ITEMTYPE_ITEM, GI_CLAIM_CHECK, true, LOGIC_CLAIM_CHECK, RHT_CLAIM_CHECK, ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); // Skulltula Token - itemTable[RG_GOLD_SKULLTULA_TOKEN] = Item(RG_GOLD_SKULLTULA_TOKEN, Text{ "Gold Skulltula Token", "Symbole de Skulltula d'Or", "Goldenes Skulltula-Symbol" }, ITEMTYPE_TOKEN, GI_SKULL_TOKEN, true, LOGIC_GOLD_SKULLTULA_TOKENS, RHT_GOLD_SKULLTULA_TOKEN, ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SKULLTULA_TOKEN, MOD_NONE); + itemTable[RG_GOLD_SKULLTULA_TOKEN] = Item(RG_GOLD_SKULLTULA_TOKEN, Text{ "Gold Skulltula Token", "Symbole de Skulltula d'Or", "Skulltula-Symbol" }, ITEMTYPE_TOKEN, GI_SKULL_TOKEN, true, LOGIC_GOLD_SKULLTULA_TOKENS, RHT_GOLD_SKULLTULA_TOKEN, ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SKULLTULA_TOKEN, MOD_NONE); // Progressive Items - itemTable[RG_PROGRESSIVE_HOOKSHOT] = Item(RG_PROGRESSIVE_HOOKSHOT, Text{ "Progressive Hookshot", "Grappin (prog.)", "Progressiver Fanghaken" }, ITEMTYPE_ITEM, 0x80, true, LOGIC_PROGRESSIVE_HOOKSHOT, RHT_PROGRESSIVE_HOOKSHOT, true); - itemTable[RG_PROGRESSIVE_STRENGTH] = Item(RG_PROGRESSIVE_STRENGTH, Text{ "Strength Upgrade", "Amélioration de Force (prog.)", "Progressives Kraft-Upgrade" }, ITEMTYPE_ITEM, 0x81, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_PROGRESSIVE_STRENGTH, true); - itemTable[RG_PROGRESSIVE_BOMB_BAG] = Item(RG_PROGRESSIVE_BOMB_BAG, Text{ "Progressive Bomb Bag", "Sac de Bombes (prog.)", "Progressive Bombentasche" }, ITEMTYPE_ITEM, 0x82, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_PROGRESSIVE_BOMB_BAG, true); - itemTable[RG_PROGRESSIVE_BOW] = Item(RG_PROGRESSIVE_BOW, Text{ "Progressive Bow", "Arc (prog.)", "Progressiver Bogen" }, ITEMTYPE_ITEM, 0x83, true, LOGIC_PROGRESSIVE_BOW, RHT_PROGRESSIVE_BOW, true); - itemTable[RG_PROGRESSIVE_SLINGSHOT] = Item(RG_PROGRESSIVE_SLINGSHOT, Text{ "Progressive Slingshot", "Lance-Pierre (prog.)", "Progressive Steinschleuder" }, ITEMTYPE_ITEM, 0x84, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_PROGRESSIVE_SLINGSHOT, true); - itemTable[RG_PROGRESSIVE_WALLET] = Item(RG_PROGRESSIVE_WALLET, Text{ "Progressive Wallet", "Bourse (prog.)", "Progressive Geldbörse" }, ITEMTYPE_ITEM, 0x85, true, LOGIC_PROGRESSIVE_WALLET, RHT_PROGRESSIVE_WALLET, true); - itemTable[RG_PROGRESSIVE_SCALE] = Item(RG_PROGRESSIVE_SCALE, Text{ "Progressive Scale", "Écaille (prog.)", "Progressive Schuppe" }, ITEMTYPE_ITEM, 0x86, true, LOGIC_PROGRESSIVE_SCALE, RHT_PROGRESSIVE_SCALE, true); - itemTable[RG_PROGRESSIVE_NUT_UPGRADE] = Item(RG_PROGRESSIVE_NUT_UPGRADE, Text{ "Progressive Nut Capacity", "Capacité de Noix (prog.)", "Progressive Nuß-Kapazität" }, ITEMTYPE_ITEM, 0x87, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_PROGRESSIVE_NUT_UPGRADE, true); - itemTable[RG_PROGRESSIVE_STICK_UPGRADE] = Item(RG_PROGRESSIVE_STICK_UPGRADE, Text{ "Progressive Stick Capacity", "Capacité de Bâtons (prog.)", "Progressive Stab-Kapazität" }, ITEMTYPE_ITEM, 0x88, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_PROGRESSIVE_STICK_UPGRADE, true); - itemTable[RG_PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{ "Progressive Bombchu", "Missiles (prog.)", "Progressive Krabbelminen" }, ITEMTYPE_ITEM, 0x89, true, LOGIC_BOMBCHUS, RHT_PROGRESSIVE_BOMBCHUS, true); - itemTable[RG_PROGRESSIVE_MAGIC_METER] = Item(RG_PROGRESSIVE_MAGIC_METER, Text{ "Progressive Magic Meter", "Jauge de Magie (prog.)", "Progressives Magisches Maß" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_PROGRESSIVE_MAGIC_METER, true); - itemTable[RG_PROGRESSIVE_OCARINA] = Item(RG_PROGRESSIVE_OCARINA, Text{ "Progressive Ocarina", "Ocarina (prog.)", "Progressive Okarina" }, ITEMTYPE_ITEM, 0x8B, true, LOGIC_PROGRESSIVE_OCARINA, RHT_PROGRESSIVE_OCARINA, true); - itemTable[RG_PROGRESSIVE_GORONSWORD] = Item(RG_PROGRESSIVE_GORONSWORD, Text{ "Progressive Goron Sword", "Épée Goron (prog.)", "Progressives Goronen-Schwert" }, ITEMTYPE_ITEM, 0xD4, true, LOGIC_PROGRESSIVE_GIANT_KNIFE, RHT_PROGRESSIVE_GORONSWORD, true); + itemTable[RG_PROGRESSIVE_HOOKSHOT] = Item(RG_PROGRESSIVE_HOOKSHOT, Text{ "Progressive Hookshot", "Grappin (prog.)", "Fanghaken (prog.)" }, ITEMTYPE_ITEM, 0x80, true, LOGIC_PROGRESSIVE_HOOKSHOT, RHT_PROGRESSIVE_HOOKSHOT, true); + itemTable[RG_PROGRESSIVE_STRENGTH] = Item(RG_PROGRESSIVE_STRENGTH, Text{ "Strength Upgrade", "Amélioration de Force (prog.)", "Stärke (prog.)" }, ITEMTYPE_ITEM, 0x81, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_PROGRESSIVE_STRENGTH, true); + itemTable[RG_PROGRESSIVE_BOMB_BAG] = Item(RG_PROGRESSIVE_BOMB_BAG, Text{ "Progressive Bomb Bag", "Sac de Bombes (prog.)", "Bombentasche (prog.)" }, ITEMTYPE_ITEM, 0x82, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_PROGRESSIVE_BOMB_BAG, true); + itemTable[RG_PROGRESSIVE_BOW] = Item(RG_PROGRESSIVE_BOW, Text{ "Progressive Bow", "Arc (prog.)", "Bogen (prog.)" }, ITEMTYPE_ITEM, 0x83, true, LOGIC_PROGRESSIVE_BOW, RHT_PROGRESSIVE_BOW, true); + itemTable[RG_PROGRESSIVE_SLINGSHOT] = Item(RG_PROGRESSIVE_SLINGSHOT, Text{ "Progressive Slingshot", "Lance-Pierre (prog.)", "Schleuder (prog.)" }, ITEMTYPE_ITEM, 0x84, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_PROGRESSIVE_SLINGSHOT, true); + itemTable[RG_PROGRESSIVE_WALLET] = Item(RG_PROGRESSIVE_WALLET, Text{ "Progressive Wallet", "Bourse (prog.)", "Geldbörse (prog.)" }, ITEMTYPE_ITEM, 0x85, true, LOGIC_PROGRESSIVE_WALLET, RHT_PROGRESSIVE_WALLET, true); + itemTable[RG_PROGRESSIVE_SCALE] = Item(RG_PROGRESSIVE_SCALE, Text{ "Progressive Scale", "Écaille (prog.)", "Zora-Schuppe (prog.)" }, ITEMTYPE_ITEM, 0x86, true, LOGIC_PROGRESSIVE_SCALE, RHT_PROGRESSIVE_SCALE, true); + itemTable[RG_PROGRESSIVE_NUT_UPGRADE] = Item(RG_PROGRESSIVE_NUT_UPGRADE, Text{ "Progressive Nut Capacity", "Capacité de Noix (prog.)", "Nuß-Kapazität (prog.)" }, ITEMTYPE_ITEM, 0x87, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_PROGRESSIVE_NUT_UPGRADE, true); + itemTable[RG_PROGRESSIVE_STICK_UPGRADE] = Item(RG_PROGRESSIVE_STICK_UPGRADE, Text{ "Progressive Stick Capacity", "Capacité de Bâtons (prog.)", "Stab-Kapazität (prog.)" }, ITEMTYPE_ITEM, 0x88, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_PROGRESSIVE_STICK_UPGRADE, true); + itemTable[RG_PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{ "Progressive Bombchu", "Missiles (prog.)", "Krabbelminen (prog.)" }, ITEMTYPE_ITEM, 0x89, true, LOGIC_BOMBCHUS, RHT_PROGRESSIVE_BOMBCHUS, true); + itemTable[RG_PROGRESSIVE_MAGIC_METER] = Item(RG_PROGRESSIVE_MAGIC_METER, Text{ "Progressive Magic Meter", "Jauge de Magie (prog.)", "Magische Kraft (prog.)" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_PROGRESSIVE_MAGIC_METER, true); + itemTable[RG_PROGRESSIVE_OCARINA] = Item(RG_PROGRESSIVE_OCARINA, Text{ "Progressive Ocarina", "Ocarina (prog.)", "Okarina (prog.)" }, ITEMTYPE_ITEM, 0x8B, true, LOGIC_PROGRESSIVE_OCARINA, RHT_PROGRESSIVE_OCARINA, true); + itemTable[RG_PROGRESSIVE_GORONSWORD] = Item(RG_PROGRESSIVE_GORONSWORD, Text{ "Progressive Goron Sword", "Épée Goron (prog.)", "Goronen-Schwert (prog.)" }, ITEMTYPE_ITEM, 0xD4, true, LOGIC_PROGRESSIVE_GIANT_KNIFE, RHT_PROGRESSIVE_GORONSWORD, true); // Bottles itemTable[RG_EMPTY_BOTTLE] = Item(RG_EMPTY_BOTTLE, Text{ "Empty Bottle", "Bouteille Vide", "Leere Flasche" }, ITEMTYPE_ITEM, GI_BOTTLE, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_MILK, ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_BOTTLE_WITH_MILK] = Item(RG_BOTTLE_WITH_MILK, Text{ "Bottle with Milk", "Bouteille avec du Lait", "Flasche mit Milch" }, ITEMTYPE_ITEM, GI_MILK_BOTTLE, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_MILK, ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_BOTTLE_WITH_RED_POTION] = Item(RG_BOTTLE_WITH_RED_POTION, Text{ "Bottle with Red Potion", "Bouteille avec une Potion Rouge", "Flasche mit rotem Elixier" }, ITEMTYPE_ITEM, 0x8C, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_RED_POTION, RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_GREEN_POTION] = Item(RG_BOTTLE_WITH_GREEN_POTION, Text{ "Bottle with Green Potion", "Bouteille avec une Potion Verte", "Flasche mit grünem Elixier" }, ITEMTYPE_ITEM, 0x8D, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_GREEN_POTION, RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_BLUE_POTION] = Item(RG_BOTTLE_WITH_BLUE_POTION, Text{ "Bottle with Blue Potion", "Bouteille avec une Potion Bleue", "Flasche mit blauem Elixier" }, ITEMTYPE_ITEM, 0x8E, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BLUE_POTION, RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_FAIRY] = Item(RG_BOTTLE_WITH_FAIRY, Text{ "Bottle with Fairy", "Bouteille avec une Fée", "Flasche mit Fee" }, ITEMTYPE_ITEM, 0x8F, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_FAIRY, RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_FISH] = Item(RG_BOTTLE_WITH_FISH, Text{ "Bottle with Fish", "Bouteille avec un Poisson", "Flasche mit Fisch" }, ITEMTYPE_ITEM, 0x90, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_FISH, RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_BLUE_FIRE] = Item(RG_BOTTLE_WITH_BLUE_FIRE, Text{ "Bottle with Blue Fire", "Bouteille avec une Flamme Bleue", "Flasche mit blauem Feuer" }, ITEMTYPE_ITEM, 0x91, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BLUE_FIRE, RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_BUGS] = Item(RG_BOTTLE_WITH_BUGS, Text{ "Bottle with Bugs", "Bouteille avec des Insectes", "Flasche mit Wanzen" }, ITEMTYPE_ITEM, 0x92, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BUGS, RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_POE] = Item(RG_BOTTLE_WITH_POE, Text{ "Bottle with Poe", "Bouteille avec un Esprit", "Flasche mit einem Geist" }, ITEMTYPE_ITEM, 0x94, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_POE, RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_RUTOS_LETTER] = Item(RG_RUTOS_LETTER, Text{ "Bottle with Ruto's Letter", "Bouteille avec la Lettre de Ruto", "Flasche mit Rutos Brief" }, ITEMTYPE_ITEM, GI_LETTER_RUTO, true, LOGIC_RUTOS_LETTER, RHT_RUTOS_LETTER, ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_BOTTLE_WITH_BIG_POE] = Item(RG_BOTTLE_WITH_BIG_POE, Text{ "Bottle with Big Poe", "Bouteille avec une Âme", "Flasche mit Seele" }, ITEMTYPE_ITEM, 0x93, true, LOGIC_BOTTLE_WITH_BIG_POE, RHT_BOTTLE_WITH_BIG_POE, RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_MILK] = Item(RG_BOTTLE_WITH_MILK, Text{ "Bottle with Milk", "Bouteille avec du Lait", "Flasche (Milch)" }, ITEMTYPE_ITEM, GI_MILK_BOTTLE, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_MILK, ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BOTTLE_WITH_RED_POTION] = Item(RG_BOTTLE_WITH_RED_POTION, Text{ "Bottle with Red Potion", "Bouteille avec une Potion Rouge", "Flasche (Rotes Elixier)" }, ITEMTYPE_ITEM, 0x8C, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_RED_POTION, RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_GREEN_POTION] = Item(RG_BOTTLE_WITH_GREEN_POTION, Text{ "Bottle with Green Potion", "Bouteille avec une Potion Verte", "Flasche (Grünes Elixier)" }, ITEMTYPE_ITEM, 0x8D, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_GREEN_POTION, RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_BLUE_POTION] = Item(RG_BOTTLE_WITH_BLUE_POTION, Text{ "Bottle with Blue Potion", "Bouteille avec une Potion Bleue", "Flasche (Blaues Elixier)" }, ITEMTYPE_ITEM, 0x8E, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BLUE_POTION, RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_FAIRY] = Item(RG_BOTTLE_WITH_FAIRY, Text{ "Bottle with Fairy", "Bouteille avec une Fée", "Flasche (Fee)" }, ITEMTYPE_ITEM, 0x8F, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_FAIRY, RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_FISH] = Item(RG_BOTTLE_WITH_FISH, Text{ "Bottle with Fish", "Bouteille avec un Poisson", "Flasche (Fisch)" }, ITEMTYPE_ITEM, 0x90, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_FISH, RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_BLUE_FIRE] = Item(RG_BOTTLE_WITH_BLUE_FIRE, Text{ "Bottle with Blue Fire", "Bouteille avec une Flamme Bleue", "Flasche (Blaues Feuer)" }, ITEMTYPE_ITEM, 0x91, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BLUE_FIRE, RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_BUGS] = Item(RG_BOTTLE_WITH_BUGS, Text{ "Bottle with Bugs", "Bouteille avec des Insectes", "Flasche (Käfer)" }, ITEMTYPE_ITEM, 0x92, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BUGS, RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_POE] = Item(RG_BOTTLE_WITH_POE, Text{ "Bottle with Poe", "Bouteille avec un Esprit", "Flasche (Irrlicht)" }, ITEMTYPE_ITEM, 0x94, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_POE, RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_RUTOS_LETTER] = Item(RG_RUTOS_LETTER, Text{ "Bottle with Ruto's Letter", "Bouteille avec la Lettre de Ruto", "Flasche (Rutos Brief)" }, ITEMTYPE_ITEM, GI_LETTER_RUTO, true, LOGIC_RUTOS_LETTER, RHT_RUTOS_LETTER, ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BOTTLE_WITH_BIG_POE] = Item(RG_BOTTLE_WITH_BIG_POE, Text{ "Bottle with Big Poe", "Bouteille avec une Âme", "Flasche (Nachtschwärmer)" }, ITEMTYPE_ITEM, 0x93, true, LOGIC_BOTTLE_WITH_BIG_POE, RHT_BOTTLE_WITH_BIG_POE, RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); // Songs itemTable[RG_ZELDAS_LULLABY] = Item(RG_ZELDAS_LULLABY, Text{ "Zelda's Lullaby", "Berceuse de Zelda", "Zeldas Wiegenlied" }, ITEMTYPE_SONG, 0xC1, true, LOGIC_ZELDAS_LULLABY, RHT_ZELDAS_LULLABY, ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_EPONAS_SONG] = Item(RG_EPONAS_SONG, Text{ "Epona's Song", "Chant d'Epona", "Eponas Lied" }, ITEMTYPE_SONG, 0xC2, true, LOGIC_EPONAS_SONG, RHT_EPONAS_SONG, ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); @@ -97,136 +99,147 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_REQUIEM_OF_SPIRIT] = Item(RG_REQUIEM_OF_SPIRIT, Text{ "Requiem of Spirit", "Requiem des Esprits", "Requiem der Geister" }, ITEMTYPE_SONG, 0xBE, true, LOGIC_REQUIEM_OF_SPIRIT, RHT_REQUIEM_OF_SPIRIT, ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_PRELUDE_OF_LIGHT] = Item(RG_PRELUDE_OF_LIGHT, Text{ "Prelude of Light", "Prélude de la Lumière", "Kantate des Lichts" }, ITEMTYPE_SONG, 0xC0, true, LOGIC_PRELUDE_OF_LIGHT, RHT_PRELUDE_OF_LIGHT, ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); // Maps and Compasses - itemTable[RG_DEKU_TREE_MAP] = Item(RG_DEKU_TREE_MAP, Text{ "Great Deku Tree Map", "Carte de l'Arbre Mojo", "Karte des Deku-Baums" }, ITEMTYPE_MAP, 0xA5, false, LOGIC_MAP_DEKU_TREE, RHT_DEKU_TREE_MAP, RG_DEKU_TREE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_DODONGOS_CAVERN_MAP] = Item(RG_DODONGOS_CAVERN_MAP, Text{ "Dodongo's Cavern Map", "Carte de la Caverne Dodongo", "Karte der Dodongo-Höhle" }, ITEMTYPE_MAP, 0xA6, false, LOGIC_MAP_DODONGOS_CAVERN, RHT_DODONGOS_CAVERN_MAP, RG_DODONGOS_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_JABU_JABUS_BELLY_MAP] = Item(RG_JABU_JABUS_BELLY_MAP, Text{ "Jabu-Jabu's Belly Map", "Carte du Ventre de Jabu-Jabu", "Karte des Jabu-Jabu-Bauchs" }, ITEMTYPE_MAP, 0xA7, false, LOGIC_MAP_JABU_JABUS_BELLY, RHT_JABU_JABUS_BELLY_MAP, RG_JABU_JABUS_BELLY_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_FOREST_TEMPLE_MAP] = Item(RG_FOREST_TEMPLE_MAP, Text{ "Forest Temple Map", "Carte du Temple de la Forêt", "Karte des Waldtempels" }, ITEMTYPE_MAP, 0xA8, false, LOGIC_MAP_FOREST_TEMPLE, RHT_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_FIRE_TEMPLE_MAP] = Item(RG_FIRE_TEMPLE_MAP, Text{ "Fire Temple Map", "Carte due Temple de Feu", "Karte des Feuertempels" }, ITEMTYPE_MAP, 0xA9, false, LOGIC_MAP_FIRE_TEMPLE, RHT_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_WATER_TEMPLE_MAP] = Item(RG_WATER_TEMPLE_MAP, Text{ "Water Temple Map", "Carte du Temple de l'Eau", "Karte des Wassertempels" }, ITEMTYPE_MAP, 0xAA, false, LOGIC_MAP_WATER_TEMPLE, RHT_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_SPIRIT_TEMPLE_MAP] = Item(RG_SPIRIT_TEMPLE_MAP, Text{ "Spirit Temple Map", "Carte due Temple de l'Esprit", "Karte des Geistertempels" }, ITEMTYPE_MAP, 0xAB, false, LOGIC_MAP_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_SHADOW_TEMPLE_MAP] = Item(RG_SHADOW_TEMPLE_MAP, Text{ "Shadow Temple Map", "Carte du Temple de l'Ombre", "Karte des Schattentempels" }, ITEMTYPE_MAP, 0xAC, false, LOGIC_MAP_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_BOTTOM_OF_THE_WELL_MAP] = Item(RG_BOTTOM_OF_THE_WELL_MAP, Text{ "Bottom of the Well Map", "Carte du Puits", "Karte des Grund des Brunnens" }, ITEMTYPE_MAP, 0xAD, false, LOGIC_MAP_BOTTOM_OF_THE_WELL, RHT_BOTTOM_OF_THE_WELL_MAP, RG_BOTTOM_OF_THE_WELL_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_ICE_CAVERN_MAP] = Item(RG_ICE_CAVERN_MAP, Text{ "Ice Cavern Map", "Carte de la Caverne Polaire", "Karte der Eishöhle" }, ITEMTYPE_MAP, 0xAE, false, LOGIC_MAP_ICE_CAVERN, RHT_ICE_CAVERN_MAP, RG_ICE_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_DEKU_TREE_COMPASS] = Item(RG_DEKU_TREE_COMPASS, Text{ "Great Deku Tree Compass", "Boussole de l'Arbre Mojo", "Kompaß des Deku-Baums" }, ITEMTYPE_COMPASS, 0x9B, false, LOGIC_COMPASS_DEKU_TREE, RHT_DEKU_TREE_COMPASS, RG_DEKU_TREE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DEKU_TREE_MAP] = Item(RG_DEKU_TREE_MAP, Text{ "Great Deku Tree Map", "Carte de l'Arbre Mojo", "Karte (Deku-Baum)" }, ITEMTYPE_MAP, 0xA5, false, LOGIC_MAP_DEKU_TREE, RHT_DEKU_TREE_MAP, RG_DEKU_TREE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DEKU_TREE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); + itemTable[RG_DODONGOS_CAVERN_MAP] = Item(RG_DODONGOS_CAVERN_MAP, Text{ "Dodongo's Cavern Map", "Carte de la Caverne Dodongo", "Karte (Dodongos Höhle)" }, ITEMTYPE_MAP, 0xA6, false, LOGIC_MAP_DODONGOS_CAVERN, RHT_DODONGOS_CAVERN_MAP, RG_DODONGOS_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DODONGOS_CAVERN_MAP].SetCustomDrawFunc(Randomizer_DrawMap); + itemTable[RG_JABU_JABUS_BELLY_MAP] = Item(RG_JABU_JABUS_BELLY_MAP, Text{ "Jabu-Jabu's Belly Map", "Carte du Ventre de Jabu-Jabu", "Karte (Jabu-Jabus Bauch)" }, ITEMTYPE_MAP, 0xA7, false, LOGIC_MAP_JABU_JABUS_BELLY, RHT_JABU_JABUS_BELLY_MAP, RG_JABU_JABUS_BELLY_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_JABU_JABUS_BELLY_MAP].SetCustomDrawFunc(Randomizer_DrawMap); + itemTable[RG_FOREST_TEMPLE_MAP] = Item(RG_FOREST_TEMPLE_MAP, Text{ "Forest Temple Map", "Carte du Temple de la Forêt", "Karte (Waldtempel)" }, ITEMTYPE_MAP, 0xA8, false, LOGIC_MAP_FOREST_TEMPLE, RHT_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); + itemTable[RG_FIRE_TEMPLE_MAP] = Item(RG_FIRE_TEMPLE_MAP, Text{ "Fire Temple Map", "Carte due Temple de Feu", "Karte (Feuertempel)" }, ITEMTYPE_MAP, 0xA9, false, LOGIC_MAP_FIRE_TEMPLE, RHT_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); + itemTable[RG_WATER_TEMPLE_MAP] = Item(RG_WATER_TEMPLE_MAP, Text{ "Water Temple Map", "Carte du Temple de l'Eau", "Karte (Wassertempel)" }, ITEMTYPE_MAP, 0xAA, false, LOGIC_MAP_WATER_TEMPLE, RHT_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); + itemTable[RG_SPIRIT_TEMPLE_MAP] = Item(RG_SPIRIT_TEMPLE_MAP, Text{ "Spirit Temple Map", "Carte due Temple de l'Esprit", "Karte (Geistertempel)" }, ITEMTYPE_MAP, 0xAB, false, LOGIC_MAP_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); + itemTable[RG_SHADOW_TEMPLE_MAP] = Item(RG_SHADOW_TEMPLE_MAP, Text{ "Shadow Temple Map", "Carte du Temple de l'Ombre", "Karte (Schattentempel)" }, ITEMTYPE_MAP, 0xAC, false, LOGIC_MAP_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); + itemTable[RG_BOTTOM_OF_THE_WELL_MAP] = Item(RG_BOTTOM_OF_THE_WELL_MAP, Text{ "Bottom of the Well Map", "Carte du Puits", "Karte (Grund des Brunnens)" }, ITEMTYPE_MAP, 0xAD, false, LOGIC_MAP_BOTTOM_OF_THE_WELL, RHT_BOTTOM_OF_THE_WELL_MAP, RG_BOTTOM_OF_THE_WELL_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_MAP].SetCustomDrawFunc(Randomizer_DrawMap); + itemTable[RG_ICE_CAVERN_MAP] = Item(RG_ICE_CAVERN_MAP, Text{ "Ice Cavern Map", "Carte de la Caverne Polaire", "Karte (Eishöhle)" }, ITEMTYPE_MAP, 0xAE, false, LOGIC_MAP_ICE_CAVERN, RHT_ICE_CAVERN_MAP, RG_ICE_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_MAP].SetCustomDrawFunc(Randomizer_DrawMap); + itemTable[RG_DEKU_TREE_COMPASS] = Item(RG_DEKU_TREE_COMPASS, Text{ "Great Deku Tree Compass", "Boussole de l'Arbre Mojo", "Kompaß (Deku-Baum)" }, ITEMTYPE_COMPASS, 0x9B, false, LOGIC_COMPASS_DEKU_TREE, RHT_DEKU_TREE_COMPASS, RG_DEKU_TREE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_DEKU_TREE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_DODONGOS_CAVERN_COMPASS] = Item(RG_DODONGOS_CAVERN_COMPASS, Text{ "Dodongo's Cavern Compass", "Boussole de la Caverne Dodongo", "Kompaß der Dodongo-Höhle" }, ITEMTYPE_COMPASS, 0x9C, false, LOGIC_COMPASS_DODONGOS_CAVERN, RHT_DODONGOS_CAVERN_COMPASS, RG_DODONGOS_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DODONGOS_CAVERN_COMPASS] = Item(RG_DODONGOS_CAVERN_COMPASS, Text{ "Dodongo's Cavern Compass", "Boussole de la Caverne Dodongo", "Kompaß (Dodongos Höhle)" }, ITEMTYPE_COMPASS, 0x9C, false, LOGIC_COMPASS_DODONGOS_CAVERN, RHT_DODONGOS_CAVERN_COMPASS, RG_DODONGOS_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_DODONGOS_CAVERN_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_JABU_JABUS_BELLY_COMPASS] = Item(RG_JABU_JABUS_BELLY_COMPASS, Text{ "Jabu-Jabu's Belly Compass", "Boussole du Ventre de Jabu-Jabu", "Kompaß des Jabu-Jabu-Bauchs" }, ITEMTYPE_COMPASS, 0x9D, false, LOGIC_COMPASS_JABU_JABUS_BELLY, RHT_JABU_JABUS_BELLY_COMPASS, RG_JABU_JABUS_BELLY_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_JABU_JABUS_BELLY_COMPASS] = Item(RG_JABU_JABUS_BELLY_COMPASS, Text{ "Jabu-Jabu's Belly Compass", "Boussole du Ventre de Jabu-Jabu", "Kompaß (Jabu-Jabus Bauch)" }, ITEMTYPE_COMPASS, 0x9D, false, LOGIC_COMPASS_JABU_JABUS_BELLY, RHT_JABU_JABUS_BELLY_COMPASS, RG_JABU_JABUS_BELLY_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_JABU_JABUS_BELLY_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_FOREST_TEMPLE_COMPASS] = Item(RG_FOREST_TEMPLE_COMPASS, Text{ "Forest Temple Compass", "Boussole du Temple de la Forêt", "Kompaß des Waldtempels" }, ITEMTYPE_COMPASS, 0x9E, false, LOGIC_COMPASS_FOREST_TEMPLE, RHT_FOREST_TEMPLE_COMPASS, RG_FOREST_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_COMPASS] = Item(RG_FOREST_TEMPLE_COMPASS, Text{ "Forest Temple Compass", "Boussole du Temple de la Forêt", "Kompaß (Waldtempel)" }, ITEMTYPE_COMPASS, 0x9E, false, LOGIC_COMPASS_FOREST_TEMPLE, RHT_FOREST_TEMPLE_COMPASS, RG_FOREST_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_FOREST_TEMPLE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_FIRE_TEMPLE_COMPASS] = Item(RG_FIRE_TEMPLE_COMPASS, Text{ "Fire Temple Compass", "Boussole du Temple du Feu", "Kompaß des Feuertempels" }, ITEMTYPE_COMPASS, 0x9F, false, LOGIC_COMPASS_FIRE_TEMPLE, RHT_FIRE_TEMPLE_COMPASS, RG_FIRE_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_COMPASS] = Item(RG_FIRE_TEMPLE_COMPASS, Text{ "Fire Temple Compass", "Boussole du Temple du Feu", "Kompaß (Feuertempel)" }, ITEMTYPE_COMPASS, 0x9F, false, LOGIC_COMPASS_FIRE_TEMPLE, RHT_FIRE_TEMPLE_COMPASS, RG_FIRE_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_FIRE_TEMPLE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_WATER_TEMPLE_COMPASS] = Item(RG_WATER_TEMPLE_COMPASS, Text{ "Water Temple Compass", "Boussole du Temple de l'Eau", "Kompaß des Wassertempels" }, ITEMTYPE_COMPASS, 0xA0, false, LOGIC_COMPASS_WATER_TEMPLE, RHT_WATER_TEMPLE_COMPASS, RG_WATER_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_COMPASS] = Item(RG_WATER_TEMPLE_COMPASS, Text{ "Water Temple Compass", "Boussole du Temple de l'Eau", "Kompaß (Wassertempel)" }, ITEMTYPE_COMPASS, 0xA0, false, LOGIC_COMPASS_WATER_TEMPLE, RHT_WATER_TEMPLE_COMPASS, RG_WATER_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_WATER_TEMPLE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_SPIRIT_TEMPLE_COMPASS] = Item(RG_SPIRIT_TEMPLE_COMPASS, Text{ "Spirit Temple Compass", "Boussole due Temple de l'Esprit", "Kompaß des Geistertempels" }, ITEMTYPE_COMPASS, 0xA1, false, LOGIC_COMPASS_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_COMPASS, RG_SPIRIT_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_COMPASS] = Item(RG_SPIRIT_TEMPLE_COMPASS, Text{ "Spirit Temple Compass", "Boussole due Temple de l'Esprit", "Kompaß (Geistertempel)" }, ITEMTYPE_COMPASS, 0xA1, false, LOGIC_COMPASS_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_COMPASS, RG_SPIRIT_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_SPIRIT_TEMPLE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_SHADOW_TEMPLE_COMPASS] = Item(RG_SHADOW_TEMPLE_COMPASS, Text{ "Shadow Temple Compass", "Boussole du Temple de l'Ombre", "Kompaß des Schattentempels" }, ITEMTYPE_COMPASS, 0xA2, false, LOGIC_COMPASS_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_COMPASS, RG_SHADOW_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_COMPASS] = Item(RG_SHADOW_TEMPLE_COMPASS, Text{ "Shadow Temple Compass", "Boussole du Temple de l'Ombre", "Kompaß (Schattentempel)" }, ITEMTYPE_COMPASS, 0xA2, false, LOGIC_COMPASS_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_COMPASS, RG_SHADOW_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_SHADOW_TEMPLE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_BOTTOM_OF_THE_WELL_COMPASS] = Item(RG_BOTTOM_OF_THE_WELL_COMPASS, Text{ "Bottom of the Well Compass", "Boussole du Puits", "Kompaß des Grund des Brunnens" }, ITEMTYPE_COMPASS, 0xA3, false, LOGIC_COMPASS_BOTTOM_OF_THE_WELL, RHT_BOTTOM_OF_THE_WELL_COMPASS, RG_BOTTOM_OF_THE_WELL_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_COMPASS] = Item(RG_BOTTOM_OF_THE_WELL_COMPASS, Text{ "Bottom of the Well Compass", "Boussole du Puits", "Kompaß (Grund des Brunnens)" }, ITEMTYPE_COMPASS, 0xA3, false, LOGIC_COMPASS_BOTTOM_OF_THE_WELL, RHT_BOTTOM_OF_THE_WELL_COMPASS, RG_BOTTOM_OF_THE_WELL_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_BOTTOM_OF_THE_WELL_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_ICE_CAVERN_COMPASS] = Item(RG_ICE_CAVERN_COMPASS, Text{ "Ice Cavern Compass", "Boussole de la Caverne Polaire", "Kompaß der Eishöhle" }, ITEMTYPE_COMPASS, 0xA4, false, LOGIC_COMPASS_ICE_CAVERN, RHT_ICE_CAVERN_COMPASS, RG_ICE_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_COMPASS] = Item(RG_ICE_CAVERN_COMPASS, Text{ "Ice Cavern Compass", "Boussole de la Caverne Polaire", "Kompaß (Eishöhle)" }, ITEMTYPE_COMPASS, 0xA4, false, LOGIC_COMPASS_ICE_CAVERN, RHT_ICE_CAVERN_COMPASS, RG_ICE_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_ICE_CAVERN_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); // Boss Keys - itemTable[RG_FOREST_TEMPLE_BOSS_KEY] = Item(RG_FOREST_TEMPLE_BOSS_KEY, Text{ "Forest Temple Boss Key", "Clé d'Or du Temple de la Forêt", "Master-Schlüssel des Waldtempels" }, ITEMTYPE_BOSSKEY, 0x95, true, LOGIC_BOSS_KEY_FOREST_TEMPLE, RHT_FOREST_TEMPLE_BOSS_KEY, RG_FOREST_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_BOSS_KEY] = Item(RG_FOREST_TEMPLE_BOSS_KEY, Text{ "Forest Temple Boss Key", "Clé d'Or du Temple de la Forêt", "Master-Schlüssel (Waldtempel)" }, ITEMTYPE_BOSSKEY, 0x95, true, LOGIC_BOSS_KEY_FOREST_TEMPLE, RHT_FOREST_TEMPLE_BOSS_KEY, RG_FOREST_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_FOREST_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_FIRE_TEMPLE_BOSS_KEY] = Item(RG_FIRE_TEMPLE_BOSS_KEY, Text{ "Fire Temple Boss Key", "Clé d'Or du Temple du Feu", "Master-Schlüssel des Feuertempels" }, ITEMTYPE_BOSSKEY, 0x96, true, LOGIC_BOSS_KEY_FIRE_TEMPLE, RHT_FIRE_TEMPLE_BOSS_KEY, RG_FIRE_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_BOSS_KEY] = Item(RG_FIRE_TEMPLE_BOSS_KEY, Text{ "Fire Temple Boss Key", "Clé d'Or du Temple du Feu", "Master-Schlüssel (Feuertempel)" }, ITEMTYPE_BOSSKEY, 0x96, true, LOGIC_BOSS_KEY_FIRE_TEMPLE, RHT_FIRE_TEMPLE_BOSS_KEY, RG_FIRE_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_FIRE_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_WATER_TEMPLE_BOSS_KEY] = Item(RG_WATER_TEMPLE_BOSS_KEY, Text{ "Water Temple Boss Key", "Clé d'Or du Temple de l'Eau", "Master-Schlüssel des Wassertempels" }, ITEMTYPE_BOSSKEY, 0x97, true, LOGIC_BOSS_KEY_WATER_TEMPLE, RHT_WATER_TEMPLE_BOSS_KEY, RG_WATER_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_BOSS_KEY] = Item(RG_WATER_TEMPLE_BOSS_KEY, Text{ "Water Temple Boss Key", "Clé d'Or du Temple de l'Eau", "Master-Schlüssel (Wassertempel)" }, ITEMTYPE_BOSSKEY, 0x97, true, LOGIC_BOSS_KEY_WATER_TEMPLE, RHT_WATER_TEMPLE_BOSS_KEY, RG_WATER_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_WATER_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_SPIRIT_TEMPLE_BOSS_KEY] = Item(RG_SPIRIT_TEMPLE_BOSS_KEY, Text{ "Spirit Temple Boss Key", "Clé d'Or du Temple de l'Esprit", "Master-Schlüssel des Geistertempels" }, ITEMTYPE_BOSSKEY, 0x98, true, LOGIC_BOSS_KEY_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_BOSS_KEY, RG_SPIRIT_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_BOSS_KEY] = Item(RG_SPIRIT_TEMPLE_BOSS_KEY, Text{ "Spirit Temple Boss Key", "Clé d'Or du Temple de l'Esprit", "Master-Schlüssel (Geistertempel)" }, ITEMTYPE_BOSSKEY, 0x98, true, LOGIC_BOSS_KEY_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_BOSS_KEY, RG_SPIRIT_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_SPIRIT_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_SHADOW_TEMPLE_BOSS_KEY] = Item( RG_SHADOW_TEMPLE_BOSS_KEY, Text{ "Shadow Temple Boss Key", "Clé d'Or du Temple de l'Ombre", "Master-Schlüssel des Schattentempels" }, ITEMTYPE_BOSSKEY, 0x99, true, LOGIC_BOSS_KEY_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_BOSS_KEY, RG_SHADOW_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_BOSS_KEY] = Item( RG_SHADOW_TEMPLE_BOSS_KEY, Text{ "Shadow Temple Boss Key", "Clé d'Or du Temple de l'Ombre", "Master-Schlüssel (Schattentempel)" }, ITEMTYPE_BOSSKEY, 0x99, true, LOGIC_BOSS_KEY_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_BOSS_KEY, RG_SHADOW_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_SHADOW_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_GANONS_CASTLE_BOSS_KEY] = Item(RG_GANONS_CASTLE_BOSS_KEY, Text{ "Ganon's Castle Boss Key", "Clé d'Or du Château de Ganon", "Master-Schlüssel von Ganons Schloß" }, ITEMTYPE_BOSSKEY, 0x9A, true, LOGIC_BOSS_KEY_GANONS_CASTLE, RHT_GANONS_CASTLE_BOSS_KEY, RG_GANONS_CASTLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_BOSS_KEY] = Item(RG_GANONS_CASTLE_BOSS_KEY, Text{ "Ganon's Castle Boss Key", "Clé d'Or du Château de Ganon", "Master-Schlüssel (Ganons Schloß)" }, ITEMTYPE_BOSSKEY, 0x9A, true, LOGIC_BOSS_KEY_GANONS_CASTLE, RHT_GANONS_CASTLE_BOSS_KEY, RG_GANONS_CASTLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_GANONS_CASTLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_FOREST_TEMPLE_SMALL_KEY] = Item(RG_FOREST_TEMPLE_SMALL_KEY, Text{ "Forest Temple Small Key", "Petite Clé du Temple de la Forêt", "Kleiner Schlüssel für den Waldtempel" }, ITEMTYPE_SMALLKEY, 0xAF, true, LOGIC_FOREST_TEMPLE_KEYS, RHT_FOREST_TEMPLE_SMALL_KEY, RG_FOREST_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_SMALL_KEY] = Item(RG_FOREST_TEMPLE_SMALL_KEY, Text{ "Forest Temple Small Key", "Petite Clé du Temple de la Forêt", "Kleiner Schlüssel (Waldtempel)" }, ITEMTYPE_SMALLKEY, 0xAF, true, LOGIC_FOREST_TEMPLE_KEYS, RHT_FOREST_TEMPLE_SMALL_KEY, RG_FOREST_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FOREST_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_FIRE_TEMPLE_SMALL_KEY] = Item(RG_FIRE_TEMPLE_SMALL_KEY, Text{ "Fire Temple Small Key", "Petite Clé du Temple du Feu", "Kleiner Schlüssel für den Feuertempel" }, ITEMTYPE_SMALLKEY, 0xB0, true, LOGIC_FIRE_TEMPLE_KEYS, RHT_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_SMALL_KEY] = Item(RG_FIRE_TEMPLE_SMALL_KEY, Text{ "Fire Temple Small Key", "Petite Clé du Temple du Feu", "Kleiner Schlüssel (Feuertempel)" }, ITEMTYPE_SMALLKEY, 0xB0, true, LOGIC_FIRE_TEMPLE_KEYS, RHT_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FIRE_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_WATER_TEMPLE_SMALL_KEY] = Item(RG_WATER_TEMPLE_SMALL_KEY, Text{ "Water Temple Small Key", "Petite Clé du Temple de l'Eau", "Kleiner Schlüssel für den Wassertempel" }, ITEMTYPE_SMALLKEY, 0xB1, true, LOGIC_WATER_TEMPLE_KEYS, RHT_WATER_TEMPLE_SMALL_KEY, RG_WATER_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_SMALL_KEY] = Item(RG_WATER_TEMPLE_SMALL_KEY, Text{ "Water Temple Small Key", "Petite Clé du Temple de l'Eau", "Kleiner Schlüssel (Wassertempel)" }, ITEMTYPE_SMALLKEY, 0xB1, true, LOGIC_WATER_TEMPLE_KEYS, RHT_WATER_TEMPLE_SMALL_KEY, RG_WATER_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_WATER_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_SPIRIT_TEMPLE_SMALL_KEY] = Item(RG_SPIRIT_TEMPLE_SMALL_KEY, Text{ "Spirit Temple Small Key", "Petite Clé du Temple de l'Esprit", "Kleiner Schlüssel für den Geistertempel" }, ITEMTYPE_SMALLKEY, 0xB2, true, LOGIC_SPIRIT_TEMPLE_KEYS, RHT_SPIRIT_TEMPLE_SMALL_KEY, RG_SPIRIT_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_SMALL_KEY] = Item(RG_SPIRIT_TEMPLE_SMALL_KEY, Text{ "Spirit Temple Small Key", "Petite Clé du Temple de l'Esprit", "Kleiner Schlüssel (Geistertempel)" }, ITEMTYPE_SMALLKEY, 0xB2, true, LOGIC_SPIRIT_TEMPLE_KEYS, RHT_SPIRIT_TEMPLE_SMALL_KEY, RG_SPIRIT_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_SPIRIT_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_SHADOW_TEMPLE_SMALL_KEY] = Item(RG_SHADOW_TEMPLE_SMALL_KEY, Text{ "Shadow Temple Small Key", "Petite Clé du Temple de l'Ombre", "Kleiner Schlüssel für den Schattentempel" }, ITEMTYPE_SMALLKEY, 0xB3, true, LOGIC_SHADOW_TEMPLE_KEYS, RHT_SHADOW_TEMPLE_SMALL_KEY, RG_SHADOW_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_SMALL_KEY] = Item(RG_SHADOW_TEMPLE_SMALL_KEY, Text{ "Shadow Temple Small Key", "Petite Clé du Temple de l'Ombre", "Kleiner Schlüssel (Schattentempel)" }, ITEMTYPE_SMALLKEY, 0xB3, true, LOGIC_SHADOW_TEMPLE_KEYS, RHT_SHADOW_TEMPLE_SMALL_KEY, RG_SHADOW_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_SHADOW_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_BOTTOM_OF_THE_WELL_SMALL_KEY] = Item(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, Text{ "Bottom of the Well Small Key", "Petite Clé du Puits", "Kleiner Schlüssel für den Grund des Brunnens" }, ITEMTYPE_SMALLKEY, 0xB4, true, LOGIC_BOTTOM_OF_THE_WELL_KEYS, RHT_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_SMALL_KEY] = Item(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, Text{ "Bottom of the Well Small Key", "Petite Clé du Puits", "Kleiner Schlüssel (Grund des Brunnens)" }, ITEMTYPE_SMALLKEY, 0xB4, true, LOGIC_BOTTOM_OF_THE_WELL_KEYS, RHT_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOTTOM_OF_THE_WELL_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_GERUDO_TRAINING_GROUND_SMALL_KEY] = Item(RG_GERUDO_TRAINING_GROUND_SMALL_KEY, Text{ "Training Ground Small Key", "Petite Clé du Gymnase Gerudo", "Kleiner Schlüssel für das Gerudo-Trainingsgelände" }, ITEMTYPE_SMALLKEY, 0xB5, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_SMALL_KEY, RG_GERUDO_TRAINING_GROUND_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUND_SMALL_KEY] = Item(RG_GERUDO_TRAINING_GROUND_SMALL_KEY, Text{ "Training Ground Small Key", "Petite Clé du Gymnase Gerudo", "Kleiner Schlüssel (Gerudo-Trainingsarena)" }, ITEMTYPE_SMALLKEY, 0xB5, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_SMALL_KEY, RG_GERUDO_TRAINING_GROUND_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_TRAINING_GROUND_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_GERUDO_FORTRESS_SMALL_KEY] = Item(RG_GERUDO_FORTRESS_SMALL_KEY, Text{ "Gerudo Fortress Small Key", "Petite Clé du Repaire des Voleurs", "Kleiner Schlüssel für die Gerudo-Festung" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xB6, true, LOGIC_GERUDO_FORTRESS_KEYS, RHT_GERUDO_FORTRESS_SMALL_KEY, RG_GERUDO_FORTRESS_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_FORTRESS_SMALL_KEY] = Item(RG_GERUDO_FORTRESS_SMALL_KEY, Text{ "Gerudo Fortress Small Key", "Petite Clé du Repaire des Voleurs", "Kleiner Schlüssel (Diebesversteck)" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xB6, true, LOGIC_GERUDO_FORTRESS_KEYS, RHT_GERUDO_FORTRESS_SMALL_KEY, RG_GERUDO_FORTRESS_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_FORTRESS_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_GANONS_CASTLE_SMALL_KEY] = Item(RG_GANONS_CASTLE_SMALL_KEY, Text{ "Ganon's Castle Small Key", "Petite Clé du Château de Ganon", "Kleiner Schlüssel für Ganons Schloß" }, ITEMTYPE_SMALLKEY, 0xB7, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_SMALL_KEY, RG_GANONS_CASTLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_SMALL_KEY] = Item(RG_GANONS_CASTLE_SMALL_KEY, Text{ "Ganon's Castle Small Key", "Petite Clé du Château de Ganon", "Kleiner Schlüssel (Ganons Schloß)" }, ITEMTYPE_SMALLKEY, 0xB7, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_SMALL_KEY, RG_GANONS_CASTLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GANONS_CASTLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_TREASURE_GAME_SMALL_KEY] = Item(RG_TREASURE_GAME_SMALL_KEY, Text{ "Chest Game Small Key", "Petite Clé du jeu la Chasse-aux-Trésors", "Kleiner Schlüssel für das Truhenspiel" }, ITEMTYPE_SMALLKEY, GI_DOOR_KEY, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_SMALL_KEY, ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_NONE); - itemTable[RG_GUARD_HOUSE_KEY] = Item(RG_GUARD_HOUSE_KEY, Text{ "Guard House Key", "", "Schlüssel für das Haus der Wachen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GUARD_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_GUARD_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TREASURE_GAME_SMALL_KEY] = Item(RG_TREASURE_GAME_SMALL_KEY, Text{ "Chest Game Small Key", "Petite Clé du jeu la Chasse-aux-Trésors", "Kleiner Schlüssel (Truhenlotterie)" }, ITEMTYPE_SMALLKEY, GI_DOOR_KEY, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_SMALL_KEY, ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_NONE); + itemTable[RG_TREASURE_GAME_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); + itemTable[RG_GUARD_HOUSE_KEY] = Item(RG_GUARD_HOUSE_KEY, Text{ "Guard House Key", "Clé de la Maison des Gardes", "Schlüssel (Wachhaus)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GUARD_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_GUARD_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GUARD_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_MARKET_BAZAAR_KEY] = Item(RG_MARKET_BAZAAR_KEY, Text{ "Market Bazaar Key", "", "Schlüssel für den Basar des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_MARKET_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_BAZAAR_KEY] = Item(RG_MARKET_BAZAAR_KEY, Text{ "Market Bazaar Key", "Clé du Bazar de la Place du Marché", "Schlüssel (Basar des Marktes)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_MARKET_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_MARKET_BAZAAR_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_MARKET_POTION_SHOP_KEY] = Item(RG_MARKET_POTION_SHOP_KEY, Text{ "Market Potion Shop Key", "", "Schlüssel für den Magie-Laden des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MARKET_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_POTION_SHOP_KEY] = Item(RG_MARKET_POTION_SHOP_KEY, Text{ "Market Potion Shop Key", "Clé du Magasin de Potions de la Place du Marché", "Schlüssel (Magie-Laden des Marktes)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MARKET_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_MARKET_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_MASK_SHOP_KEY] = Item(RG_MASK_SHOP_KEY, Text{ "Mask Shop Key", "", "Schlüssel für den Maskenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MASK_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MASK_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MASK_SHOP_KEY] = Item(RG_MASK_SHOP_KEY, Text{ "Mask Shop Key", "Clé de la Foire aux Masques", "Schlüssel (Maskenladen)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MASK_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MASK_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_MASK_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_MARKET_SHOOTING_GALLERY_KEY] = Item(RG_MARKET_SHOOTING_GALLERY_KEY, Text{ "Market Shooting Gallery Key", "", "Schlüssel für die Schießbude des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_MARKET_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_SHOOTING_GALLERY_KEY] = Item(RG_MARKET_SHOOTING_GALLERY_KEY, Text{ "Market Shooting Gallery Key", "Clé du Stand de Tir de la Place du Marché", "Schlüssel (Schießbude des Marktes)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_MARKET_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_MARKET_SHOOTING_GALLERY_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_BOMBCHU_BOWLING_KEY] = Item(RG_BOMBCHU_BOWLING_KEY, Text{ "Bombchu Bowling Alley Key", "", "Schlüssel für die Minenbowlingbahn" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_BOWLING_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_BOWLING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_BOWLING_KEY] = Item(RG_BOMBCHU_BOWLING_KEY, Text{ "Bombchu Bowling Alley Key", "Clé du Bowling Teigneux", "Schlüssel (Minenbowlingbahn)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_BOWLING_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_BOWLING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOMBCHU_BOWLING_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY] = Item(RG_TREASURE_CHEST_GAME_BUILDING_KEY, Text{ "Treasure Chest Game Building Key", "", "Schlüssel für das Haus des Schatzkisten-Pokers" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TREASURE_CHEST_GAME_BUILDING_KEY,RHT_OVERWORLD_KEY, RG_TREASURE_CHEST_GAME_BUILDING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY] = Item(RG_TREASURE_CHEST_GAME_BUILDING_KEY, Text{ "Treasure Chest Game Building Key", "Clé de la Chasse au Trésor", "Schlüssel (Haus der Truhenlotterie)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TREASURE_CHEST_GAME_BUILDING_KEY,RHT_OVERWORLD_KEY, RG_TREASURE_CHEST_GAME_BUILDING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_BOMBCHU_SHOP_KEY] = Item(RG_BOMBCHU_SHOP_KEY, Text{ "Bombchu Shop Key", "", "Schlüssel für den Krabbelminenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_SHOP_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_SHOP_KEY] = Item(RG_BOMBCHU_SHOP_KEY, Text{ "Bombchu Shop Key", "Clé du Magasin de Missiles", "Schlüssel (Krabbelminenladen)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_SHOP_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOMBCHU_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_RICHARDS_HOUSE_KEY] = Item(RG_RICHARDS_HOUSE_KEY, Text{ "Richard's House Key", "", "Schlüssel für das Haus von Richard" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_RICHARDS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_RICHARDS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_RICHARDS_HOUSE_KEY] = Item(RG_RICHARDS_HOUSE_KEY, Text{ "Richard's House Key", "Clé de la Maison de Kiki", "Schlüssel (Richards Haus)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_RICHARDS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_RICHARDS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_RICHARDS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_ALLEY_HOUSE_KEY] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "", "Schlüssel für das Gäßchenhaus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_ALLEY_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_ALLEY_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_ALLEY_HOUSE_KEY] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "Clé de la Maison de la Ruelle", "Schlüssel (Haus in der Gasse)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_ALLEY_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_ALLEY_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_ALLEY_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_KAK_BAZAAR_KEY] = Item(RG_KAK_BAZAAR_KEY, Text{ "Kakariko Bazaar Key", "", "Schlüssel für den Basar von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_KAK_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_BAZAAR_KEY] = Item(RG_KAK_BAZAAR_KEY, Text{ "Kakariko Bazaar Key", "Clé du Bazar de Cocorico", "Schlüssel (Basar von Kakariko)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_KAK_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_KAK_BAZAAR_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_KAK_POTION_SHOP_KEY] = Item(RG_KAK_POTION_SHOP_KEY, Text{ "Kakariko Potion Shop Key", "", "Schlüssel für den Magie-Laden von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_KAK_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_POTION_SHOP_KEY] = Item(RG_KAK_POTION_SHOP_KEY, Text{ "Kakariko Potion Shop Key", "Clé du Magasin de Potions de Cocorico", "Schlüssel (Magie-Laden von Kakariko)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_KAK_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_KAK_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_BOSS_HOUSE_KEY] = Item(RG_BOSS_HOUSE_KEY, Text{ "Boss's House Key", "", "Schlüssel für das Haus des Chefs" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOSS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_BOSS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOSS_HOUSE_KEY] = Item(RG_BOSS_HOUSE_KEY, Text{ "Boss's House Key", "Clé de la Maison du Chef des Ouvriers", "Schlüssel (Haus des Chefs)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOSS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_BOSS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOSS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_GRANNYS_POTION_SHOP_KEY] = Item(RG_GRANNYS_POTION_SHOP_KEY, Text{ "Granny's Potion Shop Key", "", "Schlüssel für Asas Hexenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GRANNYS_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_GRANNYS_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GRANNYS_POTION_SHOP_KEY] = Item(RG_GRANNYS_POTION_SHOP_KEY, Text{ "Granny's Potion Shop Key", "Clé de l'Apothicaire", "Schlüssel (Asas Hexenladen)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GRANNYS_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_GRANNYS_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GRANNYS_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_SKULLTULA_HOUSE_KEY] = Item(RG_SKULLTULA_HOUSE_KEY, Text{ "Skulltula House Key", "", "Schlüssel für das Skulltula-Haus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_SKULLTULA_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_SKULLTULA_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SKULLTULA_HOUSE_KEY] = Item(RG_SKULLTULA_HOUSE_KEY, Text{ "Skulltula House Key", "Clé de la Maison des Araignées", "Schlüssel (Skulltula-Haus)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_SKULLTULA_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_SKULLTULA_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_SKULLTULA_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_IMPAS_HOUSE_KEY] = Item(RG_IMPAS_HOUSE_KEY, Text{ "Impa's House Key", "", "Schlüssel für das Haus von Impa" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_IMPAS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_IMPAS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_IMPAS_HOUSE_KEY] = Item(RG_IMPAS_HOUSE_KEY, Text{ "Impa's House Key", "Clé de la Maison d'Impa", "Schlüssel (Impas Haus)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_IMPAS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_IMPAS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_IMPAS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_WINDMILL_KEY] = Item(RG_WINDMILL_KEY, Text{ "Windmill Key", "", "Schlüssel für die Windmühle" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_WINDMILL_KEY, RHT_OVERWORLD_KEY, RG_WINDMILL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_WINDMILL_KEY] = Item(RG_WINDMILL_KEY, Text{ "Windmill Key", "Clé du Moulin", "Schlüssel (Windmühle)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_WINDMILL_KEY, RHT_OVERWORLD_KEY, RG_WINDMILL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_WINDMILL_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_KAK_SHOOTING_GALLERY_KEY] = Item(RG_KAK_SHOOTING_GALLERY_KEY, Text{ "Kakariko Shooting Gallery Key", "", "Schlüssel für die Schießbude von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_KAK_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_SHOOTING_GALLERY_KEY] = Item(RG_KAK_SHOOTING_GALLERY_KEY, Text{ "Kakariko Shooting Gallery Key", "Clé du Stand de Tir de Cocorico", "Schlüssel (Schießbude von Kakariko)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_KAK_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_KAK_SHOOTING_GALLERY_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_DAMPES_HUT_KEY] = Item(RG_DAMPES_HUT_KEY, Text{ "Dampe's Hut Key", "", "Schlüssel für die Hütte von Boris" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_DAMPES_HUT_KEY, RHT_OVERWORLD_KEY, RG_DAMPES_HUT_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_DAMPES_HUT_KEY] = Item(RG_DAMPES_HUT_KEY, Text{ "Dampe's Hut Key", "Clé de la Cabane d'Igor", "Schlüssel (Hütte des Totengräbers)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_DAMPES_HUT_KEY, RHT_OVERWORLD_KEY, RG_DAMPES_HUT_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_DAMPES_HUT_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_TALONS_HOUSE_KEY] = Item(RG_TALONS_HOUSE_KEY, Text{ "Talon's House Key", "", "Schlüssel für das Haus von Talon" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TALONS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_TALONS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TALONS_HOUSE_KEY] = Item(RG_TALONS_HOUSE_KEY, Text{ "Talon's House Key", "Clé de la Maison de Talon", "Schlüssel (Talons Haus)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TALONS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_TALONS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_TALONS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_STABLES_KEY] = Item(RG_STABLES_KEY, Text{ "Stables Key", "", "Schlüssel für die Ställe" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_STABLES_KEY, RHT_OVERWORLD_KEY, RG_STABLES_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_STABLES_KEY] = Item(RG_STABLES_KEY, Text{ "Stables Key", "Clé des Écuries", "Schlüssel (Ställe)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_STABLES_KEY, RHT_OVERWORLD_KEY, RG_STABLES_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_STABLES_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_BACK_TOWER_KEY] = Item(RG_BACK_TOWER_KEY, Text{ "Back Tower Key", "", "Schlüssel für den hinteren Turm" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BACK_TOWER_KEY, RHT_OVERWORLD_KEY, RG_BACK_TOWER_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BACK_TOWER_KEY] = Item(RG_BACK_TOWER_KEY, Text{ "Back Tower Key", "Clé du Silo", "Schlüssel (Lon Lon-Turm)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BACK_TOWER_KEY, RHT_OVERWORLD_KEY, RG_BACK_TOWER_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BACK_TOWER_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_HYLIA_LAB_KEY] = Item(RG_HYLIA_LAB_KEY, Text{ "Hylia Laboratory Key", "", "Schlüssel für das Hylia-Labor" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_HYLIA_LAB_KEY, RHT_OVERWORLD_KEY, RG_HYLIA_LAB_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_HYLIA_LAB_KEY] = Item(RG_HYLIA_LAB_KEY, Text{ "Hylia Laboratory Key", "Clé du Laboratoire du Lac Hylia", "Schlüssel (Hylia-Labor)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_HYLIA_LAB_KEY, RHT_OVERWORLD_KEY, RG_HYLIA_LAB_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_HYLIA_LAB_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_FISHING_HOLE_KEY] = Item(RG_FISHING_HOLE_KEY, Text{ "Fishing Hole Key", "", "Schlüssel für den Fischweiher" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_FISHING_HOLE_KEY, RHT_OVERWORLD_KEY, RG_FISHING_HOLE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FISHING_HOLE_KEY] = Item(RG_FISHING_HOLE_KEY, Text{ "Fishing Hole Key", "Clé de l'Étang", "Schlüssel (Fischweiher)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_FISHING_HOLE_KEY, RHT_OVERWORLD_KEY, RG_FISHING_HOLE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FISHING_HOLE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); // Key Rings - itemTable[RG_FOREST_TEMPLE_KEY_RING] = Item(RG_FOREST_TEMPLE_KEY_RING, Text{ "Forest Temple Key Ring", "Trousseau du Temple de la Forêt", "Schlüsselbund für den Waldtempel" }, ITEMTYPE_SMALLKEY, 0xD5, true, LOGIC_FOREST_TEMPLE_KEYS, RHT_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_KEY_RING] = Item(RG_FOREST_TEMPLE_KEY_RING, Text{ "Forest Temple Key Ring", "Trousseau du Temple de la Forêt", "Schlüsselbund (Waldtempel)" }, ITEMTYPE_SMALLKEY, 0xD5, true, LOGIC_FOREST_TEMPLE_KEYS, RHT_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FOREST_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_FIRE_TEMPLE_KEY_RING] = Item(RG_FIRE_TEMPLE_KEY_RING, Text{ "Fire Temple Key Ring", "Trousseau du Temple du Feu", "Schlüsselbund für den Feuertempel" }, ITEMTYPE_SMALLKEY, 0xD6, true, LOGIC_FIRE_TEMPLE_KEYS, RHT_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_KEY_RING] = Item(RG_FIRE_TEMPLE_KEY_RING, Text{ "Fire Temple Key Ring", "Trousseau du Temple du Feu", "Schlüsselbund (Feuertempel)" }, ITEMTYPE_SMALLKEY, 0xD6, true, LOGIC_FIRE_TEMPLE_KEYS, RHT_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FIRE_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_WATER_TEMPLE_KEY_RING] = Item(RG_WATER_TEMPLE_KEY_RING, Text{ "Water Temple Key Ring", "Trousseau du Temple de l'Eau", "Schlüsselbund für den Wassertempel" }, ITEMTYPE_SMALLKEY, 0xD7, true, LOGIC_WATER_TEMPLE_KEYS, RHT_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_KEY_RING] = Item(RG_WATER_TEMPLE_KEY_RING, Text{ "Water Temple Key Ring", "Trousseau du Temple de l'Eau", "Schlüsselbund (Wassertempel)" }, ITEMTYPE_SMALLKEY, 0xD7, true, LOGIC_WATER_TEMPLE_KEYS, RHT_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_WATER_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_SPIRIT_TEMPLE_KEY_RING] = Item(RG_SPIRIT_TEMPLE_KEY_RING, Text{ "Spirit Temple Key Ring", "Trousseau du Temple de l'Esprit", "Schlüsselbund für den Geistertempel" }, ITEMTYPE_SMALLKEY, 0xD8, true, LOGIC_SPIRIT_TEMPLE_KEYS, RHT_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_KEY_RING] = Item(RG_SPIRIT_TEMPLE_KEY_RING, Text{ "Spirit Temple Key Ring", "Trousseau du Temple de l'Esprit", "Schlüsselbund (Geistertempel)" }, ITEMTYPE_SMALLKEY, 0xD8, true, LOGIC_SPIRIT_TEMPLE_KEYS, RHT_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_SPIRIT_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_SHADOW_TEMPLE_KEY_RING] = Item(RG_SHADOW_TEMPLE_KEY_RING, Text{ "Shadow Temple Key Ring", "Trousseau du Temple de l'Ombre", "Schlüsselbund für den Schattentempel" }, ITEMTYPE_SMALLKEY, 0xD9, true, LOGIC_SHADOW_TEMPLE_KEYS, RHT_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_KEY_RING] = Item(RG_SHADOW_TEMPLE_KEY_RING, Text{ "Shadow Temple Key Ring", "Trousseau du Temple de l'Ombre", "Schlüsselbund (Schattentempel)" }, ITEMTYPE_SMALLKEY, 0xD9, true, LOGIC_SHADOW_TEMPLE_KEYS, RHT_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_SHADOW_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING] = Item(RG_BOTTOM_OF_THE_WELL_KEY_RING, Text{ "Bottom of the Well Key Ring", "Trousseau du Puits", "Schlüsselbund für den Grund des Brunnens" }, ITEMTYPE_SMALLKEY, 0xDA, true, LOGIC_BOTTOM_OF_THE_WELL_KEYS, RHT_BOTTOM_OF_THE_WELL_KEY_RING, RG_BOTTOM_OF_THE_WELL_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING] = Item(RG_BOTTOM_OF_THE_WELL_KEY_RING, Text{ "Bottom of the Well Key Ring", "Trousseau du Puits", "Schlüsselbund (Grund des Brunnens)" }, ITEMTYPE_SMALLKEY, 0xDA, true, LOGIC_BOTTOM_OF_THE_WELL_KEYS, RHT_BOTTOM_OF_THE_WELL_KEY_RING, RG_BOTTOM_OF_THE_WELL_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUND_KEY_RING, Text{ "Training Ground Key Ring", "Trousseau du Gymnase Gerudo", "Schlüsselbund für das Gerudo-Trainingsgelände" }, ITEMTYPE_SMALLKEY, 0xDB, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_KEY_RING, RG_GERUDO_TRAINING_GROUND_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUND_KEY_RING, Text{ "Training Ground Key Ring", "Trousseau du Gymnase Gerudo", "Schlüsselbund (Gerudo-Trainingsarena)" }, ITEMTYPE_SMALLKEY, 0xDB, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_KEY_RING, RG_GERUDO_TRAINING_GROUND_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_GERUDO_FORTRESS_KEY_RING] = Item(RG_GERUDO_FORTRESS_KEY_RING, Text{ "Gerudo Fortress Key Ring", "Trousseau du Repaire des Voleurs", "Schlüsselbund für die Gerudo-Festung" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xDC, true, LOGIC_GERUDO_FORTRESS_KEYS, RHT_GERUDO_FORTRESS_KEY_RING, RG_GERUDO_FORTRESS_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_FORTRESS_KEY_RING] = Item(RG_GERUDO_FORTRESS_KEY_RING, Text{ "Gerudo Fortress Key Ring", "Trousseau du Repaire des Voleurs", "Schlüsselbund (Diebesversteck)" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xDC, true, LOGIC_GERUDO_FORTRESS_KEYS, RHT_GERUDO_FORTRESS_KEY_RING, RG_GERUDO_FORTRESS_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_FORTRESS_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_GANONS_CASTLE_KEY_RING] = Item(RG_GANONS_CASTLE_KEY_RING, Text{ "Ganon's Castle Key Ring", "Trousseau du Château de Ganon", "Schlüsselbund für Ganons Schloß" }, ITEMTYPE_SMALLKEY, 0xDD, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_KEY_RING] = Item(RG_GANONS_CASTLE_KEY_RING, Text{ "Ganon's Castle Key Ring", "Trousseau du Château de Ganon", "Schlüsselbund (Ganons Schloß)" }, ITEMTYPE_SMALLKEY, 0xDD, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GANONS_CASTLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_TREASURE_GAME_KEY_RING] = Item(RG_TREASURE_GAME_KEY_RING, Text{ "Chest Game Key Ring", "Trousseau du jeu la Chasse-aux-Trésors", "Schlüsselbund für das Truhenspiel" }, ITEMTYPE_SMALLKEY, 0xDE, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_KEY_RING, RG_TREASURE_GAME_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TREASURE_GAME_KEY_RING] = Item(RG_TREASURE_GAME_KEY_RING, Text{ "Chest Game Key Ring", "Trousseau du jeu la Chasse-aux-Trésors", "Schlüsselbund (Truhenlotterie)" }, ITEMTYPE_SMALLKEY, 0xDE, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_KEY_RING, RG_TREASURE_GAME_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_TREASURE_GAME_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); // Dungeon Rewards itemTable[RG_KOKIRI_EMERALD] = Item(RG_KOKIRI_EMERALD, Text{ "Kokiri's Emerald", "Émeraude Kokiri", "Kokiri-Smaragd" }, ITEMTYPE_DUNGEONREWARD, 0xCB, true, LOGIC_KOKIRI_EMERALD, RHT_KOKIRI_EMERALD, ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); @@ -241,15 +254,15 @@ void Rando::StaticData::InitItemTable() { // Generic Items itemTable[RG_RECOVERY_HEART] = Item(RG_RECOVERY_HEART, Text{ "Recovery Heart", "Coeur de Vie", "Herz" }, ITEMTYPE_ITEM, GI_HEART, false, LOGIC_NONE, RHT_RECOVERY_HEART, ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_GREEN_RUPEE] = Item(RG_GREEN_RUPEE, Text{ "Green Rupee", "Rubis Vert", "Grüner Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN, false, LOGIC_NONE, RHT_GREEN_RUPEE, ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_GREG_RUPEE] = Item(RG_GREG_RUPEE, Text{ "Greg the Green Rupee", "Rubis Greg", "Greg Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN, true, LOGIC_GREG, RHT_GREG_RUPEE, RG_GREG_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_GREG_RUPEE] = Item(RG_GREG_RUPEE, Text{ "Greg the Green Rupee", "Rubis Greg", "Greg der grüne Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN, true, LOGIC_GREG, RHT_GREG_RUPEE, RG_GREG_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BLUE_RUPEE] = Item(RG_BLUE_RUPEE, Text{ "Blue Rupee", "Rubis Bleu", "Blauer Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_BLUE, false, LOGIC_NONE, RHT_BLUE_RUPEE, ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_RED_RUPEE] = Item(RG_RED_RUPEE, Text{ "Red Rupee", "Rubis Rouge", "Roter Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_RED, false, LOGIC_NONE, RHT_RED_RUPEE, ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_PURPLE_RUPEE] = Item(RG_PURPLE_RUPEE, Text{ "Purple Rupee", "Rubis Pourpre", "Violetter Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_PURPLE, false, LOGIC_NONE, RHT_PURPLE_RUPEE, ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_HUGE_RUPEE] = Item(RG_HUGE_RUPEE, Text{ "Huge Rupee", "Énorme Rubis", "Riesiger Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, false, LOGIC_NONE, RHT_HUGE_RUPEE, ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_PIECE_OF_HEART] = Item(RG_PIECE_OF_HEART, Text{ "Piece of Heart", "Quart de Coeur", "Herzstück" }, ITEMTYPE_ITEM, GI_HEART_PIECE, true, LOGIC_PIECE_OF_HEART, RHT_PIECE_OF_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_HUGE_RUPEE] = Item(RG_HUGE_RUPEE, Text{ "Huge Rupee", "Énorme Rubis", "Goldener Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, false, LOGIC_NONE, RHT_HUGE_RUPEE, ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_PIECE_OF_HEART] = Item(RG_PIECE_OF_HEART, Text{ "Piece of Heart", "Quart de Coeur", "Herzteil" }, ITEMTYPE_ITEM, GI_HEART_PIECE, true, LOGIC_PIECE_OF_HEART, RHT_PIECE_OF_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_HEART_CONTAINER] = Item(RG_HEART_CONTAINER, Text{ "Heart Container", "Réceptacle de Coeur", "Herzcontainer" }, ITEMTYPE_ITEM, GI_HEART_CONTAINER_2, true, LOGIC_HEART_CONTAINER, RHT_HEART_CONTAINER, ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_ICE_TRAP] = Item(RG_ICE_TRAP, Text{ "Ice Trap", "Piège de Glace", "Eisfalle" }, ITEMTYPE_ITEM, RG_ICE_TRAP, false, LOGIC_NONE, RHT_ICE_TRAP, RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_MILK] = Item(RG_MILK, Text{ "Milk", "Lait", "Milch" }, ITEMTYPE_ITEM, GI_MILK, false, LOGIC_NONE, RHT_NONE, ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_MILK] = Item(RG_MILK, Text{ "Milk", "Lait", "Lon Lon-Milch" }, ITEMTYPE_ITEM, GI_MILK, false, LOGIC_NONE, RHT_NONE, ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_FISH] = Item(RG_FISH, Text{ "Fish", "Poisson", "Fisch" }, ITEMTYPE_ITEM, GI_FISH, false, LOGIC_NONE, RHT_NONE, ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); // Refills itemTable[RG_BOMBS_5] = Item(RG_BOMBS_5, Text{ "Bombs (5)", "Bombes (5)", "Bomben (5)" }, ITEMTYPE_REFILL, GI_BOMBS_5, false, LOGIC_NONE, RHT_BOMBS_5, ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); @@ -264,21 +277,21 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_ARROWS_30] = Item(RG_ARROWS_30, Text{ "Arrows (30)", "Flèches (30)", "Pfeile (30)" }, ITEMTYPE_REFILL, GI_ARROWS_LARGE, false, LOGIC_NONE, RHT_ARROWS_30, ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_DEKU_NUTS_5] = Item(RG_DEKU_NUTS_5, Text{ "Deku Nuts (5)", "Noix Mojo (5)", "Deku-Nüsse (5)" }, ITEMTYPE_REFILL, GI_NUTS_5, false, LOGIC_NONE, RHT_DEKU_NUTS_5, ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_DEKU_NUTS_10] = Item(RG_DEKU_NUTS_10, Text{ "Deku Nuts (10)", "Noix Mojo (10)", "Deku-Nüsse (10)" }, ITEMTYPE_REFILL, GI_NUTS_10, false, LOGIC_NONE, RHT_DEKU_NUTS_10, ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_DEKU_SEEDS_30] = Item(RG_DEKU_SEEDS_30, Text{ "Deku Seeds (30)", "Graines Mojo (30)", "Deku-Samen (30)" }, ITEMTYPE_REFILL, GI_SEEDS_30, false, LOGIC_NONE, RHT_DEKU_SEEDS_30, ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_DEKU_SEEDS_30] = Item(RG_DEKU_SEEDS_30, Text{ "Deku Seeds (30)", "Graines Mojo (30)", "Deku-Kerne (30)" }, ITEMTYPE_REFILL, GI_SEEDS_30, false, LOGIC_NONE, RHT_DEKU_SEEDS_30, ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_DEKU_STICK_1] = Item(RG_DEKU_STICK_1, Text{ "Deku Stick (1)", "Bâton Mojo (1)", "Deku-Stab (1)" }, ITEMTYPE_REFILL, GI_STICKS_1, false, LOGIC_NONE, RHT_DEKU_STICK_1, ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_RED_POTION_REFILL] = Item(RG_RED_POTION_REFILL, Text{ "Red Potion Refill", "Recharge de Potion Rouge", "Nachfüllpackung des roten Elixiers" }, ITEMTYPE_REFILL, GI_POTION_RED, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_GREEN_POTION_REFILL] = Item(RG_GREEN_POTION_REFILL, Text{ "Green Potion Refill", "Recharge de Potion Verte", "Nachfüllpackung des grünen Elixiers" }, ITEMTYPE_REFILL, GI_POTION_GREEN, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_BLUE_POTION_REFILL] = Item(RG_BLUE_POTION_REFILL, Text{ "Blue Potion Refill", "Recharge de Potion Bleue", "Nachfüllpackung des blauen Elixiers" }, ITEMTYPE_REFILL, GI_POTION_BLUE, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_RED_POTION_REFILL] = Item(RG_RED_POTION_REFILL, Text{ "Red Potion Refill", "Recharge de Potion Rouge", "Rotes Elixier" }, ITEMTYPE_REFILL, GI_POTION_RED, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_GREEN_POTION_REFILL] = Item(RG_GREEN_POTION_REFILL, Text{ "Green Potion Refill", "Recharge de Potion Verte", "Grünes Elixier" }, ITEMTYPE_REFILL, GI_POTION_GREEN, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_BLUE_POTION_REFILL] = Item(RG_BLUE_POTION_REFILL, Text{ "Blue Potion Refill", "Recharge de Potion Bleue", "Blaues Elixier" }, ITEMTYPE_REFILL, GI_POTION_BLUE, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); // Treasure Game - itemTable[RG_TREASURE_GAME_HEART] = Item(RG_TREASURE_GAME_HEART, Text{ "Piece of Heart (WINNER)", "Quart de Coeur (Chasse-aux-Trésors)", "Herzstück (Schatztruhenminispiel)" }, ITEMTYPE_ITEM, GI_HEART_PIECE_WIN, true, LOGIC_PIECE_OF_HEART, RHT_TREASURE_GAME_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_TREASURE_GAME_GREEN_RUPEE] = Item(RG_TREASURE_GAME_GREEN_RUPEE, Text{ "Green Rupee (LOSER)", "Rubis Vert (Chasse-aux-Trésors)", "Grüner Rubin (Schatztruhenminispiel)" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN_LOSE, false, LOGIC_NONE, RHT_TREASURE_GAME_GREEN_RUPEE, ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_TREASURE_GAME_HEART] = Item(RG_TREASURE_GAME_HEART, Text{ "Piece of Heart (WINNER)", "Quart de Coeur (Chasse-aux-Trésors)", "Herzteil (Truhenlotterie)" }, ITEMTYPE_ITEM, GI_HEART_PIECE_WIN, true, LOGIC_PIECE_OF_HEART, RHT_TREASURE_GAME_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_TREASURE_GAME_GREEN_RUPEE] = Item(RG_TREASURE_GAME_GREEN_RUPEE, Text{ "Green Rupee (LOSER)", "Rubis Vert (Chasse-aux-Trésors)", "Grüner Rubin (Truhenlotterie)" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN_LOSE, false, LOGIC_NONE, RHT_TREASURE_GAME_GREEN_RUPEE, ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE); // Shop - itemTable[RG_BUY_DEKU_NUTS_5] = Item(RG_BUY_DEKU_NUTS_5, Text{ "Buy Deku Nut (5)", "Acheter: Noix Mojo (5)", "Deku-Nuß kaufen (5)" }, ITEMTYPE_SHOP, GI_NUTS_5_2, true, LOGIC_NUTS, RHT_DEKU_NUTS_5, ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 15); + itemTable[RG_BUY_DEKU_NUTS_5] = Item(RG_BUY_DEKU_NUTS_5, Text{ "Buy Deku Nut (5)", "Acheter: Noix Mojo (5)", "Deku-Nüsse kaufen (5)" }, ITEMTYPE_SHOP, GI_NUTS_5_2, true, LOGIC_BUY_NUTS, RHT_DEKU_NUTS_5, ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 15); itemTable[RG_BUY_ARROWS_30] = Item(RG_BUY_ARROWS_30, Text{ "Buy Arrows (30)", "Acheter: Flèches (30)", "Pfeile kaufen (30)" }, ITEMTYPE_SHOP, GI_ARROWS_MEDIUM, true, LOGIC_BUY_ARROW, RHT_ARROWS_30, ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 60); itemTable[RG_BUY_ARROWS_50] = Item(RG_BUY_ARROWS_50, Text{ "Buy Arrows (50)", "Acheter: Flèches (50)", "Pfeile kaufen (50)" }, ITEMTYPE_SHOP, GI_ARROWS_LARGE, true, LOGIC_BUY_ARROW, RHT_ARROWS_30, ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 90); itemTable[RG_BUY_BOMBS_525] = Item(RG_BUY_BOMBS_525, Text{ "Buy Bombs (5) [25]", "Acheter: Bombes (5) [25]", "Bomben kaufen (5) [25]" }, ITEMTYPE_SHOP, GI_BOMBS_5, true, LOGIC_BUY_BOMB, RHT_BOMBS_5, ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 25); - itemTable[RG_BUY_DEKU_NUTS_10] = Item(RG_BUY_DEKU_NUTS_10, Text{ "Buy Deku Nut (10)", "Acheter: Noix Mojo (10)", "Deku-Nuß kaufen (10)" }, ITEMTYPE_SHOP, GI_NUTS_10, true, LOGIC_NUTS, RHT_DEKU_NUTS_10, ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); - itemTable[RG_BUY_DEKU_STICK_1] = Item(RG_BUY_DEKU_STICK_1, Text{ "Buy Deku Stick (1)", "Acheter: Bâton Mojo (1)", "Deku-Stab kaufen (1)" }, ITEMTYPE_SHOP, GI_STICKS_1, true, LOGIC_STICKS, RHT_DEKU_STICK_1, ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 10); + itemTable[RG_BUY_DEKU_NUTS_10] = Item(RG_BUY_DEKU_NUTS_10, Text{ "Buy Deku Nut (10)", "Acheter: Noix Mojo (10)", "Deku-Nüsse kaufen (10)" }, ITEMTYPE_SHOP, GI_NUTS_10, true, LOGIC_BUY_NUTS, RHT_DEKU_NUTS_10, ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); + itemTable[RG_BUY_DEKU_STICK_1] = Item(RG_BUY_DEKU_STICK_1, Text{ "Buy Deku Stick (1)", "Acheter: Bâton Mojo (1)", "Deku-Stab kaufen (1)" }, ITEMTYPE_SHOP, GI_STICKS_1, true, LOGIC_BUY_STICKS, RHT_DEKU_STICK_1, ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 10); itemTable[RG_BUY_BOMBS_10] = Item(RG_BUY_BOMBS_10, Text{ "Buy Bombs (10)", "Acheter: Bombes (10)", "Bomben kaufen (10)" }, ITEMTYPE_SHOP, GI_BOMBS_10, true, LOGIC_BUY_BOMB, RHT_BOMBS_10, ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); itemTable[RG_BUY_FISH] = Item(RG_BUY_FISH, Text{ "Buy Fish", "Acheter: Poisson", "Fisch kaufen" }, ITEMTYPE_SHOP, GI_FISH, true, LOGIC_FISH_ACCESS, RHT_BOTTLE_WITH_FISH, ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 200); itemTable[RG_BUY_RED_POTION_30] = Item(RG_BUY_RED_POTION_30, Text{ "Buy Red Potion [30]", "Acheter: Potion Rouge [30]", "Rotes Elixier kaufen [30]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, LOGIC_NONE, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); @@ -286,17 +299,17 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_BUY_BLUE_POTION] = Item(RG_BUY_BLUE_POTION, Text{ "Buy Blue Potion", "Acheter: Potion Bleue", "Blaues Elixier kaufen" }, ITEMTYPE_SHOP, GI_POTION_BLUE, true, LOGIC_BUY_MAGIC_POTION, RHT_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 100); itemTable[RG_BUY_HYLIAN_SHIELD] = Item(RG_BUY_HYLIAN_SHIELD, Text{ "Buy Hylian Shield", "Acheter: Bouclier Hylien", "Hylia-Schild kaufen" }, ITEMTYPE_SHOP, GI_SHIELD_HYLIAN, true, LOGIC_HYLIAN_SHIELD, RHT_HYLIAN_SHIELD, ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, false, 80); itemTable[RG_BUY_DEKU_SHIELD] = Item(RG_BUY_DEKU_SHIELD, Text{ "Buy Deku Shield", "Acheter: Bouclier Mojo", "Deku-Schild kaufen" }, ITEMTYPE_SHOP, GI_SHIELD_DEKU, true, LOGIC_DEKU_SHIELD, RHT_DEKU_SHIELD, ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, false, 40); - itemTable[RG_BUY_GORON_TUNIC] = Item(RG_BUY_GORON_TUNIC, Text{ "Buy Goron Tunic", "Acheter: Tunique Goron", "Goronen-Tunika kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_GORON, true, LOGIC_GORON_TUNIC, RHT_GORON_TUNIC, ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 200); - itemTable[RG_BUY_ZORA_TUNIC] = Item(RG_BUY_ZORA_TUNIC, Text{ "Buy Zora Tunic", "Acheter: Tunique Zora", "Zora-Tunika kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_ZORA, true, LOGIC_ZORA_TUNIC, RHT_ZORA_TUNIC, ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 300); + itemTable[RG_BUY_GORON_TUNIC] = Item(RG_BUY_GORON_TUNIC, Text{ "Buy Goron Tunic", "Acheter: Tunique Goron", "Goronen-Rüstung kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_GORON, true, LOGIC_GORON_TUNIC, RHT_GORON_TUNIC, ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 200); + itemTable[RG_BUY_ZORA_TUNIC] = Item(RG_BUY_ZORA_TUNIC, Text{ "Buy Zora Tunic", "Acheter: Tunique Zora", "Zora-Rüstung kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_ZORA, true, LOGIC_ZORA_TUNIC, RHT_ZORA_TUNIC, ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 300); itemTable[RG_BUY_HEART] = Item(RG_BUY_HEART, Text{ "Buy Heart", "Acheter: Coeur de Vie", "Herz kaufen" }, ITEMTYPE_SHOP, GI_HEART, false, LOGIC_NONE, RHT_RECOVERY_HEART, ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 10); itemTable[RG_BUY_BOMBCHUS_10] = Item(RG_BUY_BOMBCHUS_10, Text{ "Buy Bombchu (10)", "Acheter: Missiles (10)", "Krabbelminen kaufen (10)" }, ITEMTYPE_SHOP, GI_BOMBCHUS_10, true, LOGIC_BUY_BOMBCHUS, RHT_BOMBCHUS_10, ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 99); itemTable[RG_BUY_BOMBCHUS_20] = Item(RG_BUY_BOMBCHUS_20, Text{ "Buy Bombchu (20)", "Acheter: Missiles (20)", "Krabbelminen kaufen (20)" }, ITEMTYPE_SHOP, GI_BOMBCHUS_20, true, LOGIC_BUY_BOMBCHUS, RHT_BOMBCHUS_20, ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 180); - itemTable[RG_BUY_DEKU_SEEDS_30] = Item(RG_BUY_DEKU_SEEDS_30, Text{ "Buy Deku Seeds (30)", "Acheter: Graines Mojo (30)", "Deku-Samen kaufen (30)" }, ITEMTYPE_SHOP, GI_SEEDS_30, true, LOGIC_BUY_SEED, RHT_DEKU_SEEDS_30, ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); + itemTable[RG_BUY_DEKU_SEEDS_30] = Item(RG_BUY_DEKU_SEEDS_30, Text{ "Buy Deku Seeds (30)", "Acheter: Graines Mojo (30)", "Deku-Kerne kaufen (30)" }, ITEMTYPE_SHOP, GI_SEEDS_30, true, LOGIC_BUY_SEED, RHT_DEKU_SEEDS_30, ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); itemTable[RG_SOLD_OUT] = Item(RG_SOLD_OUT, Text{ "Sold Out", "Rupture de stock", "Ausverkauft" }, ITEMTYPE_SHOP, RG_SOLD_OUT, false, LOGIC_NONE, RHT_NONE, false, 0); itemTable[RG_BUY_BLUE_FIRE] = Item(RG_BUY_BLUE_FIRE, Text{ "Buy Blue Fire", "Acheter: Flamme Bleue", "Blaues Feuer kaufen" }, ITEMTYPE_SHOP, GI_BLUE_FIRE, true, LOGIC_BLUE_FIRE_ACCESS, RHT_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 300); - itemTable[RG_BUY_BOTTLE_BUG] = Item(RG_BUY_BOTTLE_BUG, Text{ "Buy Bottle Bug", "Acheter: Insecte en bouteille", "Flaschenkäfer kaufen" }, ITEMTYPE_SHOP, GI_BUGS, true, LOGIC_BUGS_ACCESS, RHT_BOTTLE_WITH_BUGS, ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); - itemTable[RG_BUY_POE] = Item(RG_BUY_POE, Text{ "Buy Poe", "Acheter: Esprit", "Geist kaufen" }, ITEMTYPE_SHOP, RG_BUY_POE, false, LOGIC_NONE, RHT_BOTTLE_WITH_BIG_POE, ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); - itemTable[RG_BUY_FAIRYS_SPIRIT] = Item(RG_BUY_FAIRYS_SPIRIT, Text{ "Buy Fairy's Spirit", "Acheter: Esprit de Fée", "Feengeist kaufen" }, ITEMTYPE_SHOP, GI_FAIRY, true, LOGIC_FAIRY_ACCESS, RHT_BOTTLE_WITH_FAIRY, ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); + itemTable[RG_BUY_BOTTLE_BUG] = Item(RG_BUY_BOTTLE_BUG, Text{ "Buy Bottle Bug", "Acheter: Insecte en bouteille", "Käfer kaufen" }, ITEMTYPE_SHOP, GI_BUGS, true, LOGIC_BUGS_ACCESS, RHT_BOTTLE_WITH_BUGS, ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); + itemTable[RG_BUY_POE] = Item(RG_BUY_POE, Text{ "Buy Poe", "Acheter: Esprit", "Irrlicht kaufen" }, ITEMTYPE_SHOP, RG_BUY_POE, false, LOGIC_NONE, RHT_BOTTLE_WITH_BIG_POE, ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); + itemTable[RG_BUY_FAIRYS_SPIRIT] = Item(RG_BUY_FAIRYS_SPIRIT, Text{ "Buy Fairy's Spirit", "Acheter: Esprit de Fée", "Fee kaufen" }, ITEMTYPE_SHOP, GI_FAIRY, true, LOGIC_FAIRY_ACCESS, RHT_BOTTLE_WITH_FAIRY, ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); itemTable[RG_BUY_ARROWS_10] = Item(RG_BUY_ARROWS_10, Text{ "Buy Arrows (10)", "Acheter: Flèches (10)", "Pfeile kaufen (10)" }, ITEMTYPE_SHOP, GI_ARROWS_SMALL, true, LOGIC_BUY_ARROW, RHT_ARROWS_10, ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 20); itemTable[RG_BUY_BOMBS_20] = Item(RG_BUY_BOMBS_20, Text{ "Buy Bombs (20)", "Acheter: Bombes (20)", "Bomben kaufen (20)" }, ITEMTYPE_SHOP, GI_BOMBS_20, true, LOGIC_BUY_BOMB, RHT_BOMBS_20, ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 80); itemTable[RG_BUY_BOMBS_30] = Item(RG_BUY_BOMBS_30, Text{ "Buy Bombs (30)", "Acheter: Bombes (30)", "Bomben kaufen (30)" }, ITEMTYPE_SHOP, GI_BOMBS_30, true, LOGIC_BUY_BOMB, RHT_BOMBS_20, ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 120); @@ -304,60 +317,60 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_BUY_RED_POTION_40] = Item(RG_BUY_RED_POTION_40, Text{ "Buy Red Potion [40]", "Acheter: Potion Rouge [40]", "Rotes Elixier kaufen [40]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, LOGIC_NONE, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 40); itemTable[RG_BUY_RED_POTION_50] = Item(RG_BUY_RED_POTION_50, Text{ "Buy Red Potion [50]", "Acheter: Potion Rouge [50]", "Rotes Elixier kaufen [50]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, LOGIC_NONE, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); // Misc. - itemTable[RG_GOHMA_SOUL] = Item(RG_GOHMA_SOUL, Text{ "Gohma's Soul", "Âme de Gohma", "Gohmas Seele" }, ITEMTYPE_ITEM, 0xE0, true, LOGIC_CAN_SUMMON_GOHMA, RHT_GOHMA_SOUL, RG_GOHMA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_GOHMA_SOUL] = Item(RG_GOHMA_SOUL, Text{ "Gohma's Soul", "Âme de Gohma", "Gohmas Seele" }, ITEMTYPE_ITEM, 0xE0, true, LOGIC_CAN_SUMMON_GOHMA, RHT_GOHMA_SOUL, RG_GOHMA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_GOHMA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_KING_DODONGO_SOUL] = Item(RG_KING_DODONGO_SOUL, Text{ "King Dodongo's Soul", "Âme du Roi Dodongo", "König Dodongos Seele" }, ITEMTYPE_ITEM, 0xE1, true, LOGIC_CAN_SUMMON_KINGDODONGO, RHT_KING_DODONGO_SOUL, RG_KING_DODONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_KING_DODONGO_SOUL] = Item(RG_KING_DODONGO_SOUL, Text{ "King Dodongo's Soul", "Âme du Roi Dodongo", "König Dodongos Seele" }, ITEMTYPE_ITEM, 0xE1, true, LOGIC_CAN_SUMMON_KINGDODONGO, RHT_KING_DODONGO_SOUL, RG_KING_DODONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_KING_DODONGO_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_BARINADE_SOUL] = Item(RG_BARINADE_SOUL, Text{ "Barinade's Soul", "Âme de Barinade", "Barinades Seele" }, ITEMTYPE_ITEM, 0xE2, true, LOGIC_CAN_SUMMON_BARINADE, RHT_BARINADE_SOUL, RG_BARINADE_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BARINADE_SOUL] = Item(RG_BARINADE_SOUL, Text{ "Barinade's Soul", "Âme de Barinade", "Barinades Seele" }, ITEMTYPE_ITEM, 0xE2, true, LOGIC_CAN_SUMMON_BARINADE, RHT_BARINADE_SOUL, RG_BARINADE_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BARINADE_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_PHANTOM_GANON_SOUL] = Item(RG_PHANTOM_GANON_SOUL, Text{ "Phantom Ganon's Soul", "Âme de Ganon Spectral", "Phantom-Ganons Seele" }, ITEMTYPE_ITEM, 0xE3, true, LOGIC_CAN_SUMMON_PHANTOMGANON, RHT_PHANTOM_GANON_SOUL, RG_PHANTOM_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_PHANTOM_GANON_SOUL] = Item(RG_PHANTOM_GANON_SOUL, Text{ "Phantom Ganon's Soul", "Âme de Ganon Spectral", "Phantom-Ganons Seele" }, ITEMTYPE_ITEM, 0xE3, true, LOGIC_CAN_SUMMON_PHANTOMGANON, RHT_PHANTOM_GANON_SOUL, RG_PHANTOM_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_PHANTOM_GANON_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_VOLVAGIA_SOUL] = Item(RG_VOLVAGIA_SOUL, Text{ "Volvagia's Soul", "Âme de Vulcania", "Volvagias Seele" }, ITEMTYPE_ITEM, 0xE4, true, LOGIC_CAN_SUMMON_VOLVAGIA, RHT_VOLVAGIA_SOUL, RG_VOLVAGIA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_VOLVAGIA_SOUL] = Item(RG_VOLVAGIA_SOUL, Text{ "Volvagia's Soul", "Âme de Volcania", "Volvagias Seele" }, ITEMTYPE_ITEM, 0xE4, true, LOGIC_CAN_SUMMON_VOLVAGIA, RHT_VOLVAGIA_SOUL, RG_VOLVAGIA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_VOLVAGIA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_MORPHA_SOUL] = Item(RG_MORPHA_SOUL, Text{ "Morpha's Soul", "Âme de Morpha", "Morphas Seele" }, ITEMTYPE_ITEM, 0xE5, true, LOGIC_CAN_SUMMON_MORPHA, RHT_MORPHA_SOUL, RG_MORPHA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MORPHA_SOUL] = Item(RG_MORPHA_SOUL, Text{ "Morpha's Soul", "Âme de Morpha", "Morphas Seele" }, ITEMTYPE_ITEM, 0xE5, true, LOGIC_CAN_SUMMON_MORPHA, RHT_MORPHA_SOUL, RG_MORPHA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_MORPHA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_BONGO_BONGO_SOUL] = Item(RG_BONGO_BONGO_SOUL, Text{ "Bongo Bongo's Soul", "Âme de Bongo Bongo", "Bongo Bongos Seele" }, ITEMTYPE_ITEM, 0xE6, true, LOGIC_CAN_SUMMON_BONGOBONGO, RHT_BONGO_BONGO_SOUL, RG_BONGO_BONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BONGO_BONGO_SOUL] = Item(RG_BONGO_BONGO_SOUL, Text{ "Bongo Bongo's Soul", "Âme de Bongo Bongo", "Bongo Bongos Seele" }, ITEMTYPE_ITEM, 0xE6, true, LOGIC_CAN_SUMMON_BONGOBONGO, RHT_BONGO_BONGO_SOUL, RG_BONGO_BONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BONGO_BONGO_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_TWINROVA_SOUL] = Item(RG_TWINROVA_SOUL, Text{ "Twinrova's Soul", "Âme du Duo Maléfique", "Twinrovas Seele" }, ITEMTYPE_ITEM, 0xE7, true, LOGIC_CAN_SUMMON_TWINROVA, RHT_TWINROVA_SOUL, RG_TWINROVA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_TWINROVA_SOUL] = Item(RG_TWINROVA_SOUL, Text{ "Twinrova's Soul", "Âme du Duo Maléfique", "Twinrovas Seele" }, ITEMTYPE_ITEM, 0xE7, true, LOGIC_CAN_SUMMON_TWINROVA, RHT_TWINROVA_SOUL, RG_TWINROVA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_TWINROVA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_GANON_SOUL] = Item(RG_GANON_SOUL, Text{ "Ganon's Soul", "Âme de Ganon", "Ganons Seele" }, ITEMTYPE_ITEM, 0xE8, true, LOGIC_CAN_SUMMON_GANON, RHT_GANON_SOUL, RG_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_GANON_SOUL] = Item(RG_GANON_SOUL, Text{ "Ganon's Soul", "Âme de Ganon", "Ganons Seele" }, ITEMTYPE_ITEM, 0xE8, true, LOGIC_CAN_SUMMON_GANON, RHT_GANON_SOUL, RG_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_GANON_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); itemTable[RG_FISHING_POLE] = Item(RG_FISHING_POLE, Text{ "Fishing Pole", "Canne à Pêche", "Angelrute" }, ITEMTYPE_ITEM, RG_FISHING_POLE, true, LOGIC_FISHING_POLE, RHT_FISHING_POLE, RG_FISHING_POLE, OBJECT_GI_FISH, GID_FISHING_POLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_FISHING_POLE].SetCustomDrawFunc(Randomizer_DrawFishingPoleGI); - itemTable[RG_OCARINA_A_BUTTON] = Item(RG_OCARINA_A_BUTTON, Text{ "Ocarina A Button", "Touche A de l'Ocarina", "Taste A der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_A_BUTTON, RHT_OCARINA_A_BUTTON, RG_OCARINA_A_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_OCARINA_A_BUTTON] = Item(RG_OCARINA_A_BUTTON, Text{ "Ocarina A Button", "Touche A de l'Ocarina", "A-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_A_BUTTON, RHT_OCARINA_A_BUTTON, RG_OCARINA_A_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_A_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - itemTable[RG_OCARINA_C_UP_BUTTON] = Item(RG_OCARINA_C_UP_BUTTON, Text{ "Ocarina C Up Button", "Touche C-Haut de l'Ocarina", "Taste C-Oben der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_UP_BUTTON, RHT_OCARINA_C_UP_BUTTON, RG_OCARINA_C_UP_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_OCARINA_C_UP_BUTTON] = Item(RG_OCARINA_C_UP_BUTTON, Text{ "Ocarina C Up Button", "Touche C-Haut de l'Ocarina", "C-Oben-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_UP_BUTTON, RHT_OCARINA_C_UP_BUTTON, RG_OCARINA_C_UP_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_UP_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - itemTable[RG_OCARINA_C_DOWN_BUTTON] = Item(RG_OCARINA_C_DOWN_BUTTON, Text{ "Ocarina C Down Button", "Touche C-Bas de l'Ocarina", "Taste C-Unten der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_DOWN_BUTTON, RHT_OCARINA_C_DOWN_BUTTON, RG_OCARINA_C_DOWN_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_OCARINA_C_DOWN_BUTTON] = Item(RG_OCARINA_C_DOWN_BUTTON, Text{ "Ocarina C Down Button", "Touche C-Bas de l'Ocarina", "C-Unten-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_DOWN_BUTTON, RHT_OCARINA_C_DOWN_BUTTON, RG_OCARINA_C_DOWN_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_DOWN_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - itemTable[RG_OCARINA_C_LEFT_BUTTON] = Item(RG_OCARINA_C_LEFT_BUTTON, Text{ "Ocarina C Left Button", "Touche C-Gauche de l'Ocarina", "Taste C-Links der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_LEFT_BUTTON, RHT_OCARINA_C_LEFT_BUTTON, RG_OCARINA_C_LEFT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_OCARINA_C_LEFT_BUTTON] = Item(RG_OCARINA_C_LEFT_BUTTON, Text{ "Ocarina C Left Button", "Touche C-Gauche de l'Ocarina", "C-Links-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_LEFT_BUTTON, RHT_OCARINA_C_LEFT_BUTTON, RG_OCARINA_C_LEFT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_LEFT_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - itemTable[RG_OCARINA_C_RIGHT_BUTTON] = Item(RG_OCARINA_C_RIGHT_BUTTON, Text{ "Ocarina C Right Button", "Touche C-Droit de l'Ocarina", "Taste C-Rechts der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_RIGHT_BUTTON, RHT_OCARINA_C_RIGHT_BUTTON, RG_OCARINA_C_RIGHT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_OCARINA_C_RIGHT_BUTTON] = Item(RG_OCARINA_C_RIGHT_BUTTON, Text{ "Ocarina C Right Button", "Touche C-Droit de l'Ocarina", "C-Rechts-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_RIGHT_BUTTON, RHT_OCARINA_C_RIGHT_BUTTON, RG_OCARINA_C_RIGHT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_RIGHT_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - itemTable[RG_BRONZE_SCALE] = Item(RG_BRONZE_SCALE, Text{ "Bronze Scale", "Écaille de Bronze", "Bronzene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_WALLET, RHT_BRONZE_SCALE, RG_BRONZE_SCALE, OBJECT_GI_SCALE, GID_SCALE_SILVER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BRONZE_SCALE] = Item(RG_BRONZE_SCALE, Text{ "Bronze Scale", "Écaille de Bronze", "Bronzene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_WALLET, RHT_BRONZE_SCALE, RG_BRONZE_SCALE, OBJECT_GI_SCALE, GID_SCALE_SILVER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BRONZE_SCALE].SetCustomDrawFunc(Randomizer_DrawBronzeScale); - itemTable[RG_BOMBCHU_BAG] = Item(RG_BOMBCHU_BAG, Text{ "Bombchu Bag", "!!!", "!!!" }, ITEMTYPE_ITEM, RG_BOMBCHU_BAG, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_BAG, RG_BOMBCHU_BAG, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_BAG] = Item(RG_BOMBCHU_BAG, Text{ "Bombchu Bag", "Sac de Missiles Teigneux", "Krabbelminentasche" }, ITEMTYPE_ITEM, RG_BOMBCHU_BAG, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_BAG, RG_BOMBCHU_BAG, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BOMBCHU_BAG].SetCustomDrawFunc(Randomizer_DrawBombchuBag); - - itemTable[RG_QUIVER_INF] = Item(RG_QUIVER_INF, Text{ "Infinite Quiver", "Carquois Infini", "Unendlicher Köcher" }, ITEMTYPE_ITEM, RG_QUIVER_INF, true, LOGIC_PROGRESSIVE_BOW, RHT_QUIVER_INF, RG_QUIVER_INF, OBJECT_GI_ARROWCASE, GID_QUIVER_50, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_BOMB_BAG_INF] = Item(RG_BOMB_BAG_INF, Text{ "Infinite Bomb Bag", "Sac de Bombes Infini", "Unendliche Bombentasche" }, ITEMTYPE_ITEM, RG_BOMB_BAG_INF, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BOMB_BAG_INF, RG_BOMB_BAG_INF, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_BULLET_BAG_INF] = Item(RG_BULLET_BAG_INF, Text{ "Infinite Bullet Bag", "Sac de Graines Infinis", "Unendliche Samentasche" }, ITEMTYPE_ITEM, RG_BULLET_BAG_INF, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BULLET_BAG_INF, RG_BULLET_BAG_INF, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_STICK_UPGRADE_INF] = Item(RG_STICK_UPGRADE_INF, Text{ "Infinite Stick Capacity", "Bâtons Mojo Infinis", "Unendliche Stab-Kapazität" }, ITEMTYPE_ITEM, RG_STICK_UPGRADE_INF, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_STICK_UPGRADE_INF, RG_STICK_UPGRADE_INF, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_NUT_UPGRADE_INF] = Item(RG_NUT_UPGRADE_INF, Text{ "Infinite Nut Capacity", "Noix Mojo Infinies", "Unendliche Nuß-Kapazität" }, ITEMTYPE_ITEM, RG_NUT_UPGRADE_INF, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NUT_UPGRADE_INF, RG_NUT_UPGRADE_INF, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_MAGIC_INF] = Item(RG_MAGIC_INF, Text{ "Infinite Magic Meter", "Magie Infinie", "Unendliches Magisches Maß" }, ITEMTYPE_ITEM, RG_MAGIC_INF, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_INF, RG_MAGIC_INF, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_BOMBCHU_INF] = Item(RG_BOMBCHU_INF, Text{ "Infinite Bombchus", "Missiles Teigneux Infinis", "Unendliche Krabbelminen" }, ITEMTYPE_ITEM, RG_BOMBCHU_INF, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_INF, RG_BOMBCHU_INF, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_BOMBCHU_INF].SetCustomDrawFunc(Randomizer_DrawBombchuBag); - itemTable[RG_WALLET_INF] = Item(RG_WALLET_INF, Text{ "Infinite Wallet", "Bourse Infinie", "Unendliche Geldbörse" }, ITEMTYPE_ITEM, RG_WALLET_INF, true, LOGIC_PROGRESSIVE_WALLET, RHT_WALLET_INF, RG_WALLET_INF, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_SKELETON_KEY] = Item(RG_SKELETON_KEY, Text{ "Skeleton Key", "Clé Squelette", "Skelettschlüssel" }, ITEMTYPE_ITEM, GI_STONE_OF_AGONY, true, LOGIC_SKELETON_KEY, RHT_SKELETON_KEY, RG_SKELETON_KEY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_QUIVER_INF] = Item(RG_QUIVER_INF, Text{ "Infinite Quiver", "Carquois Infini", "Unendlicher Köcher" }, ITEMTYPE_ITEM, RG_QUIVER_INF, true, LOGIC_PROGRESSIVE_BOW, RHT_QUIVER_INF, RG_QUIVER_INF, OBJECT_GI_ARROWCASE, GID_QUIVER_50, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOMB_BAG_INF] = Item(RG_BOMB_BAG_INF, Text{ "Infinite Bomb Bag", "Sac de Bombes Infini", "Unendliche Bombentasche" }, ITEMTYPE_ITEM, RG_BOMB_BAG_INF, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BOMB_BAG_INF, RG_BOMB_BAG_INF, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BULLET_BAG_INF] = Item(RG_BULLET_BAG_INF, Text{ "Infinite Bullet Bag", "Sac de Graines Infinis", "Unendliche Munitionstasche" }, ITEMTYPE_ITEM, RG_BULLET_BAG_INF, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BULLET_BAG_INF, RG_BULLET_BAG_INF, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_STICK_UPGRADE_INF] = Item(RG_STICK_UPGRADE_INF, Text{ "Infinite Stick Capacity", "Bâtons Mojo Infinis", "Unendliche Deku-Stab-Kapazität" }, ITEMTYPE_ITEM, RG_STICK_UPGRADE_INF, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_STICK_UPGRADE_INF, RG_STICK_UPGRADE_INF, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_NUT_UPGRADE_INF] = Item(RG_NUT_UPGRADE_INF, Text{ "Infinite Nut Capacity", "Noix Mojo Infinies", "Unendliche Deku-Nuß-Kapazität" }, ITEMTYPE_ITEM, RG_NUT_UPGRADE_INF, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NUT_UPGRADE_INF, RG_NUT_UPGRADE_INF, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_MAGIC_INF] = Item(RG_MAGIC_INF, Text{ "Infinite Magic Meter", "Magie Infinie", "Unendliche Magische Kraft" }, ITEMTYPE_ITEM, RG_MAGIC_INF, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_INF, RG_MAGIC_INF, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_INF] = Item(RG_BOMBCHU_INF, Text{ "Infinite Bombchus", "Missiles Teigneux Infinis", "Unendliche Krabbelminentasche" }, ITEMTYPE_ITEM, RG_BOMBCHU_INF, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_INF, RG_BOMBCHU_INF, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_INF].SetCustomDrawFunc(Randomizer_DrawBombchuBag); + itemTable[RG_WALLET_INF] = Item(RG_WALLET_INF, Text{ "Infinite Wallet", "Bourse Infinie", "Unendliche Geldbörse" }, ITEMTYPE_ITEM, RG_WALLET_INF, true, LOGIC_PROGRESSIVE_WALLET, RHT_WALLET_INF, RG_WALLET_INF, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + + itemTable[RG_SKELETON_KEY] = Item(RG_SKELETON_KEY, Text{ "Skeleton Key", "Clé Squelette", "Skelettschlüssel" }, ITEMTYPE_ITEM, GI_STONE_OF_AGONY, true, LOGIC_SKELETON_KEY, RHT_SKELETON_KEY, RG_SKELETON_KEY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_SKELETON_KEY].SetCustomDrawFunc(Randomizer_DrawSkeletonKey); - itemTable[RG_DEKU_STICK_BAG] = Item(RG_DEKU_STICK_BAG, Text{ "Deku Stick Bag", "Sac de Bâton Mojo", "Deku-Stab-Tasche" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_30, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_NONE, RG_DEKU_STICK_BAG, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_DEKU_STICK_BAG] = Item(RG_DEKU_STICK_BAG, Text{ "Deku Stick Bag", "Sac de Bâton Mojo", "Deku-Stab-Tasche" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_30, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_NONE, RG_DEKU_STICK_BAG, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_DEKU_NUT_BAG] = Item(RG_DEKU_NUT_BAG, Text{ "Deku Nut Bag", "Sac de Noix Mojo", "Deku-Nuß-Tasche" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NONE, RG_DEKU_NUT_BAG, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_DEKU_NUT_BAG] = Item(RG_DEKU_NUT_BAG, Text{ "Deku Nut Bag", "Sac de Noix Mojo", "Deku-Nuß-Tasche" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NONE, RG_DEKU_NUT_BAG, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_TRIFORCE] = Item(RG_TRIFORCE, Text{ "Triforce", "Triforce", "Triforce" }, ITEMTYPE_EVENT, RG_TRIFORCE, false, LOGIC_NONE, RHT_NONE); itemTable[RG_HINT] = Item(RG_HINT, Text{ "Hint", "Indice", "Hinweis" }, ITEMTYPE_EVENT, RG_HINT, false, LOGIC_NONE, RHT_NONE); @@ -368,29 +381,31 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_OCARINA_OF_TIME] = Item(RG_OCARINA_OF_TIME, Text{ "Ocarina of Time", "Ocarina du Temps", "Okarina der Zeit" }, ITEMTYPE_ITEM, GI_OCARINA_OOT, true, LOGIC_PROGRESSIVE_OCARINA, RHT_OCARINA_OF_TIME, ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_BOMB_BAG] = Item(RG_BOMB_BAG, Text{ "Bomb Bag", "Sac de Bombes", "Bombentasche" }, ITEMTYPE_ITEM, GI_BOMB_BAG_20, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BOMB_BAG, ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_BIG_BOMB_BAG] = Item(RG_BIG_BOMB_BAG, Text{ "Big Bomb Bag", "Grand Sac de Bombes", "Große Bombentasche" }, ITEMTYPE_ITEM, GI_BOMB_BAG_30, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BIG_BOMB_BAG, ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_BIGGEST_BOMB_BAG] = Item(RG_BIGGEST_BOMB_BAG, Text{ "Biggest Bomb Bag", "Énorme Sac de Bombes", "Größte Bombentasche" }, ITEMTYPE_ITEM, GI_BOMB_BAG_40, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BIGGEST_BOMB_BAG, ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_BIGGEST_BOMB_BAG] = Item(RG_BIGGEST_BOMB_BAG, Text{ "Biggest Bomb Bag", "Énorme Sac de Bombes", "Riesen-Bombentasche" }, ITEMTYPE_ITEM, GI_BOMB_BAG_40, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BIGGEST_BOMB_BAG, ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_FAIRY_BOW] = Item(RG_FAIRY_BOW, Text{ "Fairy Bow", "Arc des Fées", "Feen-Bogen" }, ITEMTYPE_ITEM, GI_BOW, true, LOGIC_PROGRESSIVE_BOW, RHT_FAIRY_BOW, ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_BIG_QUIVER] = Item(RG_BIG_QUIVER, Text{ "Big Quiver", "Grand carquois", "Großer Köcher" }, ITEMTYPE_ITEM, GI_QUIVER_40, true, LOGIC_PROGRESSIVE_BOW, RHT_BIG_QUIVER, ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_BIGGEST_QUIVER] = Item(RG_BIGGEST_QUIVER, Text{ "Biggest Quiver", "Énorme carquois", "Größter Köcher" }, ITEMTYPE_ITEM, GI_QUIVER_50, true, LOGIC_PROGRESSIVE_BOW, RHT_BIGGEST_QUIVER, ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_BIGGEST_QUIVER] = Item(RG_BIGGEST_QUIVER, Text{ "Biggest Quiver", "Énorme carquois", "Riesenköcher" }, ITEMTYPE_ITEM, GI_QUIVER_50, true, LOGIC_PROGRESSIVE_BOW, RHT_BIGGEST_QUIVER, ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_FAIRY_SLINGSHOT] = Item(RG_FAIRY_SLINGSHOT, Text{ "Fairy Slingshot", "Lance-Pierre des Fées", "Feen-Schleuder" }, ITEMTYPE_ITEM, GI_SLINGSHOT, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_FAIRY_SLINGSHOT, ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_BIG_BULLET_BAG] = Item(RG_BIG_BULLET_BAG, Text{ "Big Deku Seed Bullet Bag", "Grand sac de graines mojo", "Große Deku-Samentasche" }, ITEMTYPE_ITEM, GI_BULLET_BAG_40, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BIG_BULLET_BAG, ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_BIGGEST_BULLET_BAG] = Item(RG_BIGGEST_BULLET_BAG, Text{ "Biggest Deku Seed Bullet Bag", "Énorme sac de graines mojo", "Größte Deku-Samentasche" }, ITEMTYPE_ITEM, GI_BULLET_BAG_50, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BIGGEST_BULLET_BAG, ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_BIG_BULLET_BAG] = Item(RG_BIG_BULLET_BAG, Text{ "Big Deku Seed Bullet Bag", "Grand sac de graines mojo", "Große Munitionstasche" }, ITEMTYPE_ITEM, GI_BULLET_BAG_40, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BIG_BULLET_BAG, ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_BIGGEST_BULLET_BAG] = Item(RG_BIGGEST_BULLET_BAG, Text{ "Biggest Deku Seed Bullet Bag", "Énorme sac de graines mojo", "Riesen-Munitionstasche" }, ITEMTYPE_ITEM, GI_BULLET_BAG_50, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BIGGEST_BULLET_BAG, ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_GORONS_BRACELET] = Item(RG_GORONS_BRACELET, Text{ "Goron's Bracelet", "Bracelet Goron", "Goronen-Armband" }, ITEMTYPE_ITEM, GI_BRACELET, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_GORONS_BRACELET, ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_SILVER_GAUNTLETS] = Item(RG_SILVER_GAUNTLETS, Text{ "Silver Gauntlets", "Gantelets d'argent", "Silberhandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_SILVER, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_SILVER_GAUNTLETS, ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_GOLDEN_GAUNTLETS] = Item(RG_GOLDEN_GAUNTLETS, Text{ "Golden Gauntlets", "Gantelets d'or", "Goldhandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_GOLD, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_GOLDEN_GAUNTLETS, ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_SILVER_GAUNTLETS] = Item(RG_SILVER_GAUNTLETS, Text{ "Silver Gauntlets", "Gantelets d'argent", "Krafthandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_SILVER, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_SILVER_GAUNTLETS, ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GOLDEN_GAUNTLETS] = Item(RG_GOLDEN_GAUNTLETS, Text{ "Golden Gauntlets", "Gantelets d'or", "Titanhandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_GOLD, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_GOLDEN_GAUNTLETS, ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_SILVER_SCALE] = Item(RG_SILVER_SCALE, Text{ "Silver Scale", "Écaille d'argent", "Silberne Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_SCALE, RHT_SILVER_SCALE, ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_GOLDEN_SCALE] = Item(RG_GOLDEN_SCALE, Text{ "Golden Scale", "Écaille d'or", "Goldene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_GOLDEN, true, LOGIC_PROGRESSIVE_SCALE, RHT_GOLDEN_SCALE, ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_ADULT_WALLET] = Item(RG_ADULT_WALLET, Text{ "Adult Wallet", "Grande Bourse", "Erwachsenengeldbörse" }, ITEMTYPE_ITEM, GI_WALLET_ADULT, true, LOGIC_PROGRESSIVE_WALLET, RHT_ADULT_WALLET, ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_GIANT_WALLET] = Item(RG_GIANT_WALLET, Text{ "Giant Wallet", "Bourse de Géant", "Riesige Geldbörse" }, ITEMTYPE_ITEM, GI_WALLET_GIANT, true, LOGIC_PROGRESSIVE_WALLET, RHT_GIANT_WALLET, ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GOLDEN_SCALE] = Item(RG_GOLDEN_SCALE, Text{ "Golden Scale", "Écaille d'or", "Goldene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_GOLDEN, true, LOGIC_PROGRESSIVE_SCALE, RHT_GOLDEN_SCALE, ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_ADULT_WALLET] = Item(RG_ADULT_WALLET, Text{ "Adult Wallet", "Grande Bourse", "Große Geldbörse" }, ITEMTYPE_ITEM, GI_WALLET_ADULT, true, LOGIC_PROGRESSIVE_WALLET, RHT_ADULT_WALLET, ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GIANT_WALLET] = Item(RG_GIANT_WALLET, Text{ "Giant Wallet", "Bourse de Géant", "Riesengeldbörse" }, ITEMTYPE_ITEM, GI_WALLET_GIANT, true, LOGIC_PROGRESSIVE_WALLET, RHT_GIANT_WALLET, ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_TYCOON_WALLET] = Item(RG_TYCOON_WALLET, Text{ "Tycoon Wallet", "Bourse de Magnat", "Goldene Geldbörse" }, ITEMTYPE_ITEM, RG_TYCOON_WALLET, true, LOGIC_PROGRESSIVE_WALLET, RHT_TYCOON_WALLET, RG_TYCOON_WALLET, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_CHILD_WALLET] = Item(RG_CHILD_WALLET, Text{ "Child Wallet", "Petite Bourse", "Kindergeldbörse" }, ITEMTYPE_ITEM, RG_CHILD_WALLET, true, LOGIC_PROGRESSIVE_WALLET, RHT_CHILD_WALLET, RG_CHILD_WALLET, OBJECT_GI_PURSE, GID_WALLET_ADULT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_CHILD_WALLET] = Item(RG_CHILD_WALLET, Text{ "Child Wallet", "Petite Bourse", "Kindergeldbörse" }, ITEMTYPE_ITEM, RG_CHILD_WALLET, true, LOGIC_PROGRESSIVE_WALLET, RHT_CHILD_WALLET, RG_CHILD_WALLET, OBJECT_GI_PURSE, GID_WALLET_ADULT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_DEKU_NUT_CAPACITY_30] = Item(RG_DEKU_NUT_CAPACITY_30, Text{ "Deku Nut Capacity (30)", "Capacité de noix Mojo (30)", "Deku-Nuß-Kapazität (30)" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_DEKU_NUT_CAPACITY_30, ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_DEKU_NUT_CAPACITY_40] = Item(RG_DEKU_NUT_CAPACITY_40, Text{ "Deku Nut Capacity (40)", "Capacité de noix Mojo (40)", "Deku-Nuß-Kapazität (40)" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_40, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_DEKU_NUT_CAPACITY_40, ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_DEKU_STICK_CAPACITY_20] = Item(RG_DEKU_STICK_CAPACITY_20, Text{ "Deku Stick Capacity (20)", "Capacité de Bâtons Mojo (20)", "Deku-Stab-Kapazität (20)" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_20, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_DEKU_STICK_CAPACITY_20, ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_DEKU_STICK_CAPACITY_30] = Item(RG_DEKU_STICK_CAPACITY_30, Text{ "Deku Stick Capacity (30)", "Capacité de Bâtons Mojo (30)", "Deku-Stab-Kapazität (30)" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_30, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_DEKU_STICK_CAPACITY_30, ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_MAGIC_SINGLE] = Item(RG_MAGIC_SINGLE, Text{ "Magic Meter", "Jauge de Magie", "Magisches Maß" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_SINGLE, RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_MAGIC_DOUBLE] = Item(RG_MAGIC_DOUBLE, Text{ "Enhanced Magic Meter", "Jauge de Magie améliorée", "Verbessertes Magisches Maß" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_DOUBLE, RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Triforce Piece", "Triforce Piece", "Triforce-Fragment" }, ITEMTYPE_ITEM, 0xDF, true, LOGIC_TRIFORCE_PIECES, RHT_TRIFORCE_PIECE, RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MAGIC_SINGLE] = Item(RG_MAGIC_SINGLE, Text{ "Magic Meter", "Jauge de Magie", "Magische Kraft" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_SINGLE, RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MAGIC_DOUBLE] = Item(RG_MAGIC_DOUBLE, Text{ "Enhanced Magic Meter", "Jauge de Magie améliorée", "Verb. Magische Kraft" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_DOUBLE, RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Triforce Piece", "Triforce Piece", "Triforce-Splitter" }, ITEMTYPE_ITEM, 0xDF, true, LOGIC_TRIFORCE_PIECES, RHT_TRIFORCE_PIECE, RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + + // clang-format on // Init itemNameToEnum for (auto& item : itemTable) { @@ -401,6 +416,7 @@ void Rando::StaticData::InitItemTable() { } itemNameToEnum[item.GetName().english] = item.GetRandomizerGet(); itemNameToEnum[item.GetName().french] = item.GetRandomizerGet(); + itemNameToEnum[item.GetName().german] = item.GetRandomizerGet(); } } diff --git a/soh/soh/Enhancements/randomizer/item_location.cpp b/soh/soh/Enhancements/randomizer/item_location.cpp index 00e0366abb..f7587ec5e6 100644 --- a/soh/soh/Enhancements/randomizer/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/item_location.cpp @@ -3,8 +3,10 @@ #include "logic.h" namespace Rando { -ItemLocation::ItemLocation() : rc(RC_UNKNOWN_CHECK) {} -ItemLocation::ItemLocation(const RandomizerCheck rc_) : rc(rc_) {} +ItemLocation::ItemLocation() : rc(RC_UNKNOWN_CHECK) { +} +ItemLocation::ItemLocation(const RandomizerCheck rc_) : rc(rc_) { +} RandomizerCheck ItemLocation::GetRandomizerCheck() const { return rc; @@ -40,14 +42,14 @@ RandomizerGet ItemLocation::GetPlacedRandomizerGet() const { void ItemLocation::SetPlacedItem(const RandomizerGet item) { placedItem = item; - SetPrice (StaticData::RetrieveItem(placedItem).GetPrice()); + SetPrice(StaticData::RetrieveItem(placedItem).GetPrice()); } void ItemLocation::SetDelayedItem(const RandomizerGet item) { delayedItem = item; } -void ItemLocation::SaveDelayedItem () { +void ItemLocation::SaveDelayedItem() { placedItem = delayedItem; delayedItem = RG_NONE; } @@ -56,15 +58,16 @@ void ItemLocation::SetParentRegion(const RandomizerRegion region) { parentRegion = region; } -//RANDOTODO only used in tracker now, could possibly be removed +// RANDOTODO only used in tracker now, could possibly be removed RandomizerRegion ItemLocation::GetParentRegionKey() const { return parentRegion; } void ItemLocation::MergeAreas(std::set newAreas) { areas.merge(newAreas); - if (areas.size() >= 2){ - //if we have more than 1 area, remove any RA_NONE as that's not a real area. can happen if an entrance is in 2 regions and 1 is disconnected + if (areas.size() >= 2) { + // if we have more than 1 area, remove any RA_NONE as that's not a real area. can happen if an entrance is in 2 + // regions and 1 is disconnected areas.erase(RA_NONE); } } @@ -74,7 +77,7 @@ std::set ItemLocation::GetAreas() const { } RandomizerArea ItemLocation::GetFirstArea() const { - if (areas.empty()){ + if (areas.empty()) { assert(false); return RA_NONE; } else { @@ -83,7 +86,7 @@ RandomizerArea ItemLocation::GetFirstArea() const { } RandomizerArea ItemLocation::GetRandomArea() const { - if (areas.empty()){ + if (areas.empty()) { SPDLOG_DEBUG("Attempted to get random area of location with no areas: "); SPDLOG_DEBUG(Rando::StaticData::GetLocation(rc)->GetName()); assert(false); @@ -102,7 +105,7 @@ void ItemLocation::ApplyPlacedItemEffect() const { } uint16_t ItemLocation::GetPrice() const { - //RANDOTODO if we ever change price of shop items, this needs replacing with proper price assignment in Fill + // RANDOTODO if we ever change price of shop items, this needs replacing with proper price assignment in Fill if (StaticData::RetrieveItem(placedItem).GetItemType() == ITEMTYPE_SHOP) { return StaticData::RetrieveItem(placedItem).GetPrice(); } @@ -167,7 +170,7 @@ const std::vector& ItemLocation::GetHintedBy() const { void ItemLocation::AddHintedBy(const RandomizerHint hintKey) { hintedBy.push_back(hintKey); -} +} bool ItemLocation::IsHidden() const { return hidden; @@ -194,7 +197,6 @@ bool ItemLocation::IsVisible() const { } void ItemLocation::SetVisible(const bool visibleInImGui_) { visibleInImGui = visibleInImGui_; - } bool ItemLocation::IsWothCandidate() const { @@ -228,5 +230,14 @@ void ItemLocation::ResetVariables() { areas = {}; status = RCSHOW_UNCHECKED; isSkipped = false; + isAvailable = false; } -} \ No newline at end of file + +bool ItemLocation::IsAvailable() const { + return isAvailable; +} + +void ItemLocation::SetAvailable(bool isAvailable_) { + isAvailable = isAvailable_; +} +} // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/item_location.h b/soh/soh/Enhancements/randomizer/item_location.h index 142ac1c0b5..a04f5c2cf9 100644 --- a/soh/soh/Enhancements/randomizer/item_location.h +++ b/soh/soh/Enhancements/randomizer/item_location.h @@ -21,11 +21,11 @@ class ItemLocation { RandomizerGet& RefPlacedItem(); void SetDelayedItem(RandomizerGet item); RandomizerRegion GetParentRegionKey() const; - void SetParentRegion (RandomizerRegion region); + void SetParentRegion(RandomizerRegion region); std::set GetAreas() const; RandomizerArea GetFirstArea() const; RandomizerArea GetRandomArea() const; - void MergeAreas (std::set newAreas); + void MergeAreas(std::set newAreas); void PlaceVanillaItem(); void ApplyPlacedItemEffect() const; void SaveDelayedItem(); @@ -56,6 +56,8 @@ class ItemLocation { bool IsFoolishCandidate() const; void SetBarrenCandidate(); void ResetVariables(); + bool IsAvailable() const; + void SetAvailable(bool isAvailable_); private: RandomizerCheck rc; @@ -76,5 +78,6 @@ class ItemLocation { bool barrenCandidate = false; RandomizerCheckStatus status = RCSHOW_UNCHECKED; bool isSkipped = false; + bool isAvailable = false; }; } // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/item_override.cpp b/soh/soh/Enhancements/randomizer/item_override.cpp index 58789c579a..cc25c8836a 100644 --- a/soh/soh/Enhancements/randomizer/item_override.cpp +++ b/soh/soh/Enhancements/randomizer/item_override.cpp @@ -3,9 +3,11 @@ #include namespace Rando { -ItemOverride::ItemOverride() : mLocation(RC_UNKNOWN_CHECK), mLooksLike(RG_NONE) {} +ItemOverride::ItemOverride() : mLocation(RC_UNKNOWN_CHECK), mLooksLike(RG_NONE) { +} ItemOverride::ItemOverride(const RandomizerCheck location, const RandomizerGet looksLike) - : mLocation(location), mLooksLike(looksLike) {} + : mLocation(location), mLooksLike(looksLike) { +} RandomizerCheck ItemOverride::GetLocation() const { return mLocation; diff --git a/soh/soh/Enhancements/randomizer/item_override.h b/soh/soh/Enhancements/randomizer/item_override.h index 98a1f3d42b..355d1e51e1 100644 --- a/soh/soh/Enhancements/randomizer/item_override.h +++ b/soh/soh/Enhancements/randomizer/item_override.h @@ -14,7 +14,8 @@ class ItemOverride { RandomizerGet LooksLike() const; RandomizerGet& RefLooksLike(); Text& GetTrickName(); - void SetTrickName (Text trickName); + void SetTrickName(Text trickName); + private: RandomizerCheck mLocation; RandomizerGet mLooksLike; diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index f5c78884ba..f474397aa4 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -252,144 +252,339 @@ RandomizerCheckArea GetAreaFromScene(uint8_t scene) { } } - -Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, uint16_t vanillaPrice_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, - isVanillaCompletion_, collectionCheck, vanillaPrice_ }; -} - -Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, uint16_t vanillaPrice_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck, vanillaPrice_ }; -} - -Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, +Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, uint16_t vanillaPrice_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck , vanillaPrice_ }; + return { rc, + quest_, + checkType_, + GetAreaFromScene(scene_), + actorId_, + scene_, + actorParams_, + std::move(shortName_), + std::move(spoilerName_), + hintKey, + vanillaItem, + isVanillaCompletion_, + collectionCheck, + vanillaPrice_ }; } -Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, uint16_t vanillaPrice_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck, vanillaPrice_ }; +Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, std::string&& spoilerName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, + uint16_t vanillaPrice_) { + return { rc, + quest_, + checkType_, + area_, + actorId_, + scene_, + actorParams_, + std::move(shortName_), + std::move(spoilerName_), + hintKey, + vanillaItem, + isVanillaCompletion_, + collectionCheck, + vanillaPrice_ }; } -Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, - SpoilerCollectionCheck(SPOILER_CHK_CHEST, scene_, flag_) }; +Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, + uint16_t vanillaPrice_) { + return { rc, quest_, checkType_, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck, + vanillaPrice_ }; } -Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, +Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, + bool isVanillaCompletion_, uint16_t vanillaPrice_) { + return { rc, quest_, checkType_, area_, + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck, + vanillaPrice_ }; +} + +Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, + std::string&& shortName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, bool isVanillaCompletion_) { + return { rc, quest_, checkType_, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, SpoilerCollectionCheck(SPOILER_CHK_CHEST, scene_, flag_) }; +} + +Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, - SpoilerCollectionCheck(SPOILER_CHK_CHEST, scene_, flag_) }; + return { rc, quest_, checkType_, area_, + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, SpoilerCollectionCheck(SPOILER_CHK_CHEST, scene_, flag_) }; } -Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, - bool isVanillaCompletion_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; -} - -Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, +Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; + return { rc, quest_, checkType_, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; } -Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, - SpoilerCollectionCheck(SPOILER_CHK_COLLECTABLE, scene_, flag_) }; +Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_) { + return { rc, quest_, checkType_, area_, + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; } -Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, +Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, + RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, - SpoilerCollectionCheck(SPOILER_CHK_COLLECTABLE, scene_, flag_) }; + return { + rc, quest_, checkType_, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, SpoilerCollectionCheck(SPOILER_CHK_COLLECTABLE, scene_, flag_) + }; } -Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, - bool isVanillaCompletion_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; +Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, + RandomizerCheckType checkType_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, + std::string&& shortName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, bool isVanillaCompletion_) { + return { + rc, quest_, checkType_, area_, + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, SpoilerCollectionCheck(SPOILER_CHK_COLLECTABLE, scene_, flag_) + }; } -Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, +Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, + RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; + return { rc, quest_, checkType_, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; } -Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, +Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, + RandomizerCheckType checkType_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, + bool isVanillaCompletion_) { + return { rc, quest_, checkType_, area_, + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; +} + +Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, + int32_t actorParams_, uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey) { - return { rc, quest_, RCTYPE_SKULL_TOKEN, GetAreaFromScene(scene_), ACTOR_EN_SI, scene_, actorParams_, std::move(shortName_), hintKey, RG_GOLD_SKULLTULA_TOKEN, true, - SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, scene_, flag_) }; + return { rc, + quest_, + RCTYPE_SKULL_TOKEN, + GetAreaFromScene(scene_), + ACTOR_EN_SI, + scene_, + actorParams_, + std::move(shortName_), + hintKey, + RG_GOLD_SKULLTULA_TOKEN, + true, + SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, scene_, flag_) }; } -Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, +Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, + int32_t actorParams_, uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const uint8_t skullScene_) { - return { rc, quest_, RCTYPE_SKULL_TOKEN, GetAreaFromScene(scene_), ACTOR_EN_SI, scene_, actorParams_, std::move(shortName_), hintKey, RG_GOLD_SKULLTULA_TOKEN, true, - SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, skullScene_, flag_) }; + return { rc, + quest_, + RCTYPE_SKULL_TOKEN, + GetAreaFromScene(scene_), + ACTOR_EN_SI, + scene_, + actorParams_, + std::move(shortName_), + hintKey, + RG_GOLD_SKULLTULA_TOKEN, + true, + SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, skullScene_, flag_) }; } -Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, uint8_t flag_, - std::string&& shortName_, const RandomizerHintTextKey hintKey, const uint8_t skullScene_) { - return { rc, quest_, RCTYPE_SKULL_TOKEN, area_, ACTOR_EN_SI, scene_, actorParams_, std::move(shortName_), hintKey, RG_GOLD_SKULLTULA_TOKEN, true, - SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, skullScene_, flag_) }; +Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const uint8_t skullScene_) { + return { rc, + quest_, + RCTYPE_SKULL_TOKEN, + area_, + ACTOR_EN_SI, + scene_, + actorParams_, + std::move(shortName_), + hintKey, + RG_GOLD_SKULLTULA_TOKEN, + true, + SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, skullScene_, flag_) }; } -Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, +Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_) { - return { rc, quest_, RCTYPE_STATIC_HINT, area_, actorId_, scene_, 0x00, std::move(shortName_), std::move(spoilerName_), RHT_NONE, RG_NONE, false }; + return { rc, + quest_, + RCTYPE_STATIC_HINT, + area_, + actorId_, + scene_, + 0x00, + std::move(shortName_), + std::move(spoilerName_), + RHT_NONE, + RG_NONE, + false }; } -Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, std::string&& shortName_) { - return { rc, quest_, RCTYPE_STATIC_HINT, GetAreaFromScene(scene_), actorId_, scene_, 0x00, std::move(shortName_), RHT_NONE, RG_NONE, false }; +Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, + SceneID scene_, std::string&& shortName_) { + return { rc, + quest_, + RCTYPE_STATIC_HINT, + GetAreaFromScene(scene_), + actorId_, + scene_, + 0x00, + std::move(shortName_), + RHT_NONE, + RG_NONE, + false }; } -Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_) { - return { rc, quest_, RCTYPE_STATIC_HINT, area_, actorId_, scene_, 0x00, std::move(shortName_), RHT_NONE, RG_NONE, false }; +Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, std::string&& shortName_) { + return { rc, quest_, RCTYPE_STATIC_HINT, area_, actorId_, scene_, 0x00, std::move(shortName_), RHT_NONE, + RG_NONE, false }; } -Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, std::string&& shortName_) { - return { rc, quest_, RCTYPE_GOSSIP_STONE, GetAreaFromScene(scene_), ACTOR_EN_GS, scene_, actorParams_, std::move(shortName_), RHT_NONE, RG_NONE, false }; +Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_) { + return { rc, + quest_, + RCTYPE_GOSSIP_STONE, + GetAreaFromScene(scene_), + ACTOR_EN_GS, + scene_, + actorParams_, + std::move(shortName_), + RHT_NONE, + RG_NONE, + false }; } -Rando::Location Rando::Location::Fish(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, int32_t actorParams_, RandomizerInf flag_, - std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem) { - return {rc, quest_, RCTYPE_FISH, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, - SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, scene_, flag_)}; +Rando::Location Rando::Location::Fish(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem) { + return { rc, quest_, RCTYPE_FISH, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, false, SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, scene_, flag_) }; } -Rando::Location Rando::Location::GrottoFish(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, int32_t actorParams_, RandomizerInf flag_, - std::string&& shortName_, RandomizerHintTextKey hintKey) { - return {rc, quest_, RCTYPE_FISH, area_, ACTOR_EN_FISH, SCENE_GROTTOS, actorParams_, std::move(shortName_), hintKey, RG_FISH, false, - SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, SCENE_GROTTOS, flag_)}; +Rando::Location Rando::Location::GrottoFish(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, + RandomizerHintTextKey hintKey) { + return { rc, + quest_, + RCTYPE_FISH, + area_, + ACTOR_EN_FISH, + SCENE_GROTTOS, + actorParams_, + std::move(shortName_), + hintKey, + RG_FISH, + false, + SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, SCENE_GROTTOS, flag_) }; } Rando::Location Rando::Location::Pot(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, - std::string&& spoilerName_, RandomizerHintTextKey hintKey, - RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { - return {rc, quest_, RCTYPE_POT, area_, ACTOR_OBJ_TSUBO, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, false, - collectionCheck }; + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { + rc, quest_, RCTYPE_POT, area_, ACTOR_OBJ_TSUBO, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, false, collectionCheck + }; } -Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_) { - return { rc, quest_, RCTYPE_GOSSIP_STONE, area_, ACTOR_EN_GS, scene_, actorParams_, std::move(shortName_), RHT_NONE, RG_NONE, false }; +Rando::Location Rando::Location::Crate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_CRATE, area_, ACTOR_OBJ_KIBAKO2, + scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, + false, collectionCheck }; } -Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, - RandomizerCheckArea area_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, - RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) { - return {rc, quest_, RCTYPE_FAIRY, area_, ACTOR_EN_ELF, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, RG_NONE, false, collectionCheck}; +Rando::Location Rando::Location::NLCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_NLCRATE, area_, ACTOR_OBJ_KIBAKO2, + scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, + false, collectionCheck }; +} + +Rando::Location Rando::Location::SmallCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_SMALL_CRATE, area_, ACTOR_OBJ_KIBAKO, + scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, + false, collectionCheck }; +} + +Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_) { + return { rc, quest_, RCTYPE_GOSSIP_STONE, area_, ACTOR_EN_GS, + scene_, actorParams_, std::move(shortName_), RHT_NONE, RG_NONE, + false }; +} + +Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_FAIRY, area_, ACTOR_EN_ELF, scene_, actorParams_, std::move(shortName_), + hintKey, RG_NONE, false, collectionCheck }; +} + +Rando::Location Rando::Location::Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_GRASS, area_, ACTOR_EN_KUSA, + scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, + false, collectionCheck }; } diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index bd96c3ae13..f994996524 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -20,7 +20,9 @@ class SpoilerCollectionCheck { uint16_t flag = 0; SpoilerCollectionCheck() = default; - SpoilerCollectionCheck(const SpoilerCollectionCheckType type_, const uint8_t scene_, const uint16_t flag_) : type(type_), scene(scene_), flag(flag_) {} + SpoilerCollectionCheck(const SpoilerCollectionCheckType type_, const uint8_t scene_, const uint16_t flag_) + : type(type_), scene(scene_), flag(flag_) { + } static auto ItemGetInf(const uint8_t slot) { return SpoilerCollectionCheck(SPOILER_CHK_ITEM_GET_INF, 0x00, slot); @@ -49,46 +51,52 @@ class SpoilerCollectionCheck { class Location { public: - //RANDOTODO fix wacky ordering - Location() : rc(RC_UNKNOWN_CHECK), quest(RCQUEST_BOTH), checkType(RCTYPE_STANDARD), area(RCAREA_INVALID), actorId(ACTOR_ID_MAX), scene(SCENE_ID_MAX), actorParams(0), - hintKey(RHT_NONE), vanillaItem(RG_NONE), isVanillaCompletion(false), collectionCheck(SpoilerCollectionCheck()) {} + // RANDOTODO fix wacky ordering + Location() + : rc(RC_UNKNOWN_CHECK), quest(RCQUEST_BOTH), checkType(RCTYPE_STANDARD), area(RCAREA_INVALID), + actorId(ACTOR_ID_MAX), scene(SCENE_ID_MAX), actorParams(0), hintKey(RHT_NONE), vanillaItem(RG_NONE), + isVanillaCompletion(false), collectionCheck(SpoilerCollectionCheck()) { + } - Location(const RandomizerCheck rc_, const RandomizerCheckQuest quest_, const RandomizerCheckType checkType_, const RandomizerCheckArea area_, const ActorID actorId_, - const SceneID scene_, const int32_t actorParams_, std::string shortName_, std::string spoilerName_, const RandomizerHintTextKey hintKey_, - const RandomizerGet vanillaItem_, const bool isVanillaCompletion_ = false, const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), - const int vanillaPrice_ = 0) - : rc(rc_), quest(quest_), checkType(checkType_), area(area_), actorId(actorId_), - scene(scene_), actorParams(actorParams_), shortName(std::move(shortName_)), - spoilerName(std::move(spoilerName_)), hintKey(hintKey_), vanillaItem(vanillaItem_), - isVanillaCompletion(isVanillaCompletion_), collectionCheck(collectionCheck_), vanillaPrice(vanillaPrice_) { - if (spoilerName.length() < 23) { - excludedOption = LocationOption(rc, spoilerName); - } else { - const size_t lastSpace = spoilerName.rfind(' ', 23); - std::string settingText = spoilerName; - settingText.replace(lastSpace, 1, "\n "); - - excludedOption = LocationOption(rc, spoilerName); - } - } - - Location(const RandomizerCheck rc_, const RandomizerCheckQuest quest_, const RandomizerCheckType checkType_, const RandomizerCheckArea area_, const ActorID actorId_, - const SceneID scene_, const int32_t actorParams_, std::string shortName_, const RandomizerHintTextKey hintKey_, const RandomizerGet vanillaItem_, - const bool isVanillaCompletion_ = false, const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), - const int vanillaPrice_ = 0) - : rc(rc_), quest(quest_), checkType(checkType_), area(area_), actorId(actorId_), scene(scene_), actorParams(actorParams_), shortName(shortName_), - spoilerName(SpoilerNameFromShortName(shortName_, area_)), hintKey(hintKey_), vanillaItem(vanillaItem_), isVanillaCompletion(isVanillaCompletion_), + Location(const RandomizerCheck rc_, const RandomizerCheckQuest quest_, const RandomizerCheckType checkType_, + const RandomizerCheckArea area_, const ActorID actorId_, const SceneID scene_, const int32_t actorParams_, + std::string shortName_, std::string spoilerName_, const RandomizerHintTextKey hintKey_, + const RandomizerGet vanillaItem_, const bool isVanillaCompletion_ = false, + const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), const int vanillaPrice_ = 0) + : rc(rc_), quest(quest_), checkType(checkType_), area(area_), actorId(actorId_), scene(scene_), + actorParams(actorParams_), shortName(std::move(shortName_)), spoilerName(std::move(spoilerName_)), + hintKey(hintKey_), vanillaItem(vanillaItem_), isVanillaCompletion(isVanillaCompletion_), collectionCheck(collectionCheck_), vanillaPrice(vanillaPrice_) { - if (spoilerName.length() < 23) { - excludedOption = LocationOption(rc, spoilerName); - } else { - const size_t lastSpace = spoilerName.rfind(' ', 23); - std::string settingText = spoilerName; - settingText.replace(lastSpace, 1, "\n "); + if (spoilerName.length() < 23) { + excludedOption = LocationOption(rc, spoilerName); + } else { + const size_t lastSpace = spoilerName.rfind(' ', 23); + std::string settingText = spoilerName; + settingText.replace(lastSpace, 1, "\n "); - excludedOption = LocationOption(rc, spoilerName); - } + excludedOption = LocationOption(rc, spoilerName); } + } + + Location(const RandomizerCheck rc_, const RandomizerCheckQuest quest_, const RandomizerCheckType checkType_, + const RandomizerCheckArea area_, const ActorID actorId_, const SceneID scene_, const int32_t actorParams_, + std::string shortName_, const RandomizerHintTextKey hintKey_, const RandomizerGet vanillaItem_, + const bool isVanillaCompletion_ = false, + const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), const int vanillaPrice_ = 0) + : rc(rc_), quest(quest_), checkType(checkType_), area(area_), actorId(actorId_), scene(scene_), + actorParams(actorParams_), shortName(shortName_), spoilerName(SpoilerNameFromShortName(shortName_, area_)), + hintKey(hintKey_), vanillaItem(vanillaItem_), isVanillaCompletion(isVanillaCompletion_), + collectionCheck(collectionCheck_), vanillaPrice(vanillaPrice_) { + if (spoilerName.length() < 23) { + excludedOption = LocationOption(rc, spoilerName); + } else { + const size_t lastSpace = spoilerName.rfind(' ', 23); + std::string settingText = spoilerName; + settingText.replace(lastSpace, 1, "\n "); + + excludedOption = LocationOption(rc, spoilerName); + } + } static std::string SpoilerNameFromShortName(std::string shortName, RandomizerCheckArea area) { if (area < 0 || area >= RCAREA_INVALID) { @@ -119,98 +127,143 @@ class Location { int16_t GetVanillaPrice() const; Option* GetExcludedOption(); - static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, - std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), - bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); - - static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); - static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); + static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); - static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); + static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); - static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); + static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); - static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, + static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); + + static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_ = false); + + static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, + std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); - static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, - std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); + static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_ = false); - static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, - bool isVanillaCompletion_ = false); - - static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, - std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); - - static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, + std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); - static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); + + static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), bool isVanillaCompletion_ = false); - static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, - SceneID scene_, int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), bool isVanillaCompletion_ = false); + static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + bool isVanillaCompletion_ = false); - static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, - RandomizerHintTextKey hintKey); + static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, + uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey); /// @brief For certain scenes, the sceneId and the "Scene" in spoiler collection check later used to check the - /// GS flags don't necessarily match. Use this constructor (or the next one) for those. scene_ should be the actual scene where - /// the GS is located, skullScene_ is the value passed to GET_GS_FLAGS to get the correct skulltula. It is normal - /// and expected that these don't always match, and the naming is a holdover from 3drando. - /// @param rc - /// @param quest_ - /// @param scene_ - /// @param actorParams_ - /// @param flag_ - /// @param shortName_ - /// @param hintKey - /// @param skullScene_ + /// GS flags don't necessarily match. Use this constructor (or the next one) for those. scene_ should be the actual + /// scene where the GS is located, skullScene_ is the value passed to GET_GS_FLAGS to get the correct skulltula. It + /// is normal and expected that these don't always match, and the naming is a holdover from 3drando. + /// @param rc + /// @param quest_ + /// @param scene_ + /// @param actorParams_ + /// @param flag_ + /// @param shortName_ + /// @param hintKey + /// @param skullScene_ /// @return - static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, + uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, + uint8_t skullScene_); + + static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, uint8_t skullScene_); - static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, uint8_t flag_, - std::string&& shortName_, RandomizerHintTextKey hintKey, uint8_t skullScene_); + static Location Fish(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem); - static Location Fish(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - RandomizerInf flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem); - - static Location GrottoFish(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, int32_t actorParams_, - RandomizerInf flag_, std::string&& shortName_, RandomizerHintTextKey hintKey); + static Location GrottoFish(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, + RandomizerHintTextKey hintKey); static Location Pot(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, - RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck); + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); - static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, - std::string&& spoilerName_); + static Location Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); - static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, std::string&& shortName_); + static Location Crate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); - static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_); + static Location NLCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); - static Location Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck); + static Location SmallCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); - static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, std::string&& shortName_); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_); - static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, + std::string&& shortName_); + + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, std::string&& shortName_); + + static Location Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + SpoilerCollectionCheck collectionCheck); + + static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_); + + static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_); private: RandomizerCheck rc; diff --git a/soh/soh/Enhancements/randomizer/location_access.cpp b/soh/soh/Enhancements/randomizer/location_access.cpp index a45e27cd03..2fb04dccdb 100644 --- a/soh/soh/Enhancements/randomizer/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/location_access.cpp @@ -10,15 +10,21 @@ #include "soh/Enhancements/debugger/performanceTimer.h" #include +#include -//generic grotto event list +#include "3drando/shops.hpp" +extern "C" { +extern PlayState* gPlayState; +} + +// generic grotto event list std::vector grottoEvents; -//set the logic to be a specific age and time of day and see if the condition still holds +// set the logic to be a specific age and time of day and see if the condition still holds bool LocationAccess::CheckConditionAtAgeTime(bool& age, bool& time) const { logic->IsChild = false; logic->IsAdult = false; - logic->AtDay = false; + logic->AtDay = false; logic->AtNight = false; time = true; @@ -27,31 +33,84 @@ bool LocationAccess::CheckConditionAtAgeTime(bool& age, bool& time) const { return GetConditionsMet(); } -bool LocationAccess::ConditionsMet(Region* parentRegion) const { - //WARNING enterance validation can run this after resetting the access for sphere 0 validation - //When refactoring ToD access, either fix the above or do not assume that we - //have any access at all just because this is being run +bool LocationAccess::ConditionsMet(Region* parentRegion, bool calculatingAvailableChecks) const { + // WARNING enterance validation can run this after resetting the access for sphere 0 validation + // When refactoring ToD access, either fix the above or do not assume that we + // have any access at all just because this is being run bool conditionsMet = false; - if ( - (parentRegion->childDay && CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) || + if ((parentRegion->childDay && CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) || (parentRegion->childNight && CheckConditionAtAgeTime(logic->IsChild, logic->AtNight)) || - (parentRegion->adultDay && CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) || - (parentRegion->adultNight && CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight)) - ) { + (parentRegion->adultDay && CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) || + (parentRegion->adultNight && CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight))) { conditionsMet = true; } - return conditionsMet && CanBuy(); + return conditionsMet && CanBuy(calculatingAvailableChecks); } -bool LocationAccess::CanBuy() const { - return CanBuyAnother(location); +static uint16_t GetMinimumPrice(const Rando::Location* loc) { + extern PriceSettingsStruct shopsanityPrices; + extern PriceSettingsStruct scrubPrices; + extern PriceSettingsStruct merchantPrices; + PriceSettingsStruct priceSettings = loc->GetRCType() == RCTYPE_SHOP ? shopsanityPrices + : loc->GetRCType() == RCTYPE_SCRUB ? scrubPrices + : merchantPrices; + + auto ctx = Rando::Context::GetInstance(); + switch (ctx->GetOption(priceSettings.main).Get()) { + case RO_PRICE_VANILLA: + return loc->GetVanillaPrice(); + case RO_PRICE_CHEAP_BALANCED: + return 0; + case RO_PRICE_BALANCED: + return 0; + case RO_PRICE_FIXED: + return ctx->GetOption(priceSettings.fixedPrice).Get() * 5; + case RO_PRICE_RANGE: { + uint16_t range1 = ctx->GetOption(priceSettings.range1).Get() * 5; + uint16_t range2 = ctx->GetOption(priceSettings.range1).Get() * 5; + return range1 < range2 ? range1 : range2; + } + case RO_PRICE_SET_BY_WALLET: { + if (ctx->GetOption(priceSettings.noWallet).Get()) { + return 0; + } else if (ctx->GetOption(priceSettings.childWallet).Get()) { + return 1; + } else if (ctx->GetOption(priceSettings.adultWallet).Get()) { + return 100; + } else if (ctx->GetOption(priceSettings.giantWallet).Get()) { + return 201; + } else { + return 501; + } + } + default: + return 0; + } +} + +bool LocationAccess::CanBuy(bool calculatingAvailableChecks) const { + const auto& loc = Rando::StaticData::GetLocation(location); + const auto& itemLoc = OTRGlobals::Instance->gRandoContext->GetItemLocation(location); + + if (loc->GetRCType() == RCTYPE_SHOP || loc->GetRCType() == RCTYPE_SCRUB || loc->GetRCType() == RCTYPE_MERCHANT) { + // Checks should only be identified while playing + if (calculatingAvailableChecks && itemLoc->GetCheckStatus() != RCSHOW_IDENTIFIED) { + return CanBuyAnother(GetMinimumPrice(loc)); + } else { + return CanBuyAnother(itemLoc->GetPrice()); + } + } + + return true; } bool CanBuyAnother(RandomizerCheck rc) { - uint16_t price = ctx->GetItemLocation(rc)->GetPrice(); + return CanBuyAnother(ctx->GetItemLocation(rc)->GetPrice()); +} +bool CanBuyAnother(uint16_t price) { if (price > 500) { return logic->HasItem(RG_TYCOON_WALLET); } else if (price > 200) { @@ -64,27 +123,310 @@ bool CanBuyAnother(RandomizerCheck rc) { return true; } +std::set CalculateAreas(SceneID scene) { + switch (scene) { + case SCENE_DEKU_TREE: + return { RA_DEKU_TREE }; + case SCENE_DODONGOS_CAVERN: + return { RA_DODONGOS_CAVERN }; + case SCENE_JABU_JABU: + return { RA_JABU_JABUS_BELLY }; + case SCENE_FOREST_TEMPLE: + return { RA_FOREST_TEMPLE }; + case SCENE_FIRE_TEMPLE: + return { RA_FIRE_TEMPLE }; + case SCENE_WATER_TEMPLE: + return { RA_WATER_TEMPLE }; + case SCENE_SPIRIT_TEMPLE: + return { RA_SPIRIT_TEMPLE }; + case SCENE_SHADOW_TEMPLE: + return { RA_SHADOW_TEMPLE }; + case SCENE_BOTTOM_OF_THE_WELL: + return { RA_BOTTOM_OF_THE_WELL }; + case SCENE_ICE_CAVERN: + return { RA_ICE_CAVERN }; + case SCENE_INSIDE_GANONS_CASTLE: + return { RA_GANONS_CASTLE }; + case SCENE_GERUDO_TRAINING_GROUND: + return { RA_GERUDO_TRAINING_GROUND }; + case SCENE_THIEVES_HIDEOUT: + case SCENE_GERUDOS_FORTRESS: + return { RA_GERUDO_FORTRESS }; + case SCENE_MARKET_ENTRANCE_DAY: + case SCENE_MARKET_ENTRANCE_NIGHT: + case SCENE_MARKET_ENTRANCE_RUINS: + case SCENE_BACK_ALLEY_DAY: + case SCENE_BACK_ALLEY_NIGHT: + case SCENE_MARKET_DAY: + case SCENE_MARKET_NIGHT: + case SCENE_MARKET_RUINS: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS: + return { RA_THE_MARKET }; + case SCENE_TEMPLE_OF_TIME: + return { RA_TEMPLE_OF_TIME }; + case SCENE_HYRULE_FIELD: + return { RA_HYRULE_FIELD }; + case SCENE_KAKARIKO_VILLAGE: + return { RA_KAKARIKO_VILLAGE }; + case SCENE_GRAVEYARD: + return { RA_THE_GRAVEYARD }; + case SCENE_ZORAS_RIVER: + return { RA_ZORAS_RIVER }; + case SCENE_KOKIRI_FOREST: + return { RA_KOKIRI_FOREST }; + case SCENE_SACRED_FOREST_MEADOW: + return { RA_SACRED_FOREST_MEADOW }; + case SCENE_LAKE_HYLIA: + return { RA_LAKE_HYLIA }; + case SCENE_ZORAS_DOMAIN: + return { RA_ZORAS_DOMAIN }; + case SCENE_ZORAS_FOUNTAIN: + return { RA_ZORAS_FOUNTAIN }; + case SCENE_GERUDO_VALLEY: + return { RA_GERUDO_VALLEY }; + case SCENE_LOST_WOODS: + return { RA_THE_LOST_WOODS }; + case SCENE_DESERT_COLOSSUS: + return { RA_DESERT_COLOSSUS }; + case SCENE_HAUNTED_WASTELAND: + return { RA_HAUNTED_WASTELAND }; + case SCENE_HYRULE_CASTLE: + return { RA_HYRULE_CASTLE }; + case SCENE_DEATH_MOUNTAIN_TRAIL: + return { RA_DEATH_MOUNTAIN_TRAIL }; + case SCENE_DEATH_MOUNTAIN_CRATER: + return { RA_DEATH_MOUNTAIN_CRATER }; + case SCENE_GORON_CITY: + return { RA_GORON_CITY }; + case SCENE_LON_LON_RANCH: + return { RA_LON_LON_RANCH }; + case SCENE_OUTSIDE_GANONS_CASTLE: + return { RA_OUTSIDE_GANONS_CASTLE }; + case SCENE_TREASURE_BOX_SHOP: + case SCENE_DEKU_TREE_BOSS: + case SCENE_DODONGOS_CAVERN_BOSS: + case SCENE_JABU_JABU_BOSS: + case SCENE_FOREST_TEMPLE_BOSS: + case SCENE_FIRE_TEMPLE_BOSS: + case SCENE_WATER_TEMPLE_BOSS: + case SCENE_SPIRIT_TEMPLE_BOSS: + case SCENE_SHADOW_TEMPLE_BOSS: + case SCENE_GANONS_TOWER: + case SCENE_GANONDORF_BOSS: + case SCENE_KNOW_IT_ALL_BROS_HOUSE: + case SCENE_TWINS_HOUSE: + case SCENE_MIDOS_HOUSE: + case SCENE_SARIAS_HOUSE: + case SCENE_KAKARIKO_CENTER_GUEST_HOUSE: + case SCENE_BACK_ALLEY_HOUSE: + case SCENE_BAZAAR: + case SCENE_KOKIRI_SHOP: + case SCENE_GORON_SHOP: + case SCENE_ZORA_SHOP: + case SCENE_POTION_SHOP_KAKARIKO: + case SCENE_POTION_SHOP_MARKET: + case SCENE_BOMBCHU_SHOP: + case SCENE_HAPPY_MASK_SHOP: + case SCENE_LINKS_HOUSE: + case SCENE_DOG_LADY_HOUSE: + case SCENE_STABLE: + case SCENE_IMPAS_HOUSE: + case SCENE_LAKESIDE_LABORATORY: + case SCENE_CARPENTERS_TENT: + case SCENE_GRAVEKEEPERS_HUT: + case SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC: + case SCENE_FAIRYS_FOUNTAIN: + case SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS: + case SCENE_GROTTOS: + case SCENE_REDEAD_GRAVE: + case SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN: + case SCENE_ROYAL_FAMILYS_TOMB: + case SCENE_SHOOTING_GALLERY: + case SCENE_CASTLE_COURTYARD_GUARDS_DAY: + case SCENE_CASTLE_COURTYARD_GUARDS_NIGHT: + case SCENE_WINDMILL_AND_DAMPES_GRAVE: + case SCENE_FISHING_POND: + case SCENE_CASTLE_COURTYARD_ZELDA: + case SCENE_BOMBCHU_BOWLING_ALLEY: + case SCENE_LON_LON_BUILDINGS: + case SCENE_MARKET_GUARD_HOUSE: + case SCENE_POTION_SHOP_GRANNY: + case SCENE_HOUSE_OF_SKULLTULA: + case SCENE_GANONS_TOWER_COLLAPSE_INTERIOR: + case SCENE_INSIDE_GANONS_CASTLE_COLLAPSE: + case SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR: + case SCENE_GANON_BOSS: + case SCENE_ID_MAX: + return {}; + case SCENE_CHAMBER_OF_THE_SAGES: + case SCENE_CUTSCENE_MAP: + case SCENE_TEST01: + case SCENE_BESITU: + case SCENE_DEPTH_TEST: + case SCENE_SYOTES: + case SCENE_SYOTES2: + case SCENE_SUTARU: + case SCENE_HAIRAL_NIWA2: + case SCENE_SASATEST: + case SCENE_TESTROOM: + default: + assert(false); + return {}; + } +} + +bool GetTimePassFromScene(SceneID scene) { + switch (scene) { + case SCENE_DEKU_TREE: + case SCENE_DODONGOS_CAVERN: + case SCENE_JABU_JABU: + case SCENE_FOREST_TEMPLE: + case SCENE_FIRE_TEMPLE: + case SCENE_WATER_TEMPLE: + case SCENE_SPIRIT_TEMPLE: + case SCENE_SHADOW_TEMPLE: + case SCENE_BOTTOM_OF_THE_WELL: + case SCENE_ICE_CAVERN: + case SCENE_GANONS_TOWER: + case SCENE_GERUDO_TRAINING_GROUND: + case SCENE_THIEVES_HIDEOUT: + case SCENE_INSIDE_GANONS_CASTLE: + case SCENE_GANONS_TOWER_COLLAPSE_INTERIOR: + case SCENE_INSIDE_GANONS_CASTLE_COLLAPSE: + case SCENE_TREASURE_BOX_SHOP: + case SCENE_DEKU_TREE_BOSS: + case SCENE_DODONGOS_CAVERN_BOSS: + case SCENE_JABU_JABU_BOSS: + case SCENE_FOREST_TEMPLE_BOSS: + case SCENE_FIRE_TEMPLE_BOSS: + case SCENE_WATER_TEMPLE_BOSS: + case SCENE_SPIRIT_TEMPLE_BOSS: + case SCENE_SHADOW_TEMPLE_BOSS: + case SCENE_GANONDORF_BOSS: + case SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR: + case SCENE_MARKET_ENTRANCE_DAY: + case SCENE_MARKET_ENTRANCE_NIGHT: + case SCENE_MARKET_ENTRANCE_RUINS: + case SCENE_BACK_ALLEY_DAY: + case SCENE_BACK_ALLEY_NIGHT: + case SCENE_MARKET_DAY: + case SCENE_MARKET_NIGHT: + case SCENE_MARKET_RUINS: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS: + case SCENE_KNOW_IT_ALL_BROS_HOUSE: + case SCENE_TWINS_HOUSE: + case SCENE_MIDOS_HOUSE: + case SCENE_SARIAS_HOUSE: + case SCENE_KAKARIKO_CENTER_GUEST_HOUSE: + case SCENE_BACK_ALLEY_HOUSE: + case SCENE_BAZAAR: + case SCENE_KOKIRI_SHOP: + case SCENE_GORON_SHOP: + case SCENE_ZORA_SHOP: + case SCENE_POTION_SHOP_KAKARIKO: + case SCENE_POTION_SHOP_MARKET: + case SCENE_BOMBCHU_SHOP: + case SCENE_HAPPY_MASK_SHOP: + case SCENE_LINKS_HOUSE: + case SCENE_DOG_LADY_HOUSE: + case SCENE_STABLE: + case SCENE_IMPAS_HOUSE: + case SCENE_LAKESIDE_LABORATORY: + case SCENE_CARPENTERS_TENT: + case SCENE_GRAVEKEEPERS_HUT: + case SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC: + case SCENE_FAIRYS_FOUNTAIN: + case SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS: + case SCENE_GROTTOS: + case SCENE_REDEAD_GRAVE: + case SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN: + case SCENE_ROYAL_FAMILYS_TOMB: + case SCENE_SHOOTING_GALLERY: + case SCENE_TEMPLE_OF_TIME: + case SCENE_CHAMBER_OF_THE_SAGES: + case SCENE_CASTLE_COURTYARD_GUARDS_DAY: + case SCENE_CASTLE_COURTYARD_GUARDS_NIGHT: + case SCENE_CUTSCENE_MAP: + case SCENE_WINDMILL_AND_DAMPES_GRAVE: + case SCENE_CASTLE_COURTYARD_ZELDA: + case SCENE_BOMBCHU_BOWLING_ALLEY: + case SCENE_LON_LON_BUILDINGS: + case SCENE_MARKET_GUARD_HOUSE: + case SCENE_POTION_SHOP_GRANNY: + case SCENE_GANON_BOSS: + case SCENE_HOUSE_OF_SKULLTULA: + case SCENE_KOKIRI_FOREST: + case SCENE_SACRED_FOREST_MEADOW: + case SCENE_LOST_WOODS: + case SCENE_GORON_CITY: + case SCENE_OUTSIDE_GANONS_CASTLE: + case SCENE_GRAVEYARD: + case SCENE_ZORAS_DOMAIN: + case SCENE_ZORAS_FOUNTAIN: + case SCENE_GERUDOS_FORTRESS: + case SCENE_HAUNTED_WASTELAND: + case SCENE_DEATH_MOUNTAIN_CRATER: + case SCENE_ID_MAX: + return false; + + // Time does pass in the fishing pond but it's + // extremely slow (more than 2 IRL seconds per in-game minute) + // maybe in the future there could be a trick to count it + case SCENE_FISHING_POND: + return false; + + case SCENE_HYRULE_FIELD: + case SCENE_KAKARIKO_VILLAGE: + case SCENE_ZORAS_RIVER: + case SCENE_LAKE_HYLIA: + case SCENE_GERUDO_VALLEY: + case SCENE_DESERT_COLOSSUS: + case SCENE_HYRULE_CASTLE: + case SCENE_DEATH_MOUNTAIN_TRAIL: + case SCENE_LON_LON_RANCH: + return true; + + case SCENE_TEST01: + case SCENE_BESITU: + case SCENE_DEPTH_TEST: + case SCENE_SYOTES: + case SCENE_SYOTES2: + case SCENE_SUTARU: + case SCENE_HAIRAL_NIWA2: + case SCENE_SASATEST: + case SCENE_TESTROOM: + default: + assert(false); + return false; + } +} + Region::Region() = default; -Region::Region( - std::string regionName_, - std::string scene_, - std::set areas, - bool timePass_, - std::vector events_, - std::vector locations_, - std::list exits_ -) : regionName(std::move(regionName_)), - scene(std::move(scene_)), - areas(areas), - timePass(timePass_), - events(std::move(events_)), - locations(std::move(locations_)), - exits(std::move(exits_)) {} +Region::Region(std::string regionName_, SceneID scene_, bool timePass_, std::set areas, + std::vector events_, std::vector locations_, + std::list exits_) + : regionName(std::move(regionName_)), scene(scene_), timePass(timePass_), areas(areas), events(std::move(events_)), + locations(std::move(locations_)), exits(std::move(exits_)) { +} +Region::Region(std::string regionName_, SceneID scene_, std::vector events_, + std::vector locations_, std::list exits_) + : regionName(std::move(regionName_)), scene(scene_), timePass(GetTimePassFromScene(scene_)), + areas(CalculateAreas(scene_)), events(std::move(events_)), locations(std::move(locations_)), + exits(std::move(exits_)) { +} Region::~Region() = default; -void Region::ApplyTimePass(){ - if (timePass) { +bool Region::TimePass() { + return timePass; +} + +void Region::ApplyTimePass() { + if (TimePass()) { StartPerformanceTimer(PT_TOD_ACCESS); if (Child()) { childDay = true; @@ -103,20 +445,18 @@ void Region::ApplyTimePass(){ } bool Region::UpdateEvents() { - bool eventsUpdated = false; + bool eventsUpdated = false; StartPerformanceTimer(PT_EVENT_ACCESS); for (EventAccess& event : events) { - //If the event has already happened, there's no reason to check it + // If the event has already happened, there's no reason to check it if (event.GetEvent()) { continue; } - if ( - (childDay && event.CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) || - (childNight && event.CheckConditionAtAgeTime(logic->IsChild, logic->AtNight)) || - (adultDay && event.CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) || - (adultNight && event.CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight)) - ) { + if ((childDay && event.CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) || + (childNight && event.CheckConditionAtAgeTime(logic->IsChild, logic->AtNight)) || + (adultDay && event.CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) || + (adultNight && event.CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight))) { event.EventOccurred(); eventsUpdated = true; } @@ -126,14 +466,14 @@ bool Region::UpdateEvents() { } void Region::AddExit(RandomizerRegion parentKey, RandomizerRegion newExitKey, ConditionFn condition) { - Rando::Entrance newExit = Rando::Entrance(newExitKey, {condition}); + Rando::Entrance newExit = Rando::Entrance(newExitKey, { condition }); newExit.SetParentRegion(parentKey); exits.push_front(newExit); } -//The exit will be completely removed from this region +// The exit will be completely removed from this region void Region::RemoveExit(Rando::Entrance* exitToRemove) { - exits.remove_if([exitToRemove](const auto exit){return &exit == exitToRemove;}); + exits.remove_if([exitToRemove](const auto exit) { return &exit == exitToRemove; }); } void Region::SetAsPrimary(RandomizerRegion exitToBePrimary) { @@ -152,7 +492,8 @@ Rando::Entrance* Region::GetExit(RandomizerRegion exitToReturn) { } } - LUSLOG_ERROR("ERROR: EXIT \"%s\" DOES NOT EXIST IN \"%s\"", RegionTable(exitToReturn)->regionName.c_str(), this->regionName.c_str()); + LUSLOG_ERROR("ERROR: EXIT \"%s\" DOES NOT EXIST IN \"%s\"", RegionTable(exitToReturn)->regionName.c_str(), + this->regionName.c_str()); assert(false); return nullptr; } @@ -190,9 +531,9 @@ bool Region::CheckAllAccess(const RandomizerRegion exitKey) { for (Rando::Entrance& exit : exits) { if (exit.GetConnectedRegionKey() == exitKey) { - return exit.CheckConditionAtAgeTime(logic->IsChild, logic->AtDay) && + return exit.CheckConditionAtAgeTime(logic->IsChild, logic->AtDay) && exit.CheckConditionAtAgeTime(logic->IsChild, logic->AtNight) && - exit.CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay) && + exit.CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay) && exit.CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight); } } @@ -224,8 +565,74 @@ bool MQSpiritSharedBrokenWallRoom(const RandomizerRegion region, ConditionFn con return areaTable[region].MQSpiritShared(condition, true, anyAge); } +bool BeanPlanted(const RandomizerRegion region) { + // swchFlag found using the Actor Viewer to get the Obj_Bean parameters & 0x3F + // not tested with multiple OTRs, but can be automated similarly to GetDungeonSmallKeyDoors + SceneID sceneID; + uint8_t swchFlag; + switch (region) { + case RR_ZORAS_RIVER: + sceneID = SceneID::SCENE_ZORAS_RIVER; + swchFlag = 3; + break; + case RR_THE_GRAVEYARD: + sceneID = SceneID::SCENE_GRAVEYARD; + swchFlag = 3; + break; + case RR_KOKIRI_FOREST: + sceneID = SceneID::SCENE_KOKIRI_FOREST; + swchFlag = 9; + break; + case RR_THE_LOST_WOODS: + sceneID = SceneID::SCENE_LOST_WOODS; + swchFlag = 4; + break; + case RR_LW_BEYOND_MIDO: + sceneID = SceneID::SCENE_LOST_WOODS; + swchFlag = 18; + break; + case RR_DEATH_MOUNTAIN_TRAIL: + sceneID = SceneID::SCENE_DEATH_MOUNTAIN_TRAIL; + swchFlag = 6; + break; + case RR_LAKE_HYLIA: + sceneID = SceneID::SCENE_LAKE_HYLIA; + swchFlag = 1; + break; + case RR_GERUDO_VALLEY: + sceneID = SceneID::SCENE_GERUDO_VALLEY; + swchFlag = 3; + break; + case RR_DMC_CENTRAL_LOCAL: + sceneID = SceneID::SCENE_DEATH_MOUNTAIN_CRATER; + swchFlag = 3; + break; + case RR_DESERT_COLOSSUS: + sceneID = SceneID::SCENE_DESERT_COLOSSUS; + swchFlag = 24; + break; + default: + sceneID = SCENE_ID_MAX; + swchFlag = 0; + assert(false); + break; + } + + // Get the swch value for the scene + uint32_t swch; + if (gPlayState != nullptr && gPlayState->sceneNum == sceneID) { + swch = gPlayState->actorCtx.flags.swch; + } else if (sceneID != SCENE_ID_MAX) { + swch = Rando::Context::GetInstance()->GetLogic()->GetSaveContext()->sceneFlags[sceneID].swch; + } else { + swch = 0; + } + + return swch >> swchFlag & 1; +} + bool CanPlantBean(const RandomizerRegion region) { - return areaTable[region].CanPlantBeanCheck(); + return areaTable[region].CanPlantBeanCheck() || BeanPlanted(region); } bool BothAges(const RandomizerRegion region) { @@ -250,20 +657,26 @@ std::shared_ptr logic; void RegionTable_Init() { using namespace Rando; ctx = Context::GetInstance().get(); - logic = ctx->GetLogic(); //RANDOTODO do not hardcode, instead allow accepting a Logic class somehow + logic = ctx->GetLogic(); // RANDOTODO do not hardcode, instead allow accepting a Logic class somehow grottoEvents = { - EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), - EventAccess(&logic->ButterflyFairy, []{return logic->ButterflyFairy || (logic->CanUse(RG_STICKS));}), - EventAccess(&logic->BugShrub, []{return logic->CanCutShrubs();}), - EventAccess(&logic->LoneFish, []{return true;}), + EventAccess(&logic->GossipStoneFairy, [] { return logic->CallGossipFairy(); }), + EventAccess(&logic->ButterflyFairy, [] { return logic->CanUse(RG_STICKS); }), + EventAccess(&logic->BugShrub, [] { return logic->CanCutShrubs(); }), + EventAccess(&logic->LoneFish, [] { return true; }), }; - //Clear the array from any previous playthrough attempts. This is important so that - //locations which appear in both MQ and Vanilla dungeons don't get set in both areas. - areaTable.fill(Region("Invalid Region", "Invalid Region", {}, NO_DAY_NIGHT_CYCLE, {}, {}, {})); + // Clear the array from any previous playthrough attempts. This is important so that + // locations which appear in both MQ and Vanilla dungeons don't get set in both areas. + areaTable.fill(Region("Invalid Region", SCENE_ID_MAX, {}, {}, {})); - areaTable[RR_ROOT] = Region("Root", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_ROOT] = Region("Root", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, { //Events - EventAccess(&logic->KakarikoVillageGateOpen, []{return ctx->GetOption(RSK_KAK_GATE).Is(RO_KAK_GATE_OPEN);}), + EventAccess(&logic->KakarikoVillageGateOpen, []{return ctx->GetOption(RSK_KAK_GATE).Is(RO_KAK_GATE_OPEN);}), + EventAccess(&logic->THCouldFree1TorchCarpenter, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE);}), + EventAccess(&logic->THCouldFreeDoubleCellCarpenter, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST);}), + EventAccess(&logic->TH_CouldFreeDeadEndCarpenter, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST);}), + EventAccess(&logic->THCouldRescueSlopeCarpenter, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST);}), + EventAccess(&logic->THRescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE);}), }, { //Locations LOCATION(RC_LINKS_POCKET, true), @@ -274,7 +687,7 @@ void RegionTable_Init() { Entrance(RR_ROOT_EXITS, []{return true;}), }); - areaTable[RR_ROOT_EXITS] = Region("Root Exits", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ROOT_EXITS] = Region("Root Exits", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_CHILD_SPAWN, []{return logic->IsChild;}), Entrance(RR_ADULT_SPAWN, []{return logic->IsAdult;}), @@ -286,46 +699,48 @@ void RegionTable_Init() { Entrance(RR_PRELUDE_OF_LIGHT_WARP, []{return logic->CanUse(RG_PRELUDE_OF_LIGHT) && logic->CanLeaveForest();}), }); - areaTable[RR_CHILD_SPAWN] = Region("Child Spawn", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_CHILD_SPAWN] = Region("Child Spawn", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_KF_LINKS_HOUSE, []{return true;}), }); - areaTable[RR_ADULT_SPAWN] = Region("Adult Spawn", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ADULT_SPAWN] = Region("Adult Spawn", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_TEMPLE_OF_TIME, []{return true;}), }); - areaTable[RR_MINUET_OF_FOREST_WARP] = Region("Minuet of Forest Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_MINUET_OF_FOREST_WARP] = Region("Minuet of Forest Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_SACRED_FOREST_MEADOW, []{return true;}), }); - areaTable[RR_BOLERO_OF_FIRE_WARP] = Region("Bolero of Fire Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_BOLERO_OF_FIRE_WARP] = Region("Bolero of Fire Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_DMC_CENTRAL_LOCAL, []{return true;}), }); - areaTable[RR_SERENADE_OF_WATER_WARP] = Region("Serenade of Water Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SERENADE_OF_WATER_WARP] = Region("Serenade of Water Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_LAKE_HYLIA, []{return true;}), }); - areaTable[RR_REQUIEM_OF_SPIRIT_WARP] = Region("Requiem of Spirit Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_REQUIEM_OF_SPIRIT_WARP] = Region("Requiem of Spirit Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_NOCTURNE_OF_SHADOW_WARP] = Region("Nocturne of Shadow Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_NOCTURNE_OF_SHADOW_WARP] = Region("Nocturne of Shadow Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return true;}), }); - areaTable[RR_PRELUDE_OF_LIGHT_WARP] = Region("Prelude of Light Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_PRELUDE_OF_LIGHT_WARP] = Region("Prelude of Light Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_TEMPLE_OF_TIME, []{return true;}), }); + // clang-format on + // Overworld RegionTable_Init_KokiriForest(); RegionTable_Init_LostWoods(); @@ -346,6 +761,7 @@ void RegionTable_Init() { RegionTable_Init_ZorasFountain(); RegionTable_Init_GerudoValley(); RegionTable_Init_GerudoFortress(); + RegionTable_Init_ThievesHideout(); RegionTable_Init_HauntedWasteland(); RegionTable_Init_DesertColossus(); // Dungeons @@ -362,7 +778,7 @@ void RegionTable_Init() { RegionTable_Init_GerudoTrainingGround(); RegionTable_Init_GanonsCastle(); - //Set parent regions + // Set parent regions for (uint32_t i = RR_ROOT; i <= RR_GANONS_CASTLE; i++) { for (LocationAccess& locPair : areaTable[i].locations) { RandomizerCheck location = locPair.GetLocation(); @@ -415,130 +831,131 @@ std::string CleanCheckConditionString(std::string condition) { } namespace Regions { - const auto GetAllRegions() { - static const size_t regionCount = RR_MAX - (RR_NONE + 1); +auto GetAllRegions() { + static const size_t regionCount = RR_MAX - (RR_NONE + 1); - static std::array allRegions = {}; + static std::array allRegions = {}; - static bool intialized = false; - if (!intialized) { - for (size_t i = 0; i < regionCount; i++) { - allRegions[i] = (RandomizerRegion)((RR_NONE + 1) + i); - } - intialized = true; + static bool initialized = false; + if (!initialized) { + for (size_t i = 0; i < regionCount; i++) { + allRegions[i] = (RandomizerRegion)((RR_NONE + 1) + i); } - - return allRegions; + initialized = true; } - void AccessReset() { - auto ctx = Rando::Context::GetInstance(); - for (const RandomizerRegion region : GetAllRegions()) { - RegionTable(region)->ResetVariables(); - } + return allRegions; +} - if (/*Settings::HasNightStart TODO:: Randomize Starting Time*/ false) { - if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { - RegionTable(RR_ROOT)->childNight = true; - } else { - RegionTable(RR_ROOT)->adultNight = true; - } +void AccessReset() { + auto ctx = Rando::Context::GetInstance(); + for (const RandomizerRegion region : GetAllRegions()) { + RegionTable(region)->ResetVariables(); + } + + if (/*Settings::HasNightStart TODO:: Randomize Starting Time*/ false) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + RegionTable(RR_ROOT)->childNight = true; } else { - if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { - RegionTable(RR_ROOT)->childDay = true; - } else { - RegionTable(RR_ROOT)->adultDay = true; - } + RegionTable(RR_ROOT)->adultNight = true; } - } - - //Reset exits and clear items from locations - void ResetAllLocations() { - auto ctx = Rando::Context::GetInstance(); - for (const RandomizerRegion region : GetAllRegions()) { - RegionTable(region)->ResetVariables(); - //Erase item from every location in this exit - for (LocationAccess& locPair : RegionTable(region)->locations) { - RandomizerCheck location = locPair.GetLocation(); - Rando::Context::GetInstance()->GetItemLocation(location)->ResetVariables(); - } - } - - if (/*Settings::HasNightStart TODO:: Randomize Starting Time*/ false) { - if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { - RegionTable(RR_ROOT)->childNight = true; - } else { - RegionTable(RR_ROOT)->adultNight = true; - } + } else { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + RegionTable(RR_ROOT)->childDay = true; } else { - if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { - RegionTable(RR_ROOT)->childDay = true; - } else { - RegionTable(RR_ROOT)->adultDay = true; - } + RegionTable(RR_ROOT)->adultDay = true; + } + } +} + +// Reset exits and clear items from locations +void ResetAllLocations() { + auto ctx = Rando::Context::GetInstance(); + for (const RandomizerRegion region : GetAllRegions()) { + RegionTable(region)->ResetVariables(); + // Erase item from every location in this exit + for (LocationAccess& locPair : RegionTable(region)->locations) { + RandomizerCheck location = locPair.GetLocation(); + Rando::Context::GetInstance()->GetItemLocation(location)->ResetVariables(); } } - bool HasTimePassAccess(uint8_t age) { - for (const RandomizerRegion regionKey : GetAllRegions()) { - auto region = RegionTable(regionKey); - if (region->timePass && ((age == RO_AGE_CHILD && region->Child()) || (age == RO_AGE_ADULT && region->Adult()))) { - return true; - } + if (/*Settings::HasNightStart TODO:: Randomize Starting Time*/ false) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + RegionTable(RR_ROOT)->childNight = true; + } else { + RegionTable(RR_ROOT)->adultNight = true; + } + } else { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + RegionTable(RR_ROOT)->childDay = true; + } else { + RegionTable(RR_ROOT)->adultDay = true; } - return false; } +} - // Will dump a file which can be turned into a visual graph using graphviz - // https://graphviz.org/download/ - // Use command: dot -Tsvg -o world.svg - // Then open in a browser and CTRL + F to find the area of interest - void DumpWorldGraph(std::string str) { - std::ofstream worldGraph; - worldGraph.open (str + ".dot"); - worldGraph << "digraph {\n\tcenter=true;\n"; +bool HasTimePassAccess(uint8_t age) { + for (const RandomizerRegion regionKey : GetAllRegions()) { + auto region = RegionTable(regionKey); + if (region->TimePass() && + ((age == RO_AGE_CHILD && region->Child()) || (age == RO_AGE_ADULT && region->Adult()))) { + return true; + } + } + return false; +} - for (const RandomizerRegion regionKey : GetAllRegions()) { - auto region = RegionTable(regionKey); - for (auto exit : region->exits) { - if (exit.GetConnectedRegion()->regionName != "Invalid Region") { - std::string parent = exit.GetParentRegion()->regionName; - if (region->childDay) { - parent += " CD"; - } - if (region->childNight) { - parent += " CN"; - } - if (region->adultDay) { - parent += " AD"; - } - if (region->adultNight) { - parent += " AN"; - } - Region* connected = exit.GetConnectedRegion(); - auto connectedStr = connected->regionName; - if (connected->childDay) { - connectedStr += " CD"; - } - if (connected->childNight) { - connectedStr += " CN"; - } - if (connected->adultDay) { - connectedStr += " AD"; - } - if (connected->adultNight) { - connectedStr += " AN"; - } - worldGraph << "\t\"" + parent + "\"[shape=\"plain\"];\n"; - worldGraph << "\t\"" + connectedStr + "\"[shape=\"plain\"];\n"; - worldGraph << "\t\"" + parent + "\" -> \"" + connectedStr + "\"\n"; +// Will dump a file which can be turned into a visual graph using graphviz +// https://graphviz.org/download/ +// Use command: dot -Tsvg -o world.svg +// Then open in a browser and CTRL + F to find the area of interest +void DumpWorldGraph(std::string str) { + std::ofstream worldGraph; + worldGraph.open(str + ".dot"); + worldGraph << "digraph {\n\tcenter=true;\n"; + + for (const RandomizerRegion regionKey : GetAllRegions()) { + auto region = RegionTable(regionKey); + for (auto exit : region->exits) { + if (exit.GetConnectedRegion()->regionName != "Invalid Region") { + std::string parent = exit.GetParentRegion()->regionName; + if (region->childDay) { + parent += " CD"; } + if (region->childNight) { + parent += " CN"; + } + if (region->adultDay) { + parent += " AD"; + } + if (region->adultNight) { + parent += " AN"; + } + Region* connected = exit.GetConnectedRegion(); + auto connectedStr = connected->regionName; + if (connected->childDay) { + connectedStr += " CD"; + } + if (connected->childNight) { + connectedStr += " CN"; + } + if (connected->adultDay) { + connectedStr += " AD"; + } + if (connected->adultNight) { + connectedStr += " AN"; + } + worldGraph << "\t\"" + parent + "\"[shape=\"plain\"];\n"; + worldGraph << "\t\"" + connectedStr + "\"[shape=\"plain\"];\n"; + worldGraph << "\t\"" + parent + "\" -> \"" + connectedStr + "\"\n"; } } - worldGraph << "}"; - worldGraph.close(); } -} //namespace Regions + worldGraph << "}"; + worldGraph.close(); +} +} // namespace Regions Region* RegionTable(const RandomizerRegion regionKey) { if (regionKey > RR_MAX) { @@ -547,12 +964,13 @@ Region* RegionTable(const RandomizerRegion regionKey) { return &(areaTable[regionKey]); } -//Retrieve all the shuffable entrances of a specific type +// Retrieve all the shuffable entrances of a specific type std::vector GetShuffleableEntrances(Rando::EntranceType type, bool onlyPrimary /*= true*/) { std::vector entrancesToShuffle = {}; for (RandomizerRegion region : Regions::GetAllRegions()) { for (auto& exit : RegionTable(region)->exits) { - if ((exit.GetType() == type || type == Rando::EntranceType::All) && (exit.IsPrimary() || !onlyPrimary) && exit.GetType() != Rando::EntranceType::None) { + if ((exit.GetType() == type || type == Rando::EntranceType::All) && (exit.IsPrimary() || !onlyPrimary) && + exit.GetType() != Rando::EntranceType::None) { entrancesToShuffle.push_back(&exit); } } @@ -560,15 +978,12 @@ std::vector GetShuffleableEntrances(Rando::EntranceType type, return entrancesToShuffle; } -// Get the specific entrance by name -Rando::Entrance* GetEntrance(const std::string name) { - for (RandomizerRegion region : Regions::GetAllRegions()) { - for (auto& exit : RegionTable(region)->exits) { - if (exit.GetName() == name) { - return &exit; - } +Rando::Entrance* GetEntrance(RandomizerRegion source, RandomizerRegion destination) { + for (auto& exit : RegionTable(source)->exits) { + if (exit.GetOriginalConnectedRegionKey() == destination) { + return &exit; } } return nullptr; -} \ No newline at end of file +} diff --git a/soh/soh/Enhancements/randomizer/location_access.h b/soh/soh/Enhancements/randomizer/location_access.h index 986d08d6a3..547000ce51 100644 --- a/soh/soh/Enhancements/randomizer/location_access.h +++ b/soh/soh/Enhancements/randomizer/location_access.h @@ -9,6 +9,9 @@ #include "soh/Enhancements/randomizer/context.h" #include "soh/Enhancements/randomizer/logic.h" +#define TIME_PASSES true +#define TIME_DOESNT_PASS false + typedef bool (*ConditionFn)(); // I hate this but every alternative I can think of right now is worse @@ -18,287 +21,321 @@ extern std::shared_ptr logic; class Region; class EventAccess { - public: - explicit EventAccess(bool* event_, ConditionFn condition_function_) : event(event_), condition_function(condition_function_) {} + public: + explicit EventAccess(bool* event_, ConditionFn condition_function_) + : event(event_), condition_function(condition_function_) { + } - bool ConditionsMet() const { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } - return true; + bool ConditionsMet() const { + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { + return condition_function(); } + return true; + } - bool CheckConditionAtAgeTime(bool& age, bool& time) { - logic->IsChild = false; - logic->IsAdult = false; - logic->AtDay = false; - logic->AtNight = false; + bool CheckConditionAtAgeTime(bool& age, bool& time) { + logic->IsChild = false; + logic->IsAdult = false; + logic->AtDay = false; + logic->AtNight = false; - time = true; - age = true; + time = true; + age = true; - return ConditionsMet(); - } + return ConditionsMet(); + } - void EventOccurred() { - *event = true; - } + void EventOccurred() { + *event = true; + } - bool GetEvent() const { - return *event; - } + bool GetEvent() const { + return *event; + } - private: - bool* event; - ConditionFn condition_function; + private: + bool* event; + ConditionFn condition_function; }; std::string CleanCheckConditionString(std::string condition); -#define LOCATION(check, condition) LocationAccess(check, []{return condition;}, CleanCheckConditionString(#condition)) +#define LOCATION(check, condition) \ + LocationAccess( \ + check, [] { return condition; }, CleanCheckConditionString(#condition)) -//this class is meant to hold an item location with a boolean function to determine its accessibility from a specific area +// this class is meant to hold an item location with a boolean function to determine its accessibility from a specific +// area class LocationAccess { - public: - explicit LocationAccess(RandomizerCheck location_, ConditionFn condition_function_) : location(location_), condition_function(condition_function_), condition_str("") {} + public: + explicit LocationAccess(RandomizerCheck location_, ConditionFn condition_function_) + : location(location_), condition_function(condition_function_), condition_str("") { + } - explicit LocationAccess(RandomizerCheck location_, ConditionFn condition_function_, std::string condition_str_) : location(location_), condition_function(condition_function_), condition_str(condition_str_) {} + explicit LocationAccess(RandomizerCheck location_, ConditionFn condition_function_, std::string condition_str_) + : location(location_), condition_function(condition_function_), condition_str(condition_str_) { + } - bool GetConditionsMet() const { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } - return true; + bool GetConditionsMet() const { + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { + return condition_function(); } + return true; + } - bool CheckConditionAtAgeTime(bool& age, bool& time) const; + bool CheckConditionAtAgeTime(bool& age, bool& time) const; - bool ConditionsMet(Region* parentRegion) const; + bool ConditionsMet(Region* parentRegion, bool calculatingAvailableChecks) const; - RandomizerCheck GetLocation() const { - return location; - } + RandomizerCheck GetLocation() const { + return location; + } - std::string GetConditionStr() const { - return condition_str; - } + std::string GetConditionStr() const { + return condition_str; + } - protected: - RandomizerCheck location; - ConditionFn condition_function; - std::string condition_str; + protected: + RandomizerCheck location; + ConditionFn condition_function; + std::string condition_str; - //Makes sure shop locations are buyable - bool CanBuy() const; + // Makes sure shop locations are buyable + bool CanBuy(bool calculatingAvailableChecks) const; }; +bool CanBuyAnother(uint16_t price); bool CanBuyAnother(RandomizerCheck rc); namespace Rando { - class Entrance; - enum class EntranceType; -} +class Entrance; +enum class EntranceType; +} // namespace Rando class Region { - public: - Region(); - Region( - std::string regionName_, - std::string scene_, - std::set areas, - bool timePass_, - std::vector events_, - std::vector locations_, - std::list exits_ - ); - ~Region(); + public: + Region(); + Region(std::string regionName_, SceneID scene_, bool timePass, std::set areas, + std::vector events_, std::vector locations_, std::list exits_); + Region(std::string regionName_, SceneID scene_, std::vector events_, + std::vector locations_, std::list exits_); + ~Region(); - std::string regionName; - std::string scene; - std::set areas; - bool timePass; - std::vector events; - std::vector locations; - std::list exits; - std::list entrances; - //^ The above exits are now stored in a list instead of a vector because - //the entrance randomization algorithm plays around with pointers to these - //entrances a lot. By putting the entrances in a list, we don't have to - //worry about a vector potentially reallocating itself and invalidating all our - //entrance pointers. + std::string regionName; + SceneID scene; + bool timePass; + std::set areas; + std::vector events; + std::vector locations; + std::list exits; + std::list entrances; + //^ The above exits are now stored in a list instead of a vector because + // the entrance randomization algorithm plays around with pointers to these + // entrances a lot. By putting the entrances in a list, we don't have to + // worry about a vector potentially reallocating itself and invalidating all our + // entrance pointers. - bool childDay = false; - bool childNight = false; - bool adultDay = false; - bool adultNight = false; - bool addedToPool = false;; + bool childDay = false; + bool childNight = false; + bool adultDay = false; + bool adultNight = false; + bool addedToPool = false; - void ApplyTimePass(); + bool TimePass(); - bool UpdateEvents(); + void ApplyTimePass(); - void AddExit(RandomizerRegion parentKey, RandomizerRegion newExitKey, ConditionFn condition); + bool UpdateEvents(); - void RemoveExit(Rando::Entrance* exitToRemove); + void AddExit(RandomizerRegion parentKey, RandomizerRegion newExitKey, ConditionFn condition); - void SetAsPrimary(RandomizerRegion exitToBePrimary); + void RemoveExit(Rando::Entrance* exitToRemove); - Rando::Entrance* GetExit(RandomizerRegion exit); + void SetAsPrimary(RandomizerRegion exitToBePrimary); - bool Child() const { - return childDay || childNight; + Rando::Entrance* GetExit(RandomizerRegion exit); + + bool Child() const { + return childDay || childNight; + } + + bool Adult() const { + return adultDay || adultNight; + } + + bool BothAgesCheck() const { + return Child() && Adult(); + } + + bool HasAccess() const { + return Child() || Adult(); + } + + bool AllAccess() const { + return childDay && childNight && adultDay && adultNight; + } + + // Check to see if an exit can be access as both ages at both times of day + bool CheckAllAccess(RandomizerRegion exitKey); + + std::set GetAllAreas() const { + return areas; + } + + RandomizerArea GetFirstArea() const { + if (areas.empty()) { + assert(false); + return RA_NONE; + } else { + return *areas.begin(); } + } - bool Adult() const { - return adultDay || adultNight; - } + void ReplaceAreas(std::set newAreas) { + areas = newAreas; + } - bool BothAgesCheck() const { - return Child() && Adult(); - } + // Here checks conditional access based on whether or not both ages have + // access to this area. For example: if there are rocks that block a path + // which both child and adult can access, adult having hammer can give + // both child and adult access to the path. + bool Here(ConditionFn condition) { + // store current age variables + bool pastAdult = logic->IsAdult; + bool pastChild = logic->IsChild; - bool HasAccess() const { - return Child() || Adult(); - } + // set age access as this areas ages + logic->IsChild = Child(); + logic->IsAdult = Adult(); - bool AllAccess() const { - return childDay && childNight && adultDay && adultNight; - } + // heck condition as well as having at least child or adult access + bool hereVal = condition() && (logic->IsAdult || logic->IsChild); - //Check to see if an exit can be access as both ages at both times of day - bool CheckAllAccess(RandomizerRegion exitKey); + // set back age variables + logic->IsChild = pastChild; + logic->IsAdult = pastAdult; - std::set GetAllAreas() const{ - return areas; - } + return hereVal; + } - RandomizerArea GetFirstArea() const{ - if (areas.empty()){ - assert(false); - return RA_NONE; - } else { - return *areas.begin(); + bool CanPlantBeanCheck() const; + bool AllAccountedFor() const; + + void ResetVariables(); + + void printAgeTimeAccess() const { + auto message = "Child Day: " + std::to_string(childDay) + + "\t" + "Child Night: " + + std::to_string(childNight) + + "\t" + "Adult Day: " + + std::to_string(adultDay) + + "\t" + "Adult Night: " + + std::to_string(adultNight); + } + + /* + * This logic covers checks that exist in the shared areas of MQ spirit from a glitchless standpoint. + * This room has Quantum logic that I am currently handling with this function, however this is NOT suitable for + glitch logic as it relies on specific ages + * In this chunk there are 3 possibilities for passing a check, but first I have to talk about parallel universes. + + * In MQ Spirit key logic, we mostly care about 2 possibilities for how the player can spend keys, creating 2 + Parralel universes + * In the first universe, the player did not enter spirit as adult until after climbing as child, thus child spends + keys linearly, only needing 2 to reach statue room. + * In the second universe, the player went in as adult, possibly out of logic, and started wasting the keys to lock + child out. + * These Universes converge when the player has 7 keys (meaning adult can no longer lock child out) and adult is + known to be able to reach Statue room. This creates "Certain Access", which is tracked seperatly for each age. + * Child Certain Access is simple, if we have 7 keys and child access, it's Certain Access. + * Adult Certain Access is also simple, adult is not key locked, so if they make it to a location, it's Certain + Access. + * Things get complicated when we handle the overlap of the 2 universes, + * though an important detail is that if we have Certain Access as either age, we don't need to checked the overlap + because overlap logic is strictly stricter than either Certain Access. + + * In order to track the first universe, the logic allows technical child access with the minimum number of keys, + and then checks in this function for if we have 7 keys to determine if that is Certain or not. + * This is for technical reasons, as areas with no access at all will simply not be checked. + * Normally we would need to do similar shenanigans to track the second universe, however adult must have go through + statue room to waste keys, + * so can go back there and get new keys for Child to use if they do, and the navigation logic for shared MQ spirit + from Statue Room is very simple for Adult. + * Additionally, we don't need to know if adult can actually reach spirit temple or climb to statue room, because if + the player can't do that, then universe 2 can't happen anyway, + * and if the player does so out of logic, they can do it again, as the only consumable used sets a permanent flag. + + * The Adult Navigation logic is as such: + * - Broken Wall room is 6 key locked, because if the player tries to spend 6 keys in a way that would block adults + access, they would have to give child access instead. + * - The child side hammer switch for the time travelling chest is 7 key locked for adult + * - Reaching gauntlets hand is 7 key locked + * - Going back into big block room is complex, but the only check there is child only so not a concern + * - Everything else is possible with basic adult movement, or is impossible for child to reach glitchlessly + * Anything 7 key locked does not need to be checked as shared, as all child access is Certain and because of this + workaround we don't need to fake Adult access, meaning that is also Certain. + * All of this combined means that when checking if adult can reach a location in universe 2, we only have to ask if + it is a 6 key locked location or not. + + * Knowing all of this this, we can confirm things are logical in 3 different ways: + * - If we have Adult Access, we know it is Certain Access, so they can get checks alone. + * - If we have 7 keys, child has Certain Access as we know they cannot be locked out, so can get checks alone, + otherwise we check the logical overlap + * - If Child and Adult can get the check (ignoring actual adult access to the location), and the location is either + not 6 key locked or we have 6 keys, we can get the check with the overlap + */ + bool MQSpiritShared(ConditionFn condition, bool IsBrokenWall, bool anyAge = false) { + // if we have Certain Access as child, we can check anyAge and if true, resolve a condition with Here as if + // adult is here it's also Certain Access + if (logic->SmallKeys(RR_SPIRIT_TEMPLE, 7)) { + if (anyAge) { + return Here(condition); } - } - - void ReplaceAreas(std::set newAreas) { - areas = newAreas; - } - - //Here checks conditional access based on whether or not both ages have - //access to this area. For example: if there are rocks that block a path - //which both child and adult can access, adult having hammer can give - //both child and adult access to the path. - bool Here(ConditionFn condition) { - //store current age variables + return condition(); + // else, if we are here as adult, we have Certain Access from that and don't need special handling for + // checking adult + } else if (Adult() && logic->IsAdult) { + return condition(); + // if we do not have Certain Access, we need to check the overlap by seeing if we are both here as child and + // meet the adult universe's access condition We only need to do it as child, as only child access matters + // for this check, as adult access is assumed based on keys + } else if (Child() && logic->IsChild && (!IsBrokenWall || logic->SmallKeys(RR_SPIRIT_TEMPLE, 6))) { + bool result = false; + // store current age variables bool pastAdult = logic->IsAdult; bool pastChild = logic->IsChild; - //set age access as this areas ages - logic->IsChild = Child(); - logic->IsAdult = Adult(); + // First check if the check is possible as child + logic->IsChild = true; + logic->IsAdult = false; + result = condition(); + // If so, check again as adult. both have to be true for result to be true + if (result) { + logic->IsChild = false; + logic->IsAdult = true; + result = condition(); + } - //heck condition as well as having at least child or adult access - bool hereVal = condition() && (logic->IsAdult || logic->IsChild); - - //set back age variables + // set back age variables logic->IsChild = pastChild; logic->IsAdult = pastAdult; - - return hereVal; - } - - bool CanPlantBeanCheck() const; - bool AllAccountedFor() const; - - void ResetVariables(); - - void printAgeTimeAccess() const { - auto message = "Child Day: " + std::to_string(childDay) + "\t" - "Child Night: " + std::to_string(childNight) + "\t" - "Adult Day: " + std::to_string(adultDay) + "\t" - "Adult Night: " + std::to_string(adultNight); - } - - /* - * This logic covers checks that exist in the shared areas of MQ spirit from a glitchless standpoint. - * This room has Quantum logic that I am currently handling with this function, however this is NOT suitable for glitch logic as it relies on specific ages - * In this chunk there are 3 possibilities for passing a check, but first I have to talk about parallel universes. - - * In MQ Spirit key logic, we mostly care about 2 possibilities for how the player can spend keys, creating 2 Parralel universes - * In the first universe, the player did not enter spirit as adult until after climbing as child, thus child spends keys linearly, only needing 2 to reach statue room. - * In the second universe, the player went in as adult, possibly out of logic, and started wasting the keys to lock child out. - * These Universes converge when the player has 7 keys (meaning adult can no longer lock child out) and adult is known to be able to reach Statue room. This creates "Certain Access", which is tracked seperatly for each age. - * Child Certain Access is simple, if we have 7 keys and child access, it's Certain Access. - * Adult Certain Access is also simple, adult is not key locked, so if they make it to a location, it's Certain Access. - * Things get complicated when we handle the overlap of the 2 universes, - * though an important detail is that if we have Certain Access as either age, we don't need to checked the overlap because overlap logic is strictly stricter than either Certain Access. - - * In order to track the first universe, the logic allows technical child access with the minimum number of keys, and then checks in this function for if we have 7 keys to determine if that is Certain or not. - * This is for technical reasons, as areas with no access at all will simply not be checked. - * Normally we would need to do similar shenanigans to track the second universe, however adult must have go through statue room to waste keys, - * so can go back there and get new keys for Child to use if they do, and the navigation logic for shared MQ spirit from Statue Room is very simple for Adult. - * Additionally, we don't need to know if adult can actually reach spirit temple or climb to statue room, because if the player can't do that, then universe 2 can't happen anyway, - * and if the player does so out of logic, they can do it again, as the only consumable used sets a permanent flag. - - * The Adult Navigation logic is as such: - * - Broken Wall room is 6 key locked, because if the player tries to spend 6 keys in a way that would block adults access, they would have to give child access instead. - * - The child side hammer switch for the time travelling chest is 7 key locked for adult - * - Reaching gauntlets hand is 7 key locked - * - Going back into big block room is complex, but the only check there is child only so not a concern - * - Everything else is possible with basic adult movement, or is impossible for child to reach glitchlessly - * Anything 7 key locked does not need to be checked as shared, as all child access is Certain and because of this workaround we don't need to fake Adult access, meaning that is also Certain. - * All of this combined means that when checking if adult can reach a location in universe 2, we only have to ask if it is a 6 key locked location or not. - - * Knowing all of this this, we can confirm things are logical in 3 different ways: - * - If we have Adult Access, we know it is Certain Access, so they can get checks alone. - * - If we have 7 keys, child has Certain Access as we know they cannot be locked out, so can get checks alone, otherwise we check the logical overlap - * - If Child and Adult can get the check (ignoring actual adult access to the location), and the location is either not 6 key locked or we have 6 keys, we can get the check with the overlap - */ - bool MQSpiritShared(ConditionFn condition, bool IsBrokenWall, bool anyAge = false) { - //if we have Certain Access as child, we can check anyAge and if true, resolve a condition with Here as if adult is here it's also Certain Access - if (logic->SmallKeys(RR_SPIRIT_TEMPLE, 7)){ - if (anyAge){ - return Here(condition); - } - return condition(); - //else, if we are here as adult, we have Certain Access from that and don't need special handling for checking adult - } else if (Adult() && logic->IsAdult){ - return condition(); - //if we do not have Certain Access, we need to check the overlap by seeing if we are both here as child and meet the adult universe's access condition - //We only need to do it as child, as only child access matters for this check, as adult access is assumed based on keys - } else if (Child() && logic->IsChild && (!IsBrokenWall || logic->SmallKeys(RR_SPIRIT_TEMPLE, 6))) { - bool result = false; - //store current age variables - bool pastAdult = logic->IsAdult; - bool pastChild = logic->IsChild; - - //First check if the check is possible as child - logic->IsChild = true; - logic->IsAdult = false; - result = condition(); - //If so, check again as adult. both have to be true for result to be true - if (result) { - logic->IsChild = false; - logic->IsAdult = true; - result = condition(); - } - - //set back age variables - logic->IsChild = pastChild; - logic->IsAdult = pastAdult; - return result; - } - return false; + return result; } + return false; + } }; extern std::array areaTable; extern std::vector grottoEvents; -bool Here(const RandomizerRegion region, ConditionFn condition); //RANDOTODO make a less stupid way to check own at either age than self referencing with this +bool Here(const RandomizerRegion region, + ConditionFn + condition); // RANDOTODO make a less stupid way to check own at either age than self referencing with this bool MQSpiritSharedStatueRoom(const RandomizerRegion region, ConditionFn condition, bool anyAge = false); bool MQSpiritSharedBrokenWallRoom(const RandomizerRegion region, ConditionFn condition, bool anyAge = false); bool CanPlantBean(const RandomizerRegion region); @@ -307,20 +344,17 @@ bool ChildCanAccess(const RandomizerRegion region); bool AdultCanAccess(const RandomizerRegion region); bool HasAccessTo(const RandomizerRegion region); -#define DAY_NIGHT_CYCLE true -#define NO_DAY_NIGHT_CYCLE false - namespace Regions { - extern void AccessReset(); - extern void ResetAllLocations(); - extern bool HasTimePassAccess(uint8_t age); - extern void DumpWorldGraph(std::string str); -} //namespace Exits +extern void AccessReset(); +extern void ResetAllLocations(); +extern bool HasTimePassAccess(uint8_t age); +extern void DumpWorldGraph(std::string str); +} // namespace Regions -void RegionTable_Init(); +void RegionTable_Init(); Region* RegionTable(const RandomizerRegion regionKey); std::vector GetShuffleableEntrances(Rando::EntranceType type, bool onlyPrimary = true); -Rando::Entrance* GetEntrance(const std::string name); +Rando::Entrance* GetEntrance(RandomizerRegion source, RandomizerRegion destination); // Overworld void RegionTable_Init_KokiriForest(); @@ -355,5 +389,6 @@ void RegionTable_Init_SpiritTemple(); void RegionTable_Init_ShadowTemple(); void RegionTable_Init_BottomOfTheWell(); void RegionTable_Init_IceCavern(); +void RegionTable_Init_ThievesHideout(); void RegionTable_Init_GerudoTrainingGround(); void RegionTable_Init_GanonsCastle(); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp index 171542ea35..001ad5d81d 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp @@ -5,8 +5,9 @@ using namespace Rando; void RegionTable_Init_BottomOfTheWell() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_BOTTOM_OF_THE_WELL_ENTRYWAY] = Region("Bottom of the Well Entryway", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_ENTRYWAY] = Region("Bottom of the Well Entryway", SCENE_BOTTOM_OF_THE_WELL, {}, {}, { //Exits //Technically involves an fake wall, but passing it lensless is intended in vanilla and it is well telegraphed Entrance(RR_BOTTOM_OF_THE_WELL_PERIMETER, []{return ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla() && logic->IsChild && logic->CanPassEnemy(RE_BIG_SKULLTULA);}), @@ -16,7 +17,7 @@ void RegionTable_Init_BottomOfTheWell() { #pragma region Vanilla - areaTable[RR_BOTTOM_OF_THE_WELL_PERIMETER] = Region("Bottom of the Well Perimeter", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_PERIMETER] = Region("Bottom of the Well Perimeter", SCENE_BOTTOM_OF_THE_WELL, { //Events EventAccess(&logic->StickPot, []{return true;}), EventAccess(&logic->NutPot, []{return true;}), @@ -24,9 +25,8 @@ void RegionTable_Init_BottomOfTheWell() { }, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, logic->HasExplosives()), - LOCATION(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, (logic->HasItem(RG_BRONZE_SCALE) || logic->LoweredWaterInsideBotw) && logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE)), - LOCATION(RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, logic->LoweredWaterInsideBotw), - LOCATION(RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, logic->LoweredWaterInsideBotw), + LOCATION(RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, logic->LoweredWaterInsideBotw || logic->CanOpenUnderwaterChest()), + LOCATION(RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, logic->LoweredWaterInsideBotw || logic->CanOpenUnderwaterChest()), LOCATION(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, logic->CanBreakPots()), LOCATION(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, logic->CanBreakPots()), LOCATION(RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, (logic->CanBreakPots() && logic->LoweredWaterInsideBotw) || logic->CanUse(RG_BOOMERANG)), @@ -44,12 +44,12 @@ void RegionTable_Init_BottomOfTheWell() { }); //This region combines the Middle with the perimeter's hidden areas. If a warp puts link into the middle without crossing the perimeter or using lens, it will need it's own region - areaTable[RR_BOTTOM_OF_THE_WELL_BEHIND_FAKE_WALLS] = Region("Bottom of the Well Behind Fake Walls", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_BEHIND_FAKE_WALLS] = Region("Bottom of the Well Behind Fake Walls", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, true), LOCATION(RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, true), LOCATION(RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, true), - //N64 has no extra check here, but I can't get past without dealing with the spider or taking a hit, they probably assume sticks + //You can just barely pass the spider on the right side without damage or items, but it's probably tight enough to count as as a trick LOCATION(RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->TakeDamage()), //Not technically behind a wall, but still logically needs lens due to pits LOCATION(RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, logic->HasExplosives()), @@ -62,7 +62,7 @@ void RegionTable_Init_BottomOfTheWell() { }); //This area can be reached without lens in logic from basement, but that could require silver rupees if they are shuffled. - areaTable[RR_BOTTOM_OF_THE_WELL_SOUTHWEST_ROOM] = Region("Bottom of the Well Southwest Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_SOUTHWEST_ROOM] = Region("Bottom of the Well Southwest Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, logic->CanBreakPots()), LOCATION(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, logic->CanBreakPots()), @@ -73,7 +73,7 @@ void RegionTable_Init_BottomOfTheWell() { }); //Passing through this area needs lens, but entering doesn't, so that the fire keese can be killed without crossing the pits if enemy drops are ever shuffled - areaTable[RR_BOTTOM_OF_THE_WELL_KEESE_BEAMOS_ROOM] = Region("Bottom of the Well Keese-Beamos Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_KEESE_BEAMOS_ROOM] = Region("Bottom of the Well Keese-Beamos Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, ctx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), LOCATION(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, logic->CanBreakPots() && (ctx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH))), @@ -85,7 +85,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_BASEMENT_USEFUL_BOMB_FLOWERS, []{return ctx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_LIKE_LIKE_CAGE] = Region("Bottom of the Well Like-Like Cage", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_LIKE_LIKE_CAGE] = Region("Bottom of the Well Like-Like Cage", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, true), LOCATION(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), @@ -95,7 +95,7 @@ void RegionTable_Init_BottomOfTheWell() { }); //If the player can voidwarp into one of these rooms they will need splitting up, and Fake walls will need specifying into middle and the rest moved to perimeter - areaTable[RR_BOTTOM_OF_THE_WELL_INNER_ROOMS] = Region("Bottom of the Well Inner Rooms", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_INNER_ROOMS] = Region("Bottom of the Well Inner Rooms", SCENE_BOTTOM_OF_THE_WELL, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -108,7 +108,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_BEHIND_FAKE_WALLS, []{return logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_COFFIN_ROOM] = Region("Bottom of the Well Coffin Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_COFFIN_ROOM] = Region("Bottom of the Well Coffin Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, true), @@ -118,7 +118,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_PERIMETER, []{return logic->LoweredWaterInsideBotw || logic->HasItem(RG_BRONZE_SCALE);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_DEAD_HAND_ROOM] = Region("Bottom of the Well Dead Hand Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_DEAD_HAND_ROOM] = Region("Bottom of the Well Dead Hand Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, logic->CanKillEnemy(RE_DEAD_HAND)), LOCATION(RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, (ctx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH))), @@ -128,31 +128,43 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_PERIMETER, []{return logic->IsChild && logic->CanKillEnemy(RE_DEAD_HAND);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT] = Region("Bottom of the Well Basement", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT] = Region("Bottom of the Well Basement", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations - LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->BlastOrSmash()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, logic->CanCutShrubs() && logic->BlastOrSmash()), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_SOUTHWEST_ROOM, []{return logic->IsChild && logic->CanPassEnemy(RE_BIG_SKULLTULA);}), - //It's possible top abuse boulder's limited range of collision detection to detonate the flowers through the boulder with bow, but this is a glitch + //It's possible to abuse boulder's limited range of collision detection to detonate the flowers through the boulder with bow, but this is a glitch //the exact range is just past the furthest away plank in the green goo section Entrance(RR_BOTTOM_OF_THE_WELL_BASEMENT_USEFUL_BOMB_FLOWERS, []{return Here(RR_BOTTOM_OF_THE_WELL_BASEMENT, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE) || (logic->CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_BASEMENT));});}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT_USEFUL_BOMB_FLOWERS] = Region("Bottom of the Well Basement Useful Bomb Flowers", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT_USEFUL_BOMB_FLOWERS] = Region("Bottom of the Well Basement Useful Bomb Flowers", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations //Assumes RR_BOTTOM_OF_THE_WELL_BASEMENT access LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->HasItem(RG_GORONS_BRACELET)), @@ -161,7 +173,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_BASEMENT, []{return logic->CanDetonateUprightBombFlower();}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM] = Region("Bottom of the Well Basement Platform", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM] = Region("Bottom of the Well Basement Platform", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, true), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, true), @@ -177,7 +189,7 @@ void RegionTable_Init_BottomOfTheWell() { #pragma region MQ - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER] = Region("Bottom of the Well MQ Perimeter", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER] = Region("Bottom of the Well MQ Perimeter", SCENE_BOTTOM_OF_THE_WELL, { //Events //technically obsolete due to a wonder item fairy which only needs a projectile, but we don't have an event var for it yet EventAccess(&logic->FairyPot, []{return Here(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, []{return logic->BlastOrSmash();}) && logic->CanHitEyeTargets();}), @@ -202,7 +214,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT, []{return true;}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_WEST_ROOM_SWITCH] = Region("Bottom of the Well MQ West Room Switch", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_WEST_ROOM_SWITCH] = Region("Bottom of the Well MQ West Room Switch", SCENE_BOTTOM_OF_THE_WELL, { //Events EventAccess(&logic->OpenedWestRoomMQBotw, []{return true;}), }, {}, { @@ -212,7 +224,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT, []{return true;}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM] = Region("Bottom of the Well MQ Coffin Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM] = Region("Bottom of the Well MQ Coffin Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), @@ -222,7 +234,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, []{return (logic->LoweredWaterInsideBotw || logic->HasItem(RG_BRONZE_SCALE)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_LOCKED_CAGE] = Region("Bottom of the Well MQ Locked Cage", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_LOCKED_CAGE] = Region("Bottom of the Well MQ Locked Cage", SCENE_BOTTOM_OF_THE_WELL, { //Events EventAccess(&logic->OpenedMiddleHoleMQBotw, []{return logic->HasExplosives();}), }, {}, { @@ -230,17 +242,21 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, []{return logic->IsChild && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_ROOM] = Region("Bottom of the Well MQ Dead Hand Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_ROOM] = Region("Bottom of the Well MQ Dead Hand Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DEAD_HAND)), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, logic->HasExplosives() || (ctx->GetTrickOption(RT_BOTW_MQ_DEADHAND_KEY) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, logic->CanCutShrubs()), }, { //Exits //This assumes we spawned in dead hand's room, if whatever trick made this relevant instead puts us in the previous room, remove the kill Dead Hand check. Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, []{return logic->IsChild && logic->CanKillEnemy(RE_DEAD_HAND);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_MIDDLE] = Region("Bottom of the Well MQ Middle", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_MIDDLE] = Region("Bottom of the Well MQ Middle", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, true), //This location technically involves an invisible platform, but it's intended to do lensless in vanilla and is clearly signposted by pots. @@ -267,7 +283,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT, []{return true;}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT] = Region("Bottom of the Well MQ Basement", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT] = Region("Bottom of the Well MQ Basement", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations //behind invisible big skulltulas, but with navi spotting it's easy to avoid them, or at worst, tank your way through as they do not block the path LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), @@ -280,7 +296,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, []{return true;}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SWITCH_PLATFORM] = Region("Bottom of the Well MQ Basement Switch Platform", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SWITCH_PLATFORM] = Region("Bottom of the Well MQ Basement Switch Platform", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations //Assumes RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT access //it is technically possible to get the chest before you get screamed at without rolling, but hard enough to be a trick if that is the requirement for something to be logical @@ -293,4 +309,5 @@ void RegionTable_Init_BottomOfTheWell() { }); #pragma endregion -} \ No newline at end of file + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index 2500e49969..1d98e861a7 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -5,8 +5,9 @@ using namespace Rando; void RegionTable_Init_DekuTree() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_DEKU_TREE_ENTRYWAY] = Region("Deku Tree Entryway", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_ENTRYWAY] = Region("Deku Tree Entryway", SCENE_DEKU_TREE, {}, {}, { //Exits Entrance(RR_DEKU_TREE_LOBBY, []{return ctx->GetDungeon(DEKU_TREE)->IsVanilla();}), Entrance(RR_DEKU_TREE_MQ_1F, []{return ctx->GetDungeon(DEKU_TREE)->IsMQ();}), @@ -15,7 +16,7 @@ void RegionTable_Init_DekuTree() { #pragma region Vanilla - areaTable[RR_DEKU_TREE_LOBBY] = Region("Deku Tree Lobby", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_LOBBY] = Region("Deku Tree Lobby", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -24,6 +25,11 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MAP_CHEST, true), LOCATION(RC_DEKU_TREE_LOBBY_LOWER_HEART, true), LOCATION(RC_DEKU_TREE_LOBBY_UPPER_HEART, logic->CanPassEnemy(RE_BIG_SKULLTULA)), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_5, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_ENTRYWAY, []{return true;}), @@ -34,22 +40,26 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_DEKU_TREE_2F_MIDDLE_ROOM] = Region("Deku Tree 2F Middle Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_2F_MIDDLE_ROOM] = Region("Deku Tree 2F Middle Room", SCENE_DEKU_TREE, {}, {}, { //Exits Entrance(RR_DEKU_TREE_LOBBY, []{return Here(RR_DEKU_TREE_2F_MIDDLE_ROOM, []{return logic->CanReflectNuts() || logic->CanUse(RG_MEGATON_HAMMER);});}), Entrance(RR_DEKU_TREE_SLINGSHOT_ROOM, []{return Here(RR_DEKU_TREE_2F_MIDDLE_ROOM, []{return logic->CanReflectNuts() || logic->CanUse(RG_MEGATON_HAMMER);});}), }); - areaTable[RR_DEKU_TREE_SLINGSHOT_ROOM] = Region("Deku Tree Slingshot Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_SLINGSHOT_ROOM] = Region("Deku Tree Slingshot Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_SLINGSHOT_CHEST, true), LOCATION(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, true), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_1, logic->CanCutShrubs() && logic->CanReflectNuts()), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_2, logic->CanCutShrubs() && logic->CanReflectNuts()), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_3, logic->CanCutShrubs() && logic->CanReflectNuts()), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_4, logic->CanCutShrubs() && logic->CanReflectNuts()), }, { //Exits Entrance(RR_DEKU_TREE_2F_MIDDLE_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_DEKU_TREE_COMPASS_ROOM] = Region("Deku Tree Compass Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_COMPASS_ROOM] = Region("Deku Tree Compass Room", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -58,21 +68,25 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_COMPASS_CHEST, true), LOCATION(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, true), LOCATION(RC_DEKU_TREE_GS_COMPASS_ROOM, logic->CanAttack()), + LOCATION(RC_DEKU_TREE_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_COMPASS_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_LOBBY, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);}), Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_LOWER] = Region("Deku Tree Basement Lower", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_LOWER] = Region("Deku Tree Basement Lower", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), }, { //Locations LOCATION(RC_DEKU_TREE_BASEMENT_CHEST, true), - LOCATION(RC_DEKU_TREE_GS_BASEMENT_GATE, logic->CanJumpslashExceptHammer() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE)), - LOCATION(RC_DEKU_TREE_GS_BASEMENT_VINES, logic->CanUseProjectile() || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS) && logic->CanJumpslashExceptHammer())), + LOCATION(RC_DEKU_TREE_GS_BASEMENT_GATE, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH)), + LOCATION(RC_DEKU_TREE_GS_BASEMENT_VINES, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS) ? ED_SHORT_JUMPSLASH : ED_BOMB_THROW)), + LOCATION(RC_DEKU_TREE_BASEMENT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_LOBBY, []{return true;}), @@ -81,46 +95,64 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return false;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Region("Deku Tree Basement Scrub Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Region("Deku Tree Basement Scrub Room", SCENE_DEKU_TREE, {}, { + //Location + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_LOWER, []{return true;}), - Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return Here(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW);});}), + Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return Here(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return logic->CanHitEyeTargets();});}), }); - areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT] = Region("Deku Tree Basement Water Room Front", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT] = Region("Deku Tree Basement Water Room Front", SCENE_DEKU_TREE, {}, {}, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return true;}), Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK, []{return logic->HasItem(RG_BRONZE_SCALE) || ctx->GetTrickOption(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG);}), }); - areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree Basement Water Room Back", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree Basement Water Room Back", SCENE_DEKU_TREE, {}, { + //Locations + LOCATION(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return logic->HasItem(RG_BRONZE_SCALE) || ctx->GetTrickOption(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG);}), Entrance(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return true;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_TORCH_ROOM] = Region("Deku Tree Basement Torch Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_TORCH_ROOM] = Region("Deku Tree Basement Torch Room", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), - }, {}, { + }, { + //Locations + LOCATION(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK, []{return true;}), Entrance(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return Here(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}), }); - areaTable[RR_DEKU_TREE_BASEMENT_BACK_LOBBY] = Region("Deku Tree Basement Back Lobby", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_BACK_LOBBY] = Region("Deku Tree Basement Back Lobby", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), - }, {}, { + }, { + //Location + LOCATION(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return true;}), Entrance(RR_DEKU_TREE_BASEMENT_BACK_ROOM, []{return Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);}) && Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return logic->BlastOrSmash();});}), Entrance(RR_DEKU_TREE_BASEMENT_UPPER, []{return Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);}) && logic->IsChild;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_BACK_ROOM] = Region("Deku Tree Basement Back Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_BACK_ROOM] = Region("Deku Tree Basement Back Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, logic->HookshotOrBoomerang()), }, { @@ -128,7 +160,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return true;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_UPPER] = Region("Deku Tree Basement Upper", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_UPPER] = Region("Deku Tree Basement Upper", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -139,11 +171,14 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return Here(RR_DEKU_TREE_BASEMENT_UPPER, []{return logic->HasFireSourceWithTorch() || (ctx->GetTrickOption(RT_DEKU_B1_BOW_WEBS) && logic->IsAdult && logic->CanUse(RG_FAIRY_BOW));});}), }); - areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Region("Deku Tree Outside Boss Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Region("Deku Tree Outside Boss Room", SCENE_DEKU_TREE, {}, { //Locations - LOCATION(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), - LOCATION(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), - LOCATION(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()), }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_UPPER, []{return true;}), @@ -154,11 +189,18 @@ void RegionTable_Init_DekuTree() { #pragma region MQ - areaTable[RR_DEKU_TREE_MQ_1F] = Region("Deku Tree MQ 1F", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_1F] = Region("Deku Tree MQ 1F", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanKillEnemy(RE_WITHERED_DEKU_BABA);}), EventAccess(&logic->BrokeDeku1FWeb, []{return logic->HasFireSource();}), - }, {}, { + }, { + //Locations + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_5, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_ENTRYWAY, []{return true;}), //may need canAvoid logic with enemy shuffle @@ -170,11 +212,14 @@ void RegionTable_Init_DekuTree() { //is it possible to recoil from here to the ledge with a trick? }); - areaTable[RR_DEKU_TREE_MQ_2F] = Region("Deku Tree MQ 2F", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_2F] = Region("Deku Tree MQ 2F", SCENE_DEKU_TREE, {}, { //Locations - LOCATION(RC_DEKU_TREE_MQ_MAP_CHEST, true), - LOCATION(RC_DEKU_TREE_MQ_GS_LOBBY, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), - LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_MAP_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_GS_LOBBY, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}), @@ -183,7 +228,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return Here(RR_DEKU_TREE_MQ_2F, []{return logic->HasFireSource();});}), }); - areaTable[RR_DEKU_TREE_MQ_3F] = Region("Deku Tree MQ 3F", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_3F] = Region("Deku Tree MQ 3F", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -194,6 +239,12 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, logic->CanKillEnemy(RE_DEKU_BABA)), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, logic->HasFireSourceWithTorch() || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW))), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_2F, []{return true;}), @@ -202,25 +253,36 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_BASEMENT, []{return true;}), }); - areaTable[RR_DEKU_TREE_MQ_EYE_TARGET_ROOM] = Region("Deku Tree MQ Eye Target Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_EYE_TARGET_ROOM] = Region("Deku Tree MQ Eye Target Room", SCENE_DEKU_TREE, {}, { //Locations - LOCATION(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return Here(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return logic->CanHitEyeTargets();});}), Entrance(RR_DEKU_TREE_MQ_2F, []{return true;}), }); - areaTable[RR_DEKU_TREE_MQ_COMPASS_ROOM] = Region("Deku Tree MQ Compass Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_COMPASS_ROOM] = Region("Deku Tree MQ Compass Room", SCENE_DEKU_TREE, {}, { //Locations - LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_4, logic->CanCutShrubs()), }, { //Exits - Entrance(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return true;}), + Entrance(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}), Entrance(RR_DEKU_TREE_MQ_PAST_BOULDER_VINES, []{return Here(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS))) || (logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)));});}), }); - areaTable[RR_DEKU_TREE_MQ_PAST_BOULDER_VINES] = Region("Deku Tree MQ Past Boulder Vines", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_PAST_BOULDER_VINES] = Region("Deku Tree MQ Past Boulder Vines", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_GS_PAST_BOULDER_VINES, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), LOCATION(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, true), @@ -229,13 +291,17 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return logic->BlastOrSmash();}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT] = Region("Deku Tree MQ Basement", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT] = Region("Deku Tree MQ Basement", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), }, { //Locations - LOCATION(RC_DEKU_TREE_MQ_BASEMENT_CHEST, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_CHEST, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}), @@ -245,57 +311,77 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return ctx->GetTrickOption(RT_DEKU_B1_SKIP) || logic->PushedDekuBasementBlock || logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHEAST_ROOM] = Region("Deku Tree MQ Southeast Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHEAST_ROOM] = Region("Deku Tree MQ Southeast Room", SCENE_DEKU_TREE, { //Events //Implies CanKillEnemy(RE_GOHMA_LARVA) EventAccess(&logic->ClearedMQDekuSERoom, []{return logic->CanKillEnemy(RE_MAD_SCRUB);}), - }, {}, { + }, { + //Locations + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return logic->HasFireSource();}), Entrance(RR_DEKU_TREE_MQ_BASEMENT, []{return logic->ClearedMQDekuSERoom;}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT] = Region("Deku Tree MQ Basement Water Room Front", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT] = Region("Deku Tree MQ Basement Water Room Front", SCENE_DEKU_TREE, { //Events //It's possible to get this with bow if you have move while in first person and one-point skips on, noticeably harder and jankier as child, but that's a trick EventAccess(&logic->MQDekuWaterRoomTorches, []{return logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_STICKS) && (ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield())));}), }, { //Locations - LOCATION(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield()) || logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS));}), Entrance(RR_DEKU_TREE_MQ_BASEMENT_SOUTHEAST_ROOM, []{return true;}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree MQ Basement Water Room Back", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree MQ Basement Water Room Back", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanKillEnemy(RE_WITHERED_DEKU_BABA);}), EventAccess(&logic->MQDekuWaterRoomTorches, []{return logic->HasFireSource();}), }, { //Locations //it blocks the chest while stunned unless you stun it from afar while it's slightly off the ground - LOCATION(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, logic->CanUse(RG_SONG_OF_TIME) && logic->CanPassEnemy(RE_BIG_SKULLTULA)), + LOCATION(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, logic->CanUse(RG_SONG_OF_TIME) && logic->CanPassEnemy(RE_BIG_SKULLTULA)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM, []{return logic->MQDekuWaterRoomTorches && logic->CanPassEnemy(RE_BIG_SKULLTULA, logic->CanUse(RG_SONG_OF_TIME) ? ED_CLOSE : ED_SHORT_JUMPSLASH);}), Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield()) || logic->CanUse(RG_LONGSHOT) || logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && (logic->IsAdult || logic->CanUse(RG_HOOKSHOT)));}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM] = Region("Deku Tree MQ Basement Southwest Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM] = Region("Deku Tree MQ Basement Southwest Room", SCENE_DEKU_TREE, {}, { + //Locations + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, logic->CanCutShrubs()), + }, { //Exits //both imply CanKillEnemy(RE_GOHMA_LARVA) Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return Here(RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM, []{return logic->CanKillEnemy(RE_MAD_SCRUB) && logic->CanKillEnemy(RE_KEESE);});}), Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return Here(RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM, []{return logic->CanKillEnemy(RE_MAD_SCRUB) && logic->CanKillEnemy(RE_KEESE);});}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM] = Region("Deku Tree MQ Basement Grave Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM] = Region("Deku Tree MQ Basement Grave Room", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}) }, { //Locations LOCATION(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG))), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->IsChild && Here(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}), @@ -304,20 +390,26 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM, []{return Here(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM] = Region("Deku Tree MQ Basement Back Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM] = Region("Deku Tree MQ Basement Back Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return true;}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_LEDGE] = Region("Deku Tree MQ Basement Ledge", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_LEDGE] = Region("Deku Tree MQ Basement Ledge", SCENE_DEKU_TREE, { //Events EventAccess(&logic->PushedDekuBasementBlock, []{return true;}), }, { //Locations - LOCATION(RC_DEKU_TREE_MQ_DEKU_SCRUB, logic->CanStunDeku()), + LOCATION(RC_DEKU_TREE_MQ_DEKU_SCRUB, logic->CanStunDeku()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return logic->IsChild;}), @@ -327,11 +419,14 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, []{return Here(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->HasFireSource() || (/*logic->PushedDekuBasementBlock && */logic->CanUse(RG_STICKS));}) && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), }); - areaTable[RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM] = Region("Deku Tree MQ Outside Boss Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM] = Region("Deku Tree MQ Outside Boss Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT);}), @@ -341,23 +436,37 @@ void RegionTable_Init_DekuTree() { #pragma endregion // Boss Room - areaTable[RR_DEKU_TREE_BOSS_ENTRYWAY] = Region("Deku Tree Boss Entryway", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BOSS_ENTRYWAY] = Region("Deku Tree Boss Entryway", SCENE_DEKU_TREE, {}, {}, { + // Exits + Entrance(RR_DEKU_TREE_BOSS_ROOM, []{return true;}), + }); + + areaTable[RR_DEKU_TREE_BOSS_EXIT] = Region("Deku Tree Boss Exit", SCENE_DEKU_TREE, {}, {}, { // Exits Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return ctx->GetDungeon(DEKU_TREE)->IsVanilla();}), Entrance(RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, []{return ctx->GetDungeon(DEKU_TREE)->IsMQ();}), - Entrance(RR_DEKU_TREE_BOSS_ROOM, []{return true;}), }); - areaTable[RR_DEKU_TREE_BOSS_ROOM] = Region("Deku Tree Boss Room", "Deku Tree", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BOSS_ROOM] = Region("Deku Tree Boss Room", SCENE_DEKU_TREE_BOSS, { // Events - EventAccess(&logic->DekuTreeClear, []{return logic->DekuTreeClear || logic->CanKillEnemy(RE_GOHMA);}), + EventAccess(&logic->DekuTreeClear, []{return logic->CanKillEnemy(RE_GOHMA);}), }, { // Locations - LOCATION(RC_QUEEN_GOHMA, logic->DekuTreeClear), - LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_HEART, logic->DekuTreeClear), + LOCATION(RC_QUEEN_GOHMA, logic->DekuTreeClear), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_HEART, logic->DekuTreeClear), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, logic->CanCutShrubs()), }, { // Exits - Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{return true;}), - Entrance(RR_KF_OUTSIDE_DEKU_TREE, []{return logic->DekuTreeClear;}, false), + Entrance(RR_DEKU_TREE_BOSS_EXIT, []{return true;}), + Entrance(RR_KF_OUTSIDE_DEKU_TREE, []{return logic->DekuTreeClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index bb5e1754f0..d8e64f9969 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -5,8 +5,9 @@ using namespace Rando; void RegionTable_Init_DodongosCavern() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_DODONGOS_CAVERN_ENTRYWAY] = Region("Dodongos Cavern Entryway", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_ENTRYWAY] = Region("Dodongos Cavern Entryway", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_BEGINNING, []{return ctx->GetDungeon(DODONGOS_CAVERN)->IsVanilla();}), Entrance(RR_DODONGOS_CAVERN_MQ_BEGINNING, []{return ctx->GetDungeon(DODONGOS_CAVERN)->IsMQ();}), @@ -15,13 +16,13 @@ void RegionTable_Init_DodongosCavern() { #pragma region Vanilla - areaTable[RR_DODONGOS_CAVERN_BEGINNING] = Region("Dodongos Cavern Beginning", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_BEGINNING] = Region("Dodongos Cavern Beginning", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_ENTRYWAY, []{return true;}), Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return Here(RR_DODONGOS_CAVERN_BEGINNING, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_LOBBY] = Region("Dodongos Cavern Lobby", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_LOBBY] = Region("Dodongos Cavern Lobby", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->GossipStoneFairy, []{return (Here(RR_DODONGOS_CAVERN_LOBBY, []{return logic->CanBreakMudWalls();}) || logic->HasItem(RG_GORONS_BRACELET)) && logic->CallGossipFairy();}), }, { @@ -42,13 +43,13 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_DODONGOS_CAVERN_LOBBY_SWITCH] = Region("Dodongos Cavern Lobby Switch", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_LOBBY_SWITCH] = Region("Dodongos Cavern Lobby Switch", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), Entrance(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_SE_CORRIDOR] = Region("Dodongos Cavern SE Corridor", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_SE_CORRIDOR] = Region("Dodongos Cavern SE Corridor", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_GS_SCARECROW, logic->CanUse(RG_SCARECROW) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_DC_SCARECROW_GS) && (logic->CanAttack()))), LOCATION(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, logic->CanBreakPots()), @@ -65,7 +66,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_SE_ROOM] = Region("Dodongos Cavern SE Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_SE_ROOM] = Region("Dodongos Cavern SE Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, logic->CanAttack()), }, { @@ -73,13 +74,13 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_SE_CORRIDOR, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS] = Region("Dodongos Cavern Near Lower Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS] = Region("Dodongos Cavern Near Lower Lizalfos", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_SE_CORRIDOR, []{return true;}), Entrance(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_LOWER_LIZALFOS] = Region("Dodongos Cavern Lower Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_LOWER_LIZALFOS] = Region("Dodongos Cavern Lower Lizalfos", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_LIZALFOS_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_LIZALFOS_POT_2, logic->CanBreakPots()), @@ -92,7 +93,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS, ED_CLOSE, true, 2);});}), }); - areaTable[RR_DODONGOS_CAVERN_DODONGO_ROOM] = Region("Dodongos Cavern Dodongo Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_DODONGO_ROOM] = Region("Dodongos Cavern Dodongo Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, logic->CanBreakPots()), @@ -105,7 +106,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM, []{return Here(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM] = Region("Dodongos Cavern Near Dodongo Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM] = Region("Dodongos Cavern Near Dodongo Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, logic->CanStunDeku()), }, { @@ -113,14 +114,14 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_STAIRS_LOWER] = Region("Dodongos Cavern Stairs Lower", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_STAIRS_LOWER] = Region("Dodongos Cavern Stairs Lower", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), - Entrance(RR_DODONGOS_CAVERN_STAIRS_UPPER, []{return logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));}), + Entrance(RR_DODONGOS_CAVERN_STAIRS_UPPER, []{return logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRS_WITH_BOW) && logic->CanUse(RG_FAIRY_BOW));}), Entrance(RR_DODONGOS_CAVERN_COMPASS_ROOM, []{return Here(RR_DODONGOS_CAVERN_STAIRS_LOWER, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_STAIRS_UPPER] = Region("Dodongos Cavern Stairs Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_STAIRS_UPPER] = Region("Dodongos Cavern Stairs Upper", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, Here(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return logic->HookshotOrBoomerang();}) || logic->CanUse(RG_LONGSHOT)), LOCATION(RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, logic->IsAdult || logic->CanAttack() || (HasAccessTo(RR_DODONGOS_CAVERN_STAIRS_LOWER) && logic->CanUse(RG_LONGSHOT) && ctx->GetTrickOption(RT_DC_VINES_GS))), @@ -134,7 +135,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_ARMOS_ROOM, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_COMPASS_ROOM] = Region("Dodongos Cavern Compass Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_COMPASS_ROOM] = Region("Dodongos Cavern Compass Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_COMPASS_CHEST, true), }, { @@ -142,24 +143,27 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_STAIRS_LOWER, []{return logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET);}), }); - areaTable[RR_DODONGOS_CAVERN_ARMOS_ROOM] = Region("Dodongos Cavern Armos Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_ARMOS_ROOM] = Region("Dodongos Cavern Armos Room", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_STAIRS_UPPER, []{return true;}), Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER] = Region("Dodongos Cavern Bomb Room Lower", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER] = Region("Dodongos Cavern Bomb Room Lower", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, true), LOCATION(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, true), + LOCATION(RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_BLADE_GRASS, logic->CanCutShrubs()), }, { //Exits + Entrance(RR_DODONGOS_CAVERN_ARMOS_ROOM, []{return true;}), Entrance(RR_DODONGOS_CAVERN_2F_SIDE_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return logic->CanBreakMudWalls() || (ctx->GetTrickOption(RT_DC_SCRUB_ROOM) && logic->HasItem(RG_GORONS_BRACELET));});}), Entrance(RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, []{return (logic->IsAdult && ctx->GetTrickOption(RT_DC_JUMP)) || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanJumpslash());}), }); - areaTable[RR_DODONGOS_CAVERN_2F_SIDE_ROOM] = Region("Dodongos Cavern 2F Side Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_2F_SIDE_ROOM] = Region("Dodongos Cavern 2F Side Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, logic->CanStunDeku()), LOCATION(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, logic->CanStunDeku()), @@ -168,17 +172,18 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM] = Region("Dodongos Cavern First Slingshot Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM] = Region("Dodongos Cavern First Slingshot Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return true;}), Entrance(RR_DODONGOS_CAVERN_UPPER_LIZALFOS, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || ctx->GetTrickOption(RT_DC_SLINGSHOT_SKIP);}), }); - areaTable[RR_DODONGOS_CAVERN_UPPER_LIZALFOS] = Region("Dodongos Cavern Upper Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_UPPER_LIZALFOS] = Region("Dodongos Cavern Upper Lizalfos", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, true), LOCATION(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, true), @@ -190,7 +195,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS, ED_CLOSE, true, 2);});}), }); - areaTable[RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM] = Region("Dodongos Cavern Second Slingshot Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM] = Region("Dodongos Cavern Second Slingshot Room", SCENE_DODONGOS_CAVERN, {}, { //Location LOCATION(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, logic->CanBreakPots()), @@ -200,7 +205,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || ctx->GetTrickOption(RT_DC_SLINGSHOT_SKIP);}), }); - areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER] = Region("Dodongos Cavern Bomb Room Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER] = Region("Dodongos Cavern Bomb Room Upper", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, true), LOCATION(RC_DODONGOS_CAVERN_BLADE_POT_1, logic->CanBreakPots()), @@ -212,7 +217,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_FAR_BRIDGE] = Region("Dodongos Cavern Far Bridge", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_FAR_BRIDGE] = Region("Dodongos Cavern Far Bridge", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, Here(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return logic->CanBreakMudWalls();})), }, { @@ -221,17 +226,20 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_BOSS_AREA] = Region("Dodongos Cavern Boss Region", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_BOSS_AREA] = Region("Dodongos Cavern Boss Region", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->FairyPot, []{return true;}), - }, {}, { + }, { + //Location + LOCATION(RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), Entrance(RR_DODONGOS_CAVERN_BACK_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOSS_AREA, []{return logic->CanBreakMudWalls();});}), Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_BACK_ROOM] = Region("Dodongos Cavern Back Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_BACK_ROOM] = Region("Dodongos Cavern Back Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_GS_BACK_ROOM, logic->CanAttack()), LOCATION(RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, logic->CanBreakPots()), @@ -247,19 +255,20 @@ void RegionTable_Init_DodongosCavern() { #pragma region MQ - areaTable[RR_DODONGOS_CAVERN_MQ_BEGINNING] = Region("Dodongos Cavern MQ Beginning", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_BEGINNING] = Region("Dodongos Cavern MQ Beginning", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_ENTRYWAY, []{return true;}), Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return Here(RR_DODONGOS_CAVERN_MQ_BEGINNING, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_LOBBY] = Region("Dodongos Cavern MQ Lobby", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_LOBBY] = Region("Dodongos Cavern MQ Lobby", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_MAP_CHEST, logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET)), LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, logic->CanStunDeku()), LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, logic->CanStunDeku()), }, { //Exits + Entrance(RR_DODONGOS_CAVERN_MQ_BEGINNING, []{return true;}), Entrance(RR_DODONGOS_CAVERN_MQ_GOSSIP_STONE, []{return Here(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), Entrance(RR_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE, []{return Here(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET);});}), Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return Here(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET);});}), @@ -268,7 +277,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return Here(RR_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE, []{return logic->HasExplosives() || (logic->ClearMQDCUpperLobbyRocks && logic->HasItem(RG_GORONS_BRACELET) && ((logic->IsAdult && ctx->GetTrickOption(RT_DC_MQ_ADULT_EYES)) || (logic->IsChild && ctx->GetTrickOption(RT_DC_MQ_CHILD_EYES))));});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_GOSSIP_STONE] = Region("Dodongos Cavern MQ Gossip Stone", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_GOSSIP_STONE] = Region("Dodongos Cavern MQ Gossip Stone", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), }, { @@ -281,7 +290,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE] = Region("Dodongos Cavern MQ Mouth Side Bridge", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE] = Region("Dodongos Cavern MQ Mouth Side Bridge", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->ClearMQDCUpperLobbyRocks, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE);}), }, {}, { @@ -293,23 +302,26 @@ void RegionTable_Init_DodongosCavern() { //it is possible to use bunny hood speed, hovers and a jumpslash to go between here and the other bridge (included with TORCH_ROOM_LOWER), but this would be a trick }); - areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER] = Region("Dodongos Cavern MQ Stairs Lower", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER] = Region("Dodongos Cavern MQ Stairs Lower", SCENE_DODONGOS_CAVERN, { //Events - //EventAccess(&logic->CanClimbDCStairs, []{return logic->HasExplosives || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));}), + //EventAccess(&logic->CanClimbDCStairs, []{return logic->HasExplosives || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRS_WITH_BOW) && logic->CanUse(RG_FAIRY_BOW));}), }, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, logic->CanBreakCrates()), }, { //Exits + Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return true;}), //This is possible with sticks and shield, igniting a first flower by "touch" then very quickly crouch stabbing in a way that cuts the corner to light the 3rd bomb on the other side, but that's a trick - Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return Here(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->HasExplosives() || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));});}), + Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return Here(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->HasExplosives() || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRS_WITH_BOW) && logic->CanUse(RG_FAIRY_BOW));});}), Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_MUD_WALL, []{return Here(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->CanBreakMudWalls();});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_MUD_WALL] = Region("Dodongos Cavern MQ Stairs Past Mud Wall", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_MUD_WALL] = Region("Dodongos Cavern MQ Stairs Past Mud Wall", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), //EventAccess(&logic->CanClimbDCStairs, []{return logic->HasItem(RG_GORONS_BRACELET) && (logic->CanUse(RG_STICKS));}), @@ -318,20 +330,24 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), }, { //Exits - Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return logic->HasItem(RG_GORONS_BRACELET) && (logic->CanUse(RG_STICKS));}), + Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return logic->HasExplosives() || (logic->HasItem(RG_GORONS_BRACELET) && (logic->CanUse(RG_STICKS) || ctx->GetTrickOption(RT_DC_MQ_STAIRS_WITH_ONLY_STRENGTH))) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRS_WITH_BOW) && logic->CanUse(RG_FAIRY_BOW));}), Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER] = Region("Dodongos Cavern MQ Stairs Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER] = Region("Dodongos Cavern MQ Stairs Upper", SCENE_DODONGOS_CAVERN, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, logic->CanStunDeku()), + LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, logic->CanStunDeku()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return true;}), Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS] = Region("Dodongos Cavern MQ Past Big Skulltulas", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS] = Region("Dodongos Cavern MQ Past Big Skulltulas", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->CanUse(RG_HOVER_BOOTS);}), Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->TakeDamage();}), @@ -341,16 +357,20 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM, []{return true;}),//if we add BONKO or other crate logic, logic for silver rupees goes here }); - areaTable[RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM] = Region("Dodongos Cavern MQ Dodongo Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM] = Region("Dodongos Cavern MQ Dodongo Room", SCENE_DODONGOS_CAVERN, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DODONGO) || logic->HasItem(RG_GORONS_BRACELET)), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DODONGO) || logic->HasItem(RG_GORONS_BRACELET)), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS, []{return true;}), Entrance(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_LOWER, []{return Here(RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM, []{return logic->CanKillEnemy(RE_DODONGO) || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_LOWER] = Region("Dodongos Cavern MQ Torch Puzzle Lower", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_LOWER] = Region("Dodongos Cavern MQ Torch Puzzle Lower", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->ClearMQDCUpperLobbyRocks, []{return (((logic->IsAdult /*or bunny hood jump*/) && ctx->GetTrickOption(RT_DC_JUMP)) || logic->CanUse(RG_HOVER_BOOTS)) && logic->CanUse(RG_STICKS);}), }, { @@ -367,7 +387,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return logic->CanUse(RG_STICKS) && logic->HasItem(RG_GORONS_BRACELET);}), //Implies access to RR_DODONGOS_CAVERN_MQ_BIG_BLOCK_ROOM from here }); - areaTable[RR_DODONGOS_CAVERN_MQ_BIG_BLOCK_ROOM] = Region("Dodongos Cavern MQ Torch Puzzle Lower", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_BIG_BLOCK_ROOM] = Region("Dodongos Cavern MQ Torch Puzzle Lower", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, logic->CanBreakPots()), @@ -377,16 +397,22 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return (logic->HasFireSource() && logic->HasItem(RG_GORONS_BRACELET)) || logic->CanBreakMudWalls();}), //Requires stregnth 0, If you can somehow warp into this room, add logic->CanPassEnemy(RE_BIG_SKULLTULA) }); - areaTable[RR_DODONGOS_CAVERN_MQ_LARVAE_ROOM] = Region("Dodongos Cavern MQ Larvae Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_LARVAE_ROOM] = Region("Dodongos Cavern MQ Larvae Room", SCENE_DODONGOS_CAVERN, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, true), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts - LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, true), //implied logic->CanKillEnemy(RE_GOLD_SKULTULLA) based on entry reqs. Add crate logic when BONKO is added + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, true), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts + LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, logic->CanBreakCrates()), //implied logic->CanKillEnemy(RE_GOLD_SKULTULLA) based on entry reqs. Add crate logic when BONKO is added + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_LOWER, []{return true;}), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts }); - areaTable[RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS] = Region("Dodongos Cavern MQ Before Upper Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS] = Region("Dodongos Cavern MQ Before Upper Lizalfos", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, logic->BlastOrSmash()), //Implied CanGetEnemyDrop(RE_GOLD_SKULLTULA) LOCATION(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, logic->CanBreakPots()), @@ -401,17 +427,19 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM] = Region("Dodongos Cavern MQ Before Upper Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM] = Region("Dodongos Cavern MQ Before Upper Lizalfos", SCENE_DODONGOS_CAVERN, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return true;}), Entrance(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_UPPER, []{return logic->IsAdult || (Here(RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM, []{return logic->BlastOrSmash() || (logic->CanAttack() && logic->HasItem(RG_GORONS_BRACELET));}));}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_UPPER] = Region("Dodongos Cavern MQ Torch Puzzle Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_UPPER] = Region("Dodongos Cavern MQ Torch Puzzle Upper", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->ClearMQDCUpperLobbyRocks, []{return logic->CanDetonateUprightBombFlower() || logic->CanUse(RG_MEGATON_HAMMER);}), }, { @@ -426,7 +454,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE] = Region("Dodongos Cavern MQ Lower Right Side", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE] = Region("Dodongos Cavern MQ Lower Right Side", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, (logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET)) && logic->CanStunDeku()), LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, logic->CanBreakPots()), @@ -439,7 +467,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS, []{return Here(RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);}) && logic->CanHitEyeTargets();}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS] = Region("Dodongos Cavern MQ Lower Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS] = Region("Dodongos Cavern MQ Lower Lizalfos", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, true), }, { @@ -448,33 +476,43 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_POES_ROOM] = Region("Dodongos Cavern MQ Poes Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_POES_ROOM] = Region("Dodongos Cavern MQ Poes Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, true), //If you can get to the locked part of POES_ROOM without a way to open it or passing the chest, this will need it's own room LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);}) && //could be a seperate room if it gets busy logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG, true))), //Implies you can avoid/kill the enemies with what you use on the skull, if this assumption is broken, add //&& (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);}) || (logic->CanAvoidEnemy(RE_FIRE_KEESE) && logic->CanAvoidEnemy(RE_MAD_SCRUB))) - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, logic->CanBreakPots()), - }, { + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, logic->CanBreakCrates()), + }, { //Exits - Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), - Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS, []{return true;}), - Entrance(RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), + Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), + Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS, []{return true;}), + Entrance(RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM] = Region("Dodongos Cavern Mad Scrub Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM] = Region("Dodongos Cavern Mad Scrub Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, (logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG, true))), //Implies you can avoid/kill the enemies with what you use on the skull, if this assumption is broken, add //&& (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);}) || (logic->CanAvoidEnemy(RE_FIRE_KEESE) && logic->CanAvoidEnemy(RE_MAD_SCRUB))) + LOCATION(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH] = Region("Dodongos Cavern MQ Behind Mouth", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH] = Region("Dodongos Cavern MQ Behind Mouth", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, logic->CanBreakPots()), @@ -489,11 +527,12 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE, []{return logic->IsAdult;}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE] = Region("Dodongos Cavern MQ Back Behind Fire", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE] = Region("Dodongos Cavern MQ Back Behind Fire", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, true), //pulling the grave isn't required, as you can open the chest through it LOCATION(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return logic->CanAttack();}), @@ -501,7 +540,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE, []{return Here(RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE, []{return logic->CanDetonateBombFlowers();}) || Here(RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE, []{return logic->CanAttack();});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE] = Region("Dodongos Cavern MQ BossArea", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE] = Region("Dodongos Cavern MQ BossArea", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -510,6 +549,7 @@ void RegionTable_Init_DodongosCavern() { Here(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return (logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) /* || bunny jumps*/);})), LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE, []{return true;}), @@ -519,16 +559,24 @@ void RegionTable_Init_DodongosCavern() { #pragma endregion // Boss Room - areaTable[RR_DODONGOS_CAVERN_BOSS_ENTRYWAY] = Region("Dodongos Cavern Boss Entryway", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_BOSS_ENTRYWAY] = Region("Dodongos Cavern Boss Entryway", SCENE_DODONGOS_CAVERN, {}, {}, { + // Exits + Entrance(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return true;}), + }); + + areaTable[RR_DODONGOS_CAVERN_BOSS_EXIT] = Region("Dodongos Cavern Boss Exit", SCENE_DODONGOS_CAVERN, {}, {}, { // Exits Entrance(RR_DODONGOS_CAVERN_BOSS_AREA, []{return ctx->GetDungeon(DODONGOS_CAVERN)->IsVanilla();}), Entrance(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return ctx->GetDungeon(DODONGOS_CAVERN)->IsMQ();}), - Entrance(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_BOSS_ROOM] = Region("Dodongos Cavern Boss Room", "Dodongos Cavern", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_BOSS_ROOM] = Region("Dodongos Cavern Boss Room", SCENE_DODONGOS_CAVERN_BOSS, { // Events - EventAccess(&logic->DodongosCavernClear, []{return logic->DodongosCavernClear || (Here(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return logic->HasExplosives() || (logic->CanUse(RG_MEGATON_HAMMER) && ctx->GetTrickOption(RT_DC_HAMMER_FLOOR));}) && logic->CanKillEnemy(RE_KING_DODONGO)); /*todo add chu kill to tricks*/}), + // Blue Fire Arrows need similar accuracy as hammer trick, only put in logic when both hammer & blue fire tricks enabled + EventAccess(&logic->DodongosCavernClear, []{return Here(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return logic->HasExplosives() || + (ctx->GetTrickOption(RT_DC_HAMMER_FLOOR) ? logic->CanUse(RG_MEGATON_HAMMER) || (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && logic->BlueFire()) : + ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE));}) + && logic->CanKillEnemy(RE_KING_DODONGO);}), }, { // Locations LOCATION(RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, true), @@ -536,7 +584,9 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_KING_DODONGO, logic->DodongosCavernClear), }, { // Exits - Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, []{return true;}), - Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return logic->DodongosCavernClear;}, false), + Entrance(RR_DODONGOS_CAVERN_BOSS_EXIT, []{return true;}), + Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return logic->DodongosCavernClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 1e7214a3d9..f57d6bd218 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -5,8 +5,9 @@ using namespace Rando; void RegionTable_Init_FireTemple() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_FIRE_TEMPLE_ENTRYWAY] = Region("Fire Temple Entryway", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_ENTRYWAY] = Region("Fire Temple Entryway", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, []{return ctx->GetDungeon(FIRE_TEMPLE)->IsVanilla();}), Entrance(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER, []{return ctx->GetDungeon(FIRE_TEMPLE)->IsMQ();}), @@ -15,18 +16,18 @@ void RegionTable_Init_FireTemple() { #pragma region Vanilla - areaTable[RR_FIRE_TEMPLE_FIRST_ROOM] = Region("Fire Temple First Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRST_ROOM] = Region("Fire Temple First Room", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_ENTRYWAY, []{return true;}), Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return logic->FireTimer() >= 24;}), - Entrance(RR_FIRE_TEMPLE_LOOP_ENEMIES, []{return Here(RR_FIRE_TEMPLE_FIRST_ROOM, []{return logic->CanUse(RG_MEGATON_HAMMER);}) && (logic->SmallKeys(RR_FIRE_TEMPLE, 8) || !logic->IsKeysanity);}), + Entrance(RR_FIRE_TEMPLE_LOOP_ENEMIES, []{return Here(RR_FIRE_TEMPLE_FIRST_ROOM, []{return logic->CanUse(RG_MEGATON_HAMMER);}) && (logic->SmallKeys(RR_FIRE_TEMPLE, 8) || !logic->IsFireLoopLocked);}), Entrance(RR_FIRE_TEMPLE_LOOP_EXIT, []{return true;}), Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 2) && logic->FireTimer() >= 24;}), }); - areaTable[RR_FIRE_TEMPLE_NEAR_BOSS_ROOM] = Region("Fire Temple Near Boss Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_NEAR_BOSS_ROOM] = Region("Fire Temple Near Boss Room", SCENE_FIRE_TEMPLE, { //Events - EventAccess(&logic->FairyPot, []{return logic->FairyPot || (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT));}), + EventAccess(&logic->FairyPot, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT);}), }, { //Locations LOCATION(RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, true), @@ -37,16 +38,16 @@ void RegionTable_Init_FireTemple() { }, { //Exits Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, []{return true;}), - Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_FIRE_TEMPLE_BOSS_KEY) && ((logic->IsAdult && (ctx->GetTrickOption(RT_FIRE_BOSS_DOOR_JUMP) || Here(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);}))) || logic->CanUse(RG_HOVER_BOOTS));}), + Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return logic->IsAdult && (ctx->GetTrickOption(RT_FIRE_BOSS_DOOR_JUMP) || Here(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);}) || logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_ENEMIES] = Region("Fire Temple Loop Enemies", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_ENEMIES] = Region("Fire Temple Loop Enemies", SCENE_FIRE_TEMPLE, {}, {}, { //Exits - Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 8) || !logic->IsKeysanity;}), + Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 8) || !logic->IsFireLoopLocked;}), Entrance(RR_FIRE_TEMPLE_LOOP_TILES, []{return Here(RR_FIRE_TEMPLE_LOOP_ENEMIES, []{return logic->CanKillEnemy(RE_TORCH_SLUG) && logic->CanKillEnemy(RE_FIRE_KEESE);});}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_TILES] = Region("Fire Temple Loop Tiles", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_TILES] = Region("Fire Temple Loop Tiles", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, logic->CanAttack()), }, { @@ -55,7 +56,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_LOOP_FLARE_DANCER, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_FLARE_DANCER] = Region("Fire Temple Loop Flare Dancer", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_FLARE_DANCER] = Region("Fire Temple Loop Flare Dancer", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, (logic->HasExplosives() || logic->CanUse(RG_MEGATON_HAMMER)) && logic->IsAdult), }, { @@ -64,16 +65,16 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_LOOP_HAMMER_SWITCH, []{return Here(RR_FIRE_TEMPLE_LOOP_FLARE_DANCER, []{return logic->CanKillEnemy(RE_FLARE_DANCER);});}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_HAMMER_SWITCH] = Region("Fire Temple Loop Hammer Switch", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_LOOP_HAMMER_SWITCH] = Region("Fire Temple Loop Hammer Switch", SCENE_FIRE_TEMPLE, { //Events - EventAccess(&logic->FireLoopSwitch, []{return logic->FireLoopSwitch || logic->CanUse(RG_MEGATON_HAMMER);}), + EventAccess(&logic->FireLoopSwitch, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }, {}, { //Exits Entrance(RR_FIRE_TEMPLE_LOOP_FLARE_DANCER, []{return true;}), Entrance(RR_FIRE_TEMPLE_LOOP_GORON_ROOM, []{return logic->FireLoopSwitch;}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_GORON_ROOM] = Region("Fire Temple Loop Goron Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_GORON_ROOM] = Region("Fire Temple Loop Goron Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BOSS_KEY_CHEST, true), }, { @@ -82,13 +83,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_LOOP_EXIT, []{return logic->FireLoopSwitch;}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_EXIT] = Region("Fire Temple Loop Exit", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_EXIT] = Region("Fire Temple Loop Exit", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, []{return true;}), Entrance(RR_FIRE_TEMPLE_LOOP_GORON_ROOM, []{return logic->FireLoopSwitch;}), }); - areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM] = Region("Fire Temple Big Lava Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM] = Region("Fire Temple Big Lava Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BIG_LAVA_POT_1, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_BIG_LAVA_POT_2, logic->CanBreakPots()), @@ -102,7 +103,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 3);}), }); - areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_GORON] = Region("Fire Temple Big Lava Room North Goron", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_GORON] = Region("Fire Temple Big Lava Room North Goron", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, true), }, { @@ -110,7 +111,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_TILES] = Region("Fire Temple Big Lava Room North Tiles", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_TILES] = Region("Fire Temple Big Lava Room North Tiles", SCENE_FIRE_TEMPLE, {}, { //Locations //RANDOTODO check if child can reach LOCATION(RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, (logic->IsAdult && logic->CanAttack()) || logic->HookshotOrBoomerang()), @@ -119,7 +120,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_SOUTH_GORON] = Region("Fire Temple Big Lava Room South Goron", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_SOUTH_GORON] = Region("Fire Temple Big Lava Room South Goron", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, true), }, { @@ -127,7 +128,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM] = Region("Fire Temple Fire Pillar Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM] = Region("Fire Temple Fire Pillar Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, logic->FireTimer() >= 56), LOCATION(RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, logic->FireTimer() >= 56), @@ -138,7 +139,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_SHORTCUT_ROOM, []{return logic->FireTimer() >= 56 && logic->SmallKeys(RR_FIRE_TEMPLE, 4);}), }); - areaTable[RR_FIRE_TEMPLE_SHORTCUT_ROOM] = Region("Fire Temple Shortcut Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_SHORTCUT_ROOM] = Region("Fire Temple Shortcut Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, Here(RR_FIRE_TEMPLE_SHORTCUT_CLIMB, []{return true;})), }, { @@ -148,13 +149,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, []{return logic->IsAdult && (logic->HasItem(RG_GORONS_BRACELET) || ctx->GetTrickOption(RT_FIRE_STRENGTH)) && (logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_SLINGSHOT));}), }); - areaTable[RR_FIRE_TEMPLE_SHORTCUT_CLIMB] = Region("Fire Temple Shortcut Climb", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_SHORTCUT_CLIMB] = Region("Fire Temple Shortcut Climb", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_SHORTCUT_ROOM, []{return true;}), Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER] = Region("Fire Temple Boulder Maze Lower", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER] = Region("Fire Temple Boulder Maze Lower", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, true), LOCATION(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, logic->HasExplosives() && (logic->IsAdult || logic->HookshotOrBoomerang())), @@ -166,7 +167,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER, []{return false;}), }); - areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER_SIDE_ROOM] = Region("Fire Temple Boulder Maze Lower Side Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER_SIDE_ROOM] = Region("Fire Temple Boulder Maze Lower Side Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, true), }, { @@ -174,7 +175,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM] = Region("Fire Temple East Central Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM] = Region("Fire Temple East Central Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, true), LOCATION(RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, true), @@ -187,7 +188,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MAP_AREA, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW);}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_WALL_CHASE] = Region("Fire Temple Fire Wall Chase", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_WALL_CHASE] = Region("Fire Temple Fire Wall Chase", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, logic->FireTimer() >= 24 && (logic->IsAdult || logic->CanUse(RG_BOOMERANG))), LOCATION(RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, logic->FireTimer() >= 24 && (logic->IsAdult || logic->CanUse(RG_BOOMERANG))), @@ -200,7 +201,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_CORRIDOR, []{return logic->FireTimer() >= 24 && logic->IsAdult && logic->SmallKeys(RR_FIRE_TEMPLE, 7);}), }); - areaTable[RR_FIRE_TEMPLE_MAP_AREA] = Region("Fire Temple Map Region", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MAP_AREA] = Region("Fire Temple Map Region", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MAP_CHEST, true), }, { @@ -208,7 +209,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER] = Region("Fire Temple Boulder Maze Upper", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER] = Region("Fire Temple Boulder Maze Upper", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, true), }, { @@ -219,7 +220,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_SCARECROW_ROOM, []{return logic->CanUse(RG_SCARECROW) || (ctx->GetTrickOption(RT_FIRE_SCARECROW) && logic->IsAdult && logic->CanUse(RG_LONGSHOT));}), }); - areaTable[RR_FIRE_TEMPLE_SCARECROW_ROOM] = Region("Fire Temple Scarecrow Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_SCARECROW_ROOM] = Region("Fire Temple Scarecrow Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, logic->CanJumpslashExceptHammer() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE)), }, { @@ -228,7 +229,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_EAST_PEAK, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_EAST_PEAK] = Region("Fire Temple East Peak", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_EAST_PEAK] = Region("Fire Temple East Peak", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_SCARECROW_CHEST, true), LOCATION(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, logic->CanUseProjectile()), @@ -238,13 +239,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM, []{return logic->TakeDamage();}), }); - areaTable[RR_FIRE_TEMPLE_CORRIDOR] = Region("Fire Temple Corridor", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_CORRIDOR] = Region("Fire Temple Corridor", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_FIRE_WALL_CHASE, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 7);}), Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_ROOM] = Region("Fire Temple Fire Maze Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_ROOM] = Region("Fire Temple Fire Maze Room", SCENE_FIRE_TEMPLE, {}, { // Locations LOCATION(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, logic->CanBreakPots()), @@ -259,14 +260,14 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_LATE_FIRE_MAZE, []{return ctx->GetTrickOption(RT_FIRE_FLAME_MAZE) || false;}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_UPPER] = Region("Fire Temple Fire Maze Upper", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_UPPER] = Region("Fire Temple Fire Maze Upper", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return logic->CanUse(RG_MEGATON_HAMMER);}), Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, []{return true;}), Entrance(RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_SIDE_ROOM] = Region("Fire Temple Fire Maze Side Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_SIDE_ROOM] = Region("Fire Temple Fire Maze Side Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_COMPASS_CHEST, true), }, { @@ -274,7 +275,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_WEST_CENTRAL_LOWER] = Region("Fire Temple West Central Lower", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_CENTRAL_LOWER] = Region("Fire Temple West Central Lower", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, Here(RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER, []{return (logic->CanUse(RG_SONG_OF_TIME) || ctx->GetTrickOption(RT_RUSTED_SWITCHES)) && logic->CanUse(RG_MEGATON_HAMMER);})), }, { @@ -284,14 +285,14 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_LATE_FIRE_MAZE, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER] = Region("Fire Temple West Central Upper", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER] = Region("Fire Temple West Central Upper", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, []{return true;}), Entrance(RR_FIRE_TEMPLE_WEST_CENTRAL_LOWER, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_LATE_FIRE_MAZE] = Region("Fire Temple Late Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_LATE_FIRE_MAZE] = Region("Fire Temple Late Fire Maze", SCENE_FIRE_TEMPLE, {}, { // Locations LOCATION(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, logic->CanBreakPots()), @@ -304,19 +305,19 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return logic->HasExplosives();}), }); - areaTable[RR_FIRE_TEMPLE_UPPER_FLARE_DANCER] = Region("Fire Temple Upper Flare Dancer", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_UPPER_FLARE_DANCER] = Region("Fire Temple Upper Flare Dancer", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_LATE_FIRE_MAZE, []{return Here(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return logic->CanKillEnemy(RE_FLARE_DANCER);});}), Entrance(RR_FIRE_TEMPLE_WEST_CLIMB, []{return Here(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return logic->CanKillEnemy(RE_FLARE_DANCER);});}), }); - areaTable[RR_FIRE_TEMPLE_WEST_CLIMB] = Region("Fire Temple West Climb", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_CLIMB] = Region("Fire Temple West Climb", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return true;}), Entrance(RR_FIRE_TEMPLE_WEST_PEAK, []{return logic->CanUseProjectile();}), }); - areaTable[RR_FIRE_TEMPLE_WEST_PEAK] = Region("Fire Temple West Peak", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_PEAK] = Region("Fire Temple West Peak", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, true), }, { @@ -326,12 +327,17 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_HAMMER_RETURN_PATH, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); - areaTable[RR_FIRE_TEMPLE_HAMMER_RETURN_PATH] = Region("Fire Temple Hammer Return Path", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_HAMMER_RETURN_PATH] = Region("Fire Temple Hammer Return Path", SCENE_FIRE_TEMPLE, {}, { + // Locations + LOCATION(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); - areaTable[RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE] = Region("Fire Temple Above Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE] = Region("Fire Temple Above Fire Maze", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_HAMMER_RETURN_PATH, []{return true;}), Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);}), @@ -342,7 +348,7 @@ void RegionTable_Init_FireTemple() { #pragma region MQ //potentially dangerous temp flag on the first room's torches, should be made permanent if possible - areaTable[RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER] = Region("Fire Temple MQ First Room Lower", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER] = Region("Fire Temple MQ First Room Lower", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, logic->CanBreakPots()), @@ -354,14 +360,14 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_STALFOS_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 5);}), }); - areaTable[RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER] = Region("Fire Temple MQ First Room Upper", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER] = Region("Fire Temple MQ First Room Upper", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER, []{return true;}), - Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return logic->HasFireSource();}), + Entrance(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, []{return logic->HasFireSource();}), Entrance(RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM, []{return Here(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);});}), }); - areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_SOUTH] = Region("Fire Temple MQ Map Room South", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_SOUTH] = Region("Fire Temple MQ Map Room South", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, logic->CanKillEnemy(RE_LIKE_LIKE)), }, { @@ -370,7 +376,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_MAP_ROOM_CAGE, []{return logic->OpenedLowestGoronCage;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_STALFOS_ROOM] = Region("Fire Temple MQ Stalfos Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_STALFOS_ROOM] = Region("Fire Temple MQ Stalfos Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { @@ -379,7 +385,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_IRON_KNUCKLE_ROOM, []{return Here(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2);});}), }); - areaTable[RR_FIRE_TEMPLE_MQ_IRON_KNUCKLE_ROOM] = Region("Fire Temple MQ Iron Knuckle Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_IRON_KNUCKLE_ROOM] = Region("Fire Temple MQ Iron Knuckle Room", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -399,7 +405,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_LOWER_FLARE_DANCER, []{return Here(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);});}), }); - areaTable[RR_FIRE_TEMPLE_MQ_LOWER_FLARE_DANCER] = Region("Fire Temple MQ Lower Flare Dancer", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_LOWER_FLARE_DANCER] = Region("Fire Temple MQ Lower Flare Dancer", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, (logic->IsAdult || logic->CanUse(RG_HOOKSHOT)) && Here(RR_FIRE_TEMPLE_MQ_LOWER_FLARE_DANCER, []{return logic->CanKillEnemy(RE_FLARE_DANCER);})), }, { @@ -408,7 +414,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_MAP_ROOM_NORTH, []{return Here(RR_FIRE_TEMPLE_MQ_LOWER_FLARE_DANCER, []{return logic->CanKillEnemy(RE_FLARE_DANCER);});}), }); - areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_NORTH] = Region("Fire Temple MQ Map Room North", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_NORTH] = Region("Fire Temple MQ Map Room North", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->OpenedLowestGoronCage, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }, {}, { @@ -417,7 +423,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_MAP_ROOM_CAGE, []{return logic->OpenedLowestGoronCage;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_CAGE] = Region("Fire Temple MQ Map Room Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_CAGE] = Region("Fire Temple MQ Map Room Cage", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_MAP_CHEST, true), }, { @@ -426,21 +432,24 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_MAP_ROOM_SOUTH, []{return logic->OpenedLowestGoronCage;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM] = Region("Fire Temple MQ Near Boss Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM] = Region("Fire Temple MQ Near Boss Room", SCENE_FIRE_TEMPLE, {}, { //Locations //If we're using the south torch as the initial torch, or using FAs, we either have to cross to the north to remove the crate, or use a trick to ignore it - LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->FireTimer() > 25 && ctx->GetTrickOption(RT_FIRE_MQ_NEAR_BOSS) && (logic->CanUse(RG_FIRE_ARROWS) || (logic->IsAdult && logic->CanUse(RG_DINS_FIRE) && logic->CanUse(RG_FAIRY_BOW)))) + LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->FireTimer() > 25 && ctx->GetTrickOption(RT_FIRE_MQ_NEAR_BOSS) && (logic->CanUse(RG_FIRE_ARROWS) || (logic->IsAdult && logic->CanUse(RG_DINS_FIRE) && logic->CanUse(RG_FAIRY_BOW)))), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, logic->FireTimer() > 25 && logic->CanBreakCrates()), + }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER, []{return true;}), //Child cannot make it to the north side torches without a hook without specifically bunny hood speed + hover boots Entrance(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM_NORTH, []{return logic->FireTimer() > 32 && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)));}), - Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_FIRE_TEMPLE_BOSS_KEY) && logic->FireTimer() >= 15 && ((logic->IsAdult && (ctx->GetTrickOption(RT_FIRE_BOSS_DOOR_JUMP) || logic->CanUse(RG_HOVER_BOOTS))) || (logic->IsAdult && logic->HitFireTemplePlatform) || (logic->HitFireTemplePlatform && logic->CanUse(RG_HOVER_BOOTS)));}), + Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return logic->FireTimer() >= 15 && ((logic->IsAdult && (ctx->GetTrickOption(RT_FIRE_BOSS_DOOR_JUMP) || logic->CanUse(RG_HOVER_BOOTS))) || (logic->IsAdult && logic->HitFireTemplePlatform) || (logic->HitFireTemplePlatform && logic->CanUse(RG_HOVER_BOOTS)));}), }); //This room assumes tunic logic is handled on entry. //Covers the upper section too, as all methods to reach this can climb up somehow - areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM_NORTH] = Region("Fire Temple MQ Near Boss Room North", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM_NORTH] = Region("Fire Temple MQ Near Boss Room North", SCENE_FIRE_TEMPLE, {}, { //Locations //If we have FAs, we can just remove the crate and use those to light the torches. //otherwise, with Dins, we first light them with dins and then either use a bow shot or to cross back over to light the other torch @@ -449,15 +458,21 @@ void RegionTable_Init_FireTemple() { //Fairies cannot be used for this as it is time sensetive, and NL is only useful with sticks as it disables other magic while in use, so it's tunic or raw damage taking ability. //testing tells me you take 3 ticks of lava damage, which is 12 internal damage or 3/4 of a heart at x1 damage multiplier, performing this run //logic->EffectiveHealth() works in half hearts for whatever reason, meaning this needs a deeper refactor to be perfect, but it should be good enough for now - LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_GORON_TUNIC) || logic->EffectiveHealth() >= 2 || (logic->CanUse(RG_NAYRUS_LOVE) && logic->CanUse(RG_STICKS))))))), - LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, logic->CanBreakPots()), - LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_GORON_TUNIC) || logic->EffectiveHealth() >= 2 || (logic->CanUse(RG_NAYRUS_LOVE) && logic->CanUse(RG_STICKS))))))), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM] = Region("Fire Temple MQ Big Lava Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM] = Region("Fire Temple MQ Big Lava Room", SCENE_FIRE_TEMPLE, {}, { //Locations //I'm currently assuming the oversight version of RT_FIRE_MQ_BK_CHEST for the fire timer logic LOCATION(RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, logic->FireTimer() >= 40 && logic->HasFireSource() && logic->HasExplosives() && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && ctx->GetTrickOption(RT_FIRE_MQ_BLOCKED_CHEST)))), @@ -474,7 +489,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_TORCH_FIREWALL_ROOM, []{return logic->HasFireSource() && ((logic->CanUse(RG_FAIRY_BOW) && logic->FireTimer() >= 25) || (ctx->GetTrickOption(RT_FIRE_MQ_BK_CHEST) && logic->FireTimer() >= 50)) && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && ctx->GetTrickOption(RT_FIRE_SOT)));}), }); - areaTable[RR_FIRE_TEMPLE_MQ_TORCH_FIREWALL_ROOM] = Region("Fire Temple MQ Torch Firewall Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_TORCH_FIREWALL_ROOM] = Region("Fire Temple MQ Torch Firewall Room", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return logic->CanUse(RG_HOOKSHOT);}), }, { @@ -488,7 +503,7 @@ void RegionTable_Init_FireTemple() { }); //This room assumes Goron Tunic until looser tunic requirements tricks are made - areaTable[RR_FIRE_TEMPLE_MQ_ELEVATOR_ROOM] = Region("Fire Temple MQ Elevator Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_ELEVATOR_ROOM] = Region("Fire Temple MQ Elevator Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, true), LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, true), @@ -499,14 +514,14 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_BIG_TORCH_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_BIG_TORCH_ROOM] = Region("Fire Temple MQ Big Torch Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_BIG_TORCH_ROOM] = Region("Fire Temple MQ Big Torch Room", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_LOWER_MAZE, []{return (logic->HasFireSource() && logic->CanUse(RG_HOOKSHOT)) || (ctx->GetTrickOption(RT_FIRE_MQ_CLIMB) && logic->CanUse(RG_HOVER_BOOTS));}), Entrance(RR_FIRE_TEMPLE_MQ_ELEVATOR_ROOM, []{return logic->CanUse(RG_GORON_TUNIC);}), Entrance(RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT_CAGE, []{return logic->OpenedUpperFireShortcut;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE] = Region("Fire Temple MQ Lower Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE] = Region("Fire Temple MQ Lower Maze", SCENE_FIRE_TEMPLE, {}, { //Locations //Check handled on both floors LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, logic->HasExplosives() && ctx->GetTrickOption(RT_FIRE_MQ_MAZE_SIDE_ROOM)), @@ -519,9 +534,12 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_UPPER_MAZE, []{return logic->HasExplosives() && logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE_CRATE_CAGE] = Region("Fire Temple MQ Lower Maze Crate Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE_CRATE_CAGE] = Region("Fire Temple MQ Lower Maze Crate Cage", SCENE_FIRE_TEMPLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_LOWER_MAZE, []{return true;}), @@ -529,7 +547,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_UPPER_MAZE, []{return logic->IsAdult && ((ctx->GetTrickOption(RT_FIRE_MQ_MAZE_HOVERS) && logic->CanUse(RG_HOVER_BOOTS)) || ctx->GetTrickOption(RT_FIRE_MQ_MAZE_JUMP));}), }); - areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE] = Region("Fire Temple MQ Upper Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE] = Region("Fire Temple MQ Upper Maze", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_LOWER_MAZE, []{return true;}), //this cage is much more lenient than the lower cage as the switch is close to the front. sling, rang and bow all hit the switch easily, though might be too unintuitive for default logic @@ -541,9 +559,14 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 3) && logic->CanUse(RG_GORON_TUNIC);}), }); - areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE_BOX_CAGE] = Region("Fire Temple MQ Upper Maze Box Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE_BOX_CAGE] = Region("Fire Temple MQ Upper Maze Box Cage", SCENE_FIRE_TEMPLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), //Assumes maze access LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, logic->HasExplosives()), }, { @@ -551,7 +574,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_UPPER_MAZE, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT] = Region("Fire Temple MQ Maze Shortcut", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT] = Region("Fire Temple MQ Maze Shortcut", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->OpenedUpperFireShortcut, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }, {}, { @@ -560,9 +583,15 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT_CAGE, []{return logic->OpenedUpperFireShortcut;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT_CAGE] = Region("Fire Temple MQ Maze Shortcut Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT_CAGE] = Region("Fire Temple MQ Maze Shortcut Cage", SCENE_FIRE_TEMPLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, logic->OpenedUpperFireShortcut;), + LOCATION(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, logic->OpenedUpperFireShortcut;), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT, []{return logic->OpenedUpperFireShortcut;}), @@ -570,7 +599,7 @@ void RegionTable_Init_FireTemple() { }); - areaTable[RR_FIRE_TEMPLE_MQ_BURNING_BLOCK_CLIMB] = Region("Fire Temple MQ Burning Block Climb", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_BURNING_BLOCK_CLIMB] = Region("Fire Temple MQ Burning Block Climb", SCENE_FIRE_TEMPLE, { //Events //EventAccess(&WallFairy, []{return logic->CanUse(RG_HOOKSHOT);}), }, { @@ -583,7 +612,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_NARROW_PATH_ROOM, []{return logic->TakeDamage();}), }); - areaTable[RR_FIRE_TEMPLE_MQ_NARROW_PATH_ROOM] = Region("Fire Temple MQ Narrow Path Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_NARROW_PATH_ROOM] = Region("Fire Temple MQ Narrow Path Room", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -597,10 +626,20 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM, []{return logic->TakeDamage();}), }); - areaTable[RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM] = Region("Fire Temple MQ High Torch Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM] = Region("Fire Temple MQ High Torch Room", SCENE_FIRE_TEMPLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, logic->CanBreakPots()), - LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_UPPER_MAZE, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 3);}), @@ -609,7 +648,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE, []{return Here(RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM, []{return logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_HOOKSHOT));}) && (logic->IsAdult || logic->CanUse(RG_HOOKSHOT));}), }); - areaTable[RR_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE] = Region("Fire Temple MQ South Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE] = Region("Fire Temple MQ South Fire Maze", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, logic->HasExplosives()), LOCATION(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, logic->CanBreakPots()), @@ -624,7 +663,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_WEST_FIRE_MAZE, []{return logic->OpenedFireMQFireMazeDoor;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_FIRE_MAZE_PLATFORMS] = Region("Fire Temple MQ Fire Maze Platforms", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_FIRE_MAZE_PLATFORMS] = Region("Fire Temple MQ Fire Maze Platforms", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->HitFireTemplePlatform, []{return logic->CanUse(RG_MEGATON_HAMMER);}), EventAccess(&logic->OpenedFireMQFireMazeDoor, []{return logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_HOOKSHOT);}), @@ -634,7 +673,7 @@ void RegionTable_Init_FireTemple() { //trick to get to RR_FIRE_TEMPLE_MQ_WEST_FIRE_MAZE with hovers + taking damage is plausible }); - areaTable[RR_FIRE_TEMPLE_MQ_NORTH_FIRE_MAZE] = Region("Fire Temple MQ North Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_NORTH_FIRE_MAZE] = Region("Fire Temple MQ North Fire Maze", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), LOCATION(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, logic->CanUse(RG_BOOMERANG)), @@ -646,13 +685,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_WEST_FIRE_MAZE, []{return (bool)ctx->GetTrickOption(RT_FIRE_MQ_FLAME_MAZE);}), }); - areaTable[RR_FIRE_TEMPLE_MQ_WEST_FIRE_MAZE] = Region("Fire Temple MQ West Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_WEST_FIRE_MAZE] = Region("Fire Temple MQ West Fire Maze", SCENE_FIRE_TEMPLE, {}, {}, { Entrance(RR_FIRE_TEMPLE_MQ_FIRE_MAZE_PAST_WALL, []{return true;}), Entrance(RR_FIRE_TEMPLE_MQ_NORTH_FIRE_MAZE, []{return (bool)ctx->GetTrickOption(RT_FIRE_MQ_FLAME_MAZE);}), }); //this area exists for the pots in case we void warp to the top of fire somehow, because there's no way to get back the way we came - areaTable[RR_FIRE_TEMPLE_MQ_FIRE_MAZE_PAST_WALL] = Region("Fire Temple MQ Fire Maze Past Wall", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_FIRE_MAZE_PAST_WALL] = Region("Fire Temple MQ Fire Maze Past Wall", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, logic->CanBreakPots()), @@ -661,7 +700,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_UPPER_FLARE_DANCER, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_UPPER_FLARE_DANCER] = Region("Fire Temple MQ North Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_UPPER_FLARE_DANCER] = Region("Fire Temple MQ North Fire Maze", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, logic->CanKillEnemy(RE_FLARE_DANCER)), }, { @@ -669,7 +708,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_SCARECROW_ROOM, []{return logic->CanKillEnemy(RE_FLARE_DANCER) && logic->SmallKeys(RR_FIRE_TEMPLE, 4);}), }); - areaTable[RR_FIRE_TEMPLE_MQ_SCARECROW_ROOM] = Region("Fire Temple MQ Scarecrow Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_SCARECROW_ROOM] = Region("Fire Temple MQ Scarecrow Room", SCENE_FIRE_TEMPLE, {}, { //Locations //This requires nothing in N64 logic, but is tight enough to need rollspam with the one-point on which is stricter than I would normally consider in logic //Child basically needs the scarecrow or a bunny hood though due to a worse ledge grab. @@ -684,7 +723,7 @@ void RegionTable_Init_FireTemple() { }); //The peg knocked down from here could have logical implications for child in the fire maze if tricks to gain height like bomb jumps exist - areaTable[RR_FIRE_TEMPLE_MQ_COLLAPSED_STAIRS] = Region("Fire Temple MQ Collapsed Stairs", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_COLLAPSED_STAIRS] = Region("Fire Temple MQ Collapsed Stairs", SCENE_FIRE_TEMPLE, {}, { //Locations //If someone manages to make a trick to get here from fire maze, this needs to be in a separate room as the door back is barred LOCATION(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_MAZE, logic->CanUse(RG_HOOKSHOT)), @@ -696,16 +735,16 @@ void RegionTable_Init_FireTemple() { #pragma endregion // Boss Room - areaTable[RR_FIRE_TEMPLE_BOSS_ENTRYWAY] = Region("Fire Temple Boss Entryway", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_BOSS_ENTRYWAY] = Region("Fire Temple Boss Entryway", SCENE_FIRE_TEMPLE, {}, {}, { // Exits Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return ctx->GetDungeon(FIRE_TEMPLE)->IsVanilla() && false;}), Entrance(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, []{return ctx->GetDungeon(FIRE_TEMPLE)->IsMQ() && false;}), - Entrance(RR_FIRE_TEMPLE_BOSS_ROOM, []{return true;}), + Entrance(RR_FIRE_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_FIRE_TEMPLE_BOSS_KEY);}), }); - areaTable[RR_FIRE_TEMPLE_BOSS_ROOM] = Region("Fire Temple Boss Room", "Fire Temple", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_BOSS_ROOM] = Region("Fire Temple Boss Room", SCENE_FIRE_TEMPLE_BOSS, { // Events - EventAccess(&logic->FireTempleClear, []{return logic->FireTempleClear || (logic->FireTimer() >= 64 && logic->CanKillEnemy(RE_VOLVAGIA));}), + EventAccess(&logic->FireTempleClear, []{return logic->FireTimer() >= 64 && logic->CanKillEnemy(RE_VOLVAGIA);}), }, { // Locations LOCATION(RC_FIRE_TEMPLE_VOLVAGIA_HEART, logic->FireTempleClear), @@ -715,4 +754,6 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_DMC_CENTRAL_LOCAL, []{return logic->FireTempleClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index c9f4ebc23e..a4a5582979 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -5,8 +5,9 @@ using namespace Rando; void RegionTable_Init_ForestTemple() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_FOREST_TEMPLE_ENTRYWAY] = Region("Forest Temple Entryway", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_ENTRYWAY] = Region("Forest Temple Entryway", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_FIRST_ROOM, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsVanilla();}), Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsMQ();}), @@ -15,7 +16,7 @@ void RegionTable_Init_ForestTemple() { #pragma region Vanilla - areaTable[RR_FOREST_TEMPLE_FIRST_ROOM] = Region("Forest Temple First Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_FIRST_ROOM] = Region("Forest Temple First Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, true), LOCATION(RC_FOREST_TEMPLE_GS_FIRST_ROOM, (logic->IsAdult && logic->CanUse(RG_BOMB_BAG)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOMBCHU_5) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_FOREST_FIRST_GS) && (logic->CanJumpslashExceptHammer() || (logic->IsChild && logic->CanUse(RG_BOMB_BAG))))), @@ -25,15 +26,15 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_SOUTH_CORRIDOR, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_SOUTH_CORRIDOR] = Region("Forest Temple South Corridor", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_SOUTH_CORRIDOR] = Region("Forest Temple South Corridor", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_FIRST_ROOM, []{return true;}), - Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}), + Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); - areaTable[RR_FOREST_TEMPLE_LOBBY] = Region("Forest Temple Lobby", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_LOBBY] = Region("Forest Temple Lobby", SCENE_FOREST_TEMPLE, { //Events - EventAccess(&logic->ForestTempleMeg, []{return logic->ForestTempleMeg || (logic->ForestTempleJoelle && logic->ForestTempleBeth && logic->ForestTempleAmy && logic->CanUse(RG_FAIRY_BOW));}), + EventAccess(&logic->ForestTempleMeg, []{return logic->ForestTempleJoelle && logic->ForestTempleBeth && logic->ForestTempleAmy && logic->CanUse(RG_FAIRY_BOW);}), }, { //Locations LOCATION(RC_FOREST_TEMPLE_GS_LOBBY, logic->HookshotOrBoomerang()), @@ -55,13 +56,13 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_FOREST_TEMPLE_NORTH_CORRIDOR] = Region("Forest Temple North Corridor", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NORTH_CORRIDOR] = Region("Forest Temple North Corridor", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, []{return true;}), Entrance(RR_FOREST_TEMPLE_LOWER_STALFOS, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_LOWER_STALFOS] = Region("Forest Temple Lower Stalfos", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_LOWER_STALFOS] = Region("Forest Temple Lower Stalfos", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -74,7 +75,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NORTH_CORRIDOR, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER] = Region("Forest Temple NW Outdoors Lower", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER] = Region("Forest Temple NW Outdoors Lower", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -92,7 +93,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER] = Region("Forest Temple NW Outdoors Upper", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER] = Region("Forest Temple NW Outdoors Upper", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -108,7 +109,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER] = Region("Forest Temple NE Outdoors Lower", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER] = Region("Forest Temple NE Outdoors Lower", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -124,7 +125,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return false;}), }); - areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER] = Region("Forest Temple NE Outdoors Upper", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER] = Region("Forest Temple NE Outdoors Upper", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -135,7 +136,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return ctx->GetTrickOption(RT_FOREST_DOORFRAME) && logic->CanJumpslashExceptHammer() && logic->CanUse(RG_HOVER_BOOTS) && logic->CanUse(RG_SCARECROW);}), }); - areaTable[RR_FOREST_TEMPLE_MAP_ROOM] = Region("Forest Temple Map Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MAP_ROOM] = Region("Forest Temple Map Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MAP_CHEST, logic->CanKillEnemy(RE_BLUE_BUBBLE)), }, { @@ -144,9 +145,9 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER, []{return Here(RR_FOREST_TEMPLE_MAP_ROOM, []{return logic->CanKillEnemy(RE_BLUE_BUBBLE);});}), }); - areaTable[RR_FOREST_TEMPLE_SEWER] = Region("Forest Temple Sewer", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_SEWER] = Region("Forest Temple Sewer", SCENE_FOREST_TEMPLE, {}, { //Locations - LOCATION(RC_FOREST_TEMPLE_WELL_CHEST, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER)), + LOCATION(RC_FOREST_TEMPLE_WELL_CHEST, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || (logic->CanOpenUnderwaterChest() && logic->WaterTimer() >= 8)), LOCATION(RC_FOREST_TEMPLE_WELL_WEST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8)), LOCATION(RC_FOREST_TEMPLE_WELL_EAST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8)), }, { @@ -155,12 +156,12 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST] = Region("Forest Temple Below Boss Key Chest", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST] = Region("Forest Temple Below Boss Key Chest", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return Here(RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return logic->CanKillEnemy(RE_BLUE_BUBBLE);});}), }); - areaTable[RR_FOREST_TEMPLE_FLOORMASTER_ROOM] = Region("Forest Temple Floormaster Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_FLOORMASTER_ROOM] = Region("Forest Temple Floormaster Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_FLOORMASTER_CHEST, logic->CanDamage()), }, { @@ -168,13 +169,13 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_WEST_CORRIDOR] = Region("Forest Temple West Corridor", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_WEST_CORRIDOR] = Region("Forest Temple West Corridor", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 1, 5);}), Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}), }); - areaTable[RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM] = Region("Forest Temple Block Push Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM] = Region("Forest Temple Block Push Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, logic->HasItem(RG_GORONS_BRACELET) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT))), }, { @@ -185,13 +186,13 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED, []{return logic->IsAdult && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)) && logic->HasItem(RG_GORONS_BRACELET) && logic->SmallKeys(RR_FOREST_TEMPLE, 2);}), }); - areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED] = Region("Forest Temple NW Corridor Twisted", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED] = Region("Forest Temple NW Corridor Twisted", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 2);}), Entrance(RR_FOREST_TEMPLE_RED_POE_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 3);}), }); - areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED] = Region("Forest Temple NW Corridor Straightened", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED] = Region("Forest Temple NW Corridor Straightened", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_BOSS_KEY_CHEST, true), }, { @@ -200,9 +201,9 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 2);}), }); - areaTable[RR_FOREST_TEMPLE_RED_POE_ROOM] = Region("Forest Temple Red Poe Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_RED_POE_ROOM] = Region("Forest Temple Red Poe Room", SCENE_FOREST_TEMPLE, { //Events - EventAccess(&logic->ForestTempleJoelle, []{return logic->ForestTempleJoelle || logic->CanUse(RG_FAIRY_BOW);}), + EventAccess(&logic->ForestTempleJoelle, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { //Locations LOCATION(RC_FOREST_TEMPLE_RED_POE_CHEST, logic->ForestTempleJoelle), @@ -212,7 +213,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_UPPER_STALFOS, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_UPPER_STALFOS] = Region("Forest Temple Upper Stalfos", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_UPPER_STALFOS] = Region("Forest Temple Upper Stalfos", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_BOW_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3)), LOCATION(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, logic->CanBreakPots()), @@ -225,9 +226,9 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BLUE_POE_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3);}), }); - areaTable[RR_FOREST_TEMPLE_BLUE_POE_ROOM] = Region("Forest Temple Blue Poe Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_BLUE_POE_ROOM] = Region("Forest Temple Blue Poe Room", SCENE_FOREST_TEMPLE, { //Events - EventAccess(&logic->ForestTempleBeth, []{return logic->ForestTempleBeth || logic->CanUse(RG_FAIRY_BOW);}), + EventAccess(&logic->ForestTempleBeth, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { //Locations LOCATION(RC_FOREST_TEMPLE_BLUE_POE_CHEST, logic->ForestTempleBeth), @@ -240,19 +241,19 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 4);}), }); - areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED] = Region("Forest Temple NE Corridor Straightened", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED] = Region("Forest Temple NE Corridor Straightened", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_BLUE_POE_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 4);}), Entrance(RR_FOREST_TEMPLE_FROZEN_EYE_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 5);}), }); - areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED] = Region("Forest Temple NE Corridor Twisted", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED] = Region("Forest Temple NE Corridor Twisted", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_FROZEN_EYE_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 5);}), Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_FROZEN_EYE_ROOM] = Region("Forest Temple Frozen Eye Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_FROZEN_EYE_ROOM] = Region("Forest Temple Frozen Eye Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, logic->CanBreakPots()), @@ -262,7 +263,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 5) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE));}), }); - areaTable[RR_FOREST_TEMPLE_FALLING_ROOM] = Region("Forest Temple Falling Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_FALLING_ROOM] = Region("Forest Temple Falling Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, true), }, { @@ -271,9 +272,9 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_GREEN_POE_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_GREEN_POE_ROOM] = Region("Forest Temple Green Poe Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_GREEN_POE_ROOM] = Region("Forest Temple Green Poe Room", SCENE_FOREST_TEMPLE, { //Events - EventAccess(&logic->ForestTempleAmy, []{return logic->ForestTempleAmy || logic->CanUse(RG_FAIRY_BOW);}), + EventAccess(&logic->ForestTempleAmy, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { //Locations LOCATION(RC_FOREST_TEMPLE_GREEN_POE_POT_1, logic->CanBreakPots()), @@ -284,27 +285,27 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_EAST_CORRIDOR, []{return logic->ForestTempleAmy;}), }); - areaTable[RR_FOREST_TEMPLE_EAST_CORRIDOR] = Region("Forest Temple East Corridor", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_EAST_CORRIDOR] = Region("Forest Temple East Corridor", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}), Entrance(RR_FOREST_TEMPLE_GREEN_POE_ROOM, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}), }); - areaTable[RR_FOREST_TEMPLE_BOSS_REGION] = Region("Forest Temple Boss Region", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_BOSS_REGION] = Region("Forest Temple Boss Region", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_BASEMENT_CHEST, true), LOCATION(RC_FOREST_TEMPLE_GS_BASEMENT, logic->HookshotOrBoomerang()), }, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, []{return true;}), - Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_FOREST_TEMPLE_BOSS_KEY);}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); #pragma endregion #pragma region MQ - areaTable[RR_FOREST_TEMPLE_MQ_LOBBY] = Region("Forest Temple MQ Lobby", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_LOBBY] = Region("Forest Temple MQ Lobby", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA, ED_SHORT_JUMPSLASH, false) || logic->CanUse(RG_HOVER_BOOTS)), //Implies CanPassEnemy(RE_BIG_SKULLTULA) @@ -315,7 +316,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 1) && logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_CENTRAL_AREA] = Region("Forest Temple MQ Central Region", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_CENTRAL_AREA] = Region("Forest Temple MQ Central Region", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleMeg, []{return logic->ForestTempleJoelle && logic->ForestTempleBeth && logic->ForestTempleAmy && logic->CanKillEnemy(RE_MEG);}), }, { @@ -336,7 +337,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return logic->ForestTempleMeg;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_WOLFOS_ROOM] = Region("Forest Temple MQ Wolfos Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_WOLFOS_ROOM] = Region("Forest Temple MQ Wolfos Room", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), EventAccess(&logic->ForestClearBelowBowChest, []{return logic->CanKillEnemy(RE_WOLFOS);}), @@ -350,7 +351,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, []{return logic->ForestClearBelowBowChest && (logic->IsChild || logic->CanUse(RG_SONG_OF_TIME));}), }); - areaTable[RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE] = Region("Forest Temple MQ Lower Block Puzzle", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE] = Region("Forest Temple MQ Lower Block Puzzle", SCENE_FOREST_TEMPLE, { //longshot is capable of hitting the switch, but some invisible collision makes the shot harder than you would think, so it may be trickworthy EventAccess(&logic->MQForestBlockRoomTargets, []{return (ctx->GetTrickOption(RT_FOREST_MQ_BLOCK_PUZZLE) && logic->CanUse(RG_BOMBCHU_5));}), //It is barely possible to get this as child with master + hovers, but it's tight without bunny speed @@ -367,7 +368,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, []{return logic->ForestCanTwistHallway && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_FOREST_TEMPLE_MQ_MIDDLE_BLOCK_PUZZLE] = Region("Forest Temple MQ Middle Block Puzzle", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_MIDDLE_BLOCK_PUZZLE] = Region("Forest Temple MQ Middle Block Puzzle", SCENE_FOREST_TEMPLE, { //longshot is capable of hitting the switch, but some invisible collision makes the shot more annoying than you would think, so it may be trickworthy EventAccess(&logic->MQForestBlockRoomTargets, []{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_LONGSHOT));}), EventAccess(&logic->ForestCanTwistHallway, []{return ctx->GetTrickOption(RT_FOREST_MQ_JS_HALLWAY_SWITCH) && (logic->IsAdult && logic->CanJumpslash()) || (logic->CanUse(RG_HOVER_BOOTS) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MASTER_SWORD)));}), @@ -379,7 +380,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, []{return logic->ForestCanTwistHallway && logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_FOREST_OUTSIDE_BACKDOOR) && (logic->CanJumpslashExceptHammer() || (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER))));}), }); - areaTable[RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE] = Region("Forest Temple MQ After Block Puzzle", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE] = Region("Forest Temple MQ After Block Puzzle", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, logic->SmallKeys(RR_FOREST_TEMPLE, 3)), }, { @@ -393,7 +394,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 2) && Here(RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE, []{return logic->CanKillEnemy(RE_FLOORMASTER);});}), }); - areaTable[RR_FOREST_TEMPLE_MQ_STRAIGHT_HALLWAY] = Region("Forest Temple MQ Straight Hallway", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_STRAIGHT_HALLWAY] = Region("Forest Temple MQ Straight Hallway", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, logic->SmallKeys(RR_FOREST_TEMPLE, 3)), }, { @@ -401,12 +402,12 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM] = Region("Forest Temple MQ Floormaster Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM] = Region("Forest Temple MQ Floormaster Room", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, []{return Here(RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM, []{return logic->CanKillEnemy(RE_FLOORMASTER);});}), }); - areaTable[RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE] = Region("Forest Temple MQ Outdoor Ledge", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE] = Region("Forest Temple MQ Outdoor Ledge", SCENE_FOREST_TEMPLE, { EventAccess(&logic->ForestCanTwistHallway, []{return logic->CanHitSwitch();}), }, { //Locations @@ -419,7 +420,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_NW_OUTDOORS] = Region("Forest Temple MQ NW Outdoors", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_NW_OUTDOORS] = Region("Forest Temple MQ NW Outdoors", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), //the well checks are considered from both areas instead of being a region because the draining is a temp flag and the skull (as well as the chest with hook glitch) has different breath timers from each side @@ -437,13 +438,13 @@ void RegionTable_Init_ForestTemple() { }); //The well only coniders the eye target here because the eye target is a temp flag, making it unwieldy to use as an EventAccess to make it it's own room - areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS] = Region("Forest Temple MQ NE Outdoors", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS] = Region("Forest Temple MQ NE Outdoors", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), }, { //Locations - LOCATION(RC_FOREST_TEMPLE_MQ_WELL_CHEST, logic->CanHitEyeTargets()), + LOCATION(RC_FOREST_TEMPLE_MQ_WELL_CHEST, logic->CanHitEyeTargets() || (logic->CanOpenUnderwaterChest() && logic->WaterTimer() >= 8)), LOCATION(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), //implies logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA) LOCATION(RC_FOREST_TEMPLE_MQ_GS_WELL, logic->CanHitEyeTargets() || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), @@ -457,7 +458,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, []{return logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES] = Region("Forest Temple MQ Outdoors Top Ledges", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES] = Region("Forest Temple MQ Outdoors Top Ledges", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, true), //Actually killing the skull from the doorframe with melee is annoying. Hammer swing hits low enough unaided, other swords need to crouch stab but the spot is precise based on range. kokiri sword doesn't reach at all for adult. @@ -470,7 +471,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, []{return ctx->GetTrickOption(RT_FOREST_OUTDOORS_LEDGE) && logic->CanUse(RG_HOVER_BOOTS) && logic->CanJumpslash() && logic->TakeDamage();}), }); - areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE] = Region("Forest Temple MQ NE Outdoors Ledge", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE] = Region("Forest Temple MQ NE Outdoors Ledge", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, true), }, { @@ -480,7 +481,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return logic->CanUse(RG_SONG_OF_TIME);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_JOELLE_ROOM] = Region("Forest Temple MQ Joelle room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_JOELLE_ROOM] = Region("Forest Temple MQ Joelle room", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleJoelle, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -492,7 +493,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_3_STALFOS_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_3_STALFOS_ROOM] = Region("Forest Temple MQ 3 Stalfos Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_3_STALFOS_ROOM] = Region("Forest Temple MQ 3 Stalfos Room", SCENE_FOREST_TEMPLE, { //Events //technically happens in RR_FOREST_TEMPLE_MQ_WOLFOS_ROOM, but the way this room blocks the hole means it cannot be logical to do anything else there. EventAccess(&logic->ForestClearBelowBowChest, []{return logic->CanKillEnemy(RE_WOLFOS);}), @@ -509,7 +510,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_BETH_ROOM, []{return logic->ForestClearBelowBowChest && logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_BETH_ROOM] = Region("Forest Temple MQ Beth Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_BETH_ROOM] = Region("Forest Temple MQ Beth Room", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleBeth, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -529,13 +530,18 @@ void RegionTable_Init_ForestTemple() { }); //This room exists to show the actual map layout, and for when the crates get added to logic - areaTable[RR_FOREST_TEMPLE_MQ_TORCH_SHOT_ROOM] = Region("Forest Temple MQ Torch Shot Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_TORCH_SHOT_ROOM] = Region("Forest Temple MQ Torch Shot Room", SCENE_FOREST_TEMPLE, {}, { + // Locations + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + }, { //Exits Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE);}), Entrance(RR_FOREST_TEMPLE_MQ_BETH_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 6);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_FALLING_ROOM] = Region("Forest Temple MQ Falling Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_FALLING_ROOM] = Region("Forest Temple MQ Falling Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, true), }, { @@ -544,7 +550,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_AMY_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 6);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_AMY_ROOM] = Region("Forest Temple MQ Amy Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_AMY_ROOM] = Region("Forest Temple MQ Amy Room", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleAmy, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -557,7 +563,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_BASEMENT] = Region("Forest Temple MQ Basement", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_BASEMENT] = Region("Forest Temple MQ Basement", SCENE_FOREST_TEMPLE, { //Events //Implies CanHitSwitch() EventAccess(&logic->ForestOpenBossCorridor, []{return logic->CanHitEyeTargets();}), @@ -571,7 +577,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_BOSS_REGION, []{return logic->ForestOpenBossCorridor;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_BASEMENT_POT_ROOM] = Region("Forest Temple MQ Basement Pot Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_BASEMENT_POT_ROOM] = Region("Forest Temple MQ Basement Pot Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, logic->CanBreakPots()), @@ -582,25 +588,25 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_BOSS_REGION] = Region("Forest Temple MQ Boss Region", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_BOSS_REGION] = Region("Forest Temple MQ Boss Region", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return logic->ForestOpenBossCorridor;}), - Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_FOREST_TEMPLE_BOSS_KEY);}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); #pragma endregion // Boss Room - areaTable[RR_FOREST_TEMPLE_BOSS_ENTRYWAY] = Region("Forest Temple Boss Entryway", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_BOSS_ENTRYWAY] = Region("Forest Temple Boss Entryway", SCENE_FOREST_TEMPLE, {}, {}, { // Exits Entrance(RR_FOREST_TEMPLE_BOSS_REGION, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsVanilla() && false;}), Entrance(RR_FOREST_TEMPLE_MQ_BOSS_REGION, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsMQ() && false;}), - Entrance(RR_FOREST_TEMPLE_BOSS_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_FOREST_TEMPLE_BOSS_KEY);}), }); - areaTable[RR_FOREST_TEMPLE_BOSS_ROOM] = Region("Forest Temple Boss Room", "Forest Temple", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_BOSS_ROOM] = Region("Forest Temple Boss Room", SCENE_FOREST_TEMPLE_BOSS, { // Events - EventAccess(&logic->ForestTempleClear, []{return logic->ForestTempleClear || logic->CanKillEnemy(RE_PHANTOM_GANON);}), + EventAccess(&logic->ForestTempleClear, []{return logic->CanKillEnemy(RE_PHANTOM_GANON);}), }, { // Locations LOCATION(RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, logic->ForestTempleClear), @@ -610,4 +616,6 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_SACRED_FOREST_MEADOW, []{return logic->ForestTempleClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp index 2a73017011..8571ba3844 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp @@ -6,8 +6,9 @@ using namespace Rando; void RegionTable_Init_GanonsCastle() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_GANONS_CASTLE_ENTRYWAY] = Region("Ganon's Castle Entryway", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_ENTRYWAY] = Region("Ganon's Castle Entryway", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_LOBBY, []{return ctx->GetDungeon(GANONS_CASTLE)->IsVanilla();}), Entrance(RR_GANONS_CASTLE_MQ_LOBBY, []{return ctx->GetDungeon(GANONS_CASTLE)->IsMQ();}), @@ -16,7 +17,7 @@ void RegionTable_Init_GanonsCastle() { #pragma region Vanilla - areaTable[RR_GANONS_CASTLE_LOBBY] = Region("Ganon's Castle Lobby", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_LOBBY] = Region("Ganon's Castle Lobby", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_SHEIK_HINT_GC, true), }, { @@ -28,16 +29,11 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_SHADOW_TRIAL, []{return true;}), Entrance(RR_GANONS_CASTLE_SPIRIT_TRIAL, []{return true;}), Entrance(RR_GANONS_CASTLE_LIGHT_TRIAL, []{return logic->CanUse(RG_GOLDEN_GAUNTLETS);}), - Entrance(RR_GANONS_TOWER_FLOOR_1, []{return (logic->ForestTrialClear || ctx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && - (logic->FireTrialClear || ctx->GetTrial(TK_FIRE_TRIAL)->IsSkipped()) && - (logic->WaterTrialClear || ctx->GetTrial(TK_WATER_TRIAL)->IsSkipped()) && - (logic->ShadowTrialClear || ctx->GetTrial(TK_SHADOW_TRIAL)->IsSkipped()) && - (logic->SpiritTrialClear || ctx->GetTrial(TK_SPIRIT_TRIAL)->IsSkipped()) && - (logic->LightTrialClear || ctx->GetTrial(TK_LIGHT_TRIAL)->IsSkipped());}), + Entrance(RR_GANONS_TOWER_ENTRYWAY, []{return true;}), Entrance(RR_GANONS_CASTLE_DEKU_SCRUBS, []{return ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); - areaTable[RR_GANONS_CASTLE_DEKU_SCRUBS] = Region("Ganon's Castle Deku Scrubs", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_DEKU_SCRUBS] = Region("Ganon's Castle Deku Scrubs", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->FreeFairies, []{return true;}), }, { @@ -56,17 +52,17 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, true), }, {}); - areaTable[RR_GANONS_CASTLE_FOREST_TRIAL] = Region("Ganon's Castle Forest Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_FOREST_TRIAL] = Region("Ganon's Castle Forest Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ForestTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_DINS_FIRE));}), }, { //Locations - LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, logic->CanDamage()), - LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_DINS_FIRE))), - LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_DINS_FIRE))), + LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, logic->CanKillEnemy(RE_WOLFOS)), + LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))), + LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))), }, {}); - areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Region("Ganon's Castle Fire Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Region("Ganon's Castle Fire Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->FireTrialClear, []{return logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LIGHT_ARROWS) && logic->CanUse(RG_LONGSHOT);}), }, { @@ -76,10 +72,10 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_FIRE_TRIAL_HEART, logic->CanUse(RG_GORON_TUNIC)), }, {}); - areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Region("Ganon's Castle Water Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Region("Ganon's Castle Water Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events - EventAccess(&logic->BlueFireAccess, []{return logic->BlueFireAccess || logic->HasBottle();}), - EventAccess(&logic->FairyPot, []{return logic->FairyPot || (logic->BlueFire() && logic->CanKillEnemy(RE_FREEZARD));}), + EventAccess(&logic->BlueFireAccess, []{return true;}), + EventAccess(&logic->FairyPot, []{return logic->BlueFire() && logic->CanKillEnemy(RE_FREEZARD);}), EventAccess(&logic->WaterTrialClear, []{return logic->BlueFire() && logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_LIGHT_ARROWS);}), }, { //Locations @@ -90,7 +86,7 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, logic->CanBreakPots() && logic->BlueFire() && logic->CanKillEnemy(RE_FREEZARD)), }, {}); - areaTable[RR_GANONS_CASTLE_SHADOW_TRIAL] = Region("Ganon's Castle Shadow Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_SHADOW_TRIAL] = Region("Ganon's Castle Shadow Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ShadowTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS) && logic->CanUse(RG_MEGATON_HAMMER) && ((logic->CanUse(RG_FIRE_ARROWS) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || (logic->CanUse(RG_DINS_FIRE) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))))));}), }, { @@ -106,13 +102,13 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, (logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_DINS_FIRE)))) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH) || logic->CanUse(RG_BOOMERANG))), }, {}); - areaTable[RR_GANONS_CASTLE_SPIRIT_TRIAL] = Region("Ganon's Castle Spirit Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_SPIRIT_TRIAL] = Region("Ganon's Castle Spirit Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events - EventAccess(&logic->NutPot, []{return logic->NutPot || (((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_BOMBCHU_5) && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))));}), + EventAccess(&logic->NutPot, []{return ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_BOMBCHU_5) && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)));}), EventAccess(&logic->SpiritTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_MIRROR_SHIELD) || ctx->GetOption(RSK_SUNLIGHT_ARROWS)) && logic->CanUse(RG_BOMBCHU_5) && ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT));}), }, { //Locations - LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, (ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->CanJumpslashExceptHammer()), + LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, (ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && (logic->CanJumpslashExceptHammer() || logic->CanUse(RG_BOMBCHU_5))), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, (ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_BOMBCHU_5) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_BOMBCHU_5) && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_BOMBCHU_5) && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), @@ -120,7 +116,7 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, true), }, {}); - areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Region("Ganon's Castle Light Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Region("Ganon's Castle Light Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->LightTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS) && logic->CanUse(RG_HOOKSHOT) && logic->SmallKeys(RR_GANONS_CASTLE, 2) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH));}), }, { @@ -142,14 +138,14 @@ void RegionTable_Init_GanonsCastle() { #pragma region MQ - areaTable[RR_GANONS_CASTLE_MQ_LOBBY] = Region("Ganon's Castle MQ Lobby", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_LOBBY] = Region("Ganon's Castle MQ Lobby", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_ENTRYWAY, []{return logic->CanPassEnemy(RE_GREEN_BUBBLE) || Here(RR_GANONS_CASTLE_MQ_LOBBY, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE) && logic->CanKillEnemy(RE_ARMOS);});}), //Implies CanKillEnemy(RE_GREEN_BUBBLE) Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return Here(RR_GANONS_CASTLE_MQ_LOBBY, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE) && logic->CanKillEnemy(RE_ARMOS);});}), }); - areaTable[RR_GANONS_CASTLE_MQ_MAIN] = Region("Ganon's Castle MQ Main", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_MAIN] = Region("Ganon's Castle MQ Main", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_SHEIK_HINT_MQ_GC, true), }, { @@ -161,17 +157,11 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE, []{return true;}), Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_CHAIRS_ROOM, []{return true;}), Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_DINOLFOS_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_MAIN, []{return logic->CanUse(RG_GOLDEN_GAUNTLETS);});}), - //RANDOTODO could we just set these events automatically based on the setting? - Entrance(RR_GANONS_TOWER_FLOOR_1, []{return (logic->ForestTrialClear || ctx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && - (logic->FireTrialClear || ctx->GetTrial(TK_FIRE_TRIAL)->IsSkipped()) && - (logic->WaterTrialClear || ctx->GetTrial(TK_WATER_TRIAL)->IsSkipped()) && - (logic->ShadowTrialClear || ctx->GetTrial(TK_SHADOW_TRIAL)->IsSkipped()) && - (logic->SpiritTrialClear || ctx->GetTrial(TK_SPIRIT_TRIAL)->IsSkipped()) && - (logic->LightTrialClear || ctx->GetTrial(TK_LIGHT_TRIAL)->IsSkipped());}), + Entrance(RR_GANONS_TOWER_ENTRYWAY, []{return true;}), Entrance(RR_GANONS_CASTLE_MQ_DEKU_SCRUBS, []{return ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); - areaTable[RR_GANONS_CASTLE_MQ_DEKU_SCRUBS] = Region("Ganon's Castle MQ Deku Scrubs", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_DEKU_SCRUBS] = Region("Ganon's Castle MQ Deku Scrubs", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->FreeFairies, []{return true;}), }, { @@ -194,7 +184,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return true;}), }); - areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_STALFOS_ROOM] = Region("Ganon's Castle MQ Forest Trial Stalfos Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_STALFOS_ROOM] = Region("Ganon's Castle MQ Forest Trial Stalfos Room", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, logic->HookshotOrBoomerang()), }, { @@ -204,7 +194,7 @@ void RegionTable_Init_GanonsCastle() { }); //If it is ever possible to warp into the RR_GANONS_CASTLE_MQ_FOREST_TRIAL_FINAL_ROOM, this needs splitting up as the requirements to reach things from the other side are more complex - areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_BEAMOS_ROOM] = Region("Ganon's Castle MQ Forest Trial Beamos Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_BEAMOS_ROOM] = Region("Ganon's Castle MQ Forest Trial Beamos Room", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, logic->CanHitEyeTargets()), LOCATION(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, logic->HasFireSource()), @@ -214,7 +204,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_FOREST_TRIAL_FINAL_ROOM, []{return logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME);}), }); - areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Forest Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Forest Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ForestTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), }, { @@ -226,14 +216,14 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_FOREST_TRIAL_BEAMOS_ROOM, []{return true;}), }); - areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM] = Region("Ganon's Castle MQ Fire Trial Main Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM] = Region("Ganon's Castle MQ Fire Trial Main Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return true;}), //2 checks, 1 for the rupees, 1 for actually making it, as the rupees are permanent but throwing a pillar is not Entrance(RR_GANONS_CASTLE_MQ_FIRE_TRIAL_FINAL_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM, []{return logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS);}) && logic->CanUse(RG_GORON_TUNIC) && (logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_GOLDEN_GAUNTLETS) && (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GANON_MQ_FIRE_TRIAL) && logic->IsAdult && logic->CanUse(RG_HOOKSHOT)))));}), }); - areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Fire Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Fire Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->FireTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), //There's no way back across the lava without glitches @@ -243,7 +233,7 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, logic->CanBreakPots()), }, {}); - areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM] = Region("Ganon's Castle MQ Water Trial Geyser Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM] = Region("Ganon's Castle MQ Water Trial Geyser Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->BlueFireAccess, []{return logic->CanJumpslash() || logic->HasExplosives();}), }, { @@ -256,14 +246,14 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM, []{return logic->SmallKeys(RR_GANONS_CASTLE, 3) && Here(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, []{return logic->BlueFire();});}), }); - areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle MQ Water Trial Block Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle MQ Water Trial Block Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, []{return logic->SmallKeys(RR_GANONS_CASTLE, 3);}), //This assumes there's no way for child to have blue fire and not adult. Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM, []{return logic->IsAdult && logic->BlueFire();}), }); - areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Water Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Water Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->WaterTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), }, { @@ -275,7 +265,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM, []{return logic->BlueFire();});}), }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE] = Region("Ganon's Castle MQ Shadow Trial Starting Ledge", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE] = Region("Ganon's Castle MQ Shadow Trial Starting Ledge", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ShadowTrialFirstChest, []{return logic->CanUse(RG_FAIRY_BOW);}), }, {}, { @@ -284,7 +274,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_CHEST_PLATFORM, []{return (logic->ShadowTrialFirstChest && logic->CanUse(RG_HOOKSHOT)) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_CHEST_PLATFORM] = Region("Ganon's Castle MQ Shadow Trial Chest Platform", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_CHEST_PLATFORM] = Region("Ganon's Castle MQ Shadow Trial Chest Platform", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ShadowTrialFirstChest, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -297,7 +287,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_MOVING_PLATFORM, []{return (ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_MOVING_PLATFORM] = Region("Ganon's Castle MQ Shadow Trial Moving Platform", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_MOVING_PLATFORM] = Region("Ganon's Castle MQ Shadow Trial Moving Platform", SCENE_INSIDE_GANONS_CASTLE, { //Events //A torch run from RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE is possible but tight, so would be a trick EventAccess(&logic->ShadowTrialFirstChest, []{return logic->CanDetonateUprightBombFlower();}), @@ -308,7 +298,7 @@ void RegionTable_Init_GanonsCastle() { }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_BEAMOS_TORCH] = Region("Ganon's Castle MQ Shadow Trial Beamos Torch", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_BEAMOS_TORCH] = Region("Ganon's Castle MQ Shadow Trial Beamos Torch", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_MOVING_PLATFORM, []{return ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH);}), //A torch run from RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE is possible but very tight, so would be a trick @@ -317,7 +307,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE, []{return logic->HasFireSource() || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && ctx->GetTrickOption(RT_GANON_MQ_SHADOW_TRIAL) && logic->CanUse(RG_FAIRY_BOW));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE] = Region("Ganon's Castle MQ Shadow Trial Far Side", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE] = Region("Ganon's Castle MQ Shadow Trial Far Side", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, logic->CanHitEyeTargets()), }, { @@ -331,7 +321,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FINAL_ROOM, []{return (ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Shadow Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Shadow Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ShadowTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), }, { @@ -343,13 +333,13 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE, []{return (ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_CHAIRS_ROOM] = Region("Ganon's Castle MQ Spirit Trial Chairs Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_CHAIRS_ROOM] = Region("Ganon's Castle MQ Spirit Trial Chairs Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return true;}), Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_BEFORE_SWITCH, []{return Here(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_CHAIRS_ROOM, []{return (logic->CanHitEyeTargets() || ctx->GetTrickOption(RT_RUSTED_SWITCHES)) && logic->CanUse(RG_MEGATON_HAMMER);});}), }); - areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_BEFORE_SWITCH] = Region("Ganon's Castle MQ Spirit Trial Before Switch", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_BEFORE_SWITCH] = Region("Ganon's Castle MQ Spirit Trial Before Switch", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, logic->CanPassEnemy(RE_GREEN_BUBBLE)), }, { @@ -358,7 +348,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_AFTER_SWITCH, []{return Here(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_BEFORE_SWITCH, []{return logic->CanUse(RG_BOMBCHU_5);});}), }); - areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_AFTER_SWITCH] = Region("Ganon's Castle MQ Spirit Trial After Switch", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_AFTER_SWITCH] = Region("Ganon's Castle MQ Spirit Trial After Switch", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)), //better names for these would be nice. @@ -373,7 +363,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FINAL_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_AFTER_SWITCH, []{return (logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD));}) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Spirit Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Spirit Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->SpiritTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), EventAccess(&logic->NutPot, []{return true;}), @@ -386,13 +376,13 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_AFTER_SWITCH, []{return true;}), }); - areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_DINOLFOS_ROOM] = Region("Ganon's Castle MQ Light Trial Dinolfos Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_DINOLFOS_ROOM] = Region("Ganon's Castle MQ Light Trial Dinolfos Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return true;}), Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_TRIFORCE_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_DINOLFOS_ROOM, []{return logic->CanKillEnemy(RE_DINOLFOS) && logic->CanKillEnemy(RE_TORCH_SLUG);});}), }); - areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_TRIFORCE_ROOM] = Region("Ganon's Castle MQ Light Trial Triforce Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_TRIFORCE_ROOM] = Region("Ganon's Castle MQ Light Trial Triforce Room", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, logic->CanUse(RG_ZELDAS_LULLABY)), }, { @@ -401,13 +391,13 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_FRONT, []{return logic->SmallKeys(RR_GANONS_CASTLE, 2);}), }); - areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_FRONT] = Region("Ganon's Castle MQ Light Trial Boulder Room Front", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_FRONT] = Region("Ganon's Castle MQ Light Trial Boulder Room Front", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_TRIFORCE_ROOM, []{return logic->SmallKeys(RR_GANONS_CASTLE, 2);}), Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_BACK, []{return logic->CanUse(RG_HOOKSHOT) || ctx->GetTrickOption(RT_GANON_MQ_LIGHT_TRIAL);}), }); - areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_BACK] = Region("Ganon's Castle MQ Light Trial Boulder Room Back", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_BACK] = Region("Ganon's Castle MQ Light Trial Boulder Room Back", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, true), LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, true), @@ -418,7 +408,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_FINAL_ROOM, []{return logic->SmallKeys(RR_GANONS_CASTLE, 3) && (ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanJumpslash() || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_BOOMERANG));}), }); - areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Light Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Light Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->LightTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), }, { @@ -431,13 +421,26 @@ void RegionTable_Init_GanonsCastle() { #pragma region Tower and Escape - areaTable[RR_GANONS_TOWER_FLOOR_1] = Region("Ganon's Tower Floor 1", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_TOWER_ENTRYWAY] = Region("Ganon's Tower Entryway", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits - Entrance(RR_GANONS_CASTLE_LOBBY, []{return Here(RR_GANONS_TOWER_FLOOR_1, []{return logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2);});}), - Entrance(RR_GANONS_TOWER_FLOOR_2, []{return Here(RR_GANONS_TOWER_FLOOR_1, []{return logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2);});}), + Entrance(RR_GANONS_CASTLE_LOBBY, []{return ctx->GetDungeon(GANONS_CASTLE)->IsVanilla();}), + Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return ctx->GetDungeon(GANONS_CASTLE)->IsMQ();}), + //RANDOTODO could we just set these events automatically based on the setting? + Entrance(RR_GANONS_TOWER_FLOOR_1, []{return (logic->ForestTrialClear || ctx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && + (logic->FireTrialClear || ctx->GetTrial(TK_FIRE_TRIAL)->IsSkipped()) && + (logic->WaterTrialClear || ctx->GetTrial(TK_WATER_TRIAL)->IsSkipped()) && + (logic->ShadowTrialClear || ctx->GetTrial(TK_SHADOW_TRIAL)->IsSkipped()) && + (logic->SpiritTrialClear || ctx->GetTrial(TK_SPIRIT_TRIAL)->IsSkipped()) && + (logic->LightTrialClear || ctx->GetTrial(TK_LIGHT_TRIAL)->IsSkipped());}), }); - areaTable[RR_GANONS_TOWER_FLOOR_2] = Region("Ganon's Tower Floor 2", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_TOWER_FLOOR_1] = Region("Ganon's Tower Floor 1", SCENE_GANONS_TOWER, {}, {}, { + //Exits + Entrance(RR_GANONS_TOWER_ENTRYWAY, []{return Here(RR_GANONS_TOWER_FLOOR_1, []{return logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2);});}), + Entrance(RR_GANONS_TOWER_FLOOR_2, []{return Here(RR_GANONS_TOWER_FLOOR_1, []{return logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2);});}), + }); + + areaTable[RR_GANONS_TOWER_FLOOR_2] = Region("Ganon's Tower Floor 2", SCENE_GANONS_TOWER, {}, { //Locations LOCATION(RC_GANONS_TOWER_BOSS_KEY_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2)), }, { @@ -446,13 +449,13 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_TOWER_FLOOR_3, []{return Here(RR_GANONS_TOWER_FLOOR_2, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2);});}), }); - areaTable[RR_GANONS_TOWER_FLOOR_3] = Region("Ganon's Tower Floor 3", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_TOWER_FLOOR_3] = Region("Ganon's Tower Floor 3", SCENE_GANONS_TOWER, {}, {}, { //Exits Entrance(RR_GANONS_TOWER_FLOOR_2, []{return Here(RR_GANONS_TOWER_FLOOR_3, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE, ED_CLOSE, true, 2);});}), Entrance(RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR, []{return Here(RR_GANONS_TOWER_FLOOR_3, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE, ED_CLOSE, true, 2);});}), }); - areaTable[RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR] = Region("Ganon's Tower Before Ganondorf's Lair", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR] = Region("Ganon's Tower Before Ganondorf's Lair", SCENE_GANONS_TOWER, {}, { // Locations LOCATION(RC_GANONS_CASTLE_GANONS_TOWER_POT_1, logic->CanBreakPots()), LOCATION(RC_GANONS_CASTLE_GANONS_TOWER_POT_2, logic->CanBreakPots()), @@ -478,7 +481,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_TOWER_GANONDORF_LAIR, []{return Here(RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR, []{return logic->HasItem(RG_GANONS_CASTLE_BOSS_KEY);});}), }); - areaTable[RR_GANONS_TOWER_GANONDORF_LAIR] = Region("Ganondorf's Lair", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_TOWER_GANONDORF_LAIR] = Region("Ganondorf's Lair", SCENE_GANONDORF_BOSS, {}, { //Locations LOCATION(RC_GANONDORF_HINT, logic->HasBossSoul(RG_GANON_SOUL)), }, { @@ -486,7 +489,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_ESCAPE, []{return logic->CanKillEnemy(RE_GANONDORF);}), }); - areaTable[RR_GANONS_CASTLE_ESCAPE] = Region("Ganon's Castle Escape", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_ESCAPE] = Region("Ganon's Castle Escape", SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, {}, { //Locations //10 pots //RANDOTODO hook potsanity pots up to escape. @@ -498,10 +501,11 @@ void RegionTable_Init_GanonsCastle() { //Entrance(RR_GANONS_CASTLE_GANON_ARENA, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2, true);}), }); - areaTable[RR_GANONS_CASTLE_GANON_ARENA] = Region("Ganon's Arena", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_GANON_ARENA] = Region("Ganon's Arena", SCENE_GANON_BOSS, {}, { //Locations LOCATION(RC_GANON, logic->CanKillEnemy(RE_GANON)), }, {}); #pragma endregion -} \ No newline at end of file + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index f0b9de5c3e..2eb8764e13 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -5,20 +5,21 @@ using namespace Rando; void RegionTable_Init_GerudoTrainingGround() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_GERUDO_TRAINING_GROUND_ENTRYWAY] = Region("Gerudo Training Ground Entryway", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_ENTRYWAY] = Region("Gerudo Training Ground Entryway", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_LOBBY, []{return ctx->GetDungeon(GERUDO_TRAINING_GROUND)->IsVanilla();}), Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LOBBY, []{return ctx->GetDungeon(GERUDO_TRAINING_GROUND)->IsMQ();}), - Entrance(RR_GERUDO_FORTRESS, []{return true;}), + Entrance(RR_GF_OUTSIDE_GTG, []{return true;}), }); #pragma region Vanilla - areaTable[RR_GERUDO_TRAINING_GROUND_LOBBY] = Region("Gerudo Training Ground Lobby", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_LOBBY] = Region("Gerudo Training Ground Lobby", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations - LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)), - LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, logic->CanHitEyeTargets()), + LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, logic->CanHitEyeTargets()), LOCATION(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2, true)), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, logic->CanKillEnemy(RE_BEAMOS) && logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2, true)), LOCATION(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), @@ -32,7 +33,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE] = Region("Gerudo Training Ground Central Maze", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE] = Region("Gerudo Training Ground Central Maze", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 3) && (ctx->GetTrickOption(RT_LENS_GTG) || logic->CanUse(RG_LENS_OF_TRUTH))), LOCATION(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 4)), @@ -44,7 +45,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE_RIGHT, []{return logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 9);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE_RIGHT] = Region("Gerudo Training Ground Central Maze Right", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE_RIGHT] = Region("Gerudo Training Ground Central Maze Right", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, true), LOCATION(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, true), @@ -55,7 +56,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_LAVA_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_LAVA_ROOM] = Region("Gerudo Training Ground Lava Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_LAVA_ROOM] = Region("Gerudo Training Ground Lava Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24), }, { @@ -64,7 +65,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_HAMMER_ROOM, []{return logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_HOVER_BOOTS) && logic->CanUse(RG_HOOKSHOT));}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_HAMMER_ROOM] = Region("Gerudo Training Ground Hammer Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_HAMMER_ROOM] = Region("Gerudo Training Ground Hammer Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, logic->CanAttack()), LOCATION(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, logic->CanUse(RG_MEGATON_HAMMER) || (logic->TakeDamage() && ctx->GetTrickOption(RT_FLAMING_CHESTS))), @@ -74,7 +75,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_LAVA_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_EYE_STATUE_LOWER] = Region("Gerudo Training Ground Eye Statue Lower", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_EYE_STATUE_LOWER] = Region("Gerudo Training Ground Eye Statue Lower", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, logic->CanUse(RG_FAIRY_BOW)), }, { @@ -82,7 +83,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_HAMMER_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_EYE_STATUE_UPPER] = Region("Gerudo Training Ground Eye Statue Upper", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_EYE_STATUE_UPPER] = Region("Gerudo Training Ground Eye Statue Upper", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, logic->CanUse(RG_FAIRY_BOW)), }, { @@ -90,7 +91,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_EYE_STATUE_LOWER, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_ROOM] = Region("Gerudo Training Ground Heavy Block Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_ROOM] = Region("Gerudo Training Ground Heavy Block Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, logic->CanKillEnemy(RE_WOLFOS, ED_CLOSE, true, 4, true)), }, { @@ -99,7 +100,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_LIKE_LIKE_ROOM, []{return (ctx->GetTrickOption(RT_LENS_GTG) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_GTG_FAKE_WALL) && logic->CanUse(RG_HOVER_BOOTS))) && logic->CanUse(RG_SILVER_GAUNTLETS);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_LIKE_LIKE_ROOM] = Region("Gerudo Training Ground Like Like Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_LIKE_LIKE_ROOM] = Region("Gerudo Training Ground Like Like Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, logic->CanJumpslashExceptHammer()), LOCATION(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, logic->CanJumpslashExceptHammer()), @@ -111,7 +112,7 @@ void RegionTable_Init_GerudoTrainingGround() { #pragma region MQ - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LOBBY] = Region("Gerudo Training Ground MQ Lobby", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LOBBY] = Region("Gerudo Training Ground MQ Lobby", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, true), LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, true), @@ -131,7 +132,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_LOBBY, []{return (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT));});}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_HIDDEN_ROOM] = Region("Gerudo Training Ground MQ Maze Hidden Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_HIDDEN_ROOM] = Region("Gerudo Training Ground MQ Maze Hidden Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, true), }, { @@ -139,7 +140,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LOBBY, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_FIRST_LOCK] = Region("Gerudo Training Ground MQ Maze First Lock", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_FIRST_LOCK] = Region("Gerudo Training Ground MQ Maze First Lock", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, true), }, { @@ -148,15 +149,19 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER, []{return logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 3);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER] = Region("Gerudo Training Ground MQ Center", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER] = Region("Gerudo Training Ground MQ Center", SCENE_GERUDO_TRAINING_GROUND, { //Events EventAccess(&logic->MQGTGMazeSwitch, []{return logic->CanUse(RG_MEGATON_HAMMER);}), - }, {}, { + }, + { //Locations + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_MAZE_FIRST_LOCK, []{return logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 3);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM] = Region("Gerudo Training Ground MQ Sand Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM] = Region("Gerudo Training Ground MQ Sand Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, logic->CanKillEnemy(RE_IRON_KNUCKLE)), }, { @@ -165,13 +170,13 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);});}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE] = Region("Gerudo Training Ground MQ Left Side", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE] = Region("Gerudo Training Ground MQ Left Side", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM, []{return true;}), - Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE, []{return logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_GTG_MQ_WIHTOUT_HOOKSHOT) || (ctx->GetTrickOption(RT_GTG_MQ_WITH_HOOKSHOT) && logic->IsAdult && logic->CanJumpslash() && logic->CanUse(RG_HOOKSHOT));});}), + Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE, []{return logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_GTG_MQ_WITHOUT_HOOKSHOT) || (ctx->GetTrickOption(RT_GTG_MQ_WITH_HOOKSHOT) && logic->IsAdult && logic->CanJumpslash() && logic->CanUse(RG_HOOKSHOT));});}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM] = Region("Gerudo Training Ground MQ Stalfos Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM] = Region("Gerudo Training Ground MQ Stalfos Room", SCENE_GERUDO_TRAINING_GROUND, { //Events EventAccess(&logic->BlueFireAccess, []{return true;}), }, { @@ -184,13 +189,13 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE, []{return logic->IsAdult && Here(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2, true);}) && (ctx->GetTrickOption(RT_LENS_GTG_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->BlueFire() && (logic->CanUse(RG_SONG_OF_TIME) || (ctx->GetTrickOption(RT_GTG_FAKE_WALL) && logic->CanUse(RG_HOVER_BOOTS)));}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_BEHIND_BLOCK] = Region("Gerudo Training Ground MQ Behind Block", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_BEHIND_BLOCK] = Region("Gerudo Training Ground MQ Behind Block", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations //implies logic->CanKillEnemy(RE_SPIKE) LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, logic->CanKillEnemy(RE_FREEZARD)), }, {}); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE] = Region("Gerudo Training Ground MQ Statue Room Ledge", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE] = Region("Gerudo Training Ground MQ Statue Room Ledge", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, []{return true;}), //implies dropping down to hit the switch. Using swords, especially master, is a bit awkward, may be trick worthy, but is only relevant with other tricks @@ -198,7 +203,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM] = Region("Gerudo Training Ground MQ Magenta Fire Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM] = Region("Gerudo Training Ground MQ Magenta Fire Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, logic->MQGTGMazeSwitch), }, { @@ -206,7 +211,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM] = Region("Gerudo Training Ground MQ Statue ROom", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM] = Region("Gerudo Training Ground MQ Statue ROom", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, logic->CanUse(RG_FAIRY_BOW)), }, { @@ -215,7 +220,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SLUG_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SLUG_ROOM] = Region("Gerudo Training Ground MQ Torch Slug Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SLUG_ROOM] = Region("Gerudo Training Ground MQ Torch Slug Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations //implies logic->CanKillEnemy(RE_TORCH_SLUG) LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, logic->CanKillEnemy(RE_IRON_KNUCKLE)), @@ -226,7 +231,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_SWITCH_LEDGE, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SLUG_ROOM, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);});}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_SWITCH_LEDGE] = Region("Gerudo Training Ground MQ Switch Ledge", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_SWITCH_LEDGE] = Region("Gerudo Training Ground MQ Switch Ledge", SCENE_GERUDO_TRAINING_GROUND, { //Events EventAccess(&logic->MQGTGRightSideSwitch, []{return logic->CanUse(RG_MEGATON_HAMMER);}), EventAccess(&logic->GTGPlatformSilverRupees, []{return logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_HOVER_BOOTS);}), @@ -241,7 +246,7 @@ void RegionTable_Init_GerudoTrainingGround() { //this region exists to place silver rupee items on later, normally it's all on fire and cannot be stood on without access from another area //This covers the 2 platforms that can be jumped to directly from RR_GERUDO_TRAINING_GROUND_MQ_SWITCH_LEDGE //the unshuffled rupee collection is handled by the event GTGPlatformSilverRupees - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEDGE_SIDE_PLATFORMS] = Region("Gerudo Training Ground MQ Ledge Side Platforms", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEDGE_SIDE_PLATFORMS] = Region("Gerudo Training Ground MQ Ledge Side Platforms", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { //Exits //This is merely to extend this region's logic if you have hovers Entrance(RR_GERUDO_TRAINING_GROUND_MQ_FURTHEST_PLATFORM, []{return logic->CanUse(RG_HOVER_BOOTS);}), @@ -250,13 +255,13 @@ void RegionTable_Init_GerudoTrainingGround() { //this region exists to place silver rupee items on later, normally it's all on fire and cannot be stood on without access from another area //This covers the platform that needs hover boots or the spawned targets to reach from any starting point other than RR_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT //the unshuffled rupee collection is handled by the event GTGPlatformSilverRupees - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_FURTHEST_PLATFORM] = Region("Gerudo Training Ground MQ Furthest Platform", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_FURTHEST_PLATFORM] = Region("Gerudo Training Ground MQ Furthest Platform", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { //Exits //This is merely to extend this region's logic if you have hovers Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LEDGE_SIDE_PLATFORMS, []{return logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_PLATFORMS_UNLIT_TORCH] = Region("Gerudo Training Ground MQ Platforms Unlit Torch", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_PLATFORMS_UNLIT_TORCH] = Region("Gerudo Training Ground MQ Platforms Unlit Torch", SCENE_GERUDO_TRAINING_GROUND, { //Events EventAccess(&logic->GTGPlatformSilverRupees, []{return logic->HasFireSource() && logic->CanUse(RG_HOVER_BOOTS);}), }, {}, { @@ -267,7 +272,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT, []{return logic->MQGTGRightSideSwitch && (logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_HOOKSHOT) && logic->HasFireSource()));}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SIDE_PLATFORMS] = Region("Gerudo Training Ground Torch Side Platforms", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SIDE_PLATFORMS] = Region("Gerudo Training Ground Torch Side Platforms", SCENE_GERUDO_TRAINING_GROUND, { //Events //this torch shot is possible as child but tight and obtuse enough to be a trick EventAccess(&logic->GTGPlatformSilverRupees, []{return ((logic->CanUse(RG_FAIRY_BOW) && logic->IsAdult) || logic->CanUse(RG_FIRE_ARROWS)) && logic->CanUse(RG_HOVER_BOOTS);}), @@ -279,17 +284,17 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_UNDERWATER] = Region("Gerudo Training Ground MQ Underwater", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_UNDERWATER] = Region("Gerudo Training Ground MQ Underwater", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations //it is possible to snipe the stingers with bow or sling before dropping in, or just get really lucky, and avoid needing to take damage, but that might be trick worthy - LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, logic->HasFireSource() && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24 && logic->TakeDamage()), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, logic->HasFireSource() && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24 && logic->HasItem(RG_BRONZE_SCALE) && logic->TakeDamage()), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_PLATFORMS_UNLIT_TORCH, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT] = Region("Gerudo Training Ground MQ Maze Right", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT] = Region("Gerudo Training Ground MQ Maze Right", SCENE_GERUDO_TRAINING_GROUND, { //Events EventAccess(&logic->GTGPlatformSilverRupees, []{return logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_HOVER_BOOTS);}), }, { @@ -305,7 +310,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_FURTHEST_PLATFORM, []{return logic->CanUse(RG_FIRE_ARROWS);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_ROOM] = Region("Gerudo Training Ground MQ Dinolfos Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_ROOM] = Region("Gerudo Training Ground MQ Dinolfos Room", SCENE_GERUDO_TRAINING_GROUND, { //Events //EventAccess(&WallFairy, []{return WallFairy || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW));}), }, { @@ -321,4 +326,5 @@ void RegionTable_Init_GerudoTrainingGround() { }); #pragma endregion -} \ No newline at end of file + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp index ff9b171c82..5151377ce2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp @@ -5,34 +5,35 @@ using namespace Rando; void RegionTable_Init_IceCavern() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_ICE_CAVERN_ENTRYWAY] = Region("Ice Cavern Entryway", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ICE_CAVERN_ENTRYWAY] = Region("Ice Cavern Entryway", SCENE_ICE_CAVERN, {}, {}, { //Exits Entrance(RR_ICE_CAVERN_BEGINNING, []{return ctx->GetDungeon(ICE_CAVERN)->IsVanilla();}), Entrance(RR_ICE_CAVERN_MQ_BEGINNING, []{return ctx->GetDungeon(ICE_CAVERN)->IsMQ() && logic->CanUseProjectile();}), - Entrance(RR_ZORAS_FOUNTAIN, []{return true;}), + Entrance(RR_ZF_LEDGE, []{return true;}), }); #pragma region Vanilla - areaTable[RR_ICE_CAVERN_BEGINNING] = Region("Ice Cavern Beginning", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_BEGINNING] = Region("Ice Cavern Beginning", SCENE_ICE_CAVERN, {}, { //Locations LOCATION(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_ICE_CAVERN_ENTRYWAY, []{return true;}), - Entrance(RR_ICE_CAVERN_MAIN, []{return Here(RR_ICE_CAVERN_BEGINNING, []{return (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives() || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE);});}), + Entrance(RR_ICE_CAVERN_MAIN, []{return Here(RR_ICE_CAVERN_BEGINNING, []{return logic->CanKillEnemy(RE_FREEZARD, ED_CLOSE, true, 4);});}), }); - areaTable[RR_ICE_CAVERN_MAIN] = Region("Ice Cavern", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ICE_CAVERN_MAIN] = Region("Ice Cavern", SCENE_ICE_CAVERN, { //Events - EventAccess(&logic->BlueFireAccess, []{return logic->BlueFireAccess || (logic->IsAdult && logic->HasBottle());}), + EventAccess(&logic->BlueFireAccess, []{return logic->IsAdult;}), }, { //Locations LOCATION(RC_ICE_CAVERN_MAP_CHEST, logic->BlueFire() && logic->IsAdult), LOCATION(RC_ICE_CAVERN_COMPASS_CHEST, logic->BlueFire()), - LOCATION(RC_ICE_CAVERN_IRON_BOOTS_CHEST, logic->BlueFire() && (logic->CanJumpslash() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE))), - LOCATION(RC_SHEIK_IN_ICE_CAVERN, logic->BlueFire() && (logic->CanJumpslash() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE)) && logic->IsAdult), + LOCATION(RC_ICE_CAVERN_IRON_BOOTS_CHEST, logic->BlueFire() && logic->CanKillEnemy(RE_WOLFOS)), + LOCATION(RC_SHEIK_IN_ICE_CAVERN, logic->BlueFire() && logic->CanKillEnemy(RE_WOLFOS) && logic->IsAdult), LOCATION(RC_ICE_CAVERN_FREESTANDING_POH, logic->BlueFire()), LOCATION(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, logic->HookshotOrBoomerang()), LOCATION(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, logic->BlueFire() && logic->HookshotOrBoomerang()), @@ -58,7 +59,7 @@ void RegionTable_Init_IceCavern() { #pragma region MQ - areaTable[RR_ICE_CAVERN_MQ_BEGINNING] = Region("Ice Cavern MQ Beginning", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_MQ_BEGINNING] = Region("Ice Cavern MQ Beginning", SCENE_ICE_CAVERN, {}, { //Locations LOCATION(RC_ICE_CAVERN_MQ_ENTRANCE_POT, logic->CanBreakPots()), }, { @@ -68,7 +69,7 @@ void RegionTable_Init_IceCavern() { Entrance(RR_ICE_CAVERN_MQ_HUB, []{return true;}), }); - areaTable[RR_ICE_CAVERN_MQ_HUB] = Region("Ice Cavern MQ Hub", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ICE_CAVERN_MQ_HUB] = Region("Ice Cavern MQ Hub", SCENE_ICE_CAVERN, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -83,13 +84,13 @@ void RegionTable_Init_IceCavern() { //Exits //the switch for the glass blocking the entrance is linked to the switch that controls the glass around the skulltulla in RR_ICE_CAVERN_MQ_SCARECROW_ROOM //if you clear the ice, you can hit it with a pot from here. - Entrance(RR_ICE_CAVERN_BEGINNING, []{return logic->BlueFire();}), + Entrance(RR_ICE_CAVERN_MQ_BEGINNING, []{return logic->BlueFire();}), Entrance(RR_ICE_CAVERN_MQ_MAP_ROOM, []{return Here(RR_ICE_CAVERN_MQ_BEGINNING, []{return logic->CanKillEnemy(RE_WHITE_WOLFOS) && logic->CanKillEnemy(RE_FREEZARD);});}), Entrance(RR_ICE_CAVERN_MQ_COMPASS_ROOM, []{return logic->IsAdult && logic->BlueFire();}), Entrance(RR_ICE_CAVERN_MQ_SCARECROW_ROOM, []{return logic->BlueFire();}), }); - areaTable[RR_ICE_CAVERN_MQ_MAP_ROOM] = Region("Ice Cavern MQ Map Room", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ICE_CAVERN_MQ_MAP_ROOM] = Region("Ice Cavern MQ Map Room", SCENE_ICE_CAVERN, { //Events //Child can fit between the stalagmites on the left hand side EventAccess(&logic->BlueFireAccess, []{return logic->IsChild || logic->CanJumpslash() || logic->HasExplosives();}), @@ -98,7 +99,7 @@ void RegionTable_Init_IceCavern() { LOCATION(RC_ICE_CAVERN_MQ_MAP_CHEST, logic->BlueFire() && Here(RR_ICE_CAVERN_MQ_MAP_ROOM, []{return logic->CanHitSwitch();})), }, {}); - areaTable[RR_ICE_CAVERN_MQ_SCARECROW_ROOM] = Region("Ice Cavern MQ Scarecrow Room", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_MQ_SCARECROW_ROOM] = Region("Ice Cavern MQ Scarecrow Room", SCENE_ICE_CAVERN, {}, { //Locations LOCATION(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, (logic->BlueFire() && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || (logic->IsAdult && logic->CanHitSwitch(ED_LONG_JUMPSLASH))), LOCATION(RC_ICE_CAVERN_MQ_GS_SCARECROW, logic->CanUse(RG_SCARECROW) || (logic->IsAdult && (logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_ICE_MQ_SCARECROW)))), @@ -109,7 +110,7 @@ void RegionTable_Init_IceCavern() { Entrance(RR_ICE_CAVERN_MQ_WEST_CORRIDOR, []{return logic->IsAdult && logic->BlueFire();}), }); - areaTable[RR_ICE_CAVERN_MQ_WEST_CORRIDOR] = Region("Ice Cavern MQ West Corridor", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_MQ_WEST_CORRIDOR] = Region("Ice Cavern MQ West Corridor", SCENE_ICE_CAVERN, {}, { //Locations LOCATION(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, logic->CanBreakPots()), LOCATION(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, logic->CanBreakPots()), @@ -119,17 +120,17 @@ void RegionTable_Init_IceCavern() { Entrance(RR_ICE_CAVERN_MQ_STALFOS_ROOM, []{return true;}), }); - areaTable[RR_ICE_CAVERN_MQ_STALFOS_ROOM] = Region("Ice Cavern MQ Stalfos Room", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_MQ_STALFOS_ROOM] = Region("Ice Cavern MQ Stalfos Room", SCENE_ICE_CAVERN, {}, { //Locations LOCATION(RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, logic->CanKillEnemy(RE_STALFOS)), LOCATION(RC_SHEIK_IN_ICE_CAVERN, logic->CanKillEnemy(RE_STALFOS)), }, { //Exits - Entrance(RR_ICE_CAVERN_MQ_SCARECROW_ROOM, []{return logic->BlueFire() && Here(RR_ICE_CAVERN_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), - Entrance(RR_ICE_CAVERN_MQ_BEGINNING, []{return logic->CanUse(RG_IRON_BOOTS) && Here(RR_ICE_CAVERN_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), + Entrance(RR_ICE_CAVERN_MQ_WEST_CORRIDOR, []{return Here(RR_ICE_CAVERN_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), + Entrance(RR_ICE_CAVERN_MQ_BEGINNING, []{return logic->CanUse(RG_IRON_BOOTS) && Here(RR_ICE_CAVERN_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), }); - areaTable[RR_ICE_CAVERN_MQ_COMPASS_ROOM] = Region("Ice Cavern MQ Compass Room", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ICE_CAVERN_MQ_COMPASS_ROOM] = Region("Ice Cavern MQ Compass Room", SCENE_ICE_CAVERN, { //Events EventAccess(&logic->BlueFireAccess, []{return true;}), }, { @@ -144,4 +145,5 @@ void RegionTable_Init_IceCavern() { }, {}); #pragma endregion -} \ No newline at end of file + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index fa9c7b085e..c40ccf8055 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -5,8 +5,9 @@ using namespace Rando; void RegionTable_Init_JabuJabusBelly() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_JABU_JABUS_BELLY_ENTRYWAY] = Region("Jabu Jabus Belly Entryway", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_ENTRYWAY] = Region("Jabu Jabus Belly Entryway", SCENE_JABU_JABU, {}, {}, { //Exits Entrance(RR_JABU_JABUS_BELLY_BEGINNING, []{return ctx->GetDungeon(JABU_JABUS_BELLY)->IsVanilla();}), Entrance(RR_JABU_JABUS_BELLY_MQ_BEGINNING, []{return ctx->GetDungeon(JABU_JABUS_BELLY)->IsMQ();}), @@ -15,23 +16,24 @@ void RegionTable_Init_JabuJabusBelly() { #pragma region Vanilla - areaTable[RR_JABU_JABUS_BELLY_BEGINNING] = Region("Jabu Jabus Belly Beginning", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_BEGINNING] = Region("Jabu Jabus Belly Beginning", SCENE_JABU_JABU, {}, {}, { //Exits Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, []{return true;}), Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return logic->CanUseProjectile();}), }); //Combines Lift room middle and lower, 1F holes room, the forked corridor, and it's side rooms - areaTable[RR_JABU_JABUS_BELLY_MAIN] = Region("Jabu Jabus Belly Main", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MAIN] = Region("Jabu Jabus Belly Main", SCENE_JABU_JABU, { //Events - EventAccess(&logic->JabuRutoInB1, []{return true;}), EventAccess(&logic->JabuWestTentacle, []{return logic->JabuRutoIn1F && logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_DEKU_SCRUB, logic->HasItem(RG_BRONZE_SCALE) && (logic->IsChild || logic->HasItem(RG_SILVER_SCALE) || ctx->GetTrickOption(RT_JABU_ALCOVE_JUMP_DIVE) || logic->CanUse(RG_IRON_BOOTS)) && logic->CanStunDeku()), + LOCATION(RC_JABU_JABUS_BELLY_DEKU_SCRUB, logic->HasItem(RG_BRONZE_SCALE) && (logic->IsChild || logic->HasItem(RG_SILVER_SCALE) || ctx->GetTrickOption(RT_JABU_ALCOVE_JUMP_DIVE) || logic->CanUse(RG_IRON_BOOTS)) && logic->CanStunDeku()), //We can kill the Stingers with ruto - LOCATION(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, logic->JabuRutoIn1F), - LOCATION(RC_JABU_JABUS_BELLY_MAP_CHEST, logic->JabuWestTentacle), + LOCATION(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, logic->JabuRutoIn1F), + LOCATION(RC_JABU_JABUS_BELLY_MAP_CHEST, logic->JabuWestTentacle), + LOCATION(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_BEGINNING, []{return true;}), @@ -44,7 +46,7 @@ void RegionTable_Init_JabuJabusBelly() { }); //contains B1 of hole room (aside from the ledge leading to big octo), 2 octorock room and north water switch room - areaTable[RR_JABU_JABUS_BELLY_B1_NORTH] = Region("Jabu Jabus Belly B1 North", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_B1_NORTH] = Region("Jabu Jabus Belly B1 North", SCENE_JABU_JABU, { //Events EventAccess(&logic->JabuRutoIn1F, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE);}), EventAccess(&logic->FairyPot, []{return logic->CanUse(RG_BOOMERANG) || (logic->CanUse(RG_HOVER_BOOTS) && logic->CanKillEnemy(RE_OCTOROK));}), @@ -66,7 +68,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_SOUTH, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE);}), }); - areaTable[RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_LEDGE] = Region("Jabu Jabus Belly Water Switch Room Ledge", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_LEDGE] = Region("Jabu Jabus Belly Water Switch Room Ledge", SCENE_JABU_JABU, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -82,7 +84,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_SOUTH, []{return true;}), }); - areaTable[RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_SOUTH] = Region("Jabu Jabus Belly Water Switch Room South", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_SOUTH] = Region("Jabu Jabus Belly Water Switch Room South", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, logic->HookshotOrBoomerang()), }, { @@ -92,7 +94,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return logic->CanUseProjectile();}), }); - areaTable[RR_JABU_JABUS_BELLY_COMPASS_ROOM] = Region("Jabu Jabus Belly Compass Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_COMPASS_ROOM] = Region("Jabu Jabus Belly Compass Room", SCENE_JABU_JABU, {}, { //Locations //ruto could theoretically clear this room, but it's hard because of the timer and she doesn't appear with you when you respawn after failing, which would force a savewarp LOCATION(RC_JABU_JABUS_BELLY_COMPASS_CHEST, logic->CanKillEnemy(RE_SHABOM)), @@ -101,7 +103,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return Here(RR_JABU_JABUS_BELLY_COMPASS_ROOM, []{return logic->CanKillEnemy(RE_SHABOM);});}), }); - areaTable[RR_JABU_JABUS_BELLY_BLUE_TENTACLE] = Region("Jabu Jabus Belly Blue Tentacle", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_BLUE_TENTACLE] = Region("Jabu Jabus Belly Blue Tentacle", SCENE_JABU_JABU, { //Events EventAccess(&logic->JabuEastTentacle, []{return logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, {}, { @@ -109,7 +111,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return logic->JabuEastTentacle;}), }); - areaTable[RR_JABU_JABUS_BELLY_GREEN_TENTACLE] = Region("Jabu Jabus Belly Green Tentacle", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_GREEN_TENTACLE] = Region("Jabu Jabus Belly Green Tentacle", SCENE_JABU_JABU, { //Events EventAccess(&logic->JabuNorthTentacle, []{return logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, {}, { @@ -118,7 +120,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return logic->JabuNorthTentacle;}), }); - areaTable[RR_JABU_JABUS_BELLY_BIGOCTO_LEDGE] = Region("Jabu Jabus Belly Bigocto Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_BIGOCTO_LEDGE] = Region("Jabu Jabus Belly Bigocto Room", SCENE_JABU_JABU, {}, { //Locations //Only adult can get the token without assistance LOCATION(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH)), @@ -129,7 +131,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_ABOVE_BIGOCTO, []{return logic->JabuRutoIn1F && Here(RR_JABU_JABUS_BELLY_BIGOCTO_LEDGE, []{return logic->CanKillEnemy(RE_BIG_OCTO);});}), }); - areaTable[RR_JABU_JABUS_BELLY_ABOVE_BIGOCTO] = Region("Jabu Jabus Belly Above Bigocto", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_ABOVE_BIGOCTO] = Region("Jabu Jabus Belly Above Bigocto", SCENE_JABU_JABU, { //Events EventAccess(&logic->FairyPot, []{return true;}), EventAccess(&logic->NutPot, []{return true;}), @@ -143,7 +145,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_LIFT_UPPER, []{return logic->CanUse(RG_BOOMERANG);}), }); - areaTable[RR_JABU_JABUS_BELLY_LIFT_UPPER] = Region("Jabu Jabus Belly Lift Upper", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_LIFT_UPPER] = Region("Jabu Jabus Belly Lift Upper", SCENE_JABU_JABU, { //Events EventAccess(&logic->LoweredJabuPath, []{return true;}), }, {}, { @@ -151,7 +153,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return true;}), }); - areaTable[RR_JABU_JABUS_BELLY_NEAR_BOSS_ROOM] = Region("Jabu Jabus Belly Near Boss Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_NEAR_BOSS_ROOM] = Region("Jabu Jabus Belly Near Boss Room", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_BOMB_THROW)), }, { @@ -164,7 +166,7 @@ void RegionTable_Init_JabuJabusBelly() { #pragma region MQ - areaTable[RR_JABU_JABUS_BELLY_MQ_BEGINNING] = Region("Jabu Jabus Belly MQ Beginning", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_BEGINNING] = Region("Jabu Jabus Belly MQ Beginning", SCENE_JABU_JABU, { //Events EventAccess(&logic->NutPot, []{return true;}), }, { @@ -173,13 +175,15 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, []{return true;}), Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return Here(RR_JABU_JABUS_BELLY_MQ_BEGINNING, []{return logic->CanUse(RG_FAIRY_SLINGSHOT);});}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM] = Region("Jabu Jabus Belly MQ Lift Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM] = Region("Jabu Jabus Belly MQ Lift Room", SCENE_JABU_JABU, { //Events EventAccess(&logic->MQJabuLiftRoomCow, []{return logic->CanUse(RG_FAIRY_SLINGSHOT);}), }, { @@ -199,7 +203,7 @@ void RegionTable_Init_JabuJabusBelly() { //If opening RR_JABU_JABUS_BELLY_MQ_WATER_SWITCH_ROOM by lowering the geyser as 1 age is to let the other through is relevant, it needs an eventAccess }); - areaTable[RR_JABU_JABUS_BELLY_MQ_UNDERWATER_ALCOVE] = Region("Jabu Jabus Belly MQ Underwater Alcove", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_UNDERWATER_ALCOVE] = Region("Jabu Jabus Belly MQ Underwater Alcove", SCENE_JABU_JABU, { //Events EventAccess(&logic->MQJabuHolesRoomDoor, []{return true;}), }, { @@ -216,10 +220,15 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return logic->HasItem(RG_BRONZE_SCALE);}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM] = Region("Jabu Jabus Belly MQ Holes Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM] = Region("Jabu Jabus Belly MQ Holes Room", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, logic->CanCutShrubs() && logic->HasExplosives()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, logic->CanCutShrubs() && logic->HasExplosives()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return true;}), @@ -229,14 +238,15 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_PAST_OCTO, []{return logic->JabuWestTentacle && Here(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return logic->CanKillEnemy(RE_BIG_OCTO);}) && logic->CanUse(RG_FAIRY_SLINGSHOT);}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_WATER_SWITCH_ROOM] = Region("Jabu Jabus Belly MQ Water Switch Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MQ_WATER_SWITCH_ROOM] = Region("Jabu Jabus Belly MQ Water Switch Room", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, true), //Implies logic->CanKillEnemy(RE_LIKE_LIKE) && logic->CanKillEnemy(RE_STINGER). Without swim, jump from the song of time block to the vines. - LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, logic->CanKillEnemy(RE_LIZALFOS)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || (ctx->GetTrickOption(RT_JABU_MQ_SOT_GS) && logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, logic->CanBreakPots()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, logic->CanKillEnemy(RE_LIZALFOS)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || (ctx->GetTrickOption(RT_JABU_MQ_SOT_GS) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, logic->CanCutShrubs()), }, { //Exits //without swim, jump from rang chest to the other side @@ -245,7 +255,7 @@ void RegionTable_Init_JabuJabusBelly() { }); //Includes Like Like room - areaTable[RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR] = Region("Jabu Jabus Belly MQ Forked Corridor", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR] = Region("Jabu Jabus Belly MQ Forked Corridor", SCENE_JABU_JABU, { //Events EventAccess(&logic->JabuNorthTentacle, []{return Here(RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR, []{return logic->BlastOrSmash();}) && logic->CanUse(RG_BOOMERANG);}), }, { @@ -254,6 +264,9 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return logic->CanUse(RG_BOOMERANG);}), @@ -261,9 +274,9 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_WEST_FORKED_ROOMS, []{return Here(RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR, []{return logic->CanUse(RG_BOOMERANG);}) && (Here(RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) && logic->CanUse(RG_STICKS);}) || Here(RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR, []{return logic->HasFireSource();}));}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_WEST_FORKED_ROOMS] = Region("Jabu Jabus Belly MQ West Forked Rooms", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_WEST_FORKED_ROOMS] = Region("Jabu Jabus Belly MQ West Forked Rooms", SCENE_JABU_JABU, { //Events - EventAccess(&logic->JabuWestTentacle, []{return logic->CanUse(RG_BOOMERANG);}), + EventAccess(&logic->JabuWestTentacle, []{return logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, Here(RR_JABU_JABUS_BELLY_MQ_WEST_FORKED_ROOMS, []{return logic->HasExplosives();}) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), @@ -272,7 +285,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR, []{return true;}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_INVISIBLE_KEESE_ROOM] = Region("Jabu Jabus Belly MQ Invisible Keese Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MQ_INVISIBLE_KEESE_ROOM] = Region("Jabu Jabus Belly MQ Invisible Keese Room", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, //firstly, we can just use FAs to clear the web and then longshot the skull logic->CanUse(RG_FIRE_ARROWS) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONGSHOT) || @@ -292,13 +305,18 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return (logic->JabuNorthTentacle || logic->TakeDamage()) && logic->HasItem(RG_BRONZE_SCALE);}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_PAST_OCTO] = Region("Jabu Jabus Belly MQ Past Octo", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_PAST_OCTO] = Region("Jabu Jabus Belly MQ Past Octo", SCENE_JABU_JABU, { //Events //if a hover up to the path is added, this will want it's own room EventAccess(&logic->LoweredJabuPath, []{return logic->CanUse(RG_BOOMERANG) && logic->CanUse(RG_FAIRY_SLINGSHOT);}), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_MQ_COW, logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_COW, logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_GRASS, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1, logic->CanUse(RG_FAIRY_SLINGSHOT) && logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2, logic->CanUse(RG_FAIRY_SLINGSHOT) && logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return logic->CanUse(RG_BOOMERANG) && logic->CanUse(RG_FAIRY_SLINGSHOT);}), @@ -306,7 +324,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return logic->TakeDamage() && Here(RR_JABU_JABUS_BELLY_MQ_PAST_OCTO, []{return logic->CanKillEnemy(RE_BIG_OCTO);});}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM_EAST_LEDGE] = Region("Jabu Jabus Belly MQ Lift Room East Ledge", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM_EAST_LEDGE] = Region("Jabu Jabus Belly MQ Lift Room East Ledge", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, logic->MQJabuLiftRoomCow), }, { @@ -315,14 +333,16 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_EAST_ROOM, []{return logic->JabuNorthTentacle;}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_EAST_ROOM] = Region("Jabu Jabus Belly MQ Boss Region", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_EAST_ROOM] = Region("Jabu Jabus Belly MQ Boss Region", SCENE_JABU_JABU, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_HOOKSHOT))), - LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_HOOKSHOT))), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM_EAST_LEDGE, []{return true;}), @@ -332,16 +352,20 @@ void RegionTable_Init_JabuJabusBelly() { #pragma endregion // Boss Room - areaTable[RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY] = Region("Jabu Jabus Belly Boss Entryway", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY] = Region("Jabu Jabus Belly Boss Entryway", SCENE_JABU_JABU, {}, {}, { + // Exits + Entrance(RR_JABU_JABUS_BELLY_BOSS_ROOM, []{return true;}), + }); + + areaTable[RR_JABU_JABUS_BELLY_BOSS_EXIT] = Region("Jabu Jabus Belly Boss Exit", SCENE_JABU_JABU, {}, {}, { // Exits Entrance(RR_JABU_JABUS_BELLY_NEAR_BOSS_ROOM, []{return ctx->GetDungeon(JABU_JABUS_BELLY)->IsVanilla();}), Entrance(RR_JABU_JABUS_BELLY_MQ_EAST_ROOM, []{return ctx->GetDungeon(JABU_JABUS_BELLY)->IsMQ();}), - Entrance(RR_JABU_JABUS_BELLY_BOSS_ROOM, []{return true;}), }); - areaTable[RR_JABU_JABUS_BELLY_BOSS_ROOM] = Region("Jabu Jabus Belly Boss Room", "Jabu Jabus Belly", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_BOSS_ROOM] = Region("Jabu Jabus Belly Boss Room", SCENE_JABU_JABU_BOSS, { // Events //todo: add pot kill trick - EventAccess(&logic->JabuJabusBellyClear, []{return logic->JabuJabusBellyClear || logic->CanKillEnemy(RE_BARINADE);}), + EventAccess(&logic->JabuJabusBellyClear, []{return logic->CanKillEnemy(RE_BARINADE);}), }, { // Locations LOCATION(RC_JABU_JABUS_BELLY_BARINADE_POT_1, logic->CanBreakPots()), @@ -354,7 +378,9 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_BARINADE, logic->JabuJabusBellyClear), }, { // Exits - Entrance(RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, []{return false;}), - Entrance(RR_ZORAS_FOUNTAIN, []{return logic->JabuJabusBellyClear;}, false), + Entrance(RR_JABU_JABUS_BELLY_BOSS_EXIT, []{return false;}), + Entrance(RR_ZORAS_FOUNTAIN, []{return logic->JabuJabusBellyClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index bdcf8a4fa0..d276fc4189 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -5,8 +5,9 @@ using namespace Rando; void RegionTable_Init_ShadowTemple() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_SHADOW_TEMPLE_ENTRYWAY] = Region("Shadow Temple Entryway", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_ENTRYWAY] = Region("Shadow Temple Entryway", SCENE_SHADOW_TEMPLE, {}, {}, { //Exits Entrance(RR_SHADOW_TEMPLE_BEGINNING, []{return ctx->GetDungeon(SHADOW_TEMPLE)->IsVanilla() && (ctx->GetTrickOption(RT_LENS_SHADOW) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT));}), Entrance(RR_SHADOW_TEMPLE_MQ_BEGINNING, []{return ctx->GetDungeon(SHADOW_TEMPLE)->IsMQ();}), @@ -15,7 +16,7 @@ void RegionTable_Init_ShadowTemple() { #pragma region Vanilla - areaTable[RR_SHADOW_TEMPLE_BEGINNING] = Region("Shadow Temple Beginning", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_BEGINNING] = Region("Shadow Temple Beginning", SCENE_SHADOW_TEMPLE, { //Events EventAccess(&logic->NutPot, []{return true;}), }, { @@ -36,7 +37,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_FIRST_BEAMOS, []{return logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_SHADOW_TEMPLE_FIRST_BEAMOS] = Region("Shadow Temple First Beamos", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_FIRST_BEAMOS] = Region("Shadow Temple First Beamos", SCENE_SHADOW_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), //This fairy pot is only on 3DS }, { @@ -51,7 +52,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, []{return false;}), }); - areaTable[RR_SHADOW_TEMPLE_HUGE_PIT] = Region("Shadow Temple Huge Pit", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_HUGE_PIT] = Region("Shadow Temple Huge Pit", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, logic->CanJumpslashExceptHammer()), LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, logic->CanJumpslashExceptHammer()), @@ -76,11 +77,11 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_WIND_TUNNEL, []{return ((ctx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && ctx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->CanUse(RG_HOOKSHOT) && logic->SmallKeys(RR_SHADOW_TEMPLE, 3, 4);}), }); - areaTable[RR_SHADOW_TEMPLE_WIND_TUNNEL] = Region("Shadow Temple Wind Tunnel", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_WIND_TUNNEL] = Region("Shadow Temple Wind Tunnel", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_WIND_HINT_CHEST, true), - LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, logic->CanJumpslashExceptHammer()), - LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, true), + LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, logic->CanKillEnemy(RE_GIBDO, ED_CLOSE, true, 2)), + LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, logic->HasExplosives()), LOCATION(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, logic->CanUse(RG_LONGSHOT) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5)), LOCATION(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, logic->CanBreakPots()), @@ -92,11 +93,11 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, []{return logic->CanJumpslashExceptHammer() && logic->CanUse(RG_ZELDAS_LULLABY) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5);}), }); - areaTable[RR_SHADOW_TEMPLE_BEYOND_BOAT] = Region("Shadow Temple Beyond Boat", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_BEYOND_BOAT] = Region("Shadow Temple Beyond Boat", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, logic->CanUse(RG_DINS_FIRE)), LOCATION(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, logic->CanUse(RG_DINS_FIRE)), - LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, logic->CanJumpslashExceptHammer()), + LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, logic->CanKillEnemy(RE_FLOORMASTER)), //RANDOTODO check if child can reach the token LOCATION(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, logic->IsAdult && logic->CanAttack()), LOCATION(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, logic->CanBreakPots()), @@ -111,7 +112,7 @@ void RegionTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (ctx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))) && logic->CanUse(RG_SONG_OF_TIME) || (logic->CanUse(RG_DISTANT_SCARECROW) && logic->CanUse(RG_HOVER_BOOTS))), }, { //Exits - Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (ctx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5) && logic->CanUse(RG_HOVER_BOOTS) && logic->HasItem(RG_SHADOW_TEMPLE_BOSS_KEY);}) + Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (ctx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5) && logic->CanUse(RG_HOVER_BOOTS);}) }); #pragma endregion @@ -119,13 +120,21 @@ void RegionTable_Init_ShadowTemple() { #pragma region MQ //RANDOTODO doublecheck CanAttack when rewriting, as I assumed it only checked adult due to the entrance - areaTable[RR_SHADOW_TEMPLE_MQ_BEGINNING] = Region("Shadow Temple MQ Beginning", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_BEGINNING] = Region("Shadow Temple MQ Beginning", SCENE_SHADOW_TEMPLE, {}, {}, { //Exits Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, []{return true;}), Entrance(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM] = Region("Shadow Temple MQ Spinner Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM] = Region("Shadow Temple MQ Spinner Room", SCENE_SHADOW_TEMPLE, {}, + { + // Locations + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, []{return true;}), Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, []{return Here(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}) && (logic->CanUse(RG_HOVER_BOOTS) || Here(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_FIRE_ARROWS);}) || (ctx->GetTrickOption(RT_SHADOW_MQ_GAP) && logic->CanUse(RG_LONGSHOT) && logic->CanJumpslashExceptHammer()));}), @@ -133,7 +142,7 @@ void RegionTable_Init_ShadowTemple() { }); //Assumes we're in the "main" area and needed lens to enter. logic will need changes if a void warp puts us somewhere weird - areaTable[RR_SHADOW_TEMPLE_MQ_DEAD_HAND_AREA] = Region("Shadow Temple MQ Dead Hand Region", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_DEAD_HAND_AREA] = Region("Shadow Temple MQ Dead Hand Region", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_REDEAD)), //There's a shared flag tied to some glass here. eye target here and killing an enemy group later in the dungeon toggles. I'm building the logic as "intended", assuming the switch needs flipping @@ -148,7 +157,7 @@ void RegionTable_Init_ShadowTemple() { }); //also includes the B2 gibdo room - areaTable[RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS] = Region("Shadow Temple MQ First Beamos", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS] = Region("Shadow Temple MQ First Beamos", SCENE_SHADOW_TEMPLE, {}, { //Locations //Doing this sets the shared flag for the glass in RR_SHADOW_TEMPLE_MQ_DEAD_HAND_AREA, but doesn't seem to affect the chest LOCATION(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, logic->CanKillEnemy(RE_GIBDO) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH))), @@ -159,7 +168,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_B2_SPINNING_BLADE_ROOM, []{return ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_B2_SPINNING_BLADE_ROOM] = Region("Shadow Temple MQ B2 Spinning Blade Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_B2_SPINNING_BLADE_ROOM] = Region("Shadow Temple MQ B2 Spinning Blade Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)))), }, { @@ -168,7 +177,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_SHORTCUT_PATH, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_SHORTCUT_PATH] = Region("Shadow Temple MQ Shortcut Path", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_SHORTCUT_PATH] = Region("Shadow Temple MQ Shortcut Path", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)), }, { @@ -179,14 +188,14 @@ void RegionTable_Init_ShadowTemple() { }); //Room exists for if it's ever possible to go backwards or void warp into the middle of shadow - areaTable[RR_SHADOW_TEMPLE_MQ_B2_TO_B3_CORRIDOR] = Region("Shadow Temple MQ B2 to B3 Corridor", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_B2_TO_B3_CORRIDOR] = Region("Shadow Temple MQ B2 to B3 Corridor", SCENE_SHADOW_TEMPLE, {}, {}, { //Exits - Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, []{return logic->HasExplosives() && logic->SmallKeys(RR_SHADOW_TEMPLE, 2);}), + Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, []{return logic->SmallKeys(RR_SHADOW_TEMPLE, 2);}), Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, []{return true;}), //bunnyhovers + lens lets you go from the very top of upper pit to the stationary invisible platform below quite easily }); - areaTable[RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT] = Region("Shadow Temple MQ Upper Huge Pit", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT] = Region("Shadow Temple MQ Upper Huge Pit", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { @@ -195,7 +204,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_ROOM, []{return ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_ROOM] = Region("Shadow Temple MQ Invisible Blades Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_ROOM] = Region("Shadow Temple MQ Invisible Blades Room", SCENE_SHADOW_TEMPLE, {}, { //Locations //RT_SHADOW_MQ_INVISIBLE_BLADES does not work with NL as like-likes will not swallow you, likewise like-likes will not spit you with a fairy revive //you take half a heart base from a spit out, double check EffectiveHealth when damage logic gets reworked @@ -211,7 +220,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, []{return true;}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT] = Region("Shadow Temple MQ Lower Huge Pit", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT] = Region("Shadow Temple MQ Lower Huge Pit", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, logic->CanUse(RG_LONGSHOT)), }, { @@ -220,7 +229,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM, []{return logic->CanUse(RG_HOVER_BOOTS) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ_PLATFORM) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_SHADOW_TEMPLE, 3);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_STONE_UMBRELLA_ROOM] = Region("Shadow Temple MQ Stone Umbrella Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_STONE_UMBRELLA_ROOM] = Region("Shadow Temple MQ Stone Umbrella Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, true), //Assuming the known setup for RT_SHADOW_UMBRELLA and RT_SHADOW_UMBRELLA_GS, probably possible without sword + shield. @@ -237,7 +246,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_STONE_UMBRELLA, []{return logic->IsAdult && (logic->HasItem(RG_GORONS_BRACELET) || (ctx->GetTrickOption(RT_SHADOW_UMBRELLA) && logic->CanUse(RG_HOVER_BOOTS) && logic->CanStandingShield() && logic->CanUse(RG_MASTER_SWORD)));}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_UPPER_STONE_UMBRELLA] = Region("Shadow Temple MQ Upper Stone Umbrella", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_UPPER_STONE_UMBRELLA] = Region("Shadow Temple MQ Upper Stone Umbrella", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, true), @@ -249,7 +258,7 @@ void RegionTable_Init_ShadowTemple() { }); //while the spikes here are annoying, they don't really stop you doing anything, so I'll assume either lens trick, lens to see them, or taking damage from them. Not hovers though as a new player won't see the threat without lens to react properly - areaTable[RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM] = Region("Shadow Temple MQ Floor Spikes Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM] = Region("Shadow Temple MQ Floor Spikes Room", SCENE_SHADOW_TEMPLE, { //Events //lens or trick is always required for hookshot targets. We handle it here to not complicate the RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_UPPER_DOOR logic EventAccess(&logic->MQShadowFloorSpikeRupees, []{return (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && //Upper door side high rupee needs (hookshot and redead kill(as either age) for chest and adult) or longshot. hovers can cross from the left side with a backflip but that would be a trick @@ -268,7 +277,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_WIND_TUNNEL, []{return logic->SmallKeys(RR_SHADOW_TEMPLE, 4) && (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_HOOKSHOT) && (logic->MQShadowFloorSpikeRupees || Here(RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM, []{return logic->CanKillEnemy(RE_REDEAD);})))) && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_STALFOS_ROOM] = Region("Shadow Temple MQ Stalfos Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_STALFOS_ROOM] = Region("Shadow Temple MQ Stalfos Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2)), }, { @@ -276,14 +285,14 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM, []{return Here(RR_SHADOW_TEMPLE_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2);});}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_WIND_TUNNEL] = Region("Shadow Temple MQ Wind Tunnel", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_WIND_TUNNEL] = Region("Shadow Temple MQ Wind Tunnel", SCENE_SHADOW_TEMPLE, {}, {}, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM, []{return logic->SmallKeys(RR_SHADOW_TEMPLE, 4) && logic->CanPassEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT));}), Entrance(RR_SHADOW_TEMPLE_MQ_WIND_HINT_ROOM, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS));}), Entrance(RR_SHADOW_TEMPLE_MQ_B4_GIBDO_ROOM, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_WIND_HINT_ROOM] = Region("Shadow Temple MQ Wind Hint Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_WIND_HINT_ROOM] = Region("Shadow Temple MQ Wind Hint Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->CanPassEnemy(RE_REDEAD)), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), @@ -293,7 +302,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_WIND_TUNNEL, []{return true;}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_B4_GIBDO_ROOM] = Region("Shadow Temple MQ B4 Gibdo Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_MQ_B4_GIBDO_ROOM] = Region("Shadow Temple MQ B4 Gibdo Room", SCENE_SHADOW_TEMPLE, { //Events EventAccess(&logic->NutPot, []{return true;}), }, { @@ -310,7 +319,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_DOCK, []{return logic->SmallKeys(RR_SHADOW_TEMPLE, 5);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_DOCK] = Region("Shadow Temple MQ Dock", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_MQ_DOCK] = Region("Shadow Temple MQ Dock", SCENE_SHADOW_TEMPLE, { //Events EventAccess(&logic->ShadowShortcutBlock, []{return logic->HasItem(RG_GORONS_BRACELET);}), }, { @@ -325,7 +334,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, []{return (logic->IsAdult || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_ZELDAS_LULLABY);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT] = Region("Shadow Temple MQ Beyond Boat", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT] = Region("Shadow Temple MQ Beyond Boat", SCENE_SHADOW_TEMPLE, {}, { //Locations //It's a trick on N64 to kill this and drop down to collect this with normal weapons, as doing so without the statue being dropped voids you to before the boat //hilariously, you can also hit this with a pot before you bring down the statue, but there's no great way to reset it without crossing. the statues collision is very inconvenient afterwards @@ -337,7 +346,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_ACROSS_CHASM, []{return Here(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, []{return logic->CanUse(RG_FAIRY_BOW) || (ctx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5));});}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_ACROSS_CHASM] = Region("Shadow Temple MQ Across Chasm", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_ACROSS_CHASM] = Region("Shadow Temple MQ Across Chasm", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, logic->CanBreakPots()), LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, logic->CanBreakPots()), @@ -354,20 +363,21 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_BOSS_DOOR, []{return logic->CanUse(RG_HOVER_BOOTS) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_BOSS_DOOR] = Region("Shadow Temple MQ Boss Door", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_BOSS_DOOR] = Region("Shadow Temple MQ Boss Door", SCENE_SHADOW_TEMPLE, {}, { //Locations //you can drop onto this and the respawn is reasonable LOCATION(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_BOMB_THROW) || logic->CanUse(RG_MEGATON_HAMMER)) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH))), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_ACROSS_CHASM, []{return logic->CanUse(RG_HOVER_BOOTS) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}), - Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_SHADOW_TEMPLE_BOSS_KEY);}), + Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); //Assumes lens is checked on entry - areaTable[RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE] = Region("Shadow Temple MQ Invisible Maze", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE] = Region("Shadow Temple MQ Invisible Maze", SCENE_SHADOW_TEMPLE, {}, { //Locations - LOCATION(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, (logic->CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_SHADOW_MQ_DEADHAND)) && logic->CanKillEnemy(RE_DEAD_HAND) && logic->CanDetonateUprightBombFlower()), + //don't use CanDetonateUprightBombFlower as blue fire logic would need to account for player having multiple bottles & taking damage multiple times + LOCATION(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, (logic->CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_SHADOW_MQ_DEADHAND)) && logic->CanKillEnemy(RE_DEAD_HAND) && (logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET))), LOCATION(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, true), LOCATION(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, logic->CanBreakPots()), LOCATION(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, logic->CanBreakPots()), @@ -377,7 +387,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_SPIKE_WALLS_ROOM, []{return logic->SmallKeys(RR_SHADOW_TEMPLE, 6);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_SPIKE_WALLS_ROOM] = Region("Shadow Temple MQ Spike Walls Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_SPIKE_WALLS_ROOM] = Region("Shadow Temple MQ Spike Walls Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, logic->CanUse(RG_DINS_FIRE)), LOCATION(RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, logic->CanUse(RG_DINS_FIRE)), @@ -390,16 +400,16 @@ void RegionTable_Init_ShadowTemple() { #pragma endregion // Boss Room - areaTable[RR_SHADOW_TEMPLE_BOSS_ENTRYWAY] = Region("Shadow Temple Boss Entryway", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_BOSS_ENTRYWAY] = Region("Shadow Temple Boss Entryway", SCENE_SHADOW_TEMPLE, {}, {}, { // Exits Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, []{return ctx->GetDungeon(SHADOW_TEMPLE)->IsVanilla() && false;}), Entrance(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, []{return ctx->GetDungeon(SHADOW_TEMPLE)->IsMQ() && false;}), - Entrance(RR_SHADOW_TEMPLE_BOSS_ROOM, []{return true;}), + Entrance(RR_SHADOW_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_SHADOW_TEMPLE_BOSS_KEY);}), }); - areaTable[RR_SHADOW_TEMPLE_BOSS_ROOM] = Region("Shadow Temple Boss Room", "Shadow Temple", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_BOSS_ROOM] = Region("Shadow Temple Boss Room", SCENE_SHADOW_TEMPLE_BOSS, { // Events - EventAccess(&logic->ShadowTempleClear, []{return logic->ShadowTempleClear || logic->CanKillEnemy(RE_BONGO_BONGO);}), + EventAccess(&logic->ShadowTempleClear, []{return logic->CanKillEnemy(RE_BONGO_BONGO);}), }, { // Locations LOCATION(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, logic->ShadowTempleClear), @@ -409,4 +419,6 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return logic->ShadowTempleClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index e3d00ccf36..2755fe453b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -5,8 +5,9 @@ using namespace Rando; void RegionTable_Init_SpiritTemple() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_SPIRIT_TEMPLE_ENTRYWAY] = Region("Spirit Temple Entryway", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_ENTRYWAY] = Region("Spirit Temple Entryway", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_LOBBY, []{return ctx->GetDungeon(SPIRIT_TEMPLE)->IsVanilla();}), Entrance(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return ctx->GetDungeon(SPIRIT_TEMPLE)->IsMQ();}), @@ -15,7 +16,7 @@ void RegionTable_Init_SpiritTemple() { #pragma region Vanilla - areaTable[RR_SPIRIT_TEMPLE_LOBBY] = Region("Spirit Temple Lobby", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_LOBBY] = Region("Spirit Temple Lobby", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_LOBBY_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_LOBBY_POT_2, logic->CanBreakPots()), @@ -26,24 +27,26 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_EARLY_ADULT, []{return logic->CanUse(RG_SILVER_GAUNTLETS);}), }); - areaTable[RR_SPIRIT_TEMPLE_CHILD] = Region("Child Spirit Temple", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_CHILD] = Region("Child Spirit Temple", SCENE_SPIRIT_TEMPLE, { //Events EventAccess(&logic->NutCrate, []{return true;}), }, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), - LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), + LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CHILD_CLIMB, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), }); - areaTable[RR_SPIRIT_TEMPLE_CHILD_CLIMB] = Region("Child Spirit Temple Climb", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_CHILD_CLIMB] = Region("Child Spirit Temple Climb", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child))), LOCATION(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child))), @@ -57,7 +60,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, []{return logic->HasExplosives() || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS));}), }); - areaTable[RR_SPIRIT_TEMPLE_EARLY_ADULT] = Region("Early Adult Spirit Temple", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_EARLY_ADULT] = Region("Early Adult Spirit Temple", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_COMPASS_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_ZELDAS_LULLABY)), LOCATION(RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH))) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanJumpslashExceptHammer())), @@ -70,7 +73,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), }); - areaTable[RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER] = Region("Spirit Temple Central Chamber", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER] = Region("Spirit Temple Central Chamber", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MAP_CHEST, ((logic->HasExplosives() || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && (logic->CanUse(RG_DINS_FIRE) || ((logic->CanUse(RG_FIRE_ARROWS) || ctx->GetTrickOption(RT_SPIRIT_MAP_CHEST)) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_STICKS) ))) || @@ -107,7 +110,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, []{return ctx->GetTrickOption(RT_SPIRIT_PLATFORM_HOOKSHOT) && logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_SPIRIT_TEMPLE_OUTDOOR_HANDS] = Region("Spirit Temple Outdoor Hands", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_OUTDOOR_HANDS] = Region("Spirit Temple Outdoor Hands", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) && logic->CanUse(RG_LONGSHOT) && logic->HasExplosives()) || logic->SmallKeys(RR_SPIRIT_TEMPLE, 5)), LOCATION(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, logic->SmallKeys(RR_SPIRIT_TEMPLE, 4) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasExplosives()), @@ -116,7 +119,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_DESERT_COLOSSUS, []{return (logic->IsChild && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5)) || (logic->CanUse(RG_SILVER_GAUNTLETS) && ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) && logic->HasExplosives()) || logic->SmallKeys(RR_SPIRIT_TEMPLE, 5)));}), }); - areaTable[RR_SPIRIT_TEMPLE_BEYOND_CENTRAL_LOCKED_DOOR] = Region("Spirit Temple Beyond Central Locked Door", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_BEYOND_CENTRAL_LOCKED_DOOR] = Region("Spirit Temple Beyond Central Locked Door", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))) && logic->HasExplosives()), LOCATION(RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, (ctx->GetTrickOption(RT_LENS_SPIRIT) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->HasExplosives()), @@ -128,7 +131,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && (ctx->GetTrickOption(RT_SPIRIT_WALL) || logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_BOMBCHU_5) || ((logic->CanUse(RG_BOMB_BAG) || logic->CanUse(RG_NUTS) || logic->CanUse(RG_DINS_FIRE)) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_MEGATON_HAMMER))));}), }); - areaTable[RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR] = Region("Spirit Temple Beyond Final Locked Door", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR] = Region("Spirit Temple Beyond Final Locked Door", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, logic->CanUse(RG_ZELDAS_LULLABY) && ((logic->TakeDamage() && ctx->GetTrickOption(RT_FLAMING_CHESTS)) || (logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_HOOKSHOT)))), LOCATION(RC_SPIRIT_TEMPLE_TOPMOST_CHEST, (logic->CanUse(RG_MIRROR_SHIELD) && logic->CanAttack()) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))), @@ -139,17 +142,17 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, []{return logic->CanUse(RG_MIRROR_SHIELD) && logic->HasExplosives() && logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD] = Region("Spirit Temple Inside Statue Head", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD] = Region("Spirit Temple Inside Statue Head", SCENE_SPIRIT_TEMPLE, {}, {}, { // Exits Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, []{return true;}), - Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_SPIRIT_TEMPLE_BOSS_KEY);}), + Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); #pragma endregion #pragma region MQ - areaTable[RR_SPIRIT_TEMPLE_MQ_LOBBY] = Region("Spirit Temple MQ Lobby", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_LOBBY] = Region("Spirit Temple MQ Lobby", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, true), LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, Here(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return logic->BlastOrSmash();}) && logic->CanHitEyeTargets()), @@ -166,7 +169,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_SOUTH, []{return logic->CanUse(RG_LONGSHOT) && logic->CanUse(RG_BOMBCHU_5);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_1F_WEST] = Region("Spirit Temple MQ 1F West", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_1F_WEST] = Region("Spirit Temple MQ 1F West", SCENE_SPIRIT_TEMPLE, { //Events //not technically a rusted switch, but a boulder through a wall, but is part of the same trick on N64 EventAccess(&logic->MQSpiritCrawlBoulder, []{return logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_RUSTED_SWITCHES) && logic->CanUse(RG_MEGATON_HAMMER));}), @@ -183,7 +186,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_WEST_1F_RUSTED_SWITCH, []{return logic->IsChild && logic->MQSpiritCrawlBoulder;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_SOUTH] = Region("Spirit Temple MQ 1F Gibdo Room South", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_SOUTH] = Region("Spirit Temple MQ 1F Gibdo Room South", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_1F_WEST, []{return true;}), Entrance(RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_NORTH, []{return logic->CanUse(RG_BOMBCHU_5) && logic->CanHitEyeTargets();}), @@ -191,13 +194,13 @@ void RegionTable_Init_SpiritTemple() { }); // Room to store the 2 pots in to handle glitch logic going backwards around the loop later - areaTable[RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_NORTH] = Region("Spirit Temple MQ Gibdo Room North", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_NORTH] = Region("Spirit Temple MQ Gibdo Room North", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, logic->CanBreakPots()), }, {}); - areaTable[RR_SPIRIT_TEMPLE_MQ_TURNTABLE_ROOM] = Region("Spirit Temple Turntable Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_TURNTABLE_ROOM] = Region("Spirit Temple Turntable Room", SCENE_SPIRIT_TEMPLE, { //Events //For non-fairy pot items, you can also get them with rang without killing the stalfos EventAccess(&logic->FairyPot, []{return Here(RR_SPIRIT_TEMPLE_MQ_TURNTABLE_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), @@ -214,7 +217,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_NORTH, []{return Here(RR_SPIRIT_TEMPLE_MQ_TURNTABLE_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_NORTH] = Region("Spirit Temple MQ Map Room North", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_NORTH] = Region("Spirit Temple MQ Map Room North", SCENE_SPIRIT_TEMPLE, { //Events EventAccess(&logic->MQSpiritMapRoomEnemies, []{return logic->CanKillEnemy(RE_ANUBIS) && logic->CanKillEnemy(RE_KEESE);}), }, { @@ -226,7 +229,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_SOUTH, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_SOUTH] = Region("Spirit Temple MQ Map Room South", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_SOUTH] = Region("Spirit Temple MQ Map Room South", SCENE_SPIRIT_TEMPLE, { //Events //You can lure the keese over by aggroing them with dins if you use it as close to the torch keese as possible, but it's a trick as it's not intuitive and basically never comes up EventAccess(&logic->MQSpiritMapRoomEnemies, []{return logic->CanKillEnemy(RE_ANUBIS) && logic->CanKillEnemy(RE_KEESE, ED_BOOMERANG);}), @@ -240,7 +243,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_1F_WEST, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_WEST_1F_RUSTED_SWITCH] = Region("Spirit Temple MQ West 1F Rusted Switch", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_WEST_1F_RUSTED_SWITCH] = Region("Spirit Temple MQ West 1F Rusted Switch", SCENE_SPIRIT_TEMPLE, { //Events EventAccess(&logic->MQSpiritTimeTravelChest, []{return logic->CanUse(RG_MEGATON_HAMMER);}), EventAccess(&logic->MQSpiritCrawlBoulder, []{return logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_RUSTED_SWITCHES) && logic->CanUse(RG_MEGATON_HAMMER));}), @@ -251,7 +254,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_UNDER_LIKE_LIKE, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_UNDER_LIKE_LIKE] = Region("Spirit Temple MQ Under Like Like", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_UNDER_LIKE_LIKE] = Region("Spirit Temple MQ Under Like Like", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, MQSpiritSharedBrokenWallRoom(RR_SPIRIT_TEMPLE_MQ_UNDER_LIKE_LIKE, []{return logic->CanBreakPots();})), }, { @@ -261,7 +264,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_BROKEN_WALL_ROOM, []{return logic->CanHitSwitch();}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BROKEN_WALL_ROOM] = Region("Spirit Temple MQ Broken Wall Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BROKEN_WALL_ROOM] = Region("Spirit Temple MQ Broken Wall Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations //Implies CanKillEnemy(RE_LIKE_LIKE) LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, MQSpiritSharedBrokenWallRoom(RR_SPIRIT_TEMPLE_MQ_BROKEN_WALL_ROOM, []{return logic->CanKillEnemy(RE_BEAMOS);})), @@ -275,7 +278,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 2);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM] = Region("Spirit Temple MQ Statue Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM] = Region("Spirit Temple MQ Statue Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanHitEyeTargets();})), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return ((logic->IsAdult || logic->CanJumpslash()) && logic->CanUse(RG_BOOMERANG)) || ((logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_SONG_OF_TIME) || (logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP))) && logic->CanBreakPots());})), @@ -283,6 +286,10 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakCrates();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakCrates();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakSmallCrates();})), + }, { //Exits //we check possible adult access directly in MQSpiritSharedBrokenWallRoom, so this exit only covers Certain Access @@ -294,7 +301,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST, []{return logic->IsAdult && logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM] = Region("Spirit Temple MQ Sun Block Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM] = Region("Spirit Temple MQ Sun Block Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations //We don't need Shared here because If we are checking as child, universe 2 adult access needs nothing so it always passes, and if we are checking as adult, it is Certain Access LOCATION(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, true), @@ -308,13 +315,13 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_WEST_IRON_KNUCKLE, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 7);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_WEST_IRON_KNUCKLE] = Region("Spirit Temple MQ East Iron Knuckle", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_WEST_IRON_KNUCKLE] = Region("Spirit Temple MQ East Iron Knuckle", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 7);}), Entrance(RR_SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND] = Region("Spirit Temple MQ Silver Gauntlets Hand", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND] = Region("Spirit Temple MQ Silver Gauntlets Hand", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, true), }, { @@ -324,7 +331,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_SOUTH] = Region("Spirit Temple MQ Block Room South", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_SOUTH] = Region("Spirit Temple MQ Block Room South", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return true;}), //The block here is unusual in that it is a permanent flag, but reset anyway as child. This is because there's a check that would be blocked off by pushing them otherwise @@ -332,7 +339,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_NORTH, []{return logic->IsChild ? logic->CanUse(RG_SILVER_GAUNTLETS) : Here(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return logic->CanUse(RG_SILVER_GAUNTLETS);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_NORTH] = Region("Spirit Temple MQ Block Room North", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_NORTH] = Region("Spirit Temple MQ Block Room North", SCENE_SPIRIT_TEMPLE, {}, { //Locations //Does not need to be shared as it's hard child locked, because adult pushing the block is a permanent flag that blocks the eye target and cannot be undone LOCATION(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, logic->IsChild && logic->SmallKeys(RR_SPIRIT_TEMPLE, 7) && logic->CanHitEyeTargets()), @@ -342,9 +349,9 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST] = Region("Spirit Temple MQ Statue Room East", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST] = Region("Spirit Temple MQ Statue Room East", SCENE_SPIRIT_TEMPLE, {}, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, logic->CanUse(RG_HOOKSHOT) & logic->CanUse(RG_ZELDAS_LULLABY) && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_ZELDAS_LULLABY) && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS))), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, (ctx->GetTrickOption(RT_LENS_SPIRIT_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS))), }, { //Exits @@ -363,7 +370,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_2F, []{return logic->CanUse(RG_FIRE_ARROWS) || (ctx->GetTrickOption(RT_SPIRIT_MQ_LOWER_ADULT) && logic->CanUse(RG_DINS_FIRE));}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_2F] = Region("Spirit Temple MQ Three Suns Room 2F", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_2F] = Region("Spirit Temple MQ Three Suns Room 2F", SCENE_SPIRIT_TEMPLE, { //Events //implies logic->CanKillEnemy(RE_WALLMASTER). If we have lights, we can kill stalfos and wallmasters with bow EventAccess(&logic->MQSpirit3SunsEnemies, []{return (logic->CanUse(RG_MIRROR_SHIELD) && logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2)) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS));}), @@ -373,13 +380,13 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_1F, []{return logic->MQSpirit3SunsEnemies;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_1F] = Region("Spirit Temple MQ Three Suns Room 1F", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_1F] = Region("Spirit Temple MQ Three Suns Room 1F", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_2F, []{return logic->MQSpirit3SunsEnemies;}), Entrance(RR_SPIRIT_TEMPLE_MQ_1F_EAST, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_1F_EAST] = Region("Spirit Temple MQ 1F East", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_1F_EAST] = Region("Spirit Temple MQ 1F East", SCENE_SPIRIT_TEMPLE, { //Events //Assumes RR_SPIRIT_TEMPLE_MQ_LOBBY access EventAccess(&logic->Spirit1FSilverRupees, []{return logic->CanUse(RG_MEGATON_HAMMER);}), @@ -395,7 +402,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 7);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_LEEVER_ROOM] = Region("Spirit Temple MQ Leever Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_LEEVER_ROOM] = Region("Spirit Temple MQ Leever Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, logic->CanKillEnemy(RE_PURPLE_LEEVER) && logic->CanUse(RG_HOOKSHOT)), LOCATION(RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), @@ -404,14 +411,14 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_1F_EAST, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM] = Region("Spirit Temple MQ Symphony Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM] = Region("Spirit Temple MQ Symphony Room", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_1F_EAST, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 7);}), //Implies CanPassEnemy(RE_MOBLIN_CHIEF) Entrance(RR_SPIRIT_TEMPLE_MQ_AFTER_SYMPHONY_ROOM, []{return logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_SUNS_SONG) && logic->CanUse(RG_SONG_OF_STORMS) && logic->CanUse(RG_ZELDAS_LULLABY);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_AFTER_SYMPHONY_ROOM] = Region("Spirit Temple MQ After Symphony Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_AFTER_SYMPHONY_ROOM] = Region("Spirit Temple MQ After Symphony Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA)), LOCATION(RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), @@ -420,9 +427,10 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_FOUR_BEAMOS_ROOM] = Region("Spirit Temple MQ Four Beamos Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_FOUR_BEAMOS_ROOM] = Region("Spirit Temple MQ Four Beamos Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, logic->CanKillEnemy(RE_BEAMOS)), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, logic->CanKillEnemy(RE_BEAMOS) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST, []{return logic->CanAvoidEnemy(RE_BEAMOS, true, 4) && logic->CanUse(RG_SONG_OF_TIME) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->CanUse(RG_HOOKSHOT);}), @@ -430,7 +438,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_BIG_WALL, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 6);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_SOT_SUN_ROOM] = Region("Spirit Temple MQ SoT Sun Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_SOT_SUN_ROOM] = Region("Spirit Temple MQ SoT Sun Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, true), LOCATION(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), @@ -441,19 +449,19 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_3F_GIBDO_ROOM, []{return Here(RR_SPIRIT_TEMPLE_MQ_SOT_SUN_ROOM, []{return (logic->IsAdult || logic->CanUse(RG_SONG_OF_TIME)) && logic->CanUse(RG_MIRROR_SHIELD);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_EAST_STAIRS_TO_HAND] = Region("Spirit Temple MQ East Stairs to Hand", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_EAST_STAIRS_TO_HAND] = Region("Spirit Temple MQ East Stairs to Hand", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_SOT_SUN_ROOM, []{return true;}), Entrance(RR_SPIRIT_TEMPLE_MQ_EAST_IRON_KNUCKLE, []{return (ctx->GetTrickOption(RT_LENS_SPIRIT_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && Here(RR_SPIRIT_TEMPLE_MQ_EAST_STAIRS_TO_HAND, []{return logic->CanKillEnemy(RE_FLOORMASTER);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_EAST_IRON_KNUCKLE] = Region("Spirit Temple MQ East Iron Knuckle", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_EAST_IRON_KNUCKLE] = Region("Spirit Temple MQ East Iron Knuckle", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_EAST_STAIRS_TO_HAND, []{return true;}), Entrance(RR_SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND, []{return Here(RR_SPIRIT_TEMPLE_MQ_EAST_STAIRS_TO_HAND, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND] = Region("Spirit Temple MQ Mirror Shield Hand", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND] = Region("Spirit Temple MQ Mirror Shield Hand", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, true), }, { @@ -463,7 +471,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_3F_GIBDO_ROOM] = Region("Spirit Temple MQ 3F Gibdo Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_3F_GIBDO_ROOM] = Region("Spirit Temple MQ 3F Gibdo Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, true), }, { @@ -471,7 +479,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_SOT_SUN_ROOM, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_WALL] = Region("Spirit Temple MQ Big Wall", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_WALL] = Region("Spirit Temple MQ Big Wall", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, logic->CanBreakPots()), @@ -483,7 +491,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL, []{return logic->CanKillEnemy(RE_KEESE);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL] = Region("Spirit Temple MQ 4F Central", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL] = Region("Spirit Temple MQ 4F Central", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, logic->CanBreakPots()), @@ -494,7 +502,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_ROOM, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_NINE_CHAIRS_ROOM] = Region("Spirit Temple MQ Nine Chairs Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_NINE_CHAIRS_ROOM] = Region("Spirit Temple MQ Nine Chairs Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations //These skulls rely on the iron knuckle existing without a trick to shoot through the chairs LOCATION(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), @@ -504,19 +512,23 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_ROOM] = Region("Spirit Temple MQ Big Mirror Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_ROOM] = Region("Spirit Temple MQ Big Mirror Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL, []{return true;}), Entrance(RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CAVE, []{return Here(RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_ROOM, []{return logic->CanUse(RG_MEGATON_HAMMER);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CAVE] = Region("Spirit Temple MQ Big Mirror Cave", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CAVE] = Region("Spirit Temple MQ Big Mirror Cave", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, ctx->GetTrickOption(RT_LENS_SPIRIT_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)), }, { @@ -526,25 +538,25 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return Here(RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CAVE, []{return logic->CanUse(RG_MIRROR_SHIELD);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD] = Region("Spirit Temple MQ Inside Statue Head", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD] = Region("Spirit Temple MQ Inside Statue Head", SCENE_SPIRIT_TEMPLE, {}, {}, { // Exits Entrance(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return true;}), - Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_SPIRIT_TEMPLE_BOSS_KEY);}), + Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); #pragma endregion // Boss Room - areaTable[RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY] = Region("Spirit Temple Boss Entryway", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY] = Region("Spirit Temple Boss Entryway", SCENE_SPIRIT_TEMPLE, {}, {}, { // Exits Entrance(RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, []{return ctx->GetDungeon(SPIRIT_TEMPLE)->IsVanilla() && false;}), Entrance(RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD, []{return ctx->GetDungeon(SPIRIT_TEMPLE)->IsMQ() && false;}), - Entrance(RR_SPIRIT_TEMPLE_BOSS_ROOM, []{return true;}), + Entrance(RR_SPIRIT_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_SPIRIT_TEMPLE_BOSS_KEY);}), }); - areaTable[RR_SPIRIT_TEMPLE_BOSS_ROOM] = Region("Spirit Temple Boss Room", "Spirit Temple", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_BOSS_ROOM] = Region("Spirit Temple Boss Room", SCENE_SPIRIT_TEMPLE_BOSS, { // Events - EventAccess(&logic->SpiritTempleClear, []{return logic->SpiritTempleClear || logic->CanKillEnemy(RE_TWINROVA);}), + EventAccess(&logic->SpiritTempleClear, []{return logic->CanKillEnemy(RE_TWINROVA);}), }, { // Locations LOCATION(RC_SPIRIT_TEMPLE_TWINROVA_HEART, logic->SpiritTempleClear), @@ -554,4 +566,6 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_DESERT_COLOSSUS, []{return logic->SpiritTempleClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index 4d2fbb9bf6..03cc446458 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -5,18 +5,19 @@ using namespace Rando; void RegionTable_Init_WaterTemple() { + // clang-format off // Vanilla/MQ Decider - areaTable[RR_WATER_TEMPLE_ENTRYWAY] = Region("Water Temple Entryway", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_ENTRYWAY] = Region("Water Temple Entryway", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->HasItem(RG_BRONZE_SCALE) && ctx->GetDungeon(WATER_TEMPLE)->IsVanilla();}), Entrance(RR_WATER_TEMPLE_MQ_3F_CENTRAL, []{return logic->HasItem(RG_BRONZE_SCALE) && ctx->GetDungeon(WATER_TEMPLE)->IsMQ();}), - Entrance(RR_LAKE_HYLIA, []{return true;}), + Entrance(RR_LH_FROM_WATER_TEMPLE, []{return true;}), }); #pragma region Vanilla //Water Temple logic currently assumes that the locked door leading to the upper water raising location is unlocked from the start - areaTable[RR_WATER_TEMPLE_LOBBY] = Region("Water Temple Lobby", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_LOBBY] = Region("Water Temple Lobby", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, logic->CanBreakPots() && (logic->CanWaterTempleLowFromHigh || logic->CanWaterTempleMiddle || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)))), LOCATION(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, logic->CanBreakPots() && (logic->CanWaterTempleLowFromHigh || logic->CanWaterTempleMiddle || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)))), @@ -37,9 +38,9 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_PRE_BOSS_ROOM, []{return (logic->CanWaterTempleHigh && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_HOVER_BOOST_SIMPLE) && ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_WATER_TEMPLE_EAST_LOWER] = Region("Water Temple East Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_EAST_LOWER] = Region("Water Temple East Lower", SCENE_WATER_TEMPLE, { //Events - EventAccess(&logic->CanWaterTempleLowFromHigh, []{return logic->CanWaterTempleLowFromHigh || logic->CanUse(RG_ZELDAS_LULLABY);}), + EventAccess(&logic->CanWaterTempleLowFromHigh, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), }, { //Locations LOCATION(RC_WATER_TEMPLE_TORCH_POT_1, logic->CanBreakPots() && (logic->CanWaterTempleLowFromHigh || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS)))), @@ -52,7 +53,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_TORCH_ROOM, []{return logic->CanWaterTempleLowFromHigh && (logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW));}), }); - areaTable[RR_WATER_TEMPLE_MAP_ROOM] = Region("Water Temple Map Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MAP_ROOM] = Region("Water Temple Map Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MAP_CHEST, logic->CanKillEnemy(RE_SPIKE, ED_CLOSE, true, 3)), }, { @@ -60,7 +61,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_EAST_LOWER, []{return logic->CanKillEnemy(RE_SPIKE, ED_CLOSE, true, 3);}), }); - areaTable[RR_WATER_TEMPLE_CRACKED_WALL] = Region("Water Temple Cracked Wall", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_CRACKED_WALL] = Region("Water Temple Cracked Wall", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_CRACKED_WALL_CHEST, logic->HasExplosives()), }, { @@ -68,7 +69,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_EAST_LOWER, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_TORCH_ROOM] = Region("Water Temple Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_TORCH_ROOM] = Region("Water Temple Torch Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_TORCHES_CHEST, logic->CanKillEnemy(RE_SHELL_BLADE, ED_CLOSE, true, 3)), }, { @@ -76,13 +77,13 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_EAST_LOWER, []{return logic->CanKillEnemy(RE_SHELL_BLADE, ED_CLOSE, true, 3);}), }); - areaTable[RR_WATER_TEMPLE_NORTH_LOWER] = Region("Water Temple North Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_NORTH_LOWER] = Region("Water Temple North Lower", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return true;}), Entrance(RR_WATER_TEMPLE_BOULDERS_LOWER, []{return (logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_WATER_BK_REGION) && logic->CanUse(RG_HOVER_BOOTS))) && logic->SmallKeys(RR_WATER_TEMPLE, 4);}), }); - areaTable[RR_WATER_TEMPLE_BOULDERS_LOWER] = Region("Water Temple Boulders Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_BOULDERS_LOWER] = Region("Water Temple Boulders Lower", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, logic->CanUse(RG_LONGSHOT) || Here(RR_WATER_TEMPLE_BOULDERS_UPPER, []{return (logic->IsAdult && logic->HookshotOrBoomerang()) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT));})), }, { @@ -92,7 +93,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_BOULDERS_UPPER, []{return (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_WATER_NORTH_BASEMENT_LEDGE_JUMP))) || (logic->CanUse(RG_HOVER_BOOTS) && logic->CanUse(RG_IRON_BOOTS));}), }); - areaTable[RR_WATER_TEMPLE_BLOCK_ROOM] = Region("Water Temple Block Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_BLOCK_ROOM] = Region("Water Temple Block Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, logic->CanBreakPots()), LOCATION(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, logic->CanBreakPots()), @@ -102,20 +103,20 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_JETS_ROOM, []{return (logic->HasItem(RG_GORONS_BRACELET) && logic->HasExplosives()) || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_WATER_TEMPLE_JETS_ROOM] = Region("Water Temple Jets Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_JETS_ROOM] = Region("Water Temple Jets Room", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_BLOCK_ROOM, []{return logic->CanUse(RG_HOOKSHOT);}), Entrance(RR_WATER_TEMPLE_BOULDERS_UPPER, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_BOULDERS_UPPER] = Region("Water Temple Boulders Upper", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_BOULDERS_UPPER] = Region("Water Temple Boulders Upper", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_BOULDERS_LOWER, []{return true;}), Entrance(RR_WATER_TEMPLE_JETS_ROOM, []{return logic->IsAdult;}), Entrance(RR_WATER_TEMPLE_BOSS_KEY_ROOM, []{return (logic->CanUse(RG_IRON_BOOTS) || (logic->IsAdult && ctx->GetTrickOption(RT_WATER_BK_JUMP_DIVE))) && logic->SmallKeys(RR_WATER_TEMPLE, 5);}), }); - areaTable[RR_WATER_TEMPLE_BOSS_KEY_ROOM] = Region("Water Temple Boss Key Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_BOSS_KEY_ROOM] = Region("Water Temple Boss Key Room", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -128,7 +129,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_BOULDERS_UPPER, []{return (logic->CanUse(RG_IRON_BOOTS) || (logic->IsAdult && ctx->GetTrickOption(RT_WATER_BK_JUMP_DIVE)) || logic->IsChild || logic->HasItem(RG_SILVER_SCALE)) && logic->SmallKeys(RR_WATER_TEMPLE, 5);}), }); - areaTable[RR_WATER_TEMPLE_SOUTH_LOWER] = Region("Water Temple South Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_SOUTH_LOWER] = Region("Water Temple South Lower", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_GS_BEHIND_GATE, logic->CanJumpslash() && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)))), LOCATION(RC_WATER_TEMPLE_BEHIND_GATE_POT_1, logic->CanJumpslash() && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)))), @@ -140,13 +141,13 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->CanUse(RG_IRON_BOOTS);}), }); - areaTable[RR_WATER_TEMPLE_WEST_LOWER] = Region("Water Temple West Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_WEST_LOWER] = Region("Water Temple West Lower", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS) && logic->HasItem(RG_GORONS_BRACELET);}), Entrance(RR_WATER_TEMPLE_DRAGON_ROOM, []{return logic->CanJumpslashExceptHammer() || logic->CanUseProjectile();}), }); - areaTable[RR_WATER_TEMPLE_DRAGON_ROOM] = Region("Water Temple Dragon Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_DRAGON_ROOM] = Region("Water Temple Dragon Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_DRAGON_CHEST, (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS)) || (((logic->IsAdult && ctx->GetTrickOption(RT_WATER_ADULT_DRAGON) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_BOMBCHU_5))) || (logic->IsChild && ctx->GetTrickOption(RT_WATER_CHILD_DRAGON) && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_BOMBCHU_5)))) && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS))) || Here(RR_WATER_TEMPLE_RIVER, []{return logic->IsAdult && logic->CanUse(RG_FAIRY_BOW) && ((ctx->GetTrickOption(RT_WATER_ADULT_DRAGON) && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS))) || ctx->GetTrickOption(RT_WATER_DRAGON_JUMP_DIVE));})), @@ -155,16 +156,16 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_WEST_LOWER, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER] = Region("Water Temple Central Pillar Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER] = Region("Water Temple Central Pillar Lower", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->SmallKeys(RR_WATER_TEMPLE, 5);}), Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_UPPER, []{return logic->CanUse(RG_HOOKSHOT);}), Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT, []{return logic->CanWaterTempleMiddle && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 40;}), }); - areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_UPPER] = Region("Water Temple Central Pillar Upper", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_UPPER] = Region("Water Temple Central Pillar Upper", SCENE_WATER_TEMPLE, { //Events - EventAccess(&logic->CanWaterTempleMiddle, []{return logic->CanWaterTempleMiddle || logic->CanUse(RG_ZELDAS_LULLABY);}), + EventAccess(&logic->CanWaterTempleMiddle, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), }, { //Locations LOCATION(RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, logic->CanUse(RG_LONGSHOT) || (((ctx->GetTrickOption(RT_WATER_FW_CENTRAL_GS) && logic->CanUse(RG_FARORES_WIND) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE) || logic->SmallKeys(RR_WATER_TEMPLE, 5))) || (ctx->GetTrickOption(RT_WATER_IRONS_CENTRAL_GS) && logic->CanUse(RG_IRON_BOOTS) && ((logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_FAIRY_BOW)) || (logic->CanUse(RG_DINS_FIRE))))) && logic->CanWaterTempleHigh && logic->HookshotOrBoomerang())), @@ -174,7 +175,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT] = Region("Water Temple Central Pillar Basement", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT] = Region("Water Temple Central Pillar Basement", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 40), }, { @@ -182,7 +183,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER, []{return logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16;}), }); - areaTable[RR_WATER_TEMPLE_EAST_MIDDLE] = Region("Water Temple East Middle", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_EAST_MIDDLE] = Region("Water Temple East Middle", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_COMPASS_CHEST, logic->CanUseProjectile()), LOCATION(RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, logic->CanBreakPots()), @@ -193,21 +194,21 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->CanUse(RG_IRON_BOOTS);}), }); - areaTable[RR_WATER_TEMPLE_WEST_MIDDLE] = Region("Water Temple West Middle", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_WEST_MIDDLE] = Region("Water Temple West Middle", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return true;}), Entrance(RR_WATER_TEMPLE_HIGH_WATER, []{return logic->CanUseProjectile();}), }); - areaTable[RR_WATER_TEMPLE_HIGH_WATER] = Region("Water Temple High Water", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_HIGH_WATER] = Region("Water Temple High Water", SCENE_WATER_TEMPLE, { //Events - EventAccess(&logic->CanWaterTempleHigh, []{return logic->CanWaterTempleHigh || logic->CanUse(RG_ZELDAS_LULLABY);}), + EventAccess(&logic->CanWaterTempleHigh, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), }, {}, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_BLOCK_CORRIDOR] = Region("Water Temple Block Corridor", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_BLOCK_CORRIDOR] = Region("Water Temple Block Corridor", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, logic->HasItem(RG_GORONS_BRACELET) && (logic->CanWaterTempleLowFromHigh || logic->CanWaterTempleMiddle)), LOCATION(RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, logic->CanBreakPots() && logic->HasItem(RG_GORONS_BRACELET) && (logic->CanWaterTempleLowFromHigh || logic->CanWaterTempleMiddle)), @@ -217,7 +218,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_WATER_TEMPLE_FALLING_PLATFORM_ROOM] = Region("Water Temple Falling Platform Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_FALLING_PLATFORM_ROOM] = Region("Water Temple Falling Platform Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_WATER_RANG_FALLING_PLATFORM_GS) && logic->IsChild && logic->CanUse(RG_BOOMERANG)) || (ctx->GetTrickOption(RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS) && logic->IsAdult && logic->CanUse(RG_HOOKSHOT))), }, { @@ -226,7 +227,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM, []{return logic->CanUse(RG_HOOKSHOT) && logic->SmallKeys(RR_WATER_TEMPLE, 5);}), }); - areaTable[RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM] = Region("Water Temple Dragon Pillars Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM] = Region("Water Temple Dragon Pillars Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_LIKE_LIKE_POT_1, logic->CanUse(RG_HOOKSHOT)), LOCATION(RC_WATER_TEMPLE_LIKE_LIKE_POT_2, logic->CanUse(RG_HOOKSHOT)), @@ -236,13 +237,13 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_DARK_LINK_ROOM, []{return logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_WATER_TEMPLE_DARK_LINK_ROOM] = Region("Water Temple Dark Link Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_DARK_LINK_ROOM] = Region("Water Temple Dark Link Room", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM, []{return logic->CanKillEnemy(RE_DARK_LINK);}), Entrance(RR_WATER_TEMPLE_LONGSHOT_ROOM, []{return logic->CanKillEnemy(RE_DARK_LINK);}), }); - areaTable[RR_WATER_TEMPLE_LONGSHOT_ROOM] = Region("Water Temple Longshot Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_LONGSHOT_ROOM] = Region("Water Temple Longshot Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_LONGSHOT_CHEST, true), }, { @@ -251,7 +252,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_RIVER, []{return logic->IsChild || logic->CanUse(RG_SONG_OF_TIME);}), }); - areaTable[RR_WATER_TEMPLE_RIVER] = Region("Water Temple River", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_RIVER] = Region("Water Temple River", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_RIVER_CHEST, (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW)) && (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT))), LOCATION(RC_WATER_TEMPLE_GS_RIVER, (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)) || (ctx->GetTrickOption(RT_WATER_RIVER_GS) && logic->CanUse(RG_LONGSHOT))), @@ -266,7 +267,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_DRAGON_ROOM, []{return (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW)) && (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT));}), }); - areaTable[RR_WATER_TEMPLE_PRE_BOSS_ROOM] = Region("Water Temple Pre Boss Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_PRE_BOSS_ROOM] = Region("Water Temple Pre Boss Room", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -276,14 +277,14 @@ void RegionTable_Init_WaterTemple() { }, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return true;}), - Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_WATER_TEMPLE_BOSS_KEY);}), + Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); #pragma endregion #pragma region MQ - areaTable[RR_WATER_TEMPLE_MQ_3F_SOUTH_LEDGE] = Region("Water Temple MQ 3F South Ledge", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_3F_SOUTH_LEDGE] = Region("Water Temple MQ 3F South Ledge", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_ENTRYWAY, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), @@ -296,7 +297,7 @@ void RegionTable_Init_WaterTemple() { //Entry should only include being in the correct area, taking any possible fall damage, and floating up to the surface of WL_HIGH if coming from below //This area then leads to others based on level and worst-case water timers for follow-up exits from the water's surface //remember that any solution that works for any level doesn't need to be given a level, even if that solution is overkill for a lower level - areaTable[RR_WATER_TEMPLE_MQ_MAIN] = Region("Water Temple MQ Main", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_MAIN] = Region("Water Temple MQ Main", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_3F_SOUTH_LEDGE, []{return logic->HasItem(RG_BRONZE_SCALE) && logic->MQWaterLevel(WL_HIGH);}), //Jumping across is possible but a trick due to the janky ledge @@ -316,7 +317,7 @@ void RegionTable_Init_WaterTemple() { }); //This region specifically covers the topmost platform around central pillar - areaTable[RR_WATER_TEMPLE_MQ_3F_CENTRAL] = Region("Water Temple MQ 3F Central", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_3F_CENTRAL] = Region("Water Temple MQ 3F Central", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), Entrance(RR_WATER_TEMPLE_MQ_3F_SOUTH_LEDGE, []{return logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}), @@ -333,7 +334,7 @@ void RegionTable_Init_WaterTemple() { //This region specifically covers walking on the lower platform around central pillar. This is underwater when WL_HIGH //RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_HIGH should be accessed directly to use the central pillar door while at WL_HIGH - areaTable[RR_WATER_TEMPLE_MQ_2F_CENTRAL] = Region("Water Temple MQ 2F Central", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_2F_CENTRAL] = Region("Water Temple MQ 2F Central", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), Entrance(RR_WATER_TEMPLE_MQ_3F_CENTRAL, []{return logic->CanUse(RG_HOOKSHOT);}), @@ -343,7 +344,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY, []{return logic->MQWaterLevel(WL_LOW_OR_MID) && logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_WATER_TEMPLE_MQ_HIGH_EMBLEM] = Region("Water Temple MQ High Emblem", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_HIGH_EMBLEM] = Region("Water Temple MQ High Emblem", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->ReachedWaterHighEmblem, []{return true;}), EventAccess(&logic->CanWaterTempleHigh, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), @@ -353,7 +354,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_MQ_3F_NORTH_LEDGE] = Region("Water Temple MQ 3F North Ledge", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_3F_NORTH_LEDGE] = Region("Water Temple MQ 3F North Ledge", SCENE_WATER_TEMPLE, {}, {}, { //Exits //what we need if WL_LOW, we can't guarantee repeated access otherwise. Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->TakeDamage();}), @@ -361,13 +362,13 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BOSS_DOOR, []{return logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_ICE_ARROWS) || logic->CanUse(RG_NAYRUS_LOVE);}), }); - areaTable[RR_WATER_TEMPLE_MQ_BOSS_DOOR] = Region("Water Temple MQ Main", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_DOOR] = Region("Water Temple MQ Main", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_3F_NORTH_LEDGE, []{return logic->CanUse(RG_ICE_ARROWS) || logic->TakeDamage();}), - Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_WATER_TEMPLE_BOSS_KEY);}), + Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_MQ_EAST_TOWER] = Region("Water Temple MQ East Tower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_EAST_TOWER] = Region("Water Temple MQ East Tower", SCENE_WATER_TEMPLE, { //Events //if we can't reach these, we can't move the water at all, so no need to specify level or account for WL_LOW access here //review is some way to play ocarina underwater exists @@ -378,8 +379,7 @@ void RegionTable_Init_WaterTemple() { }, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_MAP_CHEST, logic->MQWaterLevel(WL_HIGH) && logic->HasFireSource() && logic->CanUse(RG_HOOKSHOT)), - //easy to get at WL_HIGH with the hook-the-underwater-chest glitch - LOCATION(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, logic->MQWaterLevel(WL_MID) && logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, (logic->MQWaterLevel(WL_MID) && logic->CanUse(RG_HOOKSHOT)) || (logic->MQWaterLevel(WL_HIGH_OR_MID) && logic->CanOpenUnderwaterChest())), LOCATION(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, (logic->MQWaterLevel(WL_LOW) && logic->CanBreakPots()) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->WaterTimer() >= 16)), LOCATION(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, (logic->MQWaterLevel(WL_LOW) && logic->CanBreakPots()) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->WaterTimer() >= 16)), }, { @@ -387,7 +387,7 @@ void RegionTable_Init_WaterTemple() { }); //Raising the targets by clearing this room achieves nothing logically because it requires WL_LOW to do and hookshot to use, which implies access to WL_MID and WL_HIGH already - areaTable[RR_WATER_TEMPLE_MQ_EAST_TOWER_1F_ROOM] = Region("Water Temple MQ East Tower 1F Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_EAST_TOWER_1F_ROOM] = Region("Water Temple MQ East Tower 1F Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_LIZALFOS) && logic->CanKillEnemy(RE_SPIKE)), }, { @@ -395,7 +395,7 @@ void RegionTable_Init_WaterTemple() { }); //This area assumes we entered through the lower door, so water is low and cannot be changed without leaving. - areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_1F] = Region("Water Temple MQ Central Pillar 1F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_1F] = Region("Water Temple MQ Central Pillar 1F", SCENE_WATER_TEMPLE, { //Events //This is harder than the other possibilities as you have to move between shots on top of the extra range, but there's basically no universe this should matter. EventAccess(&logic->MQWaterB1Switch, []{return ctx->GetTrickOption(RT_WATER_MQ_CENTRAL_PILLAR) && logic->CanUse(RG_FIRE_ARROWS);}), @@ -409,7 +409,7 @@ void RegionTable_Init_WaterTemple() { }); //If we enter here in WL_HIGH, go to RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_HIGH instead, Assumes WL_MID_OR_LOW - areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_2F] = Region("Water Temple MQ Central Pillar 2F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_2F] = Region("Water Temple MQ Central Pillar 2F", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->CouldWaterTempleMiddle, []{return true;}), EventAccess(&logic->CanWaterTempleMiddle, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), @@ -423,16 +423,20 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1, []{return logic->MQWaterOpenedPillarB1 && logic->MQWaterLevel(WL_MID) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_ZORA_TUNIC);}), }); - areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_HIGH] = Region("Water Temple MQ Central Pillar High", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_HIGH] = Region("Water Temple MQ Central Pillar High", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->MQWaterOpenedPillarB1, []{return ((logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_DINS_FIRE)) || (ctx->GetTrickOption(RT_WATER_MQ_CENTRAL_PILLAR) && logic->CanUse(RG_FIRE_ARROWS))) && (logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_LONGSHOT) && logic->CanJumpslash()));}), - }, {}, { + }, { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1, []{return logic->MQWaterB1Switch && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_ZORA_TUNIC);}), }); //Assuming tunic and irons was checked on entry - areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1] = Region("Water Temple MQ Central Pillar B1", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1] = Region("Water Temple MQ Central Pillar B1", SCENE_WATER_TEMPLE, {}, {}, { //Exits //Can't know water level, so we'll just assume any possibility and skip to MAIN Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterOpenedPillarB1 && logic->CanUse(RG_IRON_BOOTS) && logic->HasItem(RG_BRONZE_SCALE);}), @@ -440,34 +444,69 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1_FINAL, []{return ((logic->IsAdult && logic->CanUse(RG_LONGSHOT)) || (logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_BRONZE_SCALE)));}), }); - areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1_FINAL] = Region("Water Temple MQ Central Pillar B1 Final", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1_FINAL] = Region("Water Temple MQ Central Pillar B1 Final", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, logic->CanBreakCrates()), }, {}); //Region exists to add crate/pot/box locations - areaTable[RR_WATER_TEMPLE_MQ_STORAGE_ROOM] = Region("Water Temple MQ Storage Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_STORAGE_ROOM] = Region("Water Temple MQ Storage Room", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterLevel(WL_LOW_OR_MID) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8);}), }); - areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_2F] = Region("Water Temple MQ Behind Blue Switch 2F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_2F] = Region("Water Temple MQ Behind Blue Switch 2F", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), Entrance(RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_3F, []{return logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_3F] = Region("Water Temple MQ Behind Blue Switch 2F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_3F] = Region("Water Temple MQ Behind Blue Switch 2F", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), }, { @@ -476,11 +515,19 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_HIGH_EMBLEM, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY] = Region("Water Temple MQ Lizalfos Hallway", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY] = Region("Water Temple MQ Lizalfos Hallway", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_LIZALFOS_CAGE, []{return logic->MQWaterLevel(WL_LOW_OR_MID) && logic->CanUse(RG_DINS_FIRE);}), @@ -488,21 +535,23 @@ void RegionTable_Init_WaterTemple() { /*Entrance(RR_WATER_TEMPLE_MQ_3F_EAST_LEDGE, []{return (logic->CanUse(RG_HOOKSHOT) && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))) || (logic->MQWaterLevel(WL_LOW_OR_MID) && logic->CanUse(RG_HOOKSHOT)) || logic->MQWaterLevel(WL_HIGH) && (logic->HasItem(RG_BRONZE_SCALE));}), }); - areaTable[RR_WATER_TEMPLE_MQ_3F_EAST_LEDGE] = Region("Water Temple MQ 3F East Ledge", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_3F_EAST_LEDGE] = Region("Water Temple MQ 3F East Ledge", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), Entrance(RR_WATER_TEMPLE_MQ_3F_CENTRAL, []{return logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS);}),*/ }); - areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_CAGE] = Region("Water Temple MQ Lizalfos Cage", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_CAGE] = Region("Water Temple MQ Lizalfos Cage", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, logic->CanKillEnemy(RE_GOLD_SKULLTULA)), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, logic->CanKillEnemy(RE_GOLD_SKULLTULA)), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, logic->CanBreakCrates()), }, {}); //This room exists to hold the wonderitems that drop from the emblems here. Specifically this assumes you are standing on the final ledge - areaTable[RR_WATER_TEMPLE_MQ_WATERFALL] = Region("Water Temple Waterfall", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_WATERFALL] = Region("Water Temple Waterfall", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_3F_CENTRAL, []{return logic->SmallKeys(RR_WATER_TEMPLE, 1) && logic->CanUse(RG_LONGSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_STALFOS_PIT, []{return true;}), @@ -510,7 +559,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_STALFOS_PIT_UPPER, []{return logic->MQWaterStalfosPit && logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT] = Region("Water Temple MQ Stalfos Pit", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT] = Region("Water Temple MQ Stalfos Pit", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->MQWaterStalfosPit, []{return ((logic->IsAdult && logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3, false, true)) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->CanKillEnemy(RE_STALFOS, ED_BOMB_THROW, true, 3, false, true)));}), }, {}, { @@ -521,7 +570,7 @@ void RegionTable_Init_WaterTemple() { }); //also includes the suns fairy in the middle - areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT_POTS] = Region("Water Temple MQ Stalfos Pit Pots", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT_POTS] = Region("Water Temple MQ Stalfos Pit Pots", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), EventAccess(&logic->NutPot, []{return true;}), @@ -539,7 +588,7 @@ void RegionTable_Init_WaterTemple() { }); //specifically the area past the spikes - areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT_UPPER] = Region("Water Temple MQ Stalfos Pit Upper", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT_UPPER] = Region("Water Temple MQ Stalfos Pit Upper", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, logic->CanBreakPots()), LOCATION(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, logic->CanBreakPots()), @@ -552,7 +601,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_AFTER_DARK_LINK, []{return logic->CanKillEnemy(RE_DARK_LINK);}), }); - areaTable[RR_WATER_TEMPLE_MQ_AFTER_DARK_LINK] = Region("Water Temple MQ After Dark Link", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_AFTER_DARK_LINK] = Region("Water Temple MQ After Dark Link", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -566,7 +615,7 @@ void RegionTable_Init_WaterTemple() { }); //if we can use hookshot, we are standing on the targets, otherwise assume we're in the water - areaTable[RR_WATER_TEMPLE_MQ_RIVER_SKULL] = Region("Water Temple MQ River Skull", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_RIVER_SKULL] = Region("Water Temple MQ River Skull", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_GS_RIVER, logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), }, { @@ -574,7 +623,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_RIVER_POTS, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_WATER_TEMPLE_MQ_RIVER_POTS] = Region("Water Temple MQ River Pots", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_RIVER_POTS] = Region("Water Temple MQ River Pots", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -591,23 +640,46 @@ void RegionTable_Init_WaterTemple() { }); //This region assumes Iron boots to access - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL] = Region("Water Temple MQ Dragon Room Tunnel", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL] = Region("Water Temple MQ Dragon Room Tunnel", SCENE_WATER_TEMPLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_RIVER_POTS, []{return logic->CanUse(RG_LONGSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_ALCOVE, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_ALCOVE] = Region("Water Temple MQ Dragon Room Alcove", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_ALCOVE] = Region("Water Temple MQ Dragon Room Alcove", SCENE_WATER_TEMPLE, { //Events - EventAccess(&logic->MQWaterDragonTorches, []{return true;}), - }, {}, { + EventAccess(&logic->MQWaterDragonTorches, []{return logic->HasFireSource();}), + }, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL, []{return logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16;}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR, []{return logic->HasItem(RG_SILVER_SCALE);}), }); - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR] = Region("Water Temple MQ Dragon Room Door", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR] = Region("Water Temple MQ Dragon Room Door", SCENE_WATER_TEMPLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_RIVER_POTS, []{return logic->CanUse(RG_LONGSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL, []{return logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanUse(RG_HOOKSHOT);}), @@ -615,9 +687,10 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH, []{return logic->MQWaterDragonTorches;}), }); - areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH] = Region("Water Temple MQ Boss Key Room Switch", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH] = Region("Water Temple MQ Boss Key Room Switch", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR, []{return true;}), @@ -626,12 +699,20 @@ void RegionTable_Init_WaterTemple() { }); //this exists for the crates in preparation for clips through the grate - areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_PIT] = Region("Water Temple MQ Boss Key Room Pit", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_PIT] = Region("Water Temple MQ Boss Key Room Pit", SCENE_WATER_TEMPLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH, []{return logic->CanHitSwitch(ED_BOOMERANG);}), }); - areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_CHEST] = Region("Water Temple MQ Boss Key Room Chest", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_CHEST] = Region("Water Temple MQ Boss Key Room Chest", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, true), }, { @@ -641,7 +722,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_B1_GATE_SWITCH, []{return logic->HasItem(RG_SILVER_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && (logic->HasItem(RG_BRONZE_SCALE) || (logic->WaterTimer() >= 24 && logic->CanUse(RG_LONGSHOT))));}), }); - areaTable[RR_WATER_TEMPLE_MQ_B1_GATE_SWITCH] = Region("Water Temple MQ B1 Gate Switch", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_B1_GATE_SWITCH] = Region("Water Temple MQ B1 Gate Switch", SCENE_WATER_TEMPLE, { //Events //If the water is low, the switch is underwater and needs irons to press, otherwise, the water is too low to climb up and you need irons to hookshot a target //If a glitch clips through the gate on low, have it logically press the switch and let entrance logic enter @@ -652,22 +733,48 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_CHEST, []{return logic->CanUse(RG_IRON_BOOTS) && logic->HasItem(RG_BRONZE_SCALE) && (logic->MQWaterLevel(WL_LOW) || logic->WaterTimer() >= 24);}) }); - areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_ROOM] = Region("Water Temple MQ Triangle Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_ROOM] = Region("Water Temple MQ Triangle Torch Room", SCENE_WATER_TEMPLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterB1Switch && ((logic->MQWaterLevel(WL_LOW) && logic->HasItem(RG_GOLDEN_SCALE)) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 40 && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_LONGSHOT))));}), Entrance(RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE, []{return logic->CanUse(RG_FIRE_ARROWS) && ((logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)) || (logic->CanUse(RG_LONGSHOT) && Here(RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE, []{return logic->ScarecrowsSong();})));}) }); - areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE] = Region("Water Temple MQ Triangle Torch Cage", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE] = Region("Water Temple MQ Triangle Torch Cage", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, logic->CanBreakCrates()), }, {}); - areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM] = Region("Water Temple MQ Crates Whirlpools Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM] = Region("Water Temple MQ Crates Whirlpools Room", SCENE_WATER_TEMPLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + + }, + { //Exits //we can backflip over the spikes, but land in water. Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterB1Switch && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24 && (logic->CanUse(RG_LONGSHOT) || logic->HasItem(RG_BRONZE_SCALE));}), @@ -680,35 +787,50 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_CAGE, []{return ctx->GetTrickOption(RT_WATER_MQ_LOCKED_GS) && (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT));}), }); - areaTable[RR_WATER_TEMPLE_MQ_SINGLE_STALFOS_ROOM] = Region("Water Temple MQ Single Stalfos Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_SINGLE_STALFOS_ROOM] = Region("Water Temple MQ Single Stalfos Room", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, true), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM, []{return logic->HasItem(RG_SILVER_SCALE) || (logic->IsChild && logic->HasItem(RG_BRONZE_SCALE)) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8 && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT)));}) }); - areaTable[RR_WATER_TEMPLE_MQ_4_TORCH_ROOM] = Region("Water Temple MQ 4 Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_4_TORCH_ROOM] = Region("Water Temple MQ 4 Torch Room", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM, []{return (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanJumpslash())) || (logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8 && logic->CanUse(RG_HOOKSHOT) ));}), Entrance(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return logic->CanHitSwitch() && logic->HasFireSource();}) }); - areaTable[RR_WATER_TEMPLE_MQ_DODONGO_ROOM] = Region("Water Temple MQ Dodongo Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_DODONGO_ROOM] = Region("Water Temple MQ Dodongo Room", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_4_TORCH_ROOM, []{return (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)) && Here(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return logic->CanKillEnemy(RE_DODONGO, ED_CLOSE, true, 5);});}), Entrance(RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_CAGE, []{return (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)) && Here(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return logic->CanKillEnemy(RE_DODONGO, ED_CLOSE, true, 5);});}) }); - areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_CAGE] = Region("Water Temple MQ Basement Gated Areas", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_CAGE] = Region("Water Temple MQ Basement Gated Areas", SCENE_WATER_TEMPLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), + LOCATION(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA) && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, logic->CanBreakCrates()), }, { Entrance(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return true;}) }); @@ -716,16 +838,16 @@ void RegionTable_Init_WaterTemple() { #pragma endregion // Boss Room - areaTable[RR_WATER_TEMPLE_BOSS_ENTRYWAY] = Region("Water Temple Boss Entryway", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_BOSS_ENTRYWAY] = Region("Water Temple Boss Entryway", SCENE_WATER_TEMPLE, {}, {}, { // Exits Entrance(RR_WATER_TEMPLE_PRE_BOSS_ROOM, []{return ctx->GetDungeon(WATER_TEMPLE)->IsVanilla() && false;}), Entrance(RR_WATER_TEMPLE_MQ_BOSS_DOOR, []{return ctx->GetDungeon(WATER_TEMPLE)->IsMQ() && false;}), - Entrance(RR_WATER_TEMPLE_BOSS_ROOM, []{return true;}), + Entrance(RR_WATER_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_WATER_TEMPLE_BOSS_KEY);}), }); - areaTable[RR_WATER_TEMPLE_BOSS_ROOM] = Region("Water Temple Boss Room", "Water Temple", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_BOSS_ROOM] = Region("Water Temple Boss Room", SCENE_WATER_TEMPLE_BOSS, { // Events - EventAccess(&logic->WaterTempleClear, []{return logic->WaterTempleClear || logic->CanKillEnemy(RE_MORPHA);}), + EventAccess(&logic->WaterTempleClear, []{return logic->CanKillEnemy(RE_MORPHA);}), }, { // Locations LOCATION(RC_WATER_TEMPLE_MORPHA_HEART, logic->WaterTempleClear), @@ -735,4 +857,6 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_LAKE_HYLIA, []{return logic->WaterTempleClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp deleted file mode 100644 index 6af0551e07..0000000000 --- a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "soh/Enhancements/randomizer/location_access.h" -#include "soh/Enhancements/randomizer/entrance.h" - -using namespace Rando; - -/* - * This file should be split into "gerudo_fortress.cpp" (overworld) & "thieves_hideout.cpp" (dungeons) - * when the gerudo fortress refactor is done - */ - -void RegionTable_Init_GerudoFortress() { - areaTable[RR_GERUDO_FORTRESS] = Region("Gerudo Fortress", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&logic->CarpenterRescue, []{return logic->CanFinishGerudoFortress();}), - EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), - EventAccess(&logic->GtG_GateOpen, []{return logic->GtG_GateOpen || (logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->HasItem(RG_CHILD_WALLET));}), - }, { - //Locations - LOCATION(RC_GF_CHEST, logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || logic->CanUse(RG_LONGSHOT)), - LOCATION(RC_GF_HBA_1000_POINTS, logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_EPONA) && logic->CanUse(RG_FAIRY_BOW) && logic->AtDay), - LOCATION(RC_GF_HBA_1500_POINTS, logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_EPONA) && logic->CanUse(RG_FAIRY_BOW) && logic->AtDay), - LOCATION(RC_GF_NORTH_F1_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_GF_NORTH_F2_CARPENTER, (logic->CanKillEnemy(RE_GERUDO_WARRIOR)) && (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_KITCHEN))), - LOCATION(RC_GF_SOUTH_F1_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_GF_SOUTH_F2_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_GF_GERUDO_MEMBERSHIP_CARD, logic->CanFinishGerudoFortress()), - LOCATION(RC_GF_GS_ARCHERY_RANGE, logic->IsAdult && logic->HookshotOrBoomerang() && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanGetNightTimeGS()), - LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && (logic->CanJumpslashExceptHammer() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE)) && (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_KITCHEN) || ctx->GetTrickOption(RT_GF_JUMP)) && logic->CanGetNightTimeGS()), - LOCATION(RC_GF_BREAK_ROOM_POT_1, logic->CanBreakPots()), - LOCATION(RC_GF_BREAK_ROOM_POT_2, logic->CanBreakPots()), - LOCATION(RC_GF_KITCHEN_POT_1, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), - LOCATION(RC_GF_KITCHEN_POT_2, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), - LOCATION(RC_GF_NORTH_F1_CARPENTER_POT_1, logic->CanBreakPots()), - LOCATION(RC_GF_NORTH_F1_CARPENTER_POT_2, logic->CanBreakPots()), - LOCATION(RC_GF_NORTH_F1_CARPENTER_POT_3, logic->CanBreakPots()), - LOCATION(RC_GF_NORTH_F2_CARPENTER_POT_1, logic->CanBreakPots()), - LOCATION(RC_GF_NORTH_F2_CARPENTER_POT_2, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_POT_1, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_POT_2, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_POT_3, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, logic->CanBreakPots()), - //RANDOTODO doublecheck when GF isn't a blob - LOCATION(RC_GF_KITCHEN_SUN_FAIRY, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_SUNS_SONG)), - }, { - //Exits - Entrance(RR_GV_FORTRESS_SIDE, []{return true;}), - Entrance(RR_GF_OUTSIDE_GATE, []{return logic->GF_GateOpen;}), - Entrance(RR_GERUDO_TRAINING_GROUND_ENTRYWAY, []{return logic->GtG_GateOpen && (logic->IsAdult || ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES));}), - Entrance(RR_GF_STORMS_GROTTO, []{return logic->IsAdult && logic->CanOpenStormsGrotto();}), - }); - - areaTable[RR_GF_OUTSIDE_GATE] = Region("GF Outside Gate", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES) /*|| ShuffleSpecialIndoorEntrances*/);}), - }, {}, { - //Exits - Entrance(RR_GERUDO_FORTRESS, []{return (logic->IsAdult && (logic->CanUse(RG_HOOKSHOT) || !ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES))) || logic->GF_GateOpen;}), - Entrance(RR_WASTELAND_NEAR_FORTRESS, []{return true;}), - }); - - areaTable[RR_GF_STORMS_GROTTO] = Region("GF Storms Grotto", "GF Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&logic->FreeFairies, []{return true;}), - }, { - //Locations - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_1, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_2, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_3, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_4, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_5, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_6, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_7, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_8, true), - }, { - //Exits - Entrance(RR_GERUDO_FORTRESS, []{return true;}), - }); -} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp index c4dcf4f027..b9525386ca 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -4,39 +4,44 @@ using namespace Rando; void RegionTable_Init_CastleGrounds() { + // clang-format off //With multi-area support {RA_CASTLE_GROUNDS} is not strictly required anymore, as any interior here could inherit both //{RA_HYRULE_CASTLE} and {RA_OUTSIDE_GANONS_CASTLE}, but a setting to merge the latter 2 into the former may be preferred - areaTable[RR_CASTLE_GROUNDS] = Region("Castle Grounds", "Castle Grounds", {RA_CASTLE_GROUNDS}, NO_DAY_NIGHT_CYCLE, {}, {}, { + // + //Temporarily uses SCENE_OUTSIDE_GANONS_CASTLE to avoid self connection between ages + areaTable[RR_CASTLE_GROUNDS] = Region("Castle Grounds", SCENE_OUTSIDE_GANONS_CASTLE, TIME_DOESNT_PASS, {RA_CASTLE_GROUNDS}, {}, {}, { //Exits Entrance(RR_THE_MARKET, []{return true;}), Entrance(RR_HYRULE_CASTLE_GROUNDS, []{return logic->IsChild;}), Entrance(RR_GANONS_CASTLE_GROUNDS, []{return logic->IsAdult;}), }); - areaTable[RR_HYRULE_CASTLE_GROUNDS] = Region("Hyrule Castle Grounds", "Castle Grounds", {RA_HYRULE_CASTLE}, DAY_NIGHT_CYCLE, { + areaTable[RR_HYRULE_CASTLE_GROUNDS] = Region("Hyrule Castle Grounds", SCENE_HYRULE_CASTLE, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), - EventAccess(&logic->ButterflyFairy, []{return logic->ButterflyFairy || logic->CanUse(RG_STICKS);}), + EventAccess(&logic->ButterflyFairy, []{return logic->CanUse(RG_STICKS);}), EventAccess(&logic->BugRock, []{return true;}), }, { //Locations LOCATION(RC_HC_MALON_EGG, true), - LOCATION(RC_HC_GS_TREE, logic->IsChild && logic->CanAttack()), + LOCATION(RC_HC_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HC_MALON_GOSSIP_STONE, true), LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE, true), + LOCATION(RC_HC_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HC_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_CASTLE_GROUNDS, []{return true;}), - Entrance(RR_HC_GARDEN, []{return logic->CanUse(RG_WEIRD_EGG) || !ctx->GetOption(RSK_SHUFFLE_WEIRD_EGG) || (ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanJumpslash());}), + Entrance(RR_HC_GARDEN, []{return logic->CanUse(RG_WEIRD_EGG) || (ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanJumpslash());}), Entrance(RR_HC_GREAT_FAIRY_FOUNTAIN, []{return logic->BlastOrSmash();}), Entrance(RR_HC_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), }); - areaTable[RR_HC_GARDEN] = Region("HC Garden", "Castle Grounds", {RA_HYRULE_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HC_GARDEN] = Region("HC Garden", SCENE_CASTLE_COURTYARD_ZELDA, {}, { //Locations LOCATION(RC_HC_ZELDAS_LETTER, true), LOCATION(RC_SONG_FROM_IMPA, true), @@ -45,7 +50,7 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_HYRULE_CASTLE_GROUNDS, []{return true;}), }); - areaTable[RR_HC_GREAT_FAIRY_FOUNTAIN] = Region("HC Great Fairy Fountain", "HC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HC_GREAT_FAIRY_FOUNTAIN] = Region("HC Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, {}, { //Locations LOCATION(RC_HC_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { @@ -53,7 +58,7 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_CASTLE_GROUNDS, []{return true;}), }); - areaTable[RR_HC_STORMS_GROTTO] = Region("HC Storms Grotto", "HC Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HC_STORMS_GROTTO] = Region("HC Storms Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_HC_GS_STORMS_GROTTO, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_HC_STORMS_GS)), }, { @@ -62,7 +67,7 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_HC_STORMS_GROTTO_BEHIND_WALLS, []{return logic->CanBreakMudWalls();}), }); - areaTable[RR_HC_STORMS_GROTTO_BEHIND_WALLS] = Region("HC Storms Grotto Behind Walls", "HC Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HC_STORMS_GROTTO_BEHIND_WALLS] = Region("HC Storms Grotto Behind Walls", SCENE_GROTTOS, { //Events EventAccess(&logic->NutPot, []{return true;}), EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), @@ -79,10 +84,10 @@ void RegionTable_Init_CastleGrounds() { LOCATION(RC_HC_STORMS_GROTTO_POT_4, logic->CanBreakPots()), }, { //Exits - Entrance(RR_CASTLE_GROUNDS, []{return true;}), + Entrance(RR_HC_STORMS_GROTTO, []{return true;}), }); - areaTable[RR_GANONS_CASTLE_GROUNDS] = Region("Ganon's Castle Grounds", "Castle Grounds", {RA_OUTSIDE_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_GROUNDS] = Region("Ganon's Castle Grounds", SCENE_OUTSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->BuiltRainbowBridge, []{return logic->CanBuildRainbowBridge();}), }, { @@ -95,7 +100,7 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_GANONS_CASTLE_LEDGE, []{return logic->BuiltRainbowBridge;}), }); - areaTable[RR_OGC_GREAT_FAIRY_FOUNTAIN] = Region("OGC Great Fairy Fountain", "OGC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_OGC_GREAT_FAIRY_FOUNTAIN] = Region("OGC Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, {}, { //Locations LOCATION(RC_OGC_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { @@ -103,15 +108,17 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_CASTLE_GROUNDS, []{return true;}), }); - areaTable[RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE] = Region("Castle Grounds From Ganon's Castle", "Castle Grounds From Ganon's Castle", {RA_CASTLE_GROUNDS}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE] = Region("Castle Grounds From Ganon's Castle", SCENE_OUTSIDE_GANONS_CASTLE, {}, {}, { // Exits Entrance(RR_HYRULE_CASTLE_GROUNDS, []{return logic->IsChild;}), Entrance(RR_GANONS_CASTLE_LEDGE, []{return logic->IsAdult;}), }); - areaTable[RR_GANONS_CASTLE_LEDGE] = Region("Ganon's Castle Ledge", "OGC Ganon's Castle Ledge", {RA_OUTSIDE_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_LEDGE] = Region("Ganon's Castle Ledge", SCENE_OUTSIDE_GANONS_CASTLE, {}, {}, { // Exits Entrance(RR_GANONS_CASTLE_GROUNDS, []{return logic->BuiltRainbowBridge;}), Entrance(RR_GANONS_CASTLE_ENTRYWAY, []{return logic->IsAdult;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp index 6ba8bfc6ed..be1b2043af 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp @@ -4,23 +4,26 @@ using namespace Rando; void RegionTable_Init_DeathMountainCrater() { - areaTable[RR_DMC_UPPER_NEARBY] = Region("DMC Upper Nearby", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, {}, { + // clang-format off + areaTable[RR_DMC_UPPER_NEARBY] = Region("DMC Upper Nearby", SCENE_DEATH_MOUNTAIN_CRATER, {}, {}, { //Exits Entrance(RR_DMC_UPPER_LOCAL, []{return logic->FireTimer() >= 48;}), Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}), Entrance(RR_DMC_UPPER_GROTTO, []{return Here(RR_DMC_UPPER_NEARBY, []{return logic->BlastOrSmash() && (logic->FireTimer() >= 8 || logic->Hearts() >= 3);});}) }); - areaTable[RR_DMC_UPPER_LOCAL] = Region("DMC Upper Local", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DMC_UPPER_LOCAL] = Region("DMC Upper Local", SCENE_DEATH_MOUNTAIN_CRATER, { //Events - EventAccess(&logic->GossipStoneFairy, []{return logic->GossipStoneFairy || (logic->HasExplosives() && logic->CallGossipFairyExceptSuns() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3));}), + EventAccess(&logic->GossipStoneFairy, []{return logic->HasExplosives() && logic->CallGossipFairyExceptSuns() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3);}), }, { //Locations LOCATION(RC_DMC_WALL_FREESTANDING_POH, logic->FireTimer() >= 16 || logic->Hearts() >= 3), - LOCATION(RC_DMC_GS_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanAttack()), + LOCATION(RC_DMC_GS_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanAttack() && logic->CanBreakCrates()), LOCATION(RC_DMC_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns() && logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), LOCATION(RC_DMC_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS) && logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), LOCATION(RC_DMC_GOSSIP_STONE, logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), + LOCATION(RC_DMC_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanBreakCrates()), + }, { //Exits Entrance(RR_DMC_UPPER_NEARBY, []{return true;}), @@ -30,7 +33,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_DISTANT_PLATFORM, []{return (logic->FireTimer() >= 48 && logic->Hearts() >= 2) || logic->Hearts() >= 3;}), }); - areaTable[RR_DMC_LADDER_AREA_NEARBY] = Region("DMC Ladder Region Nearby", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_LADDER_AREA_NEARBY] = Region("DMC Ladder Region Nearby", SCENE_DEATH_MOUNTAIN_CRATER, {}, { //Locations LOCATION(RC_DMC_DEKU_SCRUB, logic->IsChild && logic->CanStunDeku()), }, { @@ -39,7 +42,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_LOWER_NEARBY, []{return logic->Hearts() >= 3 && (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_DMC_BOULDER_JS) && logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)) || (ctx->GetTrickOption(RT_DMC_BOULDER_SKIP) && logic->IsAdult));}), }); - areaTable[RR_DMC_LOWER_NEARBY] = Region("DMC Lower Nearby", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_LOWER_NEARBY] = Region("DMC Lower Nearby", SCENE_DEATH_MOUNTAIN_CRATER, {}, { // Locations LOCATION(RC_DMC_NEAR_GC_POT_1, logic->CanBreakPots()), LOCATION(RC_DMC_NEAR_GC_POT_2, logic->CanBreakPots()), @@ -53,7 +56,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_HAMMER_GROTTO, []{return logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER);}), }); - areaTable[RR_DMC_LOWER_LOCAL] = Region("DMC Lower Local", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DMC_LOWER_LOCAL] = Region("DMC Lower Local", SCENE_DEATH_MOUNTAIN_CRATER, {}, {}, { //Exits Entrance(RR_DMC_LOWER_NEARBY, []{return true;}), Entrance(RR_DMC_LADDER_AREA_NEARBY, []{return logic->FireTimer() >= 8 || logic->Hearts() >= 3;}), @@ -61,7 +64,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_CENTRAL_LOCAL, []{return (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanShield() && ctx->GetTrickOption(RT_DMC_BOLERO_JUMP))) && logic->FireTimer() >= 24;}), }); - areaTable[RR_DMC_CENTRAL_NEARBY] = Region("DMC Central Nearby", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_CENTRAL_NEARBY] = Region("DMC Central Nearby", SCENE_DEATH_MOUNTAIN_CRATER, {}, { //Locations LOCATION(RC_DMC_VOLCANO_FREESTANDING_POH, logic->IsAdult && logic->Hearts() >= 3 && (CanPlantBean(RR_DMC_CENTRAL_LOCAL) || (ctx->GetTrickOption(RT_DMC_HOVER_BEAN_POH) && logic->CanUse(RG_HOVER_BOOTS)))), LOCATION(RC_SHEIK_IN_CRATER, logic->IsAdult && (logic->FireTimer() >= 8 || logic->Hearts() >= 3)), @@ -70,7 +73,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_CENTRAL_LOCAL, []{return logic->FireTimer() >= 48;}), }); - areaTable[RR_DMC_CENTRAL_LOCAL] = Region("DMC Central Local", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DMC_CENTRAL_LOCAL] = Region("DMC Central Local", SCENE_DEATH_MOUNTAIN_CRATER, { //Events EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->FireTimer() >= 8 || logic->Hearts() >= 3);}), }, { @@ -96,7 +99,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_DISTANT_PLATFORM, []{return logic->FireTimer() >= 48 && logic->CanUse(RG_DISTANT_SCARECROW);}), }); - areaTable[RR_DMC_GREAT_FAIRY_FOUNTAIN] = Region("DMC Great Fairy Fountain", "DMC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_GREAT_FAIRY_FOUNTAIN] = Region("DMC Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, {}, { //Locations LOCATION(RC_DMC_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { @@ -104,7 +107,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_LOWER_LOCAL, []{return true;}), }); - areaTable[RR_DMC_UPPER_GROTTO] = Region("DMC Upper Grotto", "DMC Upper Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_DMC_UPPER_GROTTO] = Region("DMC Upper Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_DMC_UPPER_GROTTO_CHEST, true), LOCATION(RC_DMC_UPPER_GROTTO_FISH, logic->HasBottle()), @@ -113,12 +116,16 @@ void RegionTable_Init_DeathMountainCrater() { LOCATION(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, true), LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DMC_UPPER_LOCAL, []{return true;}), }); - areaTable[RR_DMC_HAMMER_GROTTO] = Region("DMC Hammer Grotto", "DMC Hammer Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_HAMMER_GROTTO] = Region("DMC Hammer Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, logic->CanStunDeku()), LOCATION(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, logic->CanStunDeku()), @@ -129,7 +136,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_LOWER_LOCAL, []{return true;}), }); - areaTable[RR_DMC_DISTANT_PLATFORM] = Region("DMC Distant Platform", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_DISTANT_PLATFORM] = Region("DMC Distant Platform", SCENE_DEATH_MOUNTAIN_CRATER, {}, { //Locations LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, logic->IsAdult), LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, logic->IsAdult), @@ -142,4 +149,6 @@ void RegionTable_Init_DeathMountainCrater() { //Exits Entrance(RR_DMC_CENTRAL_LOCAL, []{return logic->FireTimer() >= 48 && logic->CanUse(RG_DISTANT_SCARECROW);}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp index bd0362598b..dbf2189476 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp @@ -4,7 +4,8 @@ using namespace Rando; void RegionTable_Init_DeathMountainTrail() { - areaTable[RR_DEATH_MOUNTAIN_TRAIL] = Region("Death Mountain", "Death Mountain", {RA_DEATH_MOUNTAIN_TRAIL}, DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_DEATH_MOUNTAIN_TRAIL] = Region("Death Mountain", SCENE_DEATH_MOUNTAIN_TRAIL, { //Events EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET));}), }, { @@ -29,10 +30,10 @@ void RegionTable_Init_DeathMountainTrail() { Entrance(RR_DMT_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), }); - areaTable[RR_DEATH_MOUNTAIN_SUMMIT] = Region("Death Mountain Summit", "Death Mountain", {RA_DEATH_MOUNTAIN_TRAIL}, DAY_NIGHT_CYCLE, { + areaTable[RR_DEATH_MOUNTAIN_SUMMIT] = Region("Death Mountain Summit", SCENE_DEATH_MOUNTAIN_TRAIL, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), - EventAccess(&logic->BugRock, []{return logic->BugRock || logic->IsChild;}), + EventAccess(&logic->BugRock, []{return logic->IsChild;}), }, { //Locations LOCATION(RC_DMT_TRADE_BROKEN_SWORD, logic->IsAdult && logic->CanUse(RG_BROKEN_SWORD)), @@ -51,12 +52,12 @@ void RegionTable_Init_DeathMountainTrail() { Entrance(RR_DMT_GREAT_FAIRY_FOUNTAIN, []{return Here(RR_DEATH_MOUNTAIN_SUMMIT, []{return logic->BlastOrSmash();});}), }); - areaTable[RR_DMT_OWL_FLIGHT] = Region("DMT Owl Flight", "Death Mountain", {RA_DEATH_MOUNTAIN_TRAIL}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DMT_OWL_FLIGHT] = Region("DMT Owl Flight", SCENE_DEATH_MOUNTAIN_TRAIL, {}, {}, { //Exits Entrance(RR_KAK_IMPAS_ROOFTOP, []{return true;}), }); - areaTable[RR_DMT_COW_GROTTO] = Region("DMT Cow Grotto", "DMT Cow Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMT_COW_GROTTO] = Region("DMT Cow Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_DMT_COW_GROTTO_COW, logic->CanUse(RG_EPONAS_SONG)), LOCATION(RC_DMT_COW_GROTTO_BEEHIVE, logic->CanBreakLowerBeehives()), @@ -72,12 +73,14 @@ void RegionTable_Init_DeathMountainTrail() { LOCATION(RC_DMT_COW_GROTTO_RUPEE_6, true), LOCATION(RC_DMT_COW_GROTTO_RED_RUPEE, true), LOCATION(RC_DMT_COW_GROTTO_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_DMT_COW_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DMT_COW_GROTTO_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}), }); - areaTable[RR_DMT_STORMS_GROTTO] = Region("DMT Storms Grotto", "DMT Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_DMT_STORMS_GROTTO] = Region("DMT Storms Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_DMT_STORMS_GROTTO_CHEST, true), LOCATION(RC_DMT_STORMS_GROTTO_FISH, logic->HasBottle()), @@ -86,16 +89,22 @@ void RegionTable_Init_DeathMountainTrail() { LOCATION(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return true;}), }); - areaTable[RR_DMT_GREAT_FAIRY_FOUNTAIN] = Region("DMT Great Fairy Fountain", "DMT Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMT_GREAT_FAIRY_FOUNTAIN] = Region("DMT Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, {}, { //Locations LOCATION(RC_DMT_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp index 0ef2bbdfc7..f4b8b01c34 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp @@ -4,9 +4,10 @@ using namespace Rando; void RegionTable_Init_DesertColossus() { - areaTable[RR_DESERT_COLOSSUS] = Region("Desert Colossus", "Desert Colossus", {RA_DESERT_COLOSSUS}, DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_DESERT_COLOSSUS] = Region("Desert Colossus", SCENE_DESERT_COLOSSUS, { //Events - EventAccess(&logic->FairyPond, []{return logic->FairyPond || logic->CanUse(RG_SONG_OF_STORMS);}), + EventAccess(&logic->FairyPond, []{return logic->CanUse(RG_SONG_OF_STORMS);}), EventAccess(&logic->BugRock, []{return true;}), }, { //Locations @@ -31,7 +32,7 @@ void RegionTable_Init_DesertColossus() { }); //specifically the full oasis, after the fairies have spawned - areaTable[RR_DESERT_COLOSSUS_OASIS] = Region("Desert Colossus Oasis", "Desert Colossus", {RA_DESERT_COLOSSUS}, DAY_NIGHT_CYCLE, { + areaTable[RR_DESERT_COLOSSUS_OASIS] = Region("Desert Colossus Oasis", SCENE_DESERT_COLOSSUS, { //Events EventAccess(&logic->FairyPond, []{return true;}), }, { @@ -49,7 +50,7 @@ void RegionTable_Init_DesertColossus() { Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE] = Region("Desert Colossus From Spirit Entryway", "Desert Colossus", {RA_DESERT_COLOSSUS}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE] = Region("Desert Colossus From Spirit Entryway", SCENE_DESERT_COLOSSUS, {}, { //Locations LOCATION(RC_SHEIK_AT_COLOSSUS, true), }, { @@ -57,7 +58,7 @@ void RegionTable_Init_DesertColossus() { Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = Region("Colossus Great Fairy Fountain", "Colossus Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = Region("Colossus Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, {}, { //Locations LOCATION(RC_COLOSSUS_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { @@ -65,7 +66,7 @@ void RegionTable_Init_DesertColossus() { Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_COLOSSUS_GROTTO] = Region("Colossus Grotto", "Colossus Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_COLOSSUS_GROTTO] = Region("Colossus Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), LOCATION(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), @@ -74,4 +75,6 @@ void RegionTable_Init_DesertColossus() { //Exits Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp new file mode 100644 index 0000000000..e26e841f0d --- /dev/null +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp @@ -0,0 +1,249 @@ +#include "soh/Enhancements/randomizer/location_access.h" +#include "soh/Enhancements/randomizer/entrance.h" + +using namespace Rando; + +// clang-format off +void RegionTable_Init_GerudoFortress() { +#pragma region Ground + + areaTable[RR_GF_OUTSKIRTS] = Region("Gerudo Fortress Outskirts", SCENE_GERUDOS_FORTRESS, { + //Events + EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), //needs climb + }, { + //Locations + LOCATION(RC_GF_OUTSKIRTS_NE_CRATE, (logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSKIRTS_NW_CRATE, logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)), + }, { + //Exits + Entrance(RR_GV_FORTRESS_SIDE, []{return true;}), + Entrance(RR_TH_1_TORCH_CELL, []{return true;}), + Entrance(RR_GF_OUTSIDE_GATE, []{return logic->GF_GateOpen;}), + Entrance(RR_GF_NEAR_GROTTO, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), + Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), + //You can talk to the guards to get yourself thrown in jail, so long as you have a hookshot to actually end up there + Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}), + }); + + areaTable[RR_GF_NEAR_GROTTO] = Region("GF Near Grotto", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_SOUTHMOST_CENTER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_MID_SOUTH_CENTER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_MID_NORTH_CENTER_CRATE, logic->CanBreakCrates()), + LOCATION(RR_GF_NORTHMOST_CENTER_CRATE, logic->CanBreakCrates()), + }, { + //Exits + Entrance(RR_TH_1_TORCH_CELL, []{return true;}), + Entrance(RR_TH_STEEP_SLOPE_CELL, []{return true;}), + Entrance(RR_TH_KITCHEN_CORRIDOR, []{return true;}), + //Jail + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}), + Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), + Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return logic->CanUse(RG_LONGSHOT);}), + Entrance(RR_GF_STORMS_GROTTO, []{return logic->IsAdult && logic->CanOpenStormsGrotto();}), + }); + + areaTable[RR_GF_OUTSIDE_GTG] = Region("GF Outside GTG", SCENE_GERUDOS_FORTRESS, { + //Events + EventAccess(&logic->GtG_GateOpen, []{return (logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->HasItem(RG_CHILD_WALLET));}), + }, {}, { + //Exits + Entrance(RR_GERUDO_TRAINING_GROUND_ENTRYWAY, []{return logic->GtG_GateOpen && (logic->IsAdult || ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES));}), + //Jail + Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}), + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_NEAR_GROTTO, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), + // RANDTODO: Add tricks for getting past the gerudo guarding the hba range + Entrance(RR_GF_ABOVE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), + Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_LONGSHOT);}), + Entrance(RR_GF_HBA_RANGE, []{return logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), + }); + +#pragma endregion + +#pragma region Rooftops + + areaTable[RR_GF_ABOVE_GTG] = Region("GF Above GTG", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_TH_DOUBLE_CELL, []{return true;}), + Entrance(RR_TH_KITCHEN_CORRIDOR, []{return true;}), + //Jail + Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}), + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_NEAR_GROTTO, []{return true;}), + Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), + // need to explicitly convert it into a bool + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0 ;}), + }); + + areaTable[RR_GF_BOTTOM_OF_LOWER_VINES] = Region("GF Bottom of Lower Vines", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_TH_STEEP_SLOPE_CELL, []{return true;}), + Entrance(RR_GF_NEAR_GROTTO, []{return true;}), + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true /* logic->CanClimb() */;}), + Entrance(RR_GF_ABOVE_GTG, []{return true;}), + }); + + areaTable[RR_GF_TOP_OF_LOWER_VINES] = Region("GF Top of Lower Vines", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_TH_KITCHEN_TOP, []{return true;}), + Entrance(RR_TH_DOUBLE_CELL, []{return true;}), + Entrance(RR_GF_ABOVE_GTG, []{return true;}), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), + // need to explicitly convert it into a bool + Entrance(RR_GF_BOTTOM_OF_UPPER_VINES, []{return logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP).Get();}), + }); + + areaTable[RR_GF_NEAR_GS] = Region("GF Near GS", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOMB_THROW) && logic->CanGetNightTimeGS()), + }, { + //Exits + Entrance(RR_TH_KITCHEN_TOP, []{return true;}), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_SLOPED_ROOF, []{return logic->IsAdult;}), + Entrance(RR_GF_LONG_ROOF, []{return logic->CanUse(RG_HOVER_BOOTS) /* || bunny hood jump */ || logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP);}), + Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), + Entrance(RR_GF_BELOW_GS, []{return true;}), + }); + + areaTable[RR_GF_SLOPED_ROOF] = Region("GF Sloped Roof", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_NEAR_GS, []{return true;}), + Entrance(RR_GF_BOTTOM_OF_UPPER_VINES, []{return true;}), + Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP).Get();}), + }); + + areaTable[RR_GF_BOTTOM_OF_UPPER_VINES] = Region("GF Bottom of Upper Vines", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_GF_OUTSIDE_GTG, []{return true;}), + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_SLOPED_ROOF, []{return logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS);}), + Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return true /* logic->CanClimb() */;}), + }); + + areaTable[RR_GF_TOP_OF_UPPER_VINES] = Region("GF Top of Upper Vines", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + //if RR_GF_SLOPED_ROOF > RR_GF_TOP_OF_UPPER_VINES is ever made part of RT_GF_JUMP, climb is needed to get back up + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH) && logic->CanGetNightTimeGS()), + }, { + //Exits + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_SLOPED_ROOF, []{return true;}), + Entrance(RR_GF_BOTTOM_OF_UPPER_VINES, []{return true;}), + Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && logic->CanUse(RG_SCARECROW) && logic->CanUse(RG_HOOKSHOT)) || logic->CanUse(RG_LONGSHOT);}), + }); + + areaTable[RR_GF_NEAR_CHEST] = Region("GF Near Chest", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_CHEST, true), + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) && logic->CanGetNightTimeGS()), + }, { + //Exits + Entrance(RR_GF_NEAR_GS, []{return true;}), + Entrance(RR_GF_LONG_ROOF, []{return true;}), + }); + + areaTable[RR_GF_LONG_ROOF] = Region("GF Long Roof", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_NEAR_GS, []{return (logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP)) || logic->CanUse(RG_HOVER_BOOTS);}), + Entrance(RR_GF_BELOW_GS, []{return true;}), + Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), + Entrance(RR_GF_BELOW_CHEST, []{return true;}), + }); + + areaTable[RR_GF_BELOW_GS] = Region("GF Below GS", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONGSHOT) && logic->CanGetNightTimeGS()), + }, { + //Exits + Entrance(RR_TH_DEAD_END_CELL, []{return true;}), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), + }); + + areaTable[RR_GF_BELOW_CHEST] = Region("GF Below Chest", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_TH_BREAK_ROOM, []{return true;}), + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + }); + + +#pragma endregion + + areaTable[RR_GF_ABOVE_JAIL] = Region("GF Above Jail", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_ABOVE_JAIL_CRATE, true), + }, { + //Exits + //you don't take fall damage if you land on the rock with the flag on for some reason + //there's a trick to reach RR_GF_LONG_ROOF but that's too intricate for GF_JUMP + Entrance(RR_GF_OUTSKIRTS, []{return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0;}), + Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), + Entrance(RR_GF_BELOW_CHEST, []{return logic->TakeDamage();}), + Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}), + }); + + areaTable[RR_GF_JAIL_WINDOW] = Region("GF Jail Window", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + //There's a trick where hovers backwalk into backflip gives access to RR_GF_LONG_ROOF from here + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_BELOW_CHEST, []{return true;}), + }); + + areaTable[RR_GF_HBA_RANGE] = Region("GF HBA Range", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_HBA_1000_POINTS, logic->IsAdult && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_EPONA) && logic->CanUse(RG_FAIRY_BOW) && logic->AtDay), + LOCATION(RC_GF_HBA_1500_POINTS, logic->IsAdult && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_EPONA) && logic->CanUse(RG_FAIRY_BOW) && logic->AtDay), + LOCATION(RC_GF_HBA_RANGE_GS, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) && logic->CanGetNightTimeGS()), + LOCATION(RC_GF_HBA_RANGE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_CANOPY_EAST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_CANOPY_WEST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_TARGET_EAST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_TARGET_WEST_CRATE, logic->IsAdult || (logic->BlastOrSmash() || logic->HookshotOrBoomerang() || logic->CanUse(RG_HOVER_BOOTS))), + //implies logic->CanBreakCrates() + LOCATION(RC_GF_NORTH_TARGET_CHILD_CRATE, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_GF_SOUTH_TARGET_EAST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_SOUTH_TARGET_WEST_CRATE, logic->CanBreakCrates()), + }, { + //Exits + Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), + }); + + areaTable[RR_GF_OUTSIDE_GATE] = Region("GF Outside Gate", SCENE_GERUDOS_FORTRESS, { + //Events + EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), + }, {}, { + //Exits + Entrance(RR_GF_OUTSKIRTS, []{return logic->GF_GateOpen;}), + Entrance(RR_WASTELAND_NEAR_FORTRESS, []{return true;}), + }); + + areaTable[RR_GF_STORMS_GROTTO] = Region("GF Storms Grotto", SCENE_GROTTOS, { + //Events + EventAccess(&logic->FreeFairies, []{return true;}), + }, { + //Locations + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_8, true), + }, { + //Exits + Entrance(RR_GF_NEAR_GROTTO, []{return true;}), + }); +} +// clang-format on \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index 1c4714e52f..a9f0299ba9 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -4,22 +4,24 @@ using namespace Rando; void RegionTable_Init_GerudoValley() { - areaTable[RR_GERUDO_VALLEY] = Region("Gerudo Valley", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_GERUDO_VALLEY] = Region("Gerudo Valley", SCENE_GERUDO_VALLEY, { //Events - EventAccess(&logic->BugRock, []{return logic->BugRock || logic->IsChild;}), + EventAccess(&logic->BugRock, []{return logic->IsChild;}), }, { //Locations LOCATION(RC_GV_GS_SMALL_BRIDGE, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), - Entrance(RR_GV_UPPER_STREAM, []{return true;}), + Entrance(RR_GV_UPPER_STREAM, []{return logic->IsChild || logic->HasItem(RG_BRONZE_SCALE) || logic->TakeDamage();}), Entrance(RR_GV_CRATE_LEDGE, []{return logic->IsChild || logic->CanUse(RG_LONGSHOT);}), Entrance(RR_GV_GROTTO_LEDGE, []{return true;}), - Entrance(RR_GV_FORTRESS_SIDE, []{return (logic->IsAdult && (logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->CarpenterRescue)) || (logic->IsChild && logic->CanUse(RG_HOOKSHOT));}), + Entrance(RR_GV_FORTRESS_SIDE, []{return (logic->IsAdult && (logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->THRescuedAllCarpenters)) || (logic->IsChild && logic->CanUse(RG_HOOKSHOT));}), + Entrance(RR_GV_LOWER_STREAM, []{return logic->IsChild;}), //can use cucco as child }); - areaTable[RR_GV_UPPER_STREAM] = Region("GV Upper Stream", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, { + areaTable[RR_GV_UPPER_STREAM] = Region("GV Upper Stream", SCENE_GERUDO_VALLEY, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), @@ -34,54 +36,62 @@ void RegionTable_Init_GerudoValley() { LOCATION(RC_GV_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), LOCATION(RC_GV_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GV_GOSSIP_STONE, true), + LOCATION(RC_GV_NEAR_COW_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits - Entrance(RR_GV_LOWER_STREAM, []{return true;}), + Entrance(RR_GV_LOWER_STREAM, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), }); - areaTable[RR_GV_LOWER_STREAM] = Region("GV Lower Stream", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, {}, { + // scale/boots logic is outside lower stream, as lower stream combines access to lake hylia for entrance randomizer's sake + areaTable[RR_GV_LOWER_STREAM] = Region("GV Lower Stream", SCENE_GERUDO_VALLEY, {}, {}, { //Exits - Entrance(RR_LAKE_HYLIA, []{return logic->IsChild || logic->HasItem(RG_BRONZE_SCALE);}),//can use cucco as child + Entrance(RR_LAKE_HYLIA, []{return true;}), }); - areaTable[RR_GV_GROTTO_LEDGE] = Region("GV Grotto Ledge", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GV_GROTTO_LEDGE] = Region("GV Grotto Ledge", SCENE_GERUDO_VALLEY, {}, {}, { //Exits - Entrance(RR_GV_LOWER_STREAM, []{return true;}), + Entrance(RR_GV_UPPER_STREAM, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), + Entrance(RR_GV_LOWER_STREAM, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), Entrance(RR_GV_OCTOROK_GROTTO, []{return logic->CanUse(RG_SILVER_GAUNTLETS);}), Entrance(RR_GV_CRATE_LEDGE, []{return logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_GV_CRATE_LEDGE] = Region("GV Crate Ledge", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GV_CRATE_LEDGE] = Region("GV Crate Ledge", SCENE_GERUDO_VALLEY, {}, { //Locations - LOCATION(RC_GV_CRATE_FREESTANDING_POH, true), + LOCATION(RC_GV_CRATE_FREESTANDING_POH, logic->CanBreakCrates()), + LOCATION(RC_GV_FREESTANDING_POH_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_GV_UPPER_STREAM, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), - Entrance(RR_GV_LOWER_STREAM, []{return true;}), + Entrance(RR_GV_LOWER_STREAM, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), }); - areaTable[RR_GV_FORTRESS_SIDE] = Region("GV Fortress Side", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GV_FORTRESS_SIDE] = Region("GV Fortress Side", SCENE_GERUDO_VALLEY, {}, { //Locations LOCATION(RC_GV_CHEST, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), LOCATION(RC_GV_TRADE_SAW, logic->IsAdult && logic->CanUse(RG_POACHERS_SAW)), LOCATION(RC_GV_GS_BEHIND_TENT, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), LOCATION(RC_GV_GS_PILLAR, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_GV_CRATE_BRIDGE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_3, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_4, logic->IsChild && logic->CanBreakCrates()), }, { //Exits - Entrance(RR_GERUDO_FORTRESS, []{return true;}), + Entrance(RR_GF_OUTSKIRTS, []{return true;}), Entrance(RR_GV_UPPER_STREAM, []{return true;}), - Entrance(RR_GERUDO_VALLEY, []{return logic->IsChild || logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->CarpenterRescue;}), + Entrance(RR_GERUDO_VALLEY, []{return logic->IsChild || logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->THRescuedAllCarpenters;}), Entrance(RR_GV_CARPENTER_TENT, []{return logic->IsAdult;}), Entrance(RR_GV_STORMS_GROTTO, []{return logic->IsAdult && logic->CanOpenStormsGrotto();}), Entrance(RR_GV_CRATE_LEDGE, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), }); - areaTable[RR_GV_CARPENTER_TENT] = Region("GV Carpenter Tent", "GV Carpenter Tent", {}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GV_CARPENTER_TENT] = Region("GV Carpenter Tent", SCENE_CARPENTERS_TENT, {}, {}, { //Exits Entrance(RR_GV_FORTRESS_SIDE, []{return true;}), }); - areaTable[RR_GV_OCTOROK_GROTTO] = Region("GV Octorok Grotto", "GV Octorok Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GV_OCTOROK_GROTTO] = Region("GV Octorok Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), @@ -96,7 +106,7 @@ void RegionTable_Init_GerudoValley() { Entrance(RR_GV_GROTTO_LEDGE, []{return true;}), }); - areaTable[RR_GV_STORMS_GROTTO] = Region("GV Storms Grotto", "GV Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GV_STORMS_GROTTO] = Region("GV Storms Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_GV_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), LOCATION(RC_GV_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), @@ -105,4 +115,6 @@ void RegionTable_Init_GerudoValley() { //Exits Entrance(RR_GV_FORTRESS_SIDE, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp index 722402ae9f..7027ab6c6f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp @@ -4,15 +4,18 @@ using namespace Rando; void RegionTable_Init_GoronCity() { - areaTable[RR_GORON_CITY] = Region("Goron City", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_GORON_CITY] = Region("Goron City", SCENE_GORON_CITY, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), - EventAccess(&logic->StickPot, []{return logic->StickPot || logic->IsChild;}), - EventAccess(&logic->BugRock, []{return logic->BugRock || (logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS));}), - EventAccess(&logic->GoronCityChildFire, []{return logic->GoronCityChildFire || (logic->IsChild && logic->CanUse(RG_DINS_FIRE));}), - EventAccess(&logic->GCWoodsWarpOpen, []{return logic->GCWoodsWarpOpen || (logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE) || logic->CanUse(RG_FAIRY_BOW) || logic->HasItem(RG_GORONS_BRACELET) || logic->GoronCityChildFire);}), - EventAccess(&logic->GCDaruniasDoorOpenChild, []{return logic->GCDaruniasDoorOpenChild || (logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY));}), - EventAccess(&logic->StopGCRollingGoronAsAdult, []{return logic->StopGCRollingGoronAsAdult || (logic->IsAdult && (logic->HasItem(RG_GORONS_BRACELET) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || (ctx->GetTrickOption(RT_GC_LINK_GORON_DINS) && logic->CanUse(RG_DINS_FIRE))));}), + EventAccess(&logic->StickPot, []{return logic->IsChild;}), + EventAccess(&logic->BugRock, []{return logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS);}), + EventAccess(&logic->GoronCityChildFire, []{return logic->IsChild && logic->CanUse(RG_DINS_FIRE);}), + EventAccess(&logic->GCWoodsWarpOpen, []{return logic->CanDetonateUprightBombFlower() || logic->CanUse(RG_MEGATON_HAMMER) || logic->GoronCityChildFire;}), + EventAccess(&logic->GCDaruniasDoorOpenChild, []{return logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY);}), + // bottle animation causes similar complications as stopping goron with Din's Fire, only put in logic when both din's & blue fire tricks enabled + EventAccess(&logic->StopGCRollingGoronAsAdult, []{return logic->IsAdult && (logic->HasItem(RG_GORONS_BRACELET) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || + (ctx->GetTrickOption(RT_GC_LINK_GORON_DINS) && (logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE)))));}), }, { //Locations LOCATION(RC_GC_MAZE_LEFT_CHEST, logic->CanUse(RG_MEGATON_HAMMER) || logic->CanUse(RG_SILVER_GAUNTLETS) || (ctx->GetTrickOption(RT_GC_LEFTMOST) && logic->HasExplosives() && logic->CanUse(RG_HOVER_BOOTS))), @@ -32,6 +35,8 @@ void RegionTable_Init_GoronCity() { LOCATION(RC_GC_UPPER_STAIRCASE_POT_1, logic->CanBreakPots()), LOCATION(RC_GC_UPPER_STAIRCASE_POT_2, logic->CanBreakPots()), LOCATION(RC_GC_UPPER_STAIRCASE_POT_3, logic->CanBreakPots()), + LOCATION(RC_GC_MAZE_CRATE, logic->BlastOrSmash() || (logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBreakCrates())), + }, { //Exits Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return true;}), @@ -42,7 +47,7 @@ void RegionTable_Init_GoronCity() { Entrance(RR_GC_GROTTO_PLATFORM, []{return logic->IsAdult && ((logic->CanUse(RG_SONG_OF_TIME) && ((logic->EffectiveHealth() > 2) || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_NAYRUS_LOVE))) || (logic->EffectiveHealth() > 1 && logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_HOOKSHOT)) || (logic->CanUse(RG_NAYRUS_LOVE) && logic->CanUse(RG_HOOKSHOT)) || (logic->EffectiveHealth() > 2 && logic->CanUse(RG_HOOKSHOT) && ctx->GetTrickOption(RT_GC_GROTTO)));}), }); - areaTable[RR_GC_MEDIGORON] = Region("GC Medigoron", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GC_MEDIGORON] = Region("GC Medigoron", SCENE_GORON_CITY, {}, { //Locations LOCATION(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), LOCATION(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), @@ -53,18 +58,18 @@ void RegionTable_Init_GoronCity() { Entrance(RR_GORON_CITY, []{return true;}), }); - areaTable[RR_GC_WOODS_WARP] = Region("GC Woods Warp", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GC_WOODS_WARP] = Region("GC Woods Warp", SCENE_GORON_CITY, { //Events - EventAccess(&logic->GCWoodsWarpOpen, []{return logic->GCWoodsWarpOpen || (logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE));}), + EventAccess(&logic->GCWoodsWarpOpen, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE);}), }, {}, { //Exits Entrance(RR_GORON_CITY, []{return logic->CanLeaveForest() && logic->GCWoodsWarpOpen;}), Entrance(RR_THE_LOST_WOODS, []{return true;}), }); - areaTable[RR_GC_DARUNIAS_CHAMBER] = Region("GC Darunias Chamber", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GC_DARUNIAS_CHAMBER] = Region("GC Darunias Chamber", SCENE_GORON_CITY, { //Events - EventAccess(&logic->GoronCityChildFire, []{return logic->GoronCityChildFire || (logic->IsChild && logic->CanUse(RG_STICKS));}), + EventAccess(&logic->GoronCityChildFire, []{return logic->IsChild && logic->CanUse(RG_STICKS);}), }, { //Locations LOCATION(RC_GC_DARUNIAS_JOY, logic->IsChild && logic->CanUse(RG_SARIAS_SONG)), @@ -77,13 +82,13 @@ void RegionTable_Init_GoronCity() { Entrance(RR_DMC_LOWER_LOCAL, []{return logic->IsAdult;}), }); - areaTable[RR_GC_GROTTO_PLATFORM] = Region("GC Grotto Platform", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GC_GROTTO_PLATFORM] = Region("GC Grotto Platform", SCENE_GORON_CITY, {}, {}, { //Exits Entrance(RR_GC_GROTTO, []{return true;}), Entrance(RR_GORON_CITY, []{return logic->EffectiveHealth() > 2 || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_NAYRUS_LOVE) || ((logic->IsChild || logic->CanUse(RG_SONG_OF_TIME)) && logic->CanUse(RG_LONGSHOT));}), }); - areaTable[RR_GC_SHOP] = Region("GC Shop", "GC Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GC_SHOP] = Region("GC Shop", SCENE_GORON_SHOP, {}, { //Locations LOCATION(RC_GC_SHOP_ITEM_1, true), LOCATION(RC_GC_SHOP_ITEM_2, true), @@ -98,7 +103,7 @@ void RegionTable_Init_GoronCity() { Entrance(RR_GORON_CITY, []{return true;}), }); - areaTable[RR_GC_GROTTO] = Region("GC Grotto", "GC Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GC_GROTTO] = Region("GC Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_GC_DEKU_SCRUB_GROTTO_LEFT, logic->CanStunDeku()), LOCATION(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, logic->CanStunDeku()), @@ -108,4 +113,6 @@ void RegionTable_Init_GoronCity() { //Exits Entrance(RR_GC_GROTTO_PLATFORM, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index 87a2e3b48d..763d125757 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -4,20 +4,34 @@ using namespace Rando; void RegionTable_Init_Graveyard() { - areaTable[RR_THE_GRAVEYARD] = Region("The Graveyard", "The Graveyard", {RA_THE_GRAVEYARD}, NO_DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_THE_GRAVEYARD] = Region("The Graveyard", SCENE_GRAVEYARD, { //Events - EventAccess(&logic->ButterflyFairy, []{return logic->ButterflyFairy || (logic->CanUse(RG_STICKS) && logic->AtDay);}), + EventAccess(&logic->ButterflyFairy, []{return logic->CanUse(RG_STICKS) && logic->AtDay;}), EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), EventAccess(&logic->BugRock, []{return true;}), }, { //Locations - LOCATION(RC_GRAVEYARD_FREESTANDING_POH, (logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_GY_POH) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_GRAVEYARD_FREESTANDING_POH, (((logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT)) && logic->CanBreakCrates()) || (ctx->GetTrickOption(RT_GY_POH) && logic->CanUse(RG_BOOMERANG))), LOCATION(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->AtNight), //TODO: This needs to change LOCATION(RC_GRAVEYARD_GS_WALL, logic->IsChild && logic->HookshotOrBoomerang() && logic->AtNight && logic->CanGetNightTimeGS()), LOCATION(RC_GRAVEYARD_GS_BEAN_PATCH, logic->CanSpawnSoilSkull() && logic->CanAttack()), LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GY_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_GRAVEYARD_CRATE, ((logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT)) && logic->CanBreakCrates()), }, { //Exits Entrance(RR_GRAVEYARD_SHIELD_GRAVE, []{return logic->IsAdult || logic->AtNight;}), @@ -29,7 +43,7 @@ void RegionTable_Init_Graveyard() { Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return false;}), }); - areaTable[RR_GRAVEYARD_SHIELD_GRAVE] = Region("Graveyard Shield Grave", "Graveyard Shield Grave", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_SHIELD_GRAVE] = Region("Graveyard Shield Grave", SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, {}, { //Locations LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, true), }, { @@ -38,7 +52,7 @@ void RegionTable_Init_Graveyard() { Entrance(RR_GRAVEYARD_SHIELD_GRAVE_BACK, []{return Here(RR_GRAVEYARD_SHIELD_GRAVE, []{return logic->CanBreakMudWalls();});}), }); - areaTable[RR_GRAVEYARD_SHIELD_GRAVE_BACK] = Region("Graveyard Shield Grave Back", "Graveyard Shield Grave", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_SHIELD_GRAVE_BACK] = Region("Graveyard Shield Grave Back", SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, {}, { //Locations LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, true), LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, true), @@ -50,10 +64,10 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, true), }, { //Exits - Entrance(RR_THE_GRAVEYARD, []{return true;}), + Entrance(RR_GRAVEYARD_SHIELD_GRAVE, []{return true;}), }); - areaTable[RR_GRAVEYARD_HEART_PIECE_GRAVE] = Region("Graveyard Heart Piece Grave", "Graveyard Heart Piece Grave", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_HEART_PIECE_GRAVE] = Region("Graveyard Heart Piece Grave", SCENE_REDEAD_GRAVE, {}, { //Locations LOCATION(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, logic->CanUse(RG_SUNS_SONG)), }, { @@ -61,20 +75,20 @@ void RegionTable_Init_Graveyard() { Entrance(RR_THE_GRAVEYARD, []{return true;}), }); - areaTable[RR_GRAVEYARD_COMPOSERS_GRAVE] = Region("Graveyard Composers Grave", "Graveyard Composers Grave", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_COMPOSERS_GRAVE] = Region("Graveyard Composers Grave", SCENE_ROYAL_FAMILYS_TOMB, {}, { //Locations LOCATION(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, logic->HasFireSource()), - LOCATION(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, logic->CanUseProjectile() || logic->CanJumpslash()), + LOCATION(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, logic->CanUseProjectile() || logic->CanJumpslash()), LOCATION(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_THE_GRAVEYARD, []{return true;}), }); - areaTable[RR_GRAVEYARD_DAMPES_GRAVE] = Region("Graveyard Dampes Grave", "Windmill and Dampes Grave", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GRAVEYARD_DAMPES_GRAVE] = Region("Graveyard Dampes Grave", SCENE_WINDMILL_AND_DAMPES_GRAVE, { //Events EventAccess(&logic->NutPot, []{return true;}), - EventAccess(&logic->DampesWindmillAccess, []{return logic->DampesWindmillAccess || (logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME));}), + EventAccess(&logic->DampesWindmillAccess, []{return logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME);}), }, { //Locations LOCATION(RC_GRAVEYARD_HOOKSHOT_CHEST, true), @@ -99,7 +113,7 @@ void RegionTable_Init_Graveyard() { Entrance(RR_KAK_WINDMILL, []{return logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME);}, false), }); - areaTable[RR_GRAVEYARD_DAMPES_HOUSE] = Region("Graveyard Dampes House", "Graveyard Dampes House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_DAMPES_HOUSE] = Region("Graveyard Dampes House", SCENE_GRAVEKEEPERS_HUT, {}, { //Locations LOCATION(RC_DAMPE_HINT, logic->IsAdult), }, { @@ -107,7 +121,7 @@ void RegionTable_Init_Graveyard() { Entrance(RR_THE_GRAVEYARD, []{return true;}), }); - areaTable[RR_GRAVEYARD_WARP_PAD_REGION] = Region("Graveyard Warp Pad Region", "Graveyard", {RA_THE_GRAVEYARD}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GRAVEYARD_WARP_PAD_REGION] = Region("Graveyard Warp Pad Region", SCENE_GRAVEYARD, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), }, { @@ -120,4 +134,6 @@ void RegionTable_Init_Graveyard() { Entrance(RR_THE_GRAVEYARD, []{return true;}), Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, []{return logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_GY_SHADOW_FIRE_ARROWS) && logic->IsAdult && logic->CanUse(RG_FIRE_ARROWS));}), }); + + // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp index abedcc571c..930ffcb4f6 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp @@ -4,13 +4,18 @@ using namespace Rando; void RegionTable_Init_HauntedWasteland() { - areaTable[RR_WASTELAND_NEAR_FORTRESS] = Region("Wasteland Near Fortress", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + // clang-format off + areaTable[RR_WASTELAND_NEAR_FORTRESS] = Region("Wasteland Near Fortress", SCENE_HAUNTED_WASTELAND, {}, + { + //Locations + LOCATION(RC_HW_BEFORE_QUICKSAND_CRATE, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_GF_OUTSIDE_GATE, []{return true;}), Entrance(RR_HAUNTED_WASTELAND, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_HW_CROSSING);}), }); - areaTable[RR_HAUNTED_WASTELAND] = Region("Haunted Wasteland", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HAUNTED_WASTELAND] = Region("Haunted Wasteland", SCENE_HAUNTED_WASTELAND, { //Events EventAccess(&logic->FairyPot, []{return true;}), EventAccess(&logic->NutPot, []{return true;}), @@ -24,15 +29,23 @@ void RegionTable_Init_HauntedWasteland() { LOCATION(RC_WASTELAND_NEAR_GS_POT_2, logic->CanBreakPots()), LOCATION(RC_WASTELAND_NEAR_GS_POT_3, logic->CanBreakPots()), LOCATION(RC_WASTELAND_NEAR_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WASTELAND_NEAR_COLOSSUS, []{return ctx->GetTrickOption(RT_LENS_HW) || logic->CanUse(RG_LENS_OF_TRUTH);}), Entrance(RR_WASTELAND_NEAR_FORTRESS, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_HW_CROSSING);}), }); - areaTable[RR_WASTELAND_NEAR_COLOSSUS] = Region("Wasteland Near Colossus", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WASTELAND_NEAR_COLOSSUS] = Region("Wasteland Near Colossus", SCENE_HAUNTED_WASTELAND, {}, { + //Locations + LOCATION(RC_HW_NEAR_COLOSSUS_CRATE, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_DESERT_COLOSSUS, []{return true;}), Entrance(RR_HAUNTED_WASTELAND, []{return ctx->GetTrickOption(RT_HW_REVERSE) || false;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp index d73c091628..5bc3aeb269 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp @@ -4,14 +4,63 @@ using namespace Rando; void RegionTable_Init_HyruleField() { - areaTable[RR_HYRULE_FIELD] = Region("Hyrule Field", "Hyrule Field", {RA_HYRULE_FIELD}, DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_HYRULE_FIELD] = Region("Hyrule Field", SCENE_HYRULE_FIELD, { //Events - EventAccess(&logic->BigPoeKill, []{return logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_EPONA) && logic->HasBottle();}), + EventAccess(&logic->BigPoeKill, []{return logic->HasBottle() && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_EPONA) || ctx->GetTrickOption(RT_HF_BIG_POE_WITHOUT_EPONA));}), }, { //Locations LOCATION(RC_HF_OCARINA_OF_TIME_ITEM, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)), LOCATION(RC_SONG_FROM_OCARINA_OF_TIME, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)), LOCATION(RC_HF_POND_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_HF_CENTRAL_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_12, logic->CanCutShrubs()), }, { //Exits Entrance(RR_LW_BRIDGE, []{return true;}), @@ -31,7 +80,7 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HF_TEKTITE_GROTTO, []{return logic->CanOpenBombGrotto();}), }); - areaTable[RR_HF_SOUTHEAST_GROTTO] = Region("HF Southeast Grotto", "HF Southeast Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_HF_SOUTHEAST_GROTTO] = Region("HF Southeast Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_HF_SOUTHEAST_GROTTO_CHEST, true), LOCATION(RC_HF_SOUTHEAST_GROTTO_FISH, logic->HasBottle()), @@ -40,12 +89,16 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_OPEN_GROTTO] = Region("HF Open Grotto", "HF Open Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_HF_OPEN_GROTTO] = Region("HF Open Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_HF_OPEN_GROTTO_CHEST, true), LOCATION(RC_HF_OPEN_GROTTO_FISH, logic->HasBottle()), @@ -54,12 +107,16 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_INSIDE_FENCE_GROTTO] = Region("HF Inside Fence Grotto", "HF Inside Fence Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HF_INSIDE_FENCE_GROTTO] = Region("HF Inside Fence Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_HF_DEKU_SCRUB_GROTTO, logic->CanStunDeku()), LOCATION(RC_HF_INSIDE_FENCE_GROTTO_BEEHIVE, logic->CanBreakLowerBeehives()), @@ -69,13 +126,13 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_COW_GROTTO] = Region("HF Cow Grotto", "HF Cow Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_HF_COW_GROTTO] = Region("HF Cow Grotto", SCENE_GROTTOS, {}, {}, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), Entrance(RR_HF_COW_GROTTO_BEHIND_WEBS, []{return logic->HasFireSource();}), }); - areaTable[RR_HF_COW_GROTTO_BEHIND_WEBS] = Region("HF Cow Grotto Behind Webs", "HF Cow Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HF_COW_GROTTO_BEHIND_WEBS] = Region("HF Cow Grotto Behind Webs", SCENE_GROTTOS, { //Events EventAccess(&logic->BugShrub, []{return logic->CanCutShrubs();}), EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), @@ -88,12 +145,14 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_COW_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_COW_GROTTO_POT_1, logic->CanBreakPots()), LOCATION(RC_HF_COW_GROTTO_POT_2, logic->CanBreakPots()), + LOCATION(RC_HF_COW_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_COW_GROTTO_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HF_COW_GROTTO, []{return true;}), }); - areaTable[RR_HF_NEAR_MARKET_GROTTO] = Region("HF Near Market Grotto", "HF Near Market Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_HF_NEAR_MARKET_GROTTO] = Region("HF Near Market Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_HF_NEAR_MARKET_GROTTO_CHEST, true), LOCATION(RC_HF_NEAR_MARKET_GROTTO_FISH, logic->HasBottle()), @@ -102,12 +161,16 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_FAIRY_GROTTO] = Region("HF Fairy Grotto", "HF Fairy Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HF_FAIRY_GROTTO] = Region("HF Fairy Grotto", SCENE_GROTTOS, { //Events EventAccess(&logic->FreeFairies, []{return true;}), }, { @@ -125,7 +188,7 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_NEAR_KAK_GROTTO] = Region("HF Near Kak Grotto", "HF Near Kak Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HF_NEAR_KAK_GROTTO] = Region("HF Near Kak Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_HF_GS_NEAR_KAK_GROTTO, logic->HookshotOrBoomerang()), }, { @@ -133,11 +196,13 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_TEKTITE_GROTTO] = Region("HF Tektite Grotto", "HF Tektite Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HF_TEKTITE_GROTTO] = Region("HF Tektite Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, logic->HasItem(RG_GOLDEN_SCALE) || logic->CanUse(RG_IRON_BOOTS)), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index aff90914e1..13490c9a44 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -4,32 +4,59 @@ using namespace Rando; void RegionTable_Init_Kakariko() { - areaTable[RR_KAKARIKO_VILLAGE] = Region("Kakariko Village", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_KAKARIKO_VILLAGE] = Region("Kakariko Village", SCENE_KAKARIKO_VILLAGE, { //Events EventAccess(&logic->BugRock, []{return true;}), - //Open Gate setting is applies in RR_ROOT + //Open Gate setting is applied in RR_ROOT EventAccess(&logic->KakarikoVillageGateOpen, []{return logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER);}), }, { //Locations - LOCATION(RC_SHEIK_IN_KAKARIKO, logic->IsAdult && logic->HasItem(RG_FOREST_MEDALLION) && logic->HasItem(RG_FIRE_MEDALLION) && logic->HasItem(RG_WATER_MEDALLION)), - LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay), - LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay), - LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)), + LOCATION(RC_SHEIK_IN_KAKARIKO, logic->IsAdult && logic->HasItem(RG_FOREST_MEDALLION) && logic->HasItem(RG_FIRE_MEDALLION) && logic->HasItem(RG_WATER_MEDALLION)), + LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay), + LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay), + LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)), //Can kill lower kak skulls with pots - LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_GY_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_FENCE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), @@ -39,7 +66,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_WINDMILL, []{return logic->CanOpenOverworldDoor(RG_WINDMILL_KEY);}), Entrance(RR_KAK_BAZAAR, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_BAZAAR_KEY);}), Entrance(RR_KAK_SHOOTING_GALLERY, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_SHOOTING_GALLERY_KEY);}), - Entrance(RR_KAK_WELL, []{return logic->IsAdult || logic->DrainWell || logic->CanUse(RG_IRON_BOOTS);}), + Entrance(RR_KAK_WELL, []{return logic->IsAdult || logic->DrainWell || logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_BOTTOM_OF_THE_WELL_NAVI_DIVE) && logic->IsChild && logic->HasItem(RG_BRONZE_SCALE) && logic->CanJumpslash());}), Entrance(RR_KAK_POTION_SHOP_FRONT, []{return (logic->AtDay || logic->IsChild) && logic->CanOpenOverworldDoor(RG_KAK_POTION_SHOP_KEY);}), Entrance(RR_KAK_REDEAD_GROTTO, []{return logic->CanOpenBombGrotto();}), Entrance(RR_KAK_IMPAS_LEDGE, []{return (logic->IsChild && logic->AtDay) || (logic->IsAdult && ctx->GetTrickOption(RT_VISIBLE_COLLISION));}), @@ -52,13 +79,13 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_BACKYARD, []{return logic->IsAdult || logic->AtDay;}), }); - areaTable[RR_KAK_IMPAS_LEDGE] = Region("Kak Impas Ledge", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_IMPAS_LEDGE] = Region("Kak Impas Ledge", SCENE_KAKARIKO_VILLAGE, {}, {}, { //Exits Entrance(RR_KAK_IMPAS_HOUSE_BACK, []{return true;}), Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_IMPAS_ROOFTOP] = Region("Kak Impas Rooftop", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_IMPAS_ROOFTOP] = Region("Kak Impas Rooftop", SCENE_KAKARIKO_VILLAGE, {}, { //Locations LOCATION(RC_KAK_GS_ABOVE_IMPAS_HOUSE, logic->IsAdult && logic->CanGetNightTimeGS() && logic->CanKillEnemy(RE_GOLD_SKULLTULA)), }, { @@ -67,7 +94,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_WATCHTOWER] = Region("Kak Watchtower", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_WATCHTOWER] = Region("Kak Watchtower", SCENE_KAKARIKO_VILLAGE, {}, { //Locations //exists for when age change is in logic. LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && logic->CanUse(RG_DINS_FIRE) && logic->CanGetNightTimeGS()), @@ -77,7 +104,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_ROOFTOP, []{return ctx->GetTrickOption(RT_KAK_MAN_ON_ROOF) && logic->IsChild;}), }); - areaTable[RR_KAK_ROOFTOP] = Region("Kak Rooftop", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_ROOFTOP] = Region("Kak Rooftop", SCENE_KAKARIKO_VILLAGE, {}, { //Locations LOCATION(RC_KAK_MAN_ON_ROOF, true), }, { @@ -86,7 +113,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_BACKYARD] = Region("Kak Backyard", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_BACKYARD] = Region("Kak Backyard", SCENE_KAKARIKO_VILLAGE, {}, { //Locations //There's probably a trick to get these with rang from the main region LOCATION(RC_KAK_NEAR_MEDICINE_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), @@ -99,7 +126,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_POTION_SHOP_BACK, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_POTION_SHOP_KEY);}), }); - areaTable[RR_KAK_CARPENTER_BOSS_HOUSE] = Region("Kak Carpenter Boss House", "Kak Carpenter Boss House", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KAK_CARPENTER_BOSS_HOUSE] = Region("Kak Carpenter Boss House", SCENE_KAKARIKO_CENTER_GUEST_HOUSE, { //Events EventAccess(&logic->WakeUpAdultTalon, []{return logic->IsAdult && logic->CanUse(RG_POCKET_EGG);}), }, {}, { @@ -107,7 +134,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_HOUSE_OF_SKULLTULA] = Region("Kak House of Skulltula", "Kak House of Skulltula", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_HOUSE_OF_SKULLTULA] = Region("Kak House of Skulltula", SCENE_HOUSE_OF_SKULLTULA, {}, { //Locations LOCATION(RC_KAK_10_GOLD_SKULLTULA_REWARD, logic->GetGSCount() >= 10), LOCATION(RC_KAK_20_GOLD_SKULLTULA_REWARD, logic->GetGSCount() >= 20), @@ -120,7 +147,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_IMPAS_HOUSE] = Region("Kak Impas House", "Kak Impas House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_IMPAS_HOUSE] = Region("Kak Impas House", SCENE_IMPAS_HOUSE, {}, { //Locations LOCATION(RC_KAK_IMPAS_HOUSE_COW, logic->CanUse(RG_EPONAS_SONG)), }, { @@ -128,7 +155,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_IMPAS_HOUSE_BACK] = Region("Kak Impas House Back", "Kak Impas House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_IMPAS_HOUSE_BACK] = Region("Kak Impas House Back", SCENE_IMPAS_HOUSE, {}, { //Locations LOCATION(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, true), LOCATION(RC_KAK_IMPAS_HOUSE_COW, logic->CanUse(RG_EPONAS_SONG)), @@ -137,9 +164,9 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_IMPAS_LEDGE, []{return true;}), }); - areaTable[RR_KAK_WINDMILL] = Region("Kak Windmill", "Windmill and Dampes Grave", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KAK_WINDMILL] = Region("Kak Windmill", SCENE_WINDMILL_AND_DAMPES_GRAVE, { //Events - EventAccess(&logic->DrainWell, []{return logic->DrainWell || (logic->IsChild && logic->CanUse(RG_SONG_OF_STORMS));}), + EventAccess(&logic->DrainWell, []{return logic->IsChild && logic->CanUse(RG_SONG_OF_STORMS);}), }, { //Locations LOCATION(RC_KAK_WINDMILL_FREESTANDING_POH, logic->CanUse(RG_BOOMERANG) || logic->DampesWindmillAccess || (logic->IsAdult && ctx->GetTrickOption(RT_KAK_ADULT_WINDMILL_POH)) || (logic->IsChild && logic->CanJumpslashExceptHammer() && ctx->GetTrickOption(RT_KAK_CHILD_WINDMILL_POH))), @@ -149,7 +176,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_BAZAAR] = Region("Kak Bazaar", "Kak Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_BAZAAR] = Region("Kak Bazaar", SCENE_BAZAAR, {}, { //Locations LOCATION(RC_KAK_BAZAAR_ITEM_1, true), LOCATION(RC_KAK_BAZAAR_ITEM_2, true), @@ -164,7 +191,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_SHOOTING_GALLERY] = Region("Kak Shooting Gallery", "Kak Shooting Gallery", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_SHOOTING_GALLERY] = Region("Kak Shooting Gallery", SCENE_SHOOTING_GALLERY, {}, { //Locations LOCATION(RC_KAK_SHOOTING_GALLERY_REWARD, logic->HasItem(RG_CHILD_WALLET) && logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)), }, { @@ -172,7 +199,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_POTION_SHOP_FRONT] = Region("Kak Potion Shop Front", "Kak Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_POTION_SHOP_FRONT] = Region("Kak Potion Shop Front", SCENE_POTION_SHOP_KAKARIKO, {}, { //Locations LOCATION(RC_KAK_POTION_SHOP_ITEM_1, logic->IsAdult), LOCATION(RC_KAK_POTION_SHOP_ITEM_2, logic->IsAdult), @@ -188,13 +215,13 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_POTION_SHOP_BACK, []{return logic->IsAdult;}), }); - areaTable[RR_KAK_POTION_SHOP_BACK] = Region("Kak Potion Shop Back", "Kak Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_POTION_SHOP_BACK] = Region("Kak Potion Shop Back", SCENE_POTION_SHOP_KAKARIKO, {}, {}, { //Exits Entrance(RR_KAK_BACKYARD, []{return logic->IsAdult;}), Entrance(RR_KAK_POTION_SHOP_FRONT, []{return true;}), }); - areaTable[RR_KAK_ODD_POTION_BUILDING] = Region("Kak Granny's Potion Shop", "Kak Granny's Potion Shop", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KAK_ODD_POTION_BUILDING] = Region("Kak Granny's Potion Shop", SCENE_POTION_SHOP_GRANNY, { //Events // RANDOTODO blue pot access }, { @@ -206,7 +233,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_BACKYARD, []{return true;}), }); - areaTable[RR_KAK_REDEAD_GROTTO] = Region("Kak Redead Grotto", "Kak Redead Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_REDEAD_GROTTO] = Region("Kak Redead Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_KAK_REDEAD_GROTTO_CHEST, logic->CanKillEnemy(RE_REDEAD, ED_CLOSE, true, 2)), }, { @@ -214,7 +241,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_OPEN_GROTTO] = Region("Kak Open Grotto", "Kak Open Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_KAK_OPEN_GROTTO] = Region("Kak Open Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_KAK_OPEN_GROTTO_CHEST, true), LOCATION(RC_KAK_OPEN_GROTTO_FISH, logic->HasBottle()), @@ -223,20 +250,26 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_KAK_BACKYARD, []{return true;}), }); - areaTable[RR_KAK_BEHIND_GATE] = Region("Kak Behind Gate", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_BEHIND_GATE] = Region("Kak Behind Gate", SCENE_KAKARIKO_VILLAGE, {}, {}, { //Exits Entrance(RR_KAKARIKO_VILLAGE, []{return logic->IsAdult || ctx->GetTrickOption(RT_VISIBLE_COLLISION) || logic->KakarikoVillageGateOpen;}), Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return true;}), }); - areaTable[RR_KAK_WELL] = Region("Kak Behind Gate", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_WELL] = Region("Kak Well", SCENE_KAKARIKO_VILLAGE, {}, {}, { //Exits Entrance(RR_KAKARIKO_VILLAGE, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->DrainWell;}), Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, []{return logic->IsChild || (logic->DrainWell && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF));}), }); + + // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp index fd7c340deb..525e222009 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp @@ -4,11 +4,12 @@ using namespace Rando; void RegionTable_Init_KokiriForest() { - areaTable[RR_KOKIRI_FOREST] = Region("Kokiri Forest", "Kokiri Forest", {RA_KOKIRI_FOREST}, NO_DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_KOKIRI_FOREST] = Region("Kokiri Forest", SCENE_KOKIRI_FOREST, { //Events EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), - EventAccess(&logic->ShowedMidoSwordAndShield, []{return logic->ShowedMidoSwordAndShield || (logic->IsChild && logic->CanUse(RG_KOKIRI_SWORD) && logic->CanUse(RG_DEKU_SHIELD));}), + EventAccess(&logic->ShowedMidoSwordAndShield, []{return logic->IsChild && logic->CanUse(RG_KOKIRI_SWORD) && logic->CanUse(RG_DEKU_SHIELD);}), }, { //Locations LOCATION(RC_KF_KOKIRI_SWORD_CHEST, logic->IsChild), @@ -39,6 +40,41 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_SARIAS_ROOF_EAST_HEART, logic->IsChild), LOCATION(RC_KF_SARIAS_ROOF_NORTH_HEART, logic->IsChild), LOCATION(RC_KF_GOSSIP_STONE, true), + LOCATION(RC_KF_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_5, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_6, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_7, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_9, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_10, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_11, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_12, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_MAZE_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_MAZE_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_MAZE_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_1, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_2, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_3, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_4, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_5, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_6, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_7, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_8, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_9, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_10, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_11, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_12, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_13, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_14, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_15, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_16, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_17, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_18, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_19, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_20, logic->IsAdult && logic->CanCutShrubs()), }, { //Exits Entrance(RR_KF_LINKS_HOUSE, []{return true;}), @@ -53,11 +89,11 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KF_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), }); - areaTable[RR_KF_OUTSIDE_DEKU_TREE] = Region("KF Outside Deku Tree", "Kokiri Forest", {RA_KOKIRI_FOREST}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KF_OUTSIDE_DEKU_TREE] = Region("KF Outside Deku Tree", SCENE_KOKIRI_FOREST, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), - EventAccess(&logic->ShowedMidoSwordAndShield, []{return logic->ShowedMidoSwordAndShield || (logic->IsChild && logic->CanUse(RG_KOKIRI_SWORD) && logic->CanUse(RG_DEKU_SHIELD));}), + EventAccess(&logic->ShowedMidoSwordAndShield, []{return logic->IsChild && logic->CanUse(RG_KOKIRI_SWORD) && logic->CanUse(RG_DEKU_SHIELD);}), }, { //Locations LOCATION(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), @@ -72,7 +108,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return (logic->IsAdult && (logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->ForestTempleClear)) || ctx->GetOption(RSK_FOREST).Is(RO_CLOSED_FOREST_OFF) || logic->ShowedMidoSwordAndShield;}), }); - areaTable[RR_KF_LINKS_HOUSE] = Region("KF Link's House", "KF Link's House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_LINKS_HOUSE] = Region("KF Link's House", SCENE_LINKS_HOUSE, {}, { //Locations LOCATION(RC_KF_LINKS_HOUSE_COW, logic->IsAdult && logic->CanUse(RG_EPONAS_SONG) && logic->LinksCow), LOCATION(RC_KF_LINKS_HOUSE_POT, logic->CanBreakPots()), @@ -81,7 +117,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}) }); - areaTable[RR_KF_MIDOS_HOUSE] = Region("KF Mido's House", "KF Mido's House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_MIDOS_HOUSE] = Region("KF Mido's House", SCENE_MIDOS_HOUSE, {}, { //Locations LOCATION(RC_KF_MIDOS_TOP_LEFT_CHEST, true), LOCATION(RC_KF_MIDOS_TOP_RIGHT_CHEST, true), @@ -92,7 +128,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}), }); - areaTable[RR_KF_SARIAS_HOUSE] = Region("KF Saria's House", "KF Saria's House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_SARIAS_HOUSE] = Region("KF Saria's House", SCENE_SARIAS_HOUSE, {}, { //Locations LOCATION(RC_KF_SARIAS_TOP_LEFT_HEART, true), LOCATION(RC_KF_SARIAS_TOP_RIGHT_HEART, true), @@ -103,7 +139,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}), }); - areaTable[RR_KF_HOUSE_OF_TWINS] = Region("KF House of Twins", "KF House of Twins", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_HOUSE_OF_TWINS] = Region("KF House of Twins", SCENE_TWINS_HOUSE, {}, { //Locations LOCATION(RC_KF_TWINS_HOUSE_POT_1, logic->CanBreakPots()), LOCATION(RC_KF_TWINS_HOUSE_POT_2, logic->CanBreakPots()), @@ -112,7 +148,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}), }); - areaTable[RR_KF_KNOW_IT_ALL_HOUSE] = Region("KF Know It All House", "KF Know It All House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_KNOW_IT_ALL_HOUSE] = Region("KF Know It All House", SCENE_KNOW_IT_ALL_BROS_HOUSE, {}, { // Locations LOCATION(RC_KF_BROTHERS_HOUSE_POT_1, logic->CanBreakPots()), LOCATION(RC_KF_BROTHERS_HOUSE_POT_2, logic->CanBreakPots()), @@ -121,7 +157,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}), }); - areaTable[RR_KF_KOKIRI_SHOP] = Region("KF Kokiri Shop", "KF Kokiri Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_KOKIRI_SHOP] = Region("KF Kokiri Shop", SCENE_KOKIRI_SHOP, {}, { //Locations LOCATION(RC_KF_SHOP_ITEM_1, true), LOCATION(RC_KF_SHOP_ITEM_2, true), @@ -136,7 +172,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}), }); - areaTable[RR_KF_STORMS_GROTTO] = Region("KF Storms Grotto", "KF Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_KF_STORMS_GROTTO] = Region("KF Storms Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_KF_STORMS_GROTTO_CHEST, true), LOCATION(RC_KF_STORMS_GROTTO_FISH, logic->HasBottle()), @@ -145,8 +181,14 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_STORMS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_KOKIRI_FOREST, []{return true;}) }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp index 447d039d25..964b781cee 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -4,14 +4,15 @@ using namespace Rando; void RegionTable_Init_LakeHylia() { - areaTable[RR_LAKE_HYLIA] = Region("Lake Hylia", "Lake Hylia", {RA_LAKE_HYLIA}, DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_LAKE_HYLIA] = Region("Lake Hylia", SCENE_LAKE_HYLIA, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), - EventAccess(&logic->ButterflyFairy, []{return logic->ButterflyFairy || logic->CanUse(RG_STICKS);}), - EventAccess(&logic->BugShrub, []{return logic->BugShrub || (logic->IsChild && logic->CanCutShrubs());}), - EventAccess(&logic->ChildScarecrow, []{return logic->ChildScarecrow || (logic->IsChild && logic->HasItem(RG_FAIRY_OCARINA) && logic->OcarinaButtons() >= 2);}), - EventAccess(&logic->AdultScarecrow, []{return logic->AdultScarecrow || (logic->IsAdult && logic->HasItem(RG_FAIRY_OCARINA) && logic->OcarinaButtons() >= 2);}), + EventAccess(&logic->ButterflyFairy, []{return logic->CanUse(RG_STICKS);}), + EventAccess(&logic->BugShrub, []{return logic->IsChild && logic->CanCutShrubs();}), + EventAccess(&logic->ChildScarecrow, []{return logic->IsChild && logic->HasItem(RG_FAIRY_OCARINA) && logic->OcarinaButtons() >= 2;}), + EventAccess(&logic->AdultScarecrow, []{return logic->IsAdult && logic->HasItem(RG_FAIRY_OCARINA) && logic->OcarinaButtons() >= 2;}), }, { //Locations LOCATION(RC_LH_UNDERWATER_ITEM, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), @@ -38,43 +39,98 @@ void RegionTable_Init_LakeHylia() { LOCATION(RC_LH_LAB_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true), + LOCATION(RC_LH_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_13, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_14, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_15, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_16, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_17, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_18, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_19, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_20, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_21, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_22, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_23, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_24, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_25, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_26, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_27, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_28, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_29, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_30, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_31, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_32, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_33, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_34, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_35, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_36, logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_WARP_PAD_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LH_WARP_PAD_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), - Entrance(RR_ZORAS_DOMAIN, []{return logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), + Entrance(RR_LH_FROM_SHORTCUT, []{return true;}), Entrance(RR_LH_OWL_FLIGHT, []{return logic->IsChild;}), Entrance(RR_LH_FISHING_ISLAND, []{return ((logic->IsChild || logic->WaterTempleClear) && logic->HasItem(RG_BRONZE_SCALE)) || (logic->IsAdult && (logic->CanUse(RG_SCARECROW) || CanPlantBean(RR_LAKE_HYLIA)));}), Entrance(RR_LH_LAB, []{return logic->CanOpenOverworldDoor(RG_HYLIA_LAB_KEY);}), - Entrance(RR_WATER_TEMPLE_ENTRYWAY, []{return logic->CanUse(RG_HOOKSHOT) && ((logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_LH_WATER_HOOKSHOT) && logic->HasItem(RG_GOLDEN_SCALE))) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->HasItem(RG_GOLDEN_SCALE)));}), + Entrance(RR_LH_FROM_WATER_TEMPLE, []{return true;}), Entrance(RR_LH_GROTTO, []{return true;}), }); - areaTable[RR_LH_FISHING_ISLAND] = Region("LH Fishing Island", "Lake Hylia", {RA_LAKE_HYLIA}, DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_LH_FROM_SHORTCUT] = Region("LH From Shortcut", SCENE_LAKE_HYLIA, TIME_DOESNT_PASS, {RA_LAKE_HYLIA}, {}, {}, { + //Exits + Entrance(RR_LAKE_HYLIA, []{return logic->Hearts() > 1 || logic->HasItem(RG_BOTTLE_WITH_FAIRY) || logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), + Entrance(RR_ZORAS_DOMAIN, []{return logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), + }); + + areaTable[RR_LH_FROM_WATER_TEMPLE] = Region("LH From Water Temple", SCENE_LAKE_HYLIA, TIME_DOESNT_PASS, {RA_LAKE_HYLIA}, {}, {}, { + //Exits + Entrance(RR_LAKE_HYLIA, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->HasItem(RG_BOTTLE_WITH_FAIRY) || logic->CanUse(RG_IRON_BOOTS);}), + Entrance(RR_WATER_TEMPLE_ENTRYWAY, []{return logic->CanUse(RG_HOOKSHOT) && ((logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_LH_WATER_HOOKSHOT) && logic->HasItem(RG_GOLDEN_SCALE))) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->HasItem(RG_GOLDEN_SCALE)));}), + }); + + areaTable[RR_LH_FISHING_ISLAND] = Region("LH Fishing Island", SCENE_LAKE_HYLIA, {}, {}, { //Exits Entrance(RR_LAKE_HYLIA, []{return logic->HasItem(RG_BRONZE_SCALE);}), Entrance(RR_LH_FISHING_POND, []{return logic->CanOpenOverworldDoor(RG_FISHING_HOLE_KEY);}), }); - areaTable[RR_LH_OWL_FLIGHT] = Region("LH Owl Flight", "Lake Hylia", {RA_LAKE_HYLIA}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_LH_OWL_FLIGHT] = Region("LH Owl Flight", SCENE_LAKE_HYLIA, {}, {}, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}, false), }); - areaTable[RR_LH_LAB] = Region("LH Lab", "LH Lab", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LH_LAB] = Region("LH Lab", SCENE_LAKESIDE_LABORATORY, {}, { //Locations - LOCATION(RC_LH_LAB_DIVE, logic->HasItem(RG_GOLDEN_SCALE) || (ctx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), + LOCATION(RC_LH_LAB_DIVE, logic->HasItem(RG_GOLDEN_SCALE) || (ctx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_BRONZE_SCALE))), LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->CanUse(RG_EYEBALL_FROG)), - LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->CanBreakCrates()), LOCATION(RC_LH_LAB_FRONT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), LOCATION(RC_LH_LAB_LEFT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), LOCATION(RC_LH_LAB_RIGHT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), + LOCATION(RC_LH_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanBreakCrates()), }, { //Exits Entrance(RR_LAKE_HYLIA, []{return true;}), }); // TODO: should some of these helpers be done via events instead? - areaTable[RR_LH_FISHING_POND] = Region("LH Fishing Hole", "LH Fishing Hole", {}, DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LH_FISHING_POND] = Region("LH Fishing Hole", SCENE_FISHING_POND, {}, { //Locations LOCATION(RC_LH_CHILD_FISHING, logic->CanUse(RG_FISHING_POLE) && logic->IsChild), LOCATION(RC_LH_CHILD_FISH_1, logic->CanUse(RG_FISHING_POLE) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), @@ -118,7 +174,7 @@ void RegionTable_Init_LakeHylia() { Entrance(RR_LH_FISHING_ISLAND, []{return true;}), }); - areaTable[RR_LH_GROTTO] = Region("LH Grotto", "LH Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LH_GROTTO] = Region("LH Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_LH_DEKU_SCRUB_GROTTO_LEFT, logic->CanStunDeku()), LOCATION(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, logic->CanStunDeku()), @@ -128,4 +184,6 @@ void RegionTable_Init_LakeHylia() { //Exits Entrance(RR_LAKE_HYLIA, []{return true;}), }); + + // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp index 2831504155..c29a5924eb 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp @@ -4,10 +4,11 @@ using namespace Rando; void RegionTable_Init_LonLonRanch() { - areaTable[RR_LON_LON_RANCH] = Region("Lon Lon Ranch", "Lon Lon Ranch", {RA_LON_LON_RANCH}, NO_DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_LON_LON_RANCH] = Region("Lon Lon Ranch", SCENE_LON_LON_RANCH, { //Events - EventAccess(&logic->FreedEpona, []{return logic->FreedEpona || ((logic->HasItem(RG_CHILD_WALLET) || ctx->GetOption(RSK_SKIP_EPONA_RACE)) && logic->CanUse(RG_EPONAS_SONG) && logic->IsAdult && logic->AtDay);}), - EventAccess(&logic->LinksCow, []{return logic->LinksCow || (logic->HasItem(RG_CHILD_WALLET) && logic->CanUse(RG_EPONAS_SONG) && logic->IsAdult && logic->AtDay);}), + EventAccess(&logic->FreedEpona, []{return (logic->HasItem(RG_CHILD_WALLET) || ctx->GetOption(RSK_SKIP_EPONA_RACE)) && logic->CanUse(RG_EPONAS_SONG) && logic->IsAdult && logic->AtDay;}), + EventAccess(&logic->LinksCow, []{return logic->HasItem(RG_CHILD_WALLET) && logic->CanUse(RG_EPONAS_SONG) && logic->IsAdult && logic->AtDay;}), }, { //Locations LOCATION(RC_SONG_FROM_MALON, logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER) && logic->HasItem(RG_FAIRY_OCARINA) && logic->AtDay), @@ -22,6 +23,7 @@ void RegionTable_Init_LonLonRanch() { LOCATION(RC_LLR_RAIN_SHED_POT_1, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_LLR_RAIN_SHED_POT_2, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_LLR_RAIN_SHED_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_LLR_NEAR_TREE_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), @@ -31,7 +33,7 @@ void RegionTable_Init_LonLonRanch() { Entrance(RR_LLR_GROTTO, []{return logic->IsChild;}), }); - areaTable[RR_LLR_TALONS_HOUSE] = Region("LLR Talons House", "LLR Talons House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_TALONS_HOUSE] = Region("LLR Talons House", SCENE_LON_LON_BUILDINGS, {}, { //Locations LOCATION(RC_LLR_TALONS_CHICKENS, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->AtDay && logic->HasItem(RG_ZELDAS_LETTER)), LOCATION(RC_LLR_TALONS_HOUSE_POT_1, logic->CanBreakPots()), @@ -42,7 +44,7 @@ void RegionTable_Init_LonLonRanch() { Entrance(RR_LON_LON_RANCH, []{return true;}), }); - areaTable[RR_LLR_STABLES] = Region("LLR Stables", "LLR Stables", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_STABLES] = Region("LLR Stables", SCENE_STABLE, {}, { //Locations LOCATION(RC_LLR_STABLES_LEFT_COW, logic->CanUse(RG_EPONAS_SONG)), LOCATION(RC_LLR_STABLES_RIGHT_COW, logic->CanUse(RG_EPONAS_SONG)), @@ -51,7 +53,7 @@ void RegionTable_Init_LonLonRanch() { Entrance(RR_LON_LON_RANCH, []{return true;}), }); - areaTable[RR_LLR_TOWER] = Region("LLR Tower", "LLR Tower", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_TOWER] = Region("LLR Tower", SCENE_LON_LON_BUILDINGS, {}, { //Locations LOCATION(RC_LLR_FREESTANDING_POH, logic->IsChild), LOCATION(RC_LLR_TOWER_LEFT_COW, logic->CanUse(RG_EPONAS_SONG)), @@ -61,7 +63,7 @@ void RegionTable_Init_LonLonRanch() { Entrance(RR_LON_LON_RANCH, []{return true;}), }); - areaTable[RR_LLR_GROTTO] = Region("LLR Grotto", "LLR Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_GROTTO] = Region("LLR Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, logic->CanStunDeku()), LOCATION(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, logic->CanStunDeku()), @@ -71,4 +73,6 @@ void RegionTable_Init_LonLonRanch() { //Exits Entrance(RR_LON_LON_RANCH, []{return true;}), }); + + // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp index 17aaff6391..e949a7b1e5 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp @@ -4,12 +4,13 @@ using namespace Rando; void RegionTable_Init_LostWoods() { - areaTable[RR_LW_FOREST_EXIT] = Region("LW Forest Exit", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, {}, {}, { + // clang-format off + areaTable[RR_LW_FOREST_EXIT] = Region("LW Forest Exit", SCENE_LOST_WOODS, {}, {}, { //Exits Entrance(RR_KOKIRI_FOREST, []{return true;}) }); - areaTable[RR_THE_LOST_WOODS] = Region("Lost Woods", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_THE_LOST_WOODS] = Region("Lost Woods", SCENE_LOST_WOODS, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), @@ -48,19 +49,22 @@ void RegionTable_Init_LostWoods() { LOCATION(RC_LW_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_SHORTCUT_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_GOSSIP_STONE, true), + LOCATION(RC_LW_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_LW_FOREST_EXIT, []{return true;}), Entrance(RR_GC_WOODS_WARP, []{return true;}), Entrance(RR_LW_BRIDGE, []{return logic->CanLeaveForest() && ((logic->IsAdult && (CanPlantBean(RR_THE_LOST_WOODS) || ctx->GetTrickOption(RT_LW_BRIDGE))) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT));}), - Entrance(RR_ZORAS_RIVER, []{return logic->CanLeaveForest() && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), + Entrance(RR_ZR_FROM_SHORTCUT, []{return logic->CanLeaveForest() && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_LOST_WOOD_NAVI_DIVE) && logic->IsChild && logic->HasItem(RG_BRONZE_SCALE) && logic->CanJumpslash()));}), Entrance(RR_LW_BEYOND_MIDO, []{return logic->IsChild || logic->CanUse(RG_SARIAS_SONG) || ctx->GetTrickOption(RT_LW_MIDO_BACKFLIP);}), Entrance(RR_LW_NEAR_SHORTCUTS_GROTTO, []{return Here(RR_THE_LOST_WOODS, []{return logic->BlastOrSmash();});}), }); - areaTable[RR_LW_BEYOND_MIDO] = Region("LW Beyond Mido", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_LW_BEYOND_MIDO] = Region("LW Beyond Mido", SCENE_LOST_WOODS, { //Events - EventAccess(&logic->ButterflyFairy, []{return logic->ButterflyFairy || logic->CanUse(RG_STICKS);}), + EventAccess(&logic->ButterflyFairy, []{return logic->CanUse(RG_STICKS);}), }, { //Locations LOCATION(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, logic->IsChild && logic->CanStunDeku()), @@ -71,6 +75,12 @@ void RegionTable_Init_LostWoods() { LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_9, logic->CanCutShrubs()), }, { //Exits Entrance(RR_LW_FOREST_EXIT, []{return true;}), @@ -80,7 +90,7 @@ void RegionTable_Init_LostWoods() { Entrance(RR_LW_SCRUBS_GROTTO, []{return Here(RR_LW_BEYOND_MIDO, []{return logic->BlastOrSmash();});}), }); - areaTable[RR_LW_NEAR_SHORTCUTS_GROTTO] = Region("LW Near Shortcuts Grotto", "LW Near Shortcuts Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_LW_NEAR_SHORTCUTS_GROTTO] = Region("LW Near Shortcuts Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, true), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_FISH, logic->HasBottle()), @@ -89,12 +99,16 @@ void RegionTable_Init_LostWoods() { LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_THE_LOST_WOODS, []{return true;}), }); - areaTable[RR_DEKU_THEATER] = Region("Deku Theater", "Deku Theater", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_THEATER] = Region("Deku Theater", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_DEKU_THEATER_SKULL_MASK, logic->IsChild && logic->SkullMask), LOCATION(RC_DEKU_THEATER_MASK_OF_TRUTH, logic->IsChild && logic->MaskOfTruth), @@ -103,7 +117,7 @@ void RegionTable_Init_LostWoods() { Entrance(RR_LW_BEYOND_MIDO, []{return true;}), }); - areaTable[RR_LW_SCRUBS_GROTTO] = Region("LW Scrubs Grotto", "LW Scrubs Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LW_SCRUBS_GROTTO] = Region("LW Scrubs Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_LW_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), LOCATION(RC_LW_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), @@ -114,7 +128,7 @@ void RegionTable_Init_LostWoods() { Entrance(RR_LW_BEYOND_MIDO, []{return true;}), }); - areaTable[RR_LW_BRIDGE_FROM_FOREST] = Region("LW Bridge From Forest", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LW_BRIDGE_FROM_FOREST] = Region("LW Bridge From Forest", SCENE_LOST_WOODS, {}, { //Locations LOCATION(RC_LW_GIFT_FROM_SARIA, true), }, { @@ -122,10 +136,12 @@ void RegionTable_Init_LostWoods() { Entrance(RR_LW_BRIDGE, []{return true;}), }); - areaTable[RR_LW_BRIDGE] = Region("LW Bridge", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_LW_BRIDGE] = Region("LW Bridge", SCENE_LOST_WOODS, {}, {}, { //Exits Entrance(RR_KOKIRI_FOREST, []{return true;}), Entrance(RR_HYRULE_FIELD, []{return true;}), Entrance(RR_THE_LOST_WOODS, []{return logic->CanUse(RG_LONGSHOT);}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index af406f8bfb..7d7655ef08 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -4,14 +4,30 @@ using namespace Rando; void RegionTable_Init_Market() { - areaTable[RR_MARKET_ENTRANCE] = Region("Market Entrance", "Market Entrance", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + // clang-format off + areaTable[RR_MARKET_ENTRANCE] = Region("Market Entrance", SCENE_MARKET_ENTRANCE_DAY, {}, {}, { //Exits Entrance(RR_HYRULE_FIELD, []{return logic->IsAdult || logic->AtDay;}), Entrance(RR_THE_MARKET, []{return true;}), Entrance(RR_MARKET_GUARD_HOUSE, []{return logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}), }); - areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_THE_MARKET] = Region("Market", SCENE_MARKET_DAY, {}, { + //Locations + //RANDOTODO add item avalibility to regions to remove need to hardcode logic in limited item use situations + LOCATION(RC_MARKET_GRASS_1, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_2, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_3, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_4, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_5, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_6, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_7, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_8, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_1, logic->IsChild /*&& logic->CanRoll()*/), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_2, logic->IsChild /*&& logic->CanRoll()*/), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild /*&& logic->CanRoll()*/), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild /*&& logic->CanRoll()*/), + }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), Entrance(RR_TOT_ENTRANCE, []{return true;}), @@ -25,7 +41,7 @@ void RegionTable_Init_Market() { Entrance(RR_MARKET_BACK_ALLEY, []{return logic->IsChild;}), }); - areaTable[RR_MARKET_BACK_ALLEY] = Region("Market Back Alley", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_MARKET_BACK_ALLEY] = Region("Market Back Alley", SCENE_BACK_ALLEY_DAY, {}, {}, { //Exits Entrance(RR_THE_MARKET, []{return true;}), Entrance(RR_MARKET_BOMBCHU_SHOP, []{return logic->AtNight && logic->CanOpenOverworldDoor(RG_BOMBCHU_SHOP_KEY);}), @@ -33,13 +49,12 @@ void RegionTable_Init_Market() { Entrance(RR_MARKET_MAN_IN_GREEN_HOUSE, []{return logic->AtNight && logic->CanOpenOverworldDoor(RG_ALLEY_HOUSE_KEY);}), }); - areaTable[RR_MARKET_GUARD_HOUSE] = Region("Market Guard House", "Market Guard House", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_MARKET_GUARD_HOUSE] = Region("Market Guard House", SCENE_MARKET_GUARD_HOUSE, { //Events - EventAccess(&logic->CouldEmptyBigPoes, []{return logic->IsAdult;}), EventAccess(&logic->CanEmptyBigPoes, []{return logic->IsAdult;}), }, { //Locations - LOCATION(RC_MARKET_10_BIG_POES, logic->IsAdult && (logic->BigPoeKill || logic->BigPoes > ctx->GetOption(RSK_BIG_POE_COUNT).Get())), + LOCATION(RC_MARKET_10_BIG_POES, logic->IsAdult && (logic->BigPoeKill || logic->BigPoes >= ctx->GetOption(RSK_BIG_POE_COUNT).Get())), LOCATION(RC_MARKET_GS_GUARD_HOUSE, logic->IsChild), LOCATION(RC_MK_GUARD_HOUSE_CHILD_POT_1, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_MK_GUARD_HOUSE_CHILD_POT_2, logic->IsChild && logic->CanBreakPots()), @@ -96,12 +111,17 @@ void RegionTable_Init_Market() { LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_9, logic->IsAdult && logic->CanBreakPots()), LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_10, logic->IsAdult && logic->CanBreakPots()), LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_11, logic->IsAdult && logic->CanBreakPots()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_3, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_4, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_5, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), }); - areaTable[RR_MARKET_BAZAAR] = Region("Market Bazaar", "Market Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_BAZAAR] = Region("Market Bazaar", SCENE_BAZAAR, {}, { //Locations LOCATION(RC_MARKET_BAZAAR_ITEM_1, true), LOCATION(RC_MARKET_BAZAAR_ITEM_2, true), @@ -116,10 +136,10 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_MASK_SHOP] = Region("Market Mask Shop", "Market Mask Shop", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_MARKET_MASK_SHOP] = Region("Market Mask Shop", SCENE_HAPPY_MASK_SHOP, { //Events - EventAccess(&logic->SkullMask, []{return logic->SkullMask || (logic->HasItem(RG_ZELDAS_LETTER) && (ctx->GetOption(RSK_COMPLETE_MASK_QUEST) || ChildCanAccess(RR_KAKARIKO_VILLAGE)));}), //RANDOTODO Complete mask quest does not need this location, so should be tied to link's pocket - EventAccess(&logic->MaskOfTruth, []{return logic->MaskOfTruth || (logic->SkullMask && (ctx->GetOption(RSK_COMPLETE_MASK_QUEST) || (ChildCanAccess(RR_THE_LOST_WOODS) && logic->CanUse(RG_SARIAS_SONG) && RegionTable(RR_THE_GRAVEYARD)->childDay && ChildCanAccess(RR_HYRULE_FIELD) && logic->StoneCount() == 3)));}), + EventAccess(&logic->SkullMask, []{return logic->HasItem(RG_ZELDAS_LETTER) && (ctx->GetOption(RSK_COMPLETE_MASK_QUEST) || ChildCanAccess(RR_KAKARIKO_VILLAGE));}), //RANDOTODO Complete mask quest does not need this location, so should be tied to link's pocket + EventAccess(&logic->MaskOfTruth, []{return logic->SkullMask && (ctx->GetOption(RSK_COMPLETE_MASK_QUEST) || (ChildCanAccess(RR_THE_LOST_WOODS) && logic->CanUse(RG_SARIAS_SONG) && RegionTable(RR_THE_GRAVEYARD)->childDay && ChildCanAccess(RR_HYRULE_FIELD) && logic->StoneCount() == 3));}), }, { //Locations LOCATION(RC_MASK_SHOP_HINT, true), @@ -128,7 +148,7 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_SHOOTING_GALLERY] = Region("Market Shooting Gallery", "Market Shooting Gallery", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_SHOOTING_GALLERY] = Region("Market Shooting Gallery", SCENE_SHOOTING_GALLERY, {}, { //Locations LOCATION(RC_MARKET_SHOOTING_GALLERY_REWARD, logic->IsChild && logic->HasItem(RG_CHILD_WALLET)), }, { @@ -136,7 +156,7 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_BOMBCHU_BOWLING] = Region("Market Bombchu Bowling", "Market Bombchu Bowling", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_MARKET_BOMBCHU_BOWLING] = Region("Market Bombchu Bowling", SCENE_BOMBCHU_BOWLING_ALLEY, { //Events EventAccess(&logic->CouldPlayBowling, []{return (logic->HasItem(RG_CHILD_WALLET));}), }, { @@ -148,7 +168,7 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_POTION_SHOP] = Region("Market Potion Shop", "Market Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_POTION_SHOP] = Region("Market Potion Shop", SCENE_POTION_SHOP_MARKET, {}, { //Locations LOCATION(RC_MARKET_POTION_SHOP_ITEM_1, true), LOCATION(RC_MARKET_POTION_SHOP_ITEM_2, true), @@ -163,7 +183,7 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_TREASURE_CHEST_GAME] = Region("Market Treasure Chest Game", "Market Treasure Chest Game", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_TREASURE_CHEST_GAME] = Region("Market Treasure Chest Game", SCENE_TREASURE_BOX_SHOP, {}, { //Locations LOCATION(RC_GREG_HINT, logic->HasItem(RG_CHILD_WALLET)), LOCATION(RC_MARKET_TREASURE_CHEST_GAME_REWARD, logic->HasItem(RG_CHILD_WALLET) && ((logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 6)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)))), @@ -182,7 +202,7 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_BOMBCHU_SHOP] = Region("Market Bombchu Shop", "Market Bombchu Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_BOMBCHU_SHOP] = Region("Market Bombchu Shop", SCENE_BOMBCHU_SHOP, {}, { //Locations LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_1, true), LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_2, true), @@ -197,15 +217,16 @@ void RegionTable_Init_Market() { Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), }); - areaTable[RR_MARKET_DOG_LADY_HOUSE] = Region("Market Dog Lady House", "Market Dog Lady House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_DOG_LADY_HOUSE] = Region("Market Dog Lady House", SCENE_DOG_LADY_HOUSE, {}, { //Locations - LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), + LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), + LOCATION(RC_MK_LOST_DOG_HOUSE_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), }); - areaTable[RR_MARKET_MAN_IN_GREEN_HOUSE] = Region("Market Man in Green House", "Market Man in Green House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_MAN_IN_GREEN_HOUSE] = Region("Market Man in Green House", SCENE_BACK_ALLEY_HOUSE, {}, { // Locations LOCATION(RC_MK_BACK_ALLEY_HOUSE_POT_1, logic->CanBreakPots()), LOCATION(RC_MK_BACK_ALLEY_HOUSE_POT_2, logic->CanBreakPots()), @@ -214,4 +235,6 @@ void RegionTable_Init_Market() { //Exits Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), }); + + // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp index ecc0577e29..9d641ac980 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp @@ -4,14 +4,15 @@ using namespace Rando; void RegionTable_Init_SacredForestMeadow() { - areaTable[RR_SFM_ENTRYWAY] = Region("SFM Entryway", "Sacred Forest Meadow", {RA_SACRED_FOREST_MEADOW}, NO_DAY_NIGHT_CYCLE, {}, {}, { + // clang-format off + areaTable[RR_SFM_ENTRYWAY] = Region("SFM Entryway", SCENE_SACRED_FOREST_MEADOW, {}, {}, { //Exits Entrance(RR_LW_BEYOND_MIDO, []{return true;}), - Entrance(RR_SACRED_FOREST_MEADOW, []{return logic->CanJumpslash() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE);}), + Entrance(RR_SACRED_FOREST_MEADOW, []{return logic->IsAdult || logic->CanKillEnemy(RE_WOLFOS);}), Entrance(RR_SFM_WOLFOS_GROTTO, []{return logic->CanOpenBombGrotto();}), }); - areaTable[RR_SACRED_FOREST_MEADOW] = Region("Sacred Forest Meadow", "Sacred Forest Meadow", {RA_SACRED_FOREST_MEADOW}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SACRED_FOREST_MEADOW] = Region("Sacred Forest Meadow", SCENE_SACRED_FOREST_MEADOW, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), }, { @@ -36,7 +37,7 @@ void RegionTable_Init_SacredForestMeadow() { Entrance(RR_SFM_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), }); - areaTable[RR_SFM_FAIRY_GROTTO] = Region("SFM Fairy Grotto", "SFM Fairy Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SFM_FAIRY_GROTTO] = Region("SFM Fairy Grotto", SCENE_GROTTOS, { //Events EventAccess(&logic->FreeFairies, []{return true;}), }, { @@ -54,7 +55,7 @@ void RegionTable_Init_SacredForestMeadow() { Entrance(RR_SACRED_FOREST_MEADOW, []{return true;}), }); - areaTable[RR_SFM_WOLFOS_GROTTO] = Region("SFM Wolfos Grotto", "SFM Wolfos Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SFM_WOLFOS_GROTTO] = Region("SFM Wolfos Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_SFM_WOLFOS_GROTTO_CHEST, logic->CanKillEnemy(RE_WOLFOS, ED_CLOSE, true, 2)), }, { @@ -62,7 +63,7 @@ void RegionTable_Init_SacredForestMeadow() { Entrance(RR_SFM_ENTRYWAY, []{return true;}), }); - areaTable[RR_SFM_STORMS_GROTTO] = Region("SFM Storms Grotto", "SFM Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SFM_STORMS_GROTTO] = Region("SFM Storms Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_SFM_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), LOCATION(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), @@ -71,4 +72,6 @@ void RegionTable_Init_SacredForestMeadow() { //Exits Entrance(RR_SACRED_FOREST_MEADOW, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp index 06865772da..07efc4326a 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp @@ -4,7 +4,8 @@ using namespace Rando; void RegionTable_Init_TempleOfTime() { - areaTable[RR_TOT_ENTRANCE] = Region("ToT Entrance", "ToT Entrance", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_TOT_ENTRANCE] = Region("ToT Entrance", SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), }, { @@ -27,7 +28,7 @@ void RegionTable_Init_TempleOfTime() { Entrance(RR_TEMPLE_OF_TIME, []{return true;}), }); - areaTable[RR_TEMPLE_OF_TIME] = Region("Temple of Time", "Temple of Time", {RA_TEMPLE_OF_TIME}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_TEMPLE_OF_TIME] = Region("Temple of Time", SCENE_TEMPLE_OF_TIME, {}, { //Locations LOCATION(RC_TOT_LIGHT_ARROWS_CUTSCENE, logic->IsAdult && logic->CanTriggerLACS()), LOCATION(RC_ALTAR_HINT_CHILD, logic->IsChild), @@ -39,7 +40,7 @@ void RegionTable_Init_TempleOfTime() { Entrance(RR_TOT_BEYOND_DOOR_OF_TIME, []{return ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_OPEN) || (logic->CanUse(RG_SONG_OF_TIME) && (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_SONGONLY) || (logic->StoneCount() == 3 && logic->HasItem(RG_OCARINA_OF_TIME))));}), }); - areaTable[RR_TOT_BEYOND_DOOR_OF_TIME] = Region("Beyond Door of Time", "Beyond Door of Time", {RA_TEMPLE_OF_TIME}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_TOT_BEYOND_DOOR_OF_TIME] = Region("Beyond Door of Time", SCENE_TEMPLE_OF_TIME, { //Events //EventAccess(&logic->TimeTravel, []{return true;}), }, { @@ -51,4 +52,6 @@ void RegionTable_Init_TempleOfTime() { //Exits Entrance(RR_TEMPLE_OF_TIME, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp new file mode 100644 index 0000000000..0a70e77e84 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp @@ -0,0 +1,142 @@ +#include "soh/Enhancements/randomizer/location_access.h" +#include "soh/Enhancements/randomizer/entrance.h" + +using namespace Rando; + +// clang-format off +// When Thieve's hideout entrances are shuffled, getting caught by guards should behave like void outs to avoid logic headaches. +void RegionTable_Init_ThievesHideout() { + areaTable[RR_TH_1_TORCH_CELL] = Region("Thieves Hideout 1 Torch Cell", SCENE_THIEVES_HIDEOUT, { + //Events + EventAccess(&logic->THCouldFree1TorchCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->THRescuedAllCarpenters, []{return logic->SmallKeys(RR_GF_OUTSKIRTS, ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) ? 4 : 1) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), + }, { + //Locations + LOCATION(RC_TH_1_TORCH_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_1_TORCH_CELL_RIGHT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_1_TORCH_CELL_MID_POT, logic->CanBreakPots()), + LOCATION(RC_TH_1_TORCH_CELL_LEFT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_1_TORCH_CELL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, { + //Exits + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_NEAR_GROTTO, []{return true;}), + }); + + areaTable[RR_TH_DOUBLE_CELL] = Region("Thieves Hideout Double Cell", SCENE_THIEVES_HIDEOUT, { + //Events + EventAccess(&logic->THCouldFreeDoubleCellCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->THRescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), + }, { + //Locations + LOCATION(RC_TH_DOUBLE_CELL_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_MID_POT, logic->CanBreakPots()), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_RIGHTMOST_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_RIGHT_MIDDLE_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_LEFT_MIDDLE_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_LEFTMOST_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_DOUBLE_CELL_LEFT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_DOUBLE_CELL_RIGHT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, { + //Exits + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_NEAR_GROTTO, []{return true;}), + }); + + areaTable[RR_TH_DEAD_END_CELL] = Region("Thieves Hideout Dead End Cell", SCENE_THIEVES_HIDEOUT, { + //Events + EventAccess(&logic->TH_CouldFreeDeadEndCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->THRescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), + }, { + //Locations + LOCATION(RC_TH_DEAD_END_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_DEAD_END_CELL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, { + //Exits + Entrance(RR_GF_BELOW_GS, []{return true;}), + }); + + areaTable[RR_TH_STEEP_SLOPE_CELL] = Region("Thieves Hideout Steep Slope Cell", SCENE_THIEVES_HIDEOUT, { + //Events + EventAccess(&logic->THCouldRescueSlopeCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->THRescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), + }, { + //Locations + LOCATION(RC_TH_STEEP_SLOPE_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_STEEP_SLOPE_RIGHT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_STEEP_SLOPE_LEFT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, { + //Exits + Entrance(RR_GF_ABOVE_GTG, []{return true;}), + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + }); + + areaTable[RR_TH_KITCHEN_CORRIDOR] = Region("Thieves Hideout Kitchen Corridor", SCENE_THIEVES_HIDEOUT, {}, { + //Locations + LOCATION(RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, logic->CanBreakCrates()), + }, { + //Exits + Entrance(RR_GF_NEAR_GROTTO, []{return true;}), + Entrance(RR_GF_ABOVE_GTG, []{return true;}), + Entrance(RR_TH_KITCHEN_MAIN, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), + }); + + areaTable[RR_TH_KITCHEN_MAIN] = Region("Thieves Hideout Kitchen Bottom", SCENE_THIEVES_HIDEOUT, {}, { + //Locations + LOCATION(RC_TH_KITCHEN_POT_1, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_POT_2, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_CRATE, logic->CanBreakCrates() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_SUN_FAIRY, logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_SUNS_SONG)), + }, { + //Exits + Entrance(RR_TH_KITCHEN_CORRIDOR, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), + Entrance(RR_TH_KITCHEN_TOP, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), + }); + + areaTable[RR_TH_KITCHEN_TOP] = Region("Thieves Hideout Kitchen Top", SCENE_THIEVES_HIDEOUT, {}, { + //Locations + LOCATION(RC_TH_KITCHEN_POT_1, logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_TH_KITCHEN_POT_2, logic->CanUse(RG_BOOMERANG)), + }, { + //Exits + Entrance(RR_TH_KITCHEN_MAIN, []{return true;}), + //hookshot to cross using the rafters is implied in logic->CanPassEnemy(RE_GERUDO_GUARD) + Entrance(RR_GF_NEAR_GS, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), + }); + + areaTable[RR_TH_BREAK_ROOM] = Region("Thieves Hideout Break Room", SCENE_THIEVES_HIDEOUT, {}, { + //Locations + LOCATION(RC_TH_BREAK_ROOM_FRONT_POT, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakPots()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_TH_BREAK_ROOM_BACK_POT, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakPots()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_TH_BREAK_HALLWAY_OUTER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_BREAK_HALLWAY_INNER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_BREAK_ROOM_RIGHT_CRATE, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakCrates()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_TH_BREAK_ROOM_LEFT_CRATE, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakCrates()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() && logic->CanUse(RG_BOOMERANG))), + }, { + //Exits + Entrance(RR_GF_BELOW_CHEST, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), + //Implies logic->CanPassEnemy(RE_GERUDO_GUARD) + Entrance(RR_TH_BREAK_ROOM_CORRIDOR, []{return logic->CanUse(RG_HOOKSHOT);}), + }); + + areaTable[RR_TH_BREAK_ROOM_CORRIDOR] = Region("Thieves Hideout Break Room", SCENE_THIEVES_HIDEOUT, {}, {}, { + //Exits + Entrance(RR_TH_BREAK_ROOM, []{return logic->CanUse(RG_HOOKSHOT);}), + Entrance(RR_GF_ABOVE_JAIL, []{return true;}), + }); +} +// clang-format on \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp index 0bf91e43ae..3a626a2f93 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp @@ -4,20 +4,21 @@ using namespace Rando; void RegionTable_Init_ZorasDomain() { - areaTable[RR_ZORAS_DOMAIN] = Region("Zoras Domain", "Zoras Domain", {RA_ZORAS_DOMAIN}, NO_DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_ZORAS_DOMAIN] = Region("Zoras Domain", SCENE_ZORAS_DOMAIN, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), EventAccess(&logic->NutPot, []{return true;}), - EventAccess(&logic->StickPot, []{return logic->StickPot || logic->IsChild;}), - EventAccess(&logic->FishGroup, []{return logic->FishGroup || logic->IsChild;}), - EventAccess(&logic->KingZoraThawed, []{return logic->KingZoraThawed || (logic->IsAdult && logic->BlueFire());}), - EventAccess(&logic->DeliverLetter, []{return logic->DeliverLetter || (logic->CanUse(RG_RUTOS_LETTER) && logic->IsChild && ctx->GetOption(RSK_ZORAS_FOUNTAIN).IsNot(RO_ZF_OPEN));}), + EventAccess(&logic->StickPot, []{return logic->IsChild;}), + EventAccess(&logic->FishGroup, []{return logic->IsChild;}), + EventAccess(&logic->KingZoraThawed, []{return logic->IsAdult && logic->BlueFire();}), + EventAccess(&logic->DeliverLetter, []{return logic->CanUse(RG_RUTOS_LETTER) && logic->IsChild && ctx->GetOption(RSK_ZORAS_FOUNTAIN).IsNot(RO_ZF_OPEN);}), }, { //Locations LOCATION(RC_ZD_DIVING_MINIGAME, logic->HasItem(RG_BRONZE_SCALE) && logic->HasItem(RG_CHILD_WALLET) && logic->IsChild), LOCATION(RC_ZD_CHEST, logic->IsChild && logic->CanUse(RG_STICKS)), - LOCATION(RC_ZD_KING_ZORA_THAWED, logic->KingZoraThawed), - LOCATION(RC_ZD_TRADE_PRESCRIPTION, logic->KingZoraThawed && logic->CanUse(RG_PRESCRIPTION)), + LOCATION(RC_ZD_KING_ZORA_THAWED, logic->IsAdult && logic->KingZoraThawed), + LOCATION(RC_ZD_TRADE_PRESCRIPTION, logic->IsAdult && logic->KingZoraThawed && logic->CanUse(RG_PRESCRIPTION)), LOCATION(RC_ZD_GS_FROZEN_WATERFALL, logic->IsAdult && (logic->HookshotOrBoomerang() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || (logic->CanUse(RG_MAGIC_SINGLE) && (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))) || (ctx->GetTrickOption(RT_ZD_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), LOCATION(RC_ZD_FISH_1, logic->IsChild && logic->HasBottle()), LOCATION(RC_ZD_FISH_2, logic->IsChild && logic->HasBottle()), @@ -27,8 +28,8 @@ void RegionTable_Init_ZorasDomain() { LOCATION(RC_ZD_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), LOCATION(RC_ZD_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZD_GOSSIP_STONE, true), - LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, logic->CanBreakUpperBeehives()), - LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, logic->CanBreakUpperBeehives()), + LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, logic->IsChild && logic->CanBreakUpperBeehives()), + LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, logic->IsChild && logic->CanBreakUpperBeehives()), LOCATION(RC_ZD_NEAR_SHOP_POT_1, logic->CanBreakPots()), LOCATION(RC_ZD_NEAR_SHOP_POT_2, logic->CanBreakPots()), LOCATION(RC_ZD_NEAR_SHOP_POT_3, logic->CanBreakPots()), @@ -37,28 +38,31 @@ void RegionTable_Init_ZorasDomain() { }, { //Exits Entrance(RR_ZR_BEHIND_WATERFALL, []{return true;}), - Entrance(RR_LAKE_HYLIA, []{return logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), + Entrance(RR_LH_FROM_SHORTCUT, []{return logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), Entrance(RR_ZD_BEHIND_KING_ZORA, []{return logic->DeliverLetter || ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_OPEN) || (ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_CLOSED_CHILD) && logic->IsAdult) || (ctx->GetTrickOption(RT_ZD_KING_ZORA_SKIP) && logic->IsAdult);}), Entrance(RR_ZD_SHOP, []{return logic->IsChild || logic->BlueFire();}), Entrance(RR_ZORAS_DOMAIN_ISLAND, []{return true;}), }); - areaTable[RR_ZORAS_DOMAIN_ISLAND] = Region("Zoras Domain Island", "Zoras Domain", {RA_ZORAS_DOMAIN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ZORAS_DOMAIN_ISLAND] = Region("Zoras Domain Island", SCENE_ZORAS_DOMAIN, {}, {}, { //Exits Entrance(RR_ZORAS_DOMAIN, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE);}), Entrance(RR_ZD_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), }); - areaTable[RR_ZD_BEHIND_KING_ZORA] = Region("ZD Behind King Zora", "Zoras Domain", {RA_ZORAS_DOMAIN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZD_BEHIND_KING_ZORA] = Region("ZD Behind King Zora", SCENE_ZORAS_DOMAIN, { + //Events + EventAccess(&logic->KingZoraThawed, []{return logic->IsAdult && logic->BlueFire();}), + }, { //Locations - LOCATION(RC_ZD_BEHIND_KING_ZORA_BEEHIVE, logic->CanBreakUpperBeehives()), + LOCATION(RC_ZD_BEHIND_KING_ZORA_BEEHIVE, logic->IsChild && logic->CanBreakUpperBeehives()), }, { //Exits Entrance(RR_ZORAS_DOMAIN, []{return logic->DeliverLetter || ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_OPEN) || (ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_CLOSED_CHILD) && logic->IsAdult);}), Entrance(RR_ZORAS_FOUNTAIN, []{return true;}), }); - areaTable[RR_ZD_SHOP] = Region("ZD Shop", "ZD Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZD_SHOP] = Region("ZD Shop", SCENE_ZORA_SHOP, {}, { //Locations LOCATION(RC_ZD_SHOP_ITEM_1, true), LOCATION(RC_ZD_SHOP_ITEM_2, true), @@ -73,7 +77,7 @@ void RegionTable_Init_ZorasDomain() { Entrance(RR_ZORAS_DOMAIN, []{return true;}), }); - areaTable[RR_ZD_STORMS_GROTTO] = Region("ZD Storms Grotto", "ZD Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ZD_STORMS_GROTTO] = Region("ZD Storms Grotto", SCENE_GROTTOS, { //Events EventAccess(&logic->FreeFairies, []{return true;}), }, { @@ -90,4 +94,6 @@ void RegionTable_Init_ZorasDomain() { //Exits Entrance(RR_ZORAS_DOMAIN_ISLAND, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp index ccdca0ecaa..cfd2125c1d 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp @@ -4,24 +4,51 @@ using namespace Rando; void RegionTable_Init_ZorasFountain() { - areaTable[RR_ZORAS_FOUNTAIN] = Region("Zoras Fountain", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, { + // clang-format off + areaTable[RR_ZORAS_FOUNTAIN] = Region("Zoras Fountain", SCENE_ZORAS_FOUNTAIN, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), - EventAccess(&logic->ButterflyFairy, []{return logic->ButterflyFairy || (logic->CanUse(RG_STICKS) && logic->AtDay);}), + EventAccess(&logic->ButterflyFairy, []{return logic->CanUse(RG_STICKS) && logic->AtDay;}), }, { //Locations - LOCATION(RC_ZF_ICEBERG_FREESTANDING_POH, logic->IsAdult), + LOCATION(RC_ZF_GS_TREE, logic->IsChild), + LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), + LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), + LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), + LOCATION(RC_ZF_NEAR_JABU_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_ZF_NEAR_JABU_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_ZF_NEAR_JABU_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_ZF_NEAR_JABU_POT_4, logic->IsChild && logic->CanBreakPots()), + }, { + //Exits + Entrance(RR_ZD_BEHIND_KING_ZORA, []{return true;}), + Entrance(RR_ZF_ICEBERGS, []{return logic->IsAdult;}), + Entrance(RR_ZF_LAKEBED, []{return logic->CanUse(RG_IRON_BOOTS);}), + //child can break the brown rock without lifting the silver rock and it stays gone for adult, but it's not intuitive and there's no reasonable case where it matters. + Entrance(RR_ZF_HIDDEN_CAVE, []{return logic->CanUse(RG_SILVER_GAUNTLETS) && logic->BlastOrSmash();}), + Entrance(RR_ZF_ROCK, []{return logic->IsAdult && logic->CanUse(RG_SCARECROW);}), + Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, []{return (logic->IsChild && logic->CanUse(RG_BOTTLE_WITH_FISH));}), + Entrance(RR_ZF_GREAT_FAIRY_FOUNTAIN, []{return logic->HasExplosives() || (ctx->GetTrickOption(RT_ZF_GREAT_FAIRY_WITHOUT_EXPLOSIVES) && logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_SILVER_GAUNTLETS));}), + }); + + areaTable[RR_ZF_ICEBERGS] = Region("ZF Icebergs", SCENE_ZORAS_FOUNTAIN, {}, { + //Locations + LOCATION(RC_ZF_ICEBERG_FREESTANDING_POH, logic->IsAdult), + }, { + //Exits + //This hover is pretty tight, come at it with momentum and aim for the small corner polygon of the big iceburg while spamming roll + Entrance(RR_ZORAS_FOUNTAIN, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->HasItem(RG_HOVER_BOOTS);}), + Entrance(RR_ZF_LAKEBED, []{return logic->CanUse(RG_IRON_BOOTS);}), + Entrance(RR_ZF_LEDGE, []{return true;}), + }); + + areaTable[RR_ZF_LAKEBED] = Region("ZF Lakebed", SCENE_ZORAS_FOUNTAIN, {}, { + //Locations LOCATION(RC_ZF_BOTTOM_FREESTANDING_POH, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), - LOCATION(RC_ZF_GS_TREE, logic->IsChild), - LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), - LOCATION(RC_ZF_GS_HIDDEN_CAVE, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->BlastOrSmash() && logic->HookshotOrBoomerang() && logic->IsAdult && logic->CanGetNightTimeGS()), - LOCATION(RC_ZF_HIDDEN_CAVE_POT_1, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->IsAdult && logic->BlastOrSmash() && logic->CanBreakPots()), - LOCATION(RC_ZF_HIDDEN_CAVE_POT_2, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->IsAdult && logic->BlastOrSmash() && logic->CanBreakPots()), - LOCATION(RC_ZF_HIDDEN_CAVE_POT_3, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->IsAdult && logic->BlastOrSmash() && logic->CanBreakPots()), - LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), - LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), - LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZF_BOTTOM_NORTH_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), LOCATION(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), LOCATION(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), @@ -40,25 +67,56 @@ void RegionTable_Init_ZorasFountain() { LOCATION(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), LOCATION(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), LOCATION(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), - LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), - LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), - LOCATION(RC_ZF_NEAR_JABU_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_ZF_NEAR_JABU_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_ZF_NEAR_JABU_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_ZF_NEAR_JABU_POT_4, logic->IsChild && logic->CanBreakPots()), }, { //Exits - Entrance(RR_ZD_BEHIND_KING_ZORA, []{return true;}), - Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, []{return (logic->IsChild && logic->CanUse(RG_BOTTLE_WITH_FISH));}), - Entrance(RR_ICE_CAVERN_ENTRYWAY, []{return logic->IsAdult;}), - Entrance(RR_ZF_GREAT_FAIRY_FOUNTAIN, []{return logic->HasExplosives() || (ctx->GetTrickOption(RT_ZF_GREAT_FAIRY_WITHOUT_EXPLOSIVES) && logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_SILVER_GAUNTLETS));}), + Entrance(RR_ZORAS_FOUNTAIN, []{return logic->HasItem(RG_BRONZE_SCALE);}), }); - areaTable[RR_ZF_GREAT_FAIRY_FOUNTAIN] = Region("ZF Great Fairy Fountain", "ZF Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZF_LEDGE] = Region("ZF Ledge", SCENE_ZORAS_FOUNTAIN, {}, {}, { + //Exits + Entrance(RR_ZORAS_FOUNTAIN, []{return logic->HasItem(RG_BRONZE_SCALE);}), + Entrance(RR_ZF_ICEBERGS, []{return logic->IsAdult;}), + Entrance(RR_ZF_LAKEBED, []{return logic->CanUse(RG_IRON_BOOTS);}), + Entrance(RR_ICE_CAVERN_ENTRYWAY, []{return true;}), + }); + + areaTable[RR_ZF_HIDDEN_CAVE] = Region("ZF Hidden Cave", SCENE_ZORAS_FOUNTAIN, {}, { + //Locations + LOCATION(RC_ZF_HIDDEN_CAVE_POT_1, logic->IsAdult && logic->CanBreakPots()), + LOCATION(RC_ZF_HIDDEN_CAVE_POT_2, logic->IsAdult && logic->CanBreakPots()), + LOCATION(RC_ZF_HIDDEN_CAVE_POT_3, logic->IsAdult && logic->CanBreakPots()), + }, { + //Exits + //There are invisible big skultullas here as adult but they do not block the path and can be "seen" with Z-target + //Lens is not currently needed for this either, implying they are not considered blocking, but it's open for discussion long-term + Entrance(RR_ZF_HIDDEN_LEDGE, []{return true;}), + }); + + areaTable[RR_ZF_HIDDEN_LEDGE] = Region("ZF Hidden Ledge", SCENE_ZORAS_FOUNTAIN, {}, { + //Locations + LOCATION(RC_ZF_GS_HIDDEN_CAVE, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOMB_THROW) && logic->CanGetNightTimeGS()), + }, { + //Exits + //It is possible to avoid fall damage by jumping towards the right and landing in deeper water, but this is basically never relevent + Entrance(RR_ZORAS_FOUNTAIN, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->TakeDamage();}), + Entrance(RR_ZF_HIDDEN_CAVE, []{return true;}), + }); + + areaTable[RR_ZF_ROCK] = Region("ZF Rock", SCENE_ZORAS_FOUNTAIN, {}, { + //Locations + //Has a wonder item + }, { + //Exits + Entrance(RR_ZORAS_FOUNTAIN, []{return true;}), + }); + + areaTable[RR_ZF_GREAT_FAIRY_FOUNTAIN] = Region("ZF Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, {}, { //Locations LOCATION(RC_ZF_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { //Exits Entrance(RR_ZORAS_FOUNTAIN, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zora_river.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp similarity index 75% rename from soh/soh/Enhancements/randomizer/location_access/overworld/zora_river.cpp rename to soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp index 16ac1b2710..5473ee2caa 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zora_river.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp @@ -4,21 +4,34 @@ using namespace Rando; void RegionTable_Init_ZoraRiver() { - areaTable[RR_ZR_FRONT] = Region("ZR Front", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, { + // clang-format off + areaTable[RR_ZR_FRONT] = Region("ZR Front", SCENE_ZORAS_RIVER, {}, { //Locations - LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanAttack()), + LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), + LOCATION(RC_ZR_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_12, logic->CanCutShrubs()), }, { //Exits Entrance(RR_ZORAS_RIVER, []{return logic->IsAdult || logic->BlastOrSmash();}), Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_ZORAS_RIVER] = Region("Zora River", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, { + areaTable[RR_ZORAS_RIVER] = Region("Zora River", SCENE_ZORAS_RIVER, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), - EventAccess(&logic->ButterflyFairy, []{return logic->ButterflyFairy || logic->CanUse(RG_STICKS);}), - EventAccess(&logic->BugShrub, []{return logic->BugShrub || logic->CanCutShrubs();}), + EventAccess(&logic->ButterflyFairy, []{return logic->CanUse(RG_STICKS);}), + EventAccess(&logic->BugShrub, []{return logic->CanCutShrubs();}), }, { //Locations LOCATION(RC_ZR_MAGIC_BEAN_SALESMAN, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild), @@ -47,6 +60,7 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, logic->IsAdult && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG))), LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), + LOCATION(RC_ZR_NEAR_FREESTANDING_POH_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_ZR_FRONT, []{return true;}), @@ -57,13 +71,19 @@ void RegionTable_Init_ZoraRiver() { Entrance(RR_ZR_BEHIND_WATERFALL, []{return ctx->GetOption(RSK_SLEEPING_WATERFALL).Is(RO_WATERFALL_OPEN) || Here(RR_ZORAS_RIVER, []{return logic->CanUse(RG_ZELDAS_LULLABY);}) || (logic->IsChild && ctx->GetTrickOption(RT_ZR_CUCCO)) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && ctx->GetTrickOption(RT_ZR_HOVERS));}), }); - areaTable[RR_ZR_BEHIND_WATERFALL] = Region("ZR Behind Waterfall", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ZR_FROM_SHORTCUT] = Region("ZR From Shortcut", SCENE_ZORAS_RIVER, TIME_DOESNT_PASS, {RA_ZORAS_RIVER}, {}, {}, { + //Exits + Entrance(RR_ZORAS_RIVER, []{return logic->Hearts() > 1 || logic->HasItem(RG_BOTTLE_WITH_FAIRY) || logic->HasItem(RG_BRONZE_SCALE);}), + Entrance(RR_THE_LOST_WOODS, []{return logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), + }); + + areaTable[RR_ZR_BEHIND_WATERFALL] = Region("ZR Behind Waterfall", SCENE_ZORAS_RIVER, {}, {}, { //Exits Entrance(RR_ZORAS_RIVER, []{return true;}), Entrance(RR_ZORAS_DOMAIN, []{return true;}), }); - areaTable[RR_ZR_OPEN_GROTTO] = Region("ZR Open Grotto", "ZR Open Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_ZR_OPEN_GROTTO] = Region("ZR Open Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_ZR_OPEN_GROTTO_CHEST, true), LOCATION(RC_ZR_OPEN_GROTTO_FISH, logic->HasBottle()), @@ -72,12 +92,16 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_ZORAS_RIVER, []{return true;}), }); - areaTable[RR_ZR_FAIRY_GROTTO] = Region("ZR Fairy Grotto", "ZR Fairy Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ZR_FAIRY_GROTTO] = Region("ZR Fairy Grotto", SCENE_GROTTOS, { //Event EventAccess(&logic->FreeFairies, []{return true;}), }, { @@ -95,7 +119,7 @@ void RegionTable_Init_ZoraRiver() { Entrance(RR_ZORAS_RIVER, []{return true;}), }); - areaTable[RR_ZR_STORMS_GROTTO] = Region("ZR Storms Grotto", "ZR Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZR_STORMS_GROTTO] = Region("ZR Storms Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_ZR_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), LOCATION(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), @@ -104,4 +128,6 @@ void RegionTable_Init_ZoraRiver() { //Exits Entrance(RR_ZORAS_RIVER, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 1e0b3a7d18..2fea752ccb 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -8,8 +8,7 @@ std::multimap, RandomizerCheck> Rando::StaticData::Che std::vector Rando::StaticData::dungeonRewardLocations = { // Bosses - RC_QUEEN_GOHMA, RC_KING_DODONGO, RC_BARINADE, - RC_PHANTOM_GANON, RC_VOLVAGIA, RC_MORPHA, RC_TWINROVA, RC_BONGO_BONGO, + RC_QUEEN_GOHMA, RC_KING_DODONGO, RC_BARINADE, RC_PHANTOM_GANON, RC_VOLVAGIA, RC_MORPHA, RC_TWINROVA, RC_BONGO_BONGO, }; using namespace Rando; @@ -17,7 +16,8 @@ using namespace Rando; std::vector Rando::StaticData::GetPondFishLocations() { std::vector pondFishLocations = {}; for (Location& location : locationTable) { - if (location.GetRCType() == RCTYPE_FISH && location.GetScene() == SCENE_FISHING_POND && location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + if (location.GetRCType() == RCTYPE_FISH && location.GetScene() == SCENE_FISHING_POND && + location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) { pondFishLocations.push_back(location.GetRandomizerCheck()); } } @@ -26,7 +26,8 @@ std::vector Rando::StaticData::GetPondFishLocations() { std::vector Rando::StaticData::GetOverworldFishLocations() { std::vector overworldFishLocations = {}; for (Location& location : locationTable) { - if (location.GetRCType() == RCTYPE_FISH && location.GetScene() != SCENE_FISHING_POND && location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + if (location.GetRCType() == RCTYPE_FISH && location.GetScene() != SCENE_FISHING_POND && + location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) { overworldFishLocations.push_back(location.GetRandomizerCheck()); } } @@ -113,8 +114,9 @@ std::vector Rando::StaticData::GetOverworldFairyLocations() { return fairyLocations; } -void Rando::StaticData::InitLocationTable() { // Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Hint Text Key Vanilla Item Spoiler Collection Check Vanilla Progression Price +void Rando::StaticData::InitLocationTable() { // clang-format off + // Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Hint Text Key Vanilla Item Spoiler Collection Check Vanilla Progression Price locationTable[RC_UNKNOWN_CHECK] = Location::Base(RC_UNKNOWN_CHECK, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_INVALID, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, "Invalid Location", "Invalid Location", RHT_NONE, RG_NONE); // Kokiri Forest locationTable[RC_KF_KOKIRI_SWORD_CHEST] = Location::Chest(RC_KF_KOKIRI_SWORD_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_KOKIRI_FOREST, 1248, 0x00, "Kokiri Sword Chest", RHT_KF_KOKIRI_SWORD_CHEST, RG_KOKIRI_SWORD, true); @@ -169,14 +171,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GV_DEKU_SCRUB_GROTTO_FRONT] = Location::Base(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GERUDO_VALLEY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08, 0xF0), "Deku Scrub Grotto Front", RHT_GV_DEKU_SCRUB_GROTTO_FRONT, RG_BUY_GREEN_POTION, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT), false, 40); // Gerudo Fortress locationTable[RC_GF_CHEST] = Location::Chest(RC_GF_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_GERUDOS_FORTRESS, 1984, 0x00, "Chest", RHT_GF_CHEST, RG_PIECE_OF_HEART, true); - locationTable[RC_GF_HBA_1000_POINTS] = Location::Base(RC_GF_HBA_1000_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "GF HBA 1000 Points", RHT_GF_HBA_1000_POINTS, RG_PIECE_OF_HEART, SpoilerCollectionCheck::InfTable(INFTABLE_190), true); - locationTable[RC_GF_HBA_1500_POINTS] = Location::Base(RC_GF_HBA_1500_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "GF HBA 1500 Points", RHT_GF_HBA_1500_POINTS, RG_PROGRESSIVE_BOW, SpoilerCollectionCheck::ItemGetInf(15), true); - // RandoTodo: Do we replace these with the RC_HIDEOUT keys or keep these? - locationTable[RC_GF_GERUDO_MEMBERSHIP_CARD] = Location::Base(RC_GF_GERUDO_MEMBERSHIP_CARD, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_THIEVES_HIDEOUT, 0x00, "GF Gerudo Membership Card", RHT_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ITEM_FROM_LEADER_OF_FORTRESS), true); - locationTable[RC_GF_NORTH_F1_CARPENTER] = Location::Collectable(RC_GF_NORTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3089, 0x0C, "GF North F1 Carpenter", RHT_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_NORTH_F2_CARPENTER] = Location::Collectable(RC_GF_NORTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 2577, 0x0A, "GF North F2 Carpenter", RHT_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_SOUTH_F1_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3601, 0x0E, "GF South F1 Carpenter", RHT_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_SOUTH_F2_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3857, 0x0F, "GF South F2 Carpenter", RHT_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_GF_HBA_1000_POINTS] = Location::Base(RC_GF_HBA_1000_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "HBA 1000 Points", RHT_GF_HBA_1000_POINTS, RG_PIECE_OF_HEART, SpoilerCollectionCheck::InfTable(INFTABLE_190), true); + locationTable[RC_GF_HBA_1500_POINTS] = Location::Base(RC_GF_HBA_1500_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "HBA 1500 Points", RHT_GF_HBA_1500_POINTS, RG_PROGRESSIVE_BOW, SpoilerCollectionCheck::ItemGetInf(15), true); + // Thieves Hideout + locationTable[RC_TH_FREED_CARPENTERS] = Location::Base(RC_TH_FREED_CARPENTERS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_THIEVES_HIDEOUT, 0x00, "Freed All Carpenters", RHT_TH_FREED_CARPENTERS, RG_GERUDO_MEMBERSHIP_CARD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_ITEM_FROM_LEADER_OF_FORTRESS), true); + locationTable[RC_TH_1_TORCH_CARPENTER] = Location::Collectable(RC_TH_1_TORCH_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3089, 0x0C, "1 Torch Carpenter", RHT_TH_1_TORCH_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_TH_DEAD_END_CARPENTER] = Location::Collectable(RC_TH_DEAD_END_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 2577, 0x0A, "Dead End Carpenter", RHT_TH_DEAD_END_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_TH_DOUBLE_CELL_CARPENTER] = Location::Collectable(RC_TH_DOUBLE_CELL_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3601, 0x0E, "Double Cell Carpenter", RHT_TH_DOUBLE_CELL_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_TH_STEEP_SLOPE_CARPENTER] = Location::Collectable(RC_TH_STEEP_SLOPE_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3857, 0x0F, "Steep Slope Carpenter", RHT_TH_STEEP_SLOPE_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); // Haunted Wasteland locationTable[RC_WASTELAND_CHEST] = Location::Chest(RC_WASTELAND_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_WASTELAND, ACTOR_EN_BOX, SCENE_HAUNTED_WASTELAND, -30048, 0x00, "Chest", RHT_WASTELAND_CHEST, RG_PURPLE_RUPEE); locationTable[RC_WASTELAND_BOMBCHU_SALESMAN] = Location::Base(RC_WASTELAND_BOMBCHU_SALESMAN, RCQUEST_BOTH, RCTYPE_MERCHANT, RCAREA_WASTELAND, ACTOR_ID_MAX, SCENE_HAUNTED_WASTELAND, 0x00, "Carpet Salesman", RHT_WASTELAND_BOMBCHU_SALESMAN, RG_BUY_BOMBCHUS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN), false, 200); @@ -225,7 +227,7 @@ void Rando::StaticData::InitLocationTable() { // // Graveyard locationTable[RC_GRAVEYARD_SHIELD_GRAVE_CHEST] = Location::Chest(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 21824, 0x00, "Shield Grave Chest", RHT_GRAVEYARD_SHIELD_GRAVE_CHEST, RG_HYLIAN_SHIELD); locationTable[RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = Location::Chest(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_REDEAD_GRAVE, -22592, 0x00, "Heart Piece Grave Chest", RHT_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RG_PIECE_OF_HEART, true); - locationTable[RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST] = Location::Chest(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_ROYAL_FAMILYS_TOMB, -32736, 0x00, "Composers Grave Chest", RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RG_BOMBS_5); + locationTable[RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST] = Location::Chest(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_ROYAL_FAMILYS_TOMB, -32736, 0x00, "Royal Family's Tomb Chest", RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RG_BOMBS_5); locationTable[RC_GRAVEYARD_HOOKSHOT_CHEST] = Location::Chest(RC_GRAVEYARD_HOOKSHOT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_WINDMILL_AND_DAMPES_GRAVE, 4352, 0x00, "Hookshot Chest", RHT_GRAVEYARD_HOOKSHOT_CHEST, RG_PROGRESSIVE_HOOKSHOT, true); locationTable[RC_GRAVEYARD_FREESTANDING_POH] = Location::Collectable(RC_GRAVEYARD_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_GRAVEYARD, 1030, 0x04, "Freestanding PoH", RHT_GRAVEYARD_FREESTANDING_POH, RG_PIECE_OF_HEART, true); locationTable[RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 1798, 0x07, "Dampe Race Freestanding PoH", RHT_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RG_PIECE_OF_HEART, true); @@ -733,7 +735,7 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_SFM_GS] = Location::GSToken(RC_SFM_GS, RCQUEST_BOTH, SCENE_SACRED_FOREST_MEADOW, 19720, 0x08, "GS", RHT_SFM_GS, 0x0D); // Hyrule Field locationTable[RC_HF_GS_COW_GROTTO] = Location::GSToken(RC_HF_GS_COW_GROTTO, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, 10753, 0x01, "GS Cow Grotto", RHT_HF_GS_COW_GROTTO, 0x0A); - locationTable[RC_HF_GS_NEAR_KAK_GROTTO] = Location::GSToken(RC_HF_GS_NEAR_KAK_GROTTO, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, 10754, 0x02, "GS Near Kak Grotto", RHT_HF_GS_NEAR_KAK_GROTTO, 0x0A); + locationTable[RC_HF_GS_NEAR_KAK_GROTTO] = Location::GSToken(RC_HF_GS_NEAR_KAK_GROTTO, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, 10754, 0x02, "GS Stone Bridge Tree Grotto", RHT_HF_GS_NEAR_KAK_GROTTO, 0x0A); // Lake Hylia locationTable[RC_LH_GS_BEAN_PATCH] = Location::GSToken(RC_LH_GS_BEAN_PATCH, RCQUEST_BOTH, SCENE_LAKE_HYLIA, 29185, 0x01, "GS Bean Patch", RHT_LH_GS_BEAN_PATCH, 0x12); locationTable[RC_LH_GS_SMALL_ISLAND] = Location::GSToken(RC_LH_GS_SMALL_ISLAND, RCQUEST_BOTH, SCENE_LAKE_HYLIA, 20994, 0x02, "GS Small Island", RHT_LH_GS_SMALL_ISLAND, 0x12); @@ -746,7 +748,7 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GV_GS_PILLAR] = Location::GSToken(RC_GV_GS_PILLAR, RCQUEST_BOTH, SCENE_GERUDO_VALLEY, 21252, 0x04, "GS Pillar", RHT_GV_GS_PILLAR, 0x13); locationTable[RC_GV_GS_BEHIND_TENT] = Location::GSToken(RC_GV_GS_BEHIND_TENT, RCQUEST_BOTH, SCENE_GERUDO_VALLEY, 21256, 0x08, "GS Behind Tent", RHT_GV_GS_BEHIND_TENT, 0x13); // Gerudo Fortress - locationTable[RC_GF_GS_ARCHERY_RANGE] = Location::GSToken(RC_GF_GS_ARCHERY_RANGE, RCQUEST_BOTH, SCENE_GERUDOS_FORTRESS, 21505, 0x01, "GS Archery Range", RHT_GF_GS_ARCHERY_RANGE, 0x14); + locationTable[RC_GF_HBA_RANGE_GS] = Location::GSToken(RC_GF_HBA_RANGE_GS, RCQUEST_BOTH, SCENE_GERUDOS_FORTRESS, 21505, 0x01, "GS Archery Range", RHT_GF_GS_ARCHERY_RANGE, 0x14); locationTable[RC_GF_GS_TOP_FLOOR] = Location::GSToken(RC_GF_GS_TOP_FLOOR, RCQUEST_BOTH, SCENE_GERUDOS_FORTRESS, 21506, 0x02, "GS Top Floor", RHT_GF_GS_TOP_FLOOR, 0x14); // Wasteland & Desert Colossus locationTable[RC_WASTELAND_GS] = Location::GSToken(RC_WASTELAND_GS, RCQUEST_BOTH, SCENE_HAUNTED_WASTELAND, 13570, 0x02, "GS", RHT_WASTELAND_GS, 0x15); @@ -826,54 +828,6 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_DMC_GREAT_FAIRY_REWARD] = Location::Base(RC_DMC_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 2, "Great Fairy Reward", RHT_DMC_GREAT_FAIRY_REWARD, RG_PROGRESSIVE_MAGIC_METER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GREAT_FAIRY_REWARD), true); locationTable[RC_OGC_GREAT_FAIRY_REWARD] = Location::Base(RC_OGC_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 3, "OGC Great Fairy Reward", "OGC Great Fairy Reward", RHT_OGC_GREAT_FAIRY_REWARD, RG_DOUBLE_DEFENSE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_OGC_GREAT_FAIRY_REWARD), true); - // Songs - locationTable[RC_SHEIK_IN_FOREST] = Location::Base(RC_SHEIK_IN_FOREST, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Sheik in Forest", "Sheik in Forest", RHT_SHEIK_IN_FOREST, RG_MINUET_OF_FOREST, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_MINUET_OF_FOREST), true); - locationTable[RC_SHEIK_IN_CRATER] = Location::Base(RC_SHEIK_IN_CRATER, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_CRATER, 0x00, "Sheik in Crater", "Sheik in Crater", RHT_SHEIK_IN_CRATER, RG_BOLERO_OF_FIRE, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_BOLERO_OF_FIRE), true); - locationTable[RC_SHEIK_IN_ICE_CAVERN] = Location::Base(RC_SHEIK_IN_ICE_CAVERN, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_ICE_CAVERN, 0x00, "Sheik in Ice Cavern", "Sheik in Ice Cavern", RHT_SHEIK_IN_ICE_CAVERN, RG_SERENADE_OF_WATER, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER), true); - locationTable[RC_SHEIK_AT_COLOSSUS] = Location::Base(RC_SHEIK_AT_COLOSSUS, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DESERT_COLOSSUS, 0x00, "Sheik at Colossus", "Sheik at Colossus", RHT_SHEIK_AT_COLOSSUS, RG_REQUIEM_OF_SPIRIT, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT), true); - locationTable[RC_SHEIK_IN_KAKARIKO] = Location::Base(RC_SHEIK_IN_KAKARIKO, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, "Sheik in Kakariko", "Sheik in Kakariko", RHT_SHEIK_IN_KAKARIKO, RG_NOCTURNE_OF_SHADOW, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL), true); - locationTable[RC_SHEIK_AT_TEMPLE] = Location::Base(RC_SHEIK_AT_TEMPLE, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, 0x00, "Sheik at Temple", "Sheik at Temple", RHT_SHEIK_AT_TEMPLE, RG_PRELUDE_OF_LIGHT, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT), true); - locationTable[RC_SONG_FROM_IMPA] = Location::Base(RC_SONG_FROM_IMPA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, "Song from Impa", "Song from Impa", RHT_SONG_FROM_IMPA, RG_ZELDAS_LULLABY, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY), true); - locationTable[RC_SONG_FROM_MALON] = Location::Base(RC_SONG_FROM_MALON, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_LON_LON_RANCH, 0x00, "Song from Malon", "Song from Malon", RHT_SONG_FROM_MALON, RG_EPONAS_SONG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LEARNED_EPONA_SONG), true); - locationTable[RC_SONG_FROM_SARIA] = Location::Base(RC_SONG_FROM_SARIA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Song from Saria", "Song from Saria", RHT_SONG_FROM_SARIA, RG_SARIAS_SONG, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SARIAS_SONG), true); - locationTable[RC_SONG_FROM_ROYAL_FAMILYS_TOMB] = Location::Base(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_ROYAL_FAMILYS_TOMB, 0x00, "Song from Composers Grave", "Song from Composers Grave", RHT_SONG_FROM_ROYAL_FAMILYS_TOMB, RG_SUNS_SONG, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SUNS_SONG), true); - locationTable[RC_SONG_FROM_OCARINA_OF_TIME] = Location::Base(RC_SONG_FROM_OCARINA_OF_TIME, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_HYRULE_FIELD, 0x00, "Song from Ocarina of Time", "Song from Ocarina of Time", RHT_SONG_FROM_OCARINA_OF_TIME, RG_SONG_OF_TIME, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SONG_OF_TIME), true); - locationTable[RC_SONG_FROM_WINDMILL] = Location::Base(RC_SONG_FROM_WINDMILL, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x00, "Song from Windmill", "Song from Windmill", RHT_SONG_FROM_WINDMILL, RG_SONG_OF_STORMS, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SONG_OF_STORMS), true); - - //Beehives - locationTable[RC_KF_STORMS_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_KOKIRI_FOREST, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x2C), "Storms Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT)); - locationTable[RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_KOKIRI_FOREST, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x2C), "Storms Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_LOST_WOODS, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x14), "Near Shortcuts Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_LOST_WOODS, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x14), "Near Shortcuts Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT)); - locationTable[RC_LW_DEKU_SCRUB_GROTTO_BEEHIVE] = Location::Base(RC_LW_DEKU_SCRUB_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_LOST_WOODS, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(747, 0xF5), "Deku Scrub Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO)); - locationTable[RC_SFM_STORMS_GROTTO_BEEHIVE] = Location::Base(RC_SFM_STORMS_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_SACRED_FOREST_MEADOW, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2262, 0xEE), "Storms Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_SFM_STORMS_GROTTO)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x00), "Near Market Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x00), "Near Market Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT)); - locationTable[RC_HF_OPEN_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x03), "Open Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT)); - locationTable[RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x03), "Open Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT)); - locationTable[RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x22), "Southeast Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT)); - locationTable[RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x22), "Southeast Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT)); - locationTable[RC_HF_INSIDE_FENCE_GROTTO_BEEHIVE] = Location::Base(RC_HF_INSIDE_FENCE_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_HYRULE_FIELD, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1410, 0xE6), "Inside Fence Grotto Beehive", RHT_BEEHIVE_LONELY_SCRUB_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO)); - locationTable[RC_LLR_GROTTO_BEEHIVE] = Location::Base(RC_LLR_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_LON_LON_RANCH, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(5144, 0xFC), "Grotto Beehive", RHT_BEEHIVE_SCRUB_TRIO_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_LLR_GROTTO)); - locationTable[RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_KAKARIKO_VILLAGE, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x28), "Open Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT)); - locationTable[RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_KAKARIKO_VILLAGE, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x28), "Open Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT)); - locationTable[RC_DMT_COW_GROTTO_BEEHIVE] = Location::Base(RC_DMT_COW_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2617, 0xF8), "Cow Grotto Beehive", RHT_BEEHIVE_COW_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMT_COW_GROTTO)); - locationTable[RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x57), "Storms Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT)); - locationTable[RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x57), "Storms Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT)); - locationTable[RC_GC_GROTTO_BEEHIVE] = Location::Base(RC_GC_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_GORON_CITY, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(5144, 0xFB), "Grotto Beehive", RHT_BEEHIVE_SCRUB_TRIO_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_GC_GROTTO)); - locationTable[RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x7A), "Upper Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT)); - locationTable[RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x7A), "Upper Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT)); - locationTable[RC_DMC_HAMMER_GROTTO_BEEHIVE] = Location::Base(RC_DMC_HAMMER_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(5144, 0xF9), "Hammer Grotto Beehive", RHT_BEEHIVE_SCRUB_TRIO_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO)); - locationTable[RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT] = Location::Base(RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_ZORAS_RIVER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-144, 0x29), "Open Grotto Beehive Left", RHT_BEEHIVE_CHEST_GROTTO, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT)); - locationTable[RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT] = Location::Base(RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_ZORAS_RIVER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 0x29), "Open Grotto Beehive Right", RHT_BEEHIVE_CHEST_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT)); - locationTable[RC_ZR_STORMS_GROTTO_BEEHIVE] = Location::Base(RC_ZR_STORMS_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_ZORAS_RIVER, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2262, 0xEB), "Storms Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZR_STORMS_GROTTO)); - locationTable[RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT] = Location::Base(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, RCQUEST_BOTH, RCTYPE_BEEHIVE, ACTOR_OBJ_COMB, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(382, 0x00), "In Front of King Zora Beehive Left", RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT)); - locationTable[RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT] = Location::Base(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, RCQUEST_BOTH, RCTYPE_BEEHIVE, ACTOR_OBJ_COMB, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(948, 0x00), "In Front of King Zora Beehive Right", RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT)); - locationTable[RC_ZD_BEHIND_KING_ZORA_BEEHIVE] = Location::Base(RC_ZD_BEHIND_KING_ZORA_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, ACTOR_OBJ_COMB, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(701, 0x00), "Behind King Zora Beehive", RHT_BEEHIVE_BEHIND_KING_ZORA, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA)); - locationTable[RC_LH_GROTTO_BEEHIVE] = Location::Base(RC_LH_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_LAKE_HYLIA, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(5144, 0xEF), "Grotto Beehive", RHT_BEEHIVE_SCRUB_TRIO_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_LH_GROTTO)); - locationTable[RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE] = Location::Base(RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_GERUDO_VALLEY, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2262, 0xF0), "Deku Scrub Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO)); - locationTable[RC_COLOSSUS_GROTTO_BEEHIVE] = Location::Base(RC_COLOSSUS_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DESERT_COLOSSUS, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2262, 0xFD), "Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_COLOSSUS_GROTTO)); - /*------------------------------- --- SHOPS --- 8 6 2 4 @@ -992,7 +946,7 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, -22947, "Open Grotto Gossip Stone"); locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, -22984, "Open Grotto Gossip Stone"); locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, -22985, "Open Grotto Gossip Stone"); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, -22964, "Near Shortcuts Gossip Stone"); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, -22964, "Near Shortcuts Grotto Gossip Stone"); locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, -23255, "Storms Grotto Gossip Stone"); locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, -23802, "Upper Grotto Gossip Stone"); diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 408ded72e2..442f2b23b3 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -13,795 +13,867 @@ #include "macros.h" #include "variables.h" #include +#include "StringHelper.h" +#include "soh/resource/type/Scene.h" +#include "soh/resource/type/scenecommand/SetTransitionActorList.h" +#include "src/overlays/actors/ovl_En_Door/z_en_door.h" +#include "src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h" namespace Rando { - bool Logic::HasItem(RandomizerGet itemName) { - switch (itemName) { - case RG_FAIRY_OCARINA: - return CheckInventory(ITEM_OCARINA_FAIRY, false); - case RG_OCARINA_OF_TIME: - return CheckInventory(ITEM_OCARINA_TIME, true); - case RG_DINS_FIRE: - return CheckInventory(ITEM_DINS_FIRE, true); - case RG_FARORES_WIND: - return CheckInventory(ITEM_FARORES_WIND, true); - case RG_NAYRUS_LOVE: - return CheckInventory(ITEM_NAYRUS_LOVE, true); - case RG_LENS_OF_TRUTH: - return CheckInventory(ITEM_LENS, true); - case RG_FAIRY_BOW: - return CheckInventory(ITEM_BOW, true); - case RG_MEGATON_HAMMER: - return CheckInventory(ITEM_HAMMER, true); - case RG_HOOKSHOT: - return CheckInventory(ITEM_HOOKSHOT, false); - case RG_LONGSHOT: - return CheckInventory(ITEM_LONGSHOT, true); - case RG_PROGRESSIVE_STICK_UPGRADE: - case RG_STICKS: - return CurrentUpgrade(UPG_STICKS); - case RG_FIRE_ARROWS: - return CheckInventory(ITEM_ARROW_FIRE, true); - case RG_ICE_ARROWS: - return CheckInventory(ITEM_ARROW_ICE, true); - case RG_LIGHT_ARROWS: - return CheckInventory(ITEM_ARROW_LIGHT, true); - case RG_PROGRESSIVE_BOMBCHUS: - case RG_BOMBCHU_5: - case RG_BOMBCHU_10: - case RG_BOMBCHU_20: - return (BombchusEnabled() && (GetInLogic(LOGIC_BUY_BOMBCHUS) || CouldPlayBowling || CarpetMerchant)) || CheckInventory(ITEM_BOMBCHU, true); - case RG_FAIRY_SLINGSHOT: - return CheckInventory(ITEM_SLINGSHOT, true); - case RG_BOOMERANG: - return CheckInventory(ITEM_BOOMERANG, true); - case RG_PROGRESSIVE_NUT_UPGRADE: - case RG_NUTS: - return CurrentUpgrade(UPG_NUTS); - //RANDOTODO handle cases where the scarecrow is persistent between age better when OI is added - case RG_SCARECROW: - return ScarecrowsSong() && CanUse(RG_HOOKSHOT); - case RG_DISTANT_SCARECROW: - return ScarecrowsSong() && CanUse(RG_LONGSHOT); - case RG_MAGIC_BEAN: - return GetAmmo(ITEM_BEAN) > 0; - case RG_KOKIRI_SWORD: - case RG_DEKU_SHIELD: - case RG_GORON_TUNIC: - case RG_ZORA_TUNIC: - case RG_HYLIAN_SHIELD: - case RG_MIRROR_SHIELD: - case RG_MASTER_SWORD: - case RG_BIGGORON_SWORD: - case RG_IRON_BOOTS: - case RG_HOVER_BOOTS: - return CheckEquipment(RandoGetToEquipFlag.at(itemName)); - case RG_GORONS_BRACELET: - return CurrentUpgrade(UPG_STRENGTH); - case RG_SILVER_GAUNTLETS: - return CurrentUpgrade(UPG_STRENGTH) >= 2; - case RG_GOLDEN_GAUNTLETS: - return CurrentUpgrade(UPG_STRENGTH) >= 3; - case RG_PROGRESSIVE_BOMB_BAG: - case RG_BOMB_BAG: - return CurrentUpgrade(UPG_BOMB_BAG); - case RG_MAGIC_SINGLE: - return GetSaveContext()->magicLevel >= 1; - // Songs - case RG_ZELDAS_LULLABY: - case RG_EPONAS_SONG: - case RG_SARIAS_SONG: - case RG_SUNS_SONG: - case RG_SONG_OF_TIME: - case RG_SONG_OF_STORMS: - case RG_MINUET_OF_FOREST: - case RG_BOLERO_OF_FIRE: - case RG_SERENADE_OF_WATER: - case RG_REQUIEM_OF_SPIRIT: - case RG_NOCTURNE_OF_SHADOW: - case RG_PRELUDE_OF_LIGHT: - // Dungeon Rewards - case RG_KOKIRI_EMERALD: - case RG_GORON_RUBY: - case RG_ZORA_SAPPHIRE: - case RG_FOREST_MEDALLION: - case RG_FIRE_MEDALLION: - case RG_WATER_MEDALLION: - case RG_SPIRIT_MEDALLION: - case RG_SHADOW_MEDALLION: - case RG_LIGHT_MEDALLION: - // Misc Quest Items - case RG_STONE_OF_AGONY: - case RG_GERUDO_MEMBERSHIP_CARD: - return CheckQuestItem(RandoGetToQuestItem.at(itemName)); - case RG_RUTOS_LETTER: - return CheckEventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER); - case RG_DOUBLE_DEFENSE: - return GetSaveContext()->isDoubleDefenseAcquired; - case RG_FISHING_POLE: - case RG_ZELDAS_LETTER: - case RG_WEIRD_EGG: - case RG_GREG_RUPEE: - // Ocarina Buttons - case RG_OCARINA_A_BUTTON: - case RG_OCARINA_C_LEFT_BUTTON: - case RG_OCARINA_C_RIGHT_BUTTON: - case RG_OCARINA_C_DOWN_BUTTON: - case RG_OCARINA_C_UP_BUTTON: - // Boss Souls - case RG_GOHMA_SOUL: - case RG_KING_DODONGO_SOUL: - case RG_BARINADE_SOUL: - case RG_PHANTOM_GANON_SOUL: - case RG_VOLVAGIA_SOUL: - case RG_MORPHA_SOUL: - case RG_BONGO_BONGO_SOUL: - case RG_TWINROVA_SOUL: - case RG_GANON_SOUL: - case RG_SKELETON_KEY: - // Overworld Keys - case RG_GUARD_HOUSE_KEY: - case RG_MARKET_BAZAAR_KEY: - case RG_MARKET_POTION_SHOP_KEY: - case RG_MASK_SHOP_KEY: - case RG_MARKET_SHOOTING_GALLERY_KEY: - case RG_BOMBCHU_BOWLING_KEY: - case RG_TREASURE_CHEST_GAME_BUILDING_KEY: - case RG_BOMBCHU_SHOP_KEY: - case RG_RICHARDS_HOUSE_KEY: - case RG_ALLEY_HOUSE_KEY: - case RG_KAK_BAZAAR_KEY: - case RG_KAK_POTION_SHOP_KEY: - case RG_BOSS_HOUSE_KEY: - case RG_GRANNYS_POTION_SHOP_KEY: - case RG_SKULLTULA_HOUSE_KEY: - case RG_IMPAS_HOUSE_KEY: - case RG_WINDMILL_KEY: - case RG_KAK_SHOOTING_GALLERY_KEY: - case RG_DAMPES_HUT_KEY: - case RG_TALONS_HOUSE_KEY: - case RG_STABLES_KEY: - case RG_BACK_TOWER_KEY: - case RG_HYLIA_LAB_KEY: - case RG_FISHING_HOLE_KEY: - return CheckRandoInf(RandoGetToRandInf.at(itemName)); - // Boss Keys - case RG_EPONA: - return FreedEpona; - case RG_FOREST_TEMPLE_BOSS_KEY: - case RG_FIRE_TEMPLE_BOSS_KEY: - case RG_WATER_TEMPLE_BOSS_KEY: - case RG_SPIRIT_TEMPLE_BOSS_KEY: - case RG_SHADOW_TEMPLE_BOSS_KEY: - case RG_GANONS_CASTLE_BOSS_KEY: - return CheckDungeonItem(DUNGEON_KEY_BOSS, RandoGetToDungeonScene.at(itemName)); - // Maps - case RG_DEKU_TREE_MAP: - case RG_DODONGOS_CAVERN_MAP: - case RG_JABU_JABUS_BELLY_MAP: - case RG_FOREST_TEMPLE_MAP: - case RG_FIRE_TEMPLE_MAP: - case RG_WATER_TEMPLE_MAP: - case RG_SPIRIT_TEMPLE_MAP: - case RG_SHADOW_TEMPLE_MAP: - case RG_BOTTOM_OF_THE_WELL_MAP: - case RG_ICE_CAVERN_MAP: - return CheckDungeonItem(DUNGEON_MAP, RandoGetToDungeonScene.at(itemName)); - // Compasses - case RG_DEKU_TREE_COMPASS: - case RG_DODONGOS_CAVERN_COMPASS: - case RG_JABU_JABUS_BELLY_COMPASS: - case RG_FOREST_TEMPLE_COMPASS: - case RG_FIRE_TEMPLE_COMPASS: - case RG_WATER_TEMPLE_COMPASS: - case RG_SPIRIT_TEMPLE_COMPASS: - case RG_SHADOW_TEMPLE_COMPASS: - case RG_BOTTOM_OF_THE_WELL_COMPASS: - case RG_ICE_CAVERN_COMPASS: - return CheckDungeonItem(DUNGEON_COMPASS, RandoGetToDungeonScene.at(itemName)); - // Wallets - case RG_CHILD_WALLET: - return CheckRandoInf(RAND_INF_HAS_WALLET); - case RG_ADULT_WALLET: - return CurrentUpgrade(UPG_WALLET) >= 1; - case RG_GIANT_WALLET: - return CurrentUpgrade(UPG_WALLET) >= 2; - case RG_TYCOON_WALLET: - return CurrentUpgrade(UPG_WALLET) >= 3; - // Scales - case RG_BRONZE_SCALE: - return CheckRandoInf(RAND_INF_CAN_SWIM); - case RG_SILVER_SCALE: - return CurrentUpgrade(UPG_SCALE) >= 1; - case RG_GOLDEN_SCALE: - return CurrentUpgrade(UPG_SCALE) >= 2; - case RG_POCKET_EGG: - case RG_COJIRO: - case RG_ODD_MUSHROOM: - case RG_ODD_POTION: - case RG_POACHERS_SAW: - case RG_BROKEN_SWORD: - case RG_PRESCRIPTION: - case RG_EYEBALL_FROG: - case RG_EYEDROPS: - case RG_CLAIM_CHECK: - return CheckRandoInf(itemName - RG_POCKET_EGG + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG); - case RG_BOTTLE_WITH_BIG_POE: - case RG_BOTTLE_WITH_BLUE_FIRE: - case RG_BOTTLE_WITH_BLUE_POTION: - case RG_BOTTLE_WITH_BUGS: - case RG_BOTTLE_WITH_FAIRY: - case RG_BOTTLE_WITH_FISH: - case RG_BOTTLE_WITH_GREEN_POTION: - case RG_BOTTLE_WITH_MILK: - case RG_BOTTLE_WITH_POE: - case RG_BOTTLE_WITH_RED_POTION: - case RG_EMPTY_BOTTLE: - return HasBottle(); - default: - break; - } - SPDLOG_ERROR("HasItem reached `return false;`. Missing case for RandomizerGet of {}", static_cast(itemName)); - assert(false); - return false; - } - - //Can the passed in item be used? - //RANDOTODO catch magic items explicitly and add an assert on miss. - bool Logic::CanUse(RandomizerGet itemName) { - if (!HasItem(itemName)) - return false; - - switch (itemName) { - // Magic items - case RG_MAGIC_SINGLE: - return AmmoCanDrop || (HasBottle() && GetInLogic(LOGIC_BUY_MAGIC_POTION)); - case RG_DINS_FIRE: - case RG_FARORES_WIND: - case RG_NAYRUS_LOVE: - case RG_LENS_OF_TRUTH: - return CanUse(RG_MAGIC_SINGLE); - case RG_FIRE_ARROWS: - case RG_ICE_ARROWS: - case RG_LIGHT_ARROWS: - return CanUse(RG_MAGIC_SINGLE) && CanUse(RG_FAIRY_BOW); - - // Adult items - // TODO: Uncomment those if we ever implement more item usability settings - case RG_FAIRY_BOW: - return IsAdult && (AmmoCanDrop || GetInLogic(LOGIC_BUY_ARROW));// || BowAsChild; - case RG_MEGATON_HAMMER: - return IsAdult;// || HammerAsChild; - case RG_IRON_BOOTS: - return IsAdult;// || IronBootsAsChild; - case RG_HOVER_BOOTS: - return IsAdult;// || HoverBootsAsChild; - case RG_HOOKSHOT: - case RG_LONGSHOT: - case RG_SCARECROW: - case RG_DISTANT_SCARECROW: - return IsAdult;// || HookshotAsChild; - case RG_GORON_TUNIC: - return IsAdult;// || GoronTunicAsChild; - case RG_ZORA_TUNIC: - return IsAdult;// || ZoraTunicAsChild; - case RG_MIRROR_SHIELD: - return IsAdult;// || MirrorShieldAsChild; - case RG_MASTER_SWORD: - return IsAdult;// || MasterSwordAsChild; - case RG_BIGGORON_SWORD: - return IsAdult;// || BiggoronSwordAsChild; - case RG_SILVER_GAUNTLETS: - case RG_GOLDEN_GAUNTLETS: - // Adult Trade - case RG_POCKET_EGG: - case RG_COJIRO: - case RG_ODD_MUSHROOM: - case RG_ODD_POTION: - case RG_POACHERS_SAW: - case RG_BROKEN_SWORD: - case RG_PRESCRIPTION: - case RG_EYEBALL_FROG: - case RG_EYEDROPS: - case RG_CLAIM_CHECK: - return IsAdult; - - // Child items - case RG_FAIRY_SLINGSHOT: - return IsChild && (AmmoCanDrop || GetInLogic(LOGIC_BUY_SEED));// || SlingshotAsAdult; - case RG_BOOMERANG: - return IsChild;// || BoomerangAsAdult; - case RG_KOKIRI_SWORD: - return IsChild;// || KokiriSwordAsAdult; - case RG_NUTS: - return (NutPot || NutCrate || DekuBabaNuts) && AmmoCanDrop; //RANDOTODO BuyNuts currently mixed in with Nuts, should be seperate as BuyNuts are also a Nuts source - case RG_STICKS: - return IsChild /* || StickAsAdult;*/&& (StickPot || DekuBabaSticks); - case RG_DEKU_SHIELD: - return IsChild;// || DekuShieldAsAdult; - case RG_PROGRESSIVE_BOMB_BAG: - case RG_BOMB_BAG: - return AmmoCanDrop || GetInLogic(LOGIC_BUY_BOMB); - case RG_PROGRESSIVE_BOMBCHUS: - case RG_BOMBCHU_5: - case RG_BOMBCHU_10: - case RG_BOMBCHU_20: - return BombchuRefill() && BombchusEnabled(); - case RG_WEIRD_EGG: - case RG_RUTOS_LETTER: - return IsChild; - case RG_MAGIC_BEAN: - return IsChild; - +bool Logic::HasItem(RandomizerGet itemName) { + switch (itemName) { + case RG_FAIRY_OCARINA: + return CheckInventory(ITEM_OCARINA_FAIRY, false); + case RG_OCARINA_OF_TIME: + return CheckInventory(ITEM_OCARINA_TIME, true); + case RG_DINS_FIRE: + return CheckInventory(ITEM_DINS_FIRE, true); + case RG_FARORES_WIND: + return CheckInventory(ITEM_FARORES_WIND, true); + case RG_NAYRUS_LOVE: + return CheckInventory(ITEM_NAYRUS_LOVE, true); + case RG_LENS_OF_TRUTH: + return CheckInventory(ITEM_LENS, true); + case RG_FAIRY_BOW: + return CheckInventory(ITEM_BOW, true); + case RG_MEGATON_HAMMER: + return CheckInventory(ITEM_HAMMER, true); + case RG_HOOKSHOT: + return CheckInventory(ITEM_HOOKSHOT, false); + case RG_LONGSHOT: + return CheckInventory(ITEM_LONGSHOT, true); + case RG_PROGRESSIVE_STICK_UPGRADE: + case RG_STICKS: + return CurrentUpgrade(UPG_STICKS); + case RG_FIRE_ARROWS: + return CheckInventory(ITEM_ARROW_FIRE, true); + case RG_ICE_ARROWS: + return CheckInventory(ITEM_ARROW_ICE, true); + case RG_LIGHT_ARROWS: + return CheckInventory(ITEM_ARROW_LIGHT, true); + case RG_PROGRESSIVE_BOMBCHUS: + case RG_BOMBCHU_5: + case RG_BOMBCHU_10: + case RG_BOMBCHU_20: + return (BombchusEnabled() && (GetInLogic(LOGIC_BUY_BOMBCHUS) || CouldPlayBowling || CarpetMerchant)) || + CheckInventory(ITEM_BOMBCHU, true); + case RG_FAIRY_SLINGSHOT: + return CheckInventory(ITEM_SLINGSHOT, true); + case RG_BOOMERANG: + return CheckInventory(ITEM_BOOMERANG, true); + case RG_PROGRESSIVE_NUT_UPGRADE: + case RG_NUTS: + return CurrentUpgrade(UPG_NUTS); + // RANDOTODO handle cases where the scarecrow is persistent between age better when OI is added + case RG_SCARECROW: + return ScarecrowsSong() && CanUse(RG_HOOKSHOT); + case RG_DISTANT_SCARECROW: + return ScarecrowsSong() && CanUse(RG_LONGSHOT); + case RG_MAGIC_BEAN: + return GetAmmo(ITEM_BEAN) > 0 || CheckInventory(ITEM_BEAN, true); + case RG_KOKIRI_SWORD: + case RG_DEKU_SHIELD: + case RG_GORON_TUNIC: + case RG_ZORA_TUNIC: + case RG_HYLIAN_SHIELD: + case RG_MIRROR_SHIELD: + case RG_MASTER_SWORD: + case RG_BIGGORON_SWORD: + case RG_IRON_BOOTS: + case RG_HOVER_BOOTS: + return CheckEquipment(RandoGetToEquipFlag.at(itemName)); + case RG_GORONS_BRACELET: + return CurrentUpgrade(UPG_STRENGTH); + case RG_SILVER_GAUNTLETS: + return CurrentUpgrade(UPG_STRENGTH) >= 2; + case RG_GOLDEN_GAUNTLETS: + return CurrentUpgrade(UPG_STRENGTH) >= 3; + case RG_PROGRESSIVE_BOMB_BAG: + case RG_BOMB_BAG: + return CurrentUpgrade(UPG_BOMB_BAG); + case RG_MAGIC_SINGLE: + return GetSaveContext()->magicLevel >= 1 || GetSaveContext()->isMagicAcquired; // Songs - case RG_ZELDAS_LULLABY: - case RG_EPONAS_SONG: - case RG_PRELUDE_OF_LIGHT: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON); - case RG_SARIAS_SONG: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); - case RG_SUNS_SONG: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); - case RG_SONG_OF_TIME: - case RG_BOLERO_OF_FIRE: - case RG_REQUIEM_OF_SPIRIT: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); - case RG_SONG_OF_STORMS: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); - case RG_MINUET_OF_FOREST: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON); - case RG_SERENADE_OF_WATER: - case RG_NOCTURNE_OF_SHADOW: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); - - // Misc. Items - case RG_FISHING_POLE: - return HasItem(RG_CHILD_WALLET); // as long as you have enough rubies - case RG_EPONA: - return IsAdult && CanUse(RG_EPONAS_SONG); - - // Bottle Items - case RG_BOTTLE_WITH_BUGS: - return BugShrub || WanderingBugs || BugRock || GetInLogic(LOGIC_BUGS_ACCESS); - case RG_BOTTLE_WITH_FISH: - return LoneFish || FishGroup || GetInLogic(LOGIC_FISH_ACCESS); //is there any need to care about lone vs group? - case RG_BOTTLE_WITH_BLUE_FIRE: //RANDOTODO should probably be better named - return BlueFireAccess || GetInLogic(LOGIC_BLUE_FIRE_ACCESS); - case RG_BOTTLE_WITH_FAIRY: - return FairyPot || GossipStoneFairy || BeanPlantFairy || ButterflyFairy || FreeFairies || FairyPond || GetInLogic(LOGIC_FAIRY_ACCESS); - - default: - SPDLOG_ERROR("CanUse reached `default` for {}. Assuming intention is no extra requirements for use so returning true, but HasItem should be used instead.", static_cast(itemName)); - assert(false); - return true; - } + case RG_ZELDAS_LULLABY: + case RG_EPONAS_SONG: + case RG_SARIAS_SONG: + case RG_SUNS_SONG: + case RG_SONG_OF_TIME: + case RG_SONG_OF_STORMS: + case RG_MINUET_OF_FOREST: + case RG_BOLERO_OF_FIRE: + case RG_SERENADE_OF_WATER: + case RG_REQUIEM_OF_SPIRIT: + case RG_NOCTURNE_OF_SHADOW: + case RG_PRELUDE_OF_LIGHT: + // Dungeon Rewards + case RG_KOKIRI_EMERALD: + case RG_GORON_RUBY: + case RG_ZORA_SAPPHIRE: + case RG_FOREST_MEDALLION: + case RG_FIRE_MEDALLION: + case RG_WATER_MEDALLION: + case RG_SPIRIT_MEDALLION: + case RG_SHADOW_MEDALLION: + case RG_LIGHT_MEDALLION: + // Misc Quest Items + case RG_STONE_OF_AGONY: + case RG_GERUDO_MEMBERSHIP_CARD: + return CheckQuestItem(RandoGetToQuestItem.at(itemName)); + case RG_DOUBLE_DEFENSE: + return GetSaveContext()->isDoubleDefenseAcquired; + case RG_FISHING_POLE: + case RG_ZELDAS_LETTER: + case RG_WEIRD_EGG: + case RG_GREG_RUPEE: + // Ocarina Buttons + case RG_OCARINA_A_BUTTON: + case RG_OCARINA_C_LEFT_BUTTON: + case RG_OCARINA_C_RIGHT_BUTTON: + case RG_OCARINA_C_DOWN_BUTTON: + case RG_OCARINA_C_UP_BUTTON: + // Boss Souls + case RG_GOHMA_SOUL: + case RG_KING_DODONGO_SOUL: + case RG_BARINADE_SOUL: + case RG_PHANTOM_GANON_SOUL: + case RG_VOLVAGIA_SOUL: + case RG_MORPHA_SOUL: + case RG_BONGO_BONGO_SOUL: + case RG_TWINROVA_SOUL: + case RG_GANON_SOUL: + case RG_SKELETON_KEY: + // Overworld Keys + case RG_GUARD_HOUSE_KEY: + case RG_MARKET_BAZAAR_KEY: + case RG_MARKET_POTION_SHOP_KEY: + case RG_MASK_SHOP_KEY: + case RG_MARKET_SHOOTING_GALLERY_KEY: + case RG_BOMBCHU_BOWLING_KEY: + case RG_TREASURE_CHEST_GAME_BUILDING_KEY: + case RG_BOMBCHU_SHOP_KEY: + case RG_RICHARDS_HOUSE_KEY: + case RG_ALLEY_HOUSE_KEY: + case RG_KAK_BAZAAR_KEY: + case RG_KAK_POTION_SHOP_KEY: + case RG_BOSS_HOUSE_KEY: + case RG_GRANNYS_POTION_SHOP_KEY: + case RG_SKULLTULA_HOUSE_KEY: + case RG_IMPAS_HOUSE_KEY: + case RG_WINDMILL_KEY: + case RG_KAK_SHOOTING_GALLERY_KEY: + case RG_DAMPES_HUT_KEY: + case RG_TALONS_HOUSE_KEY: + case RG_STABLES_KEY: + case RG_BACK_TOWER_KEY: + case RG_HYLIA_LAB_KEY: + case RG_FISHING_HOLE_KEY: + case RG_RUTOS_LETTER: + return CheckRandoInf(RandoGetToRandInf.at(itemName)); + // Boss Keys + case RG_EPONA: + return FreedEpona; + case RG_FOREST_TEMPLE_BOSS_KEY: + case RG_FIRE_TEMPLE_BOSS_KEY: + case RG_WATER_TEMPLE_BOSS_KEY: + case RG_SPIRIT_TEMPLE_BOSS_KEY: + case RG_SHADOW_TEMPLE_BOSS_KEY: + case RG_GANONS_CASTLE_BOSS_KEY: + return CheckDungeonItem(DUNGEON_KEY_BOSS, RandoGetToDungeonScene.at(itemName)); + // Maps + case RG_DEKU_TREE_MAP: + case RG_DODONGOS_CAVERN_MAP: + case RG_JABU_JABUS_BELLY_MAP: + case RG_FOREST_TEMPLE_MAP: + case RG_FIRE_TEMPLE_MAP: + case RG_WATER_TEMPLE_MAP: + case RG_SPIRIT_TEMPLE_MAP: + case RG_SHADOW_TEMPLE_MAP: + case RG_BOTTOM_OF_THE_WELL_MAP: + case RG_ICE_CAVERN_MAP: + return CheckDungeonItem(DUNGEON_MAP, RandoGetToDungeonScene.at(itemName)); + // Compasses + case RG_DEKU_TREE_COMPASS: + case RG_DODONGOS_CAVERN_COMPASS: + case RG_JABU_JABUS_BELLY_COMPASS: + case RG_FOREST_TEMPLE_COMPASS: + case RG_FIRE_TEMPLE_COMPASS: + case RG_WATER_TEMPLE_COMPASS: + case RG_SPIRIT_TEMPLE_COMPASS: + case RG_SHADOW_TEMPLE_COMPASS: + case RG_BOTTOM_OF_THE_WELL_COMPASS: + case RG_ICE_CAVERN_COMPASS: + return CheckDungeonItem(DUNGEON_COMPASS, RandoGetToDungeonScene.at(itemName)); + // Wallets + case RG_CHILD_WALLET: + return CheckRandoInf(RAND_INF_HAS_WALLET); + case RG_ADULT_WALLET: + return CurrentUpgrade(UPG_WALLET) >= 1; + case RG_GIANT_WALLET: + return CurrentUpgrade(UPG_WALLET) >= 2; + case RG_TYCOON_WALLET: + return CurrentUpgrade(UPG_WALLET) >= 3; + // Scales + case RG_BRONZE_SCALE: + return CheckRandoInf(RAND_INF_CAN_SWIM); + case RG_SILVER_SCALE: + return CurrentUpgrade(UPG_SCALE) >= 1; + case RG_GOLDEN_SCALE: + return CurrentUpgrade(UPG_SCALE) >= 2; + case RG_POCKET_EGG: + return CheckRandoInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG); + case RG_COJIRO: + case RG_ODD_MUSHROOM: + case RG_ODD_POTION: + case RG_POACHERS_SAW: + case RG_BROKEN_SWORD: + case RG_PRESCRIPTION: + case RG_EYEBALL_FROG: + case RG_EYEDROPS: + case RG_CLAIM_CHECK: + return CheckRandoInf(itemName - RG_COJIRO + RAND_INF_ADULT_TRADES_HAS_COJIRO); + case RG_BOTTLE_WITH_BIG_POE: + case RG_BOTTLE_WITH_BLUE_FIRE: + case RG_BOTTLE_WITH_BLUE_POTION: + case RG_BOTTLE_WITH_BUGS: + case RG_BOTTLE_WITH_FAIRY: + case RG_BOTTLE_WITH_FISH: + case RG_BOTTLE_WITH_GREEN_POTION: + case RG_BOTTLE_WITH_MILK: + case RG_BOTTLE_WITH_POE: + case RG_BOTTLE_WITH_RED_POTION: + case RG_EMPTY_BOTTLE: + return HasBottle(); + default: + break; } + SPDLOG_ERROR("HasItem reached `return false;`. Missing case for RandomizerGet of {}", + static_cast(itemName)); + assert(false); + return false; +} - bool Logic::HasProjectile(HasProjectileAge age) { - return HasExplosives() || - (age == HasProjectileAge::Child && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG))) || - (age == HasProjectileAge::Adult && (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) )) || - (age == HasProjectileAge::Both && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG)) && (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW))) || - (age == HasProjectileAge::Either && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW))); - } - - bool Logic::HasBossSoul(RandomizerGet itemName) { - if (!ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS)) { - return true; - } - switch(itemName) { - case RG_GOHMA_SOUL: - case RG_KING_DODONGO_SOUL: - case RG_BARINADE_SOUL: - case RG_PHANTOM_GANON_SOUL: - case RG_VOLVAGIA_SOUL: - case RG_MORPHA_SOUL: - case RG_BONGO_BONGO_SOUL: - case RG_TWINROVA_SOUL: - return HasItem(itemName); - case RG_GANON_SOUL: - return ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON) ? HasItem(RG_GANON_SOUL) : true; - default: - return false; - } - } - - bool Logic::CanOpenOverworldDoor(RandomizerGet key) { - if (!ctx->GetOption(RSK_LOCK_OVERWORLD_DOORS)) { - return true; - } - - if (HasItem(RG_SKELETON_KEY)) { - return true; - } - - return HasItem(key); - } - - uint8_t GetDifficultyValueFromString(Rando::Option& glitchOption) { - return 0; - } - - //todo rewrite glitch section - - bool Logic::CanEquipSwap(RandomizerGet itemName) { - if (!HasItem(itemName)) - return false; - - if (CanDoGlitch(GlitchType::EquipSwapDins) || CanDoGlitch(GlitchType::EquipSwap)) - return true; - +// Can the passed in item be used? +// RANDOTODO catch magic items explicitly and add an assert on miss. +bool Logic::CanUse(RandomizerGet itemName) { + if (!HasItem(itemName)) return false; - } - bool Logic::CanDoGlitch(GlitchType glitch) { - // TODO: Uncomment when glitches are implemented - switch(glitch) { - case GlitchType::EquipSwapDins: - return ((IsAdult && HasItem(RG_DINS_FIRE)) || (IsChild && (HasItem(RG_STICKS) || HasItem(RG_DINS_FIRE)))) && false; //GlitchEquipSwapDins; - case GlitchType::EquipSwap: // todo: add bunny hood to adult item equippable list and child trade item to child item equippable list - return ((IsAdult && (HasItem(RG_DINS_FIRE) || HasItem(RG_FARORES_WIND) || HasItem(RG_NAYRUS_LOVE))) || (IsChild && (HasItem(RG_STICKS) || - HasItem(RG_FAIRY_SLINGSHOT) || HasItem(RG_BOOMERANG) || HasBottle() || CanUse(RG_NUTS) || HasItem(RG_FAIRY_OCARINA) || HasItem(RG_LENS_OF_TRUTH) || HasExplosives() || - GetAmmo(ITEM_BEAN) > 0 || HasItem(RG_DINS_FIRE) || HasItem(RG_FARORES_WIND) || HasItem(RG_NAYRUS_LOVE)))) && false; //GlitchEquipSwap; - } + switch (itemName) { + // Magic items + case RG_MAGIC_SINGLE: + return AmmoCanDrop || (HasBottle() && GetInLogic(LOGIC_BUY_MAGIC_POTION)); + case RG_DINS_FIRE: + case RG_FARORES_WIND: + case RG_NAYRUS_LOVE: + case RG_LENS_OF_TRUTH: + return CanUse(RG_MAGIC_SINGLE); + case RG_FIRE_ARROWS: + case RG_ICE_ARROWS: + case RG_LIGHT_ARROWS: + return CanUse(RG_MAGIC_SINGLE) && CanUse(RG_FAIRY_BOW); - //Shouldn't be reached - return false; - } + // Adult items + // TODO: Uncomment those if we ever implement more item usability settings + case RG_FAIRY_BOW: + return IsAdult && (AmmoCanDrop || GetInLogic(LOGIC_BUY_ARROW)); // || BowAsChild; + case RG_MEGATON_HAMMER: + return IsAdult; // || HammerAsChild; + case RG_IRON_BOOTS: + return IsAdult; // || IronBootsAsChild; + case RG_HOVER_BOOTS: + return IsAdult; // || HoverBootsAsChild; + case RG_HOOKSHOT: + case RG_LONGSHOT: + case RG_SCARECROW: + case RG_DISTANT_SCARECROW: + return IsAdult; // || HookshotAsChild; + case RG_GORON_TUNIC: + return IsAdult; // || GoronTunicAsChild; + case RG_ZORA_TUNIC: + return IsAdult; // || ZoraTunicAsChild; + case RG_MIRROR_SHIELD: + return IsAdult; // || MirrorShieldAsChild; + case RG_MASTER_SWORD: + return IsAdult; // || MasterSwordAsChild; + case RG_BIGGORON_SWORD: + return IsAdult; // || BiggoronSwordAsChild; + case RG_SILVER_GAUNTLETS: + case RG_GOLDEN_GAUNTLETS: + // Adult Trade + case RG_POCKET_EGG: + case RG_COJIRO: + case RG_ODD_MUSHROOM: + case RG_ODD_POTION: + case RG_POACHERS_SAW: + case RG_BROKEN_SWORD: + case RG_PRESCRIPTION: + case RG_EYEBALL_FROG: + case RG_EYEDROPS: + case RG_CLAIM_CHECK: + return IsAdult; -//RANDOTODO quantity is a placeholder for proper ammo use calculation logic. in time will want updating to account for ammo capacity -//Can we kill this enemy - bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wallOrFloor, uint8_t quantity, bool timer, bool inWater) { - bool killed = false; - switch(enemy) { - case RE_GOLD_SKULLTULA: - switch (distance){ - case ED_CLOSE: - //hammer jumpslash cannot damage these, but hammer swing can - killed = CanUse(RG_MEGATON_HAMMER); - [[fallthrough]]; - case ED_SHORT_JUMPSLASH: - killed = killed || CanUse(RG_KOKIRI_SWORD); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - killed = killed || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); - [[fallthrough]]; - case ED_BOMB_THROW: - killed = killed || CanUse(RG_BOMB_BAG); - [[fallthrough]]; - case ED_BOOMERANG: - killed = killed || CanUse(RG_BOOMERANG) || CanUse(RG_DINS_FIRE); - [[fallthrough]]; - case ED_HOOKSHOT: - //RANDOTODO test dins and chu range in a practical example - killed = killed || CanUse(RG_HOOKSHOT); - [[fallthrough]]; - case ED_LONGSHOT: - killed = killed || CanUse(RG_LONGSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - [[fallthrough]]; - case ED_FAR: - killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - break; - } - return killed; - case RE_GOHMA_LARVA: - case RE_MAD_SCRUB: - case RE_DEKU_BABA: - return CanAttack(); - case RE_BIG_SKULLTULA: - switch (distance){ - case ED_CLOSE: - //hammer jumpslash cannot damage these, but hammer swing can - killed = CanUse(RG_MEGATON_HAMMER); - [[fallthrough]]; - case ED_SHORT_JUMPSLASH: - killed = killed || CanUse(RG_KOKIRI_SWORD); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - killed = killed || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); - [[fallthrough]]; - case ED_BOMB_THROW: - killed = killed || CanUse(RG_BOMB_BAG); - [[fallthrough]]; - case ED_BOOMERANG: - //RANDOTODO test dins and chu range in a practical example - killed = killed || CanUse(RG_DINS_FIRE); - [[fallthrough]]; - case ED_HOOKSHOT: - //RANDOTODO test dins and chu range in a practical example - killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - [[fallthrough]]; - case ED_LONGSHOT: - killed = killed || CanUse(RG_LONGSHOT); - [[fallthrough]]; - case ED_FAR: - killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - break; - } - return killed; - case RE_DODONGO: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || (quantity <= 5 && CanUse(RG_STICKS)) || HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - case RE_LIZALFOS: - return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - case RE_KEESE: - case RE_FIRE_KEESE: - switch (distance){ - case ED_CLOSE: - case ED_SHORT_JUMPSLASH: - killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - killed = killed || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); - [[fallthrough]]; - case ED_BOMB_THROW: - //RANDOTODO test dins and chu range in a practical example - killed = killed || (!inWater && CanUse(RG_BOMB_BAG)); - [[fallthrough]]; - case ED_BOOMERANG: - //RANDOTODO test dins and chu range in a practical example - killed = killed || CanUse(RG_BOOMERANG); - [[fallthrough]]; - case ED_HOOKSHOT: - //RANDOTODO test dins, bomb and chu range in a practical example - killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - [[fallthrough]]; - case ED_LONGSHOT: - killed = killed || CanUse(RG_LONGSHOT); - [[fallthrough]]; - case ED_FAR: - killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - break; - } - return killed; - case RE_BLUE_BUBBLE: - //RANDOTODO Trick to use shield hylian shield as child to stun these guys - //RANDOTODO check hammer damage - return BlastOrSmash() || CanUse(RG_FAIRY_BOW) || ((CanJumpslashExceptHammer() || CanUse(RG_FAIRY_SLINGSHOT)) && (CanUse(RG_NUTS) || HookshotOrBoomerang() || CanStandingShield())); - case RE_DEAD_HAND: - //RANDOTODO change Dead Hand trick to be sticks Dead Hand - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || (CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_CHILD_DEADHAND)); - case RE_WITHERED_DEKU_BABA: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_BOOMERANG); - case RE_LIKE_LIKE: - case RE_FLOORMASTER: - return CanDamage(); - case RE_STALFOS: - //RANDOTODO Add trick to kill stalfos with sticks, and a second one for bombs without stunning. Higher ammo logic for bombs is also plausible - switch (distance){ - case ED_CLOSE: - case ED_SHORT_JUMPSLASH: - killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - killed = killed || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - killed = killed || CanUse(RG_BIGGORON_SWORD) || (quantity <= 1 && CanUse(RG_STICKS)); - [[fallthrough]]; - case ED_BOMB_THROW: - killed = killed || (quantity <= 2 && !timer && !inWater && (CanUse(RG_NUTS) || HookshotOrBoomerang()) && CanUse(RG_BOMB_BAG)); - [[fallthrough]]; - case ED_BOOMERANG: - case ED_HOOKSHOT: - //RANDOTODO test dins and chu range in a practical example - killed = killed || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - [[fallthrough]]; - case ED_LONGSHOT: - case ED_FAR: - killed = killed || CanUse(RG_FAIRY_BOW); - break; - } - return killed; - //Needs 16 bombs, but is in default logic in N64, probably because getting the hits is quite easy. - //bow and sling can wake them and damage after they shed their armour, so could reduce ammo requirements for explosives to 10. - //requires 8 sticks to kill so would be a trick unless we apply higher stick bag logic - case RE_IRON_KNUCKLE: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || HasExplosives(); - //To stun flare dancer with chus, you have to hit the flame under it while it is spinning. It should eventually return to spinning after dashing for a while if you miss the window - //it is possible to damage the core with explosives, but difficult to get all 4 hits in even with chus, and if it reconstructs the core heals, so it would be a trick. - //the core takes damage from hookshot even if it doesn't show - //Dins killing isn't hard, but is obscure and tight on single magic, so is a trick - case RE_FLARE_DANCER: - return CanUse(RG_MEGATON_HAMMER) || CanUse(RG_HOOKSHOT) || (HasExplosives() && (CanJumpslashExceptHammer() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG))); - case RE_WOLFOS: - case RE_WHITE_WOLFOS: - case RE_WALLMASTER: - return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMBCHU_5) || CanUse(RG_DINS_FIRE) || (CanUse(RG_BOMB_BAG) && (CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG))); - case RE_GERUDO_WARRIOR: - return CanJumpslash() || CanUse(RG_FAIRY_BOW) || (ctx->GetTrickOption(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON) && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMBCHU_5))); - case RE_GIBDO: - case RE_REDEAD: - return CanJumpslash() || CanUse(RG_DINS_FIRE); - case RE_MEG: - return CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || HasExplosives(); - case RE_ARMOS: - return BlastOrSmash() || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS) || CanUse(RG_FAIRY_BOW) || ((CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG)) && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_FAIRY_SLINGSHOT))); - case RE_GREEN_BUBBLE: - //does not technically need to be stunned to kill with dins, but the flame must be off and timing it is awkward - //Also they don't trigger the kill room in ganons MQ if they die from dins? Vanilla bug? - return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || HasExplosives()/* || (CanUse(RG_DINS_FIRE) && (CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG)))*/; - case RE_DINOLFOS: - //stunning + bombs is possible but painful, as it loves to dodge the bombs and hookshot. it also dodges chus but if you cook it so it detonates under the dodge it usually gets caught on landing - return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || (!timer && CanUse(RG_BOMBCHU_5)); - case RE_TORCH_SLUG: - return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_BOW); - case RE_FREEZARD: - return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_DINS_FIRE) || CanUse(RG_FIRE_ARROWS); - case RE_SHELL_BLADE: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_DINS_FIRE); - case RE_SPIKE: - return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_DINS_FIRE); - case RE_STINGER: - switch (distance){ - case ED_CLOSE: - case ED_SHORT_JUMPSLASH: - killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - killed = killed || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); - [[fallthrough]]; - case ED_BOMB_THROW: - //RANDOTODO test dins and chu range in a practical example - killed = killed || (!inWater && CanUse(RG_BOMB_BAG)); - [[fallthrough]]; - case ED_BOOMERANG: - case ED_HOOKSHOT: - //RANDOTODO test dins, bomb and chu range in a practical example - killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - [[fallthrough]]; - case ED_LONGSHOT: - killed = killed || CanUse(RG_LONGSHOT); - [[fallthrough]]; - case ED_FAR: - killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - break; - } - return killed; - case RE_BIG_OCTO: - //If chasing octo is annoying but with rolls you can catch him, and you need rang to get into this room without shenanigains anyway. Bunny makes it free - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_STICKS) || CanUse(RG_MASTER_SWORD); - case RE_GOHMA: - return HasBossSoul(RG_GOHMA_SOUL) && CanJumpslash() && - (CanUse(RG_NUTS) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || HookshotOrBoomerang()); - case RE_KING_DODONGO: - return HasBossSoul(RG_KING_DODONGO_SOUL) && CanJumpslash() && - (CanUse(RG_BOMB_BAG) || HasItem(RG_GORONS_BRACELET)); - case RE_BARINADE: - return HasBossSoul(RG_BARINADE_SOUL) && CanUse(RG_BOOMERANG) && CanJumpslashExceptHammer(); - case RE_PHANTOM_GANON: - return HasBossSoul(RG_PHANTOM_GANON_SOUL) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && - (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT)); - case RE_VOLVAGIA: - return HasBossSoul(RG_VOLVAGIA_SOUL) && CanUse(RG_MEGATON_HAMMER); - case RE_MORPHA: - return HasBossSoul(RG_MORPHA_SOUL) && CanUse(RG_HOOKSHOT) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER)); - case RE_BONGO_BONGO: - return HasBossSoul(RG_BONGO_BONGO_SOUL) && - (CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && - (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || ctx->GetTrickOption(RT_SHADOW_BONGO)); - case RE_TWINROVA: - return HasBossSoul(RG_TWINROVA_SOUL) && CanUse(RG_MIRROR_SHIELD) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER)); - case RE_GANONDORF: - // RANDOTODO: Trick to use hammer (no jumpslash) or stick (only jumpslash) instead of a sword to reflect the energy ball - // and either of them regardless of jumpslashing to damage and kill ganondorf + // Child items + case RG_FAIRY_SLINGSHOT: + return IsChild && (AmmoCanDrop || GetInLogic(LOGIC_BUY_SEED)); // || SlingshotAsAdult; + case RG_BOOMERANG: + return IsChild; // || BoomerangAsAdult; + case RG_KOKIRI_SWORD: + return IsChild; // || KokiriSwordAsAdult; + case RG_NUTS: + return ((NutPot || NutCrate || DekuBabaNuts) && AmmoCanDrop) || GetInLogic(LOGIC_BUY_NUTS); + case RG_STICKS: + return IsChild /* || StickAsAdult;*/ && (StickPot || DekuBabaSticks || GetInLogic(LOGIC_BUY_STICKS)); + case RG_DEKU_SHIELD: + return IsChild; // || DekuShieldAsAdult; + case RG_PROGRESSIVE_BOMB_BAG: + case RG_BOMB_BAG: + return AmmoCanDrop || GetInLogic(LOGIC_BUY_BOMB); + case RG_PROGRESSIVE_BOMBCHUS: + case RG_BOMBCHU_5: + case RG_BOMBCHU_10: + case RG_BOMBCHU_20: + return BombchuRefill() && BombchusEnabled(); + case RG_WEIRD_EGG: + case RG_RUTOS_LETTER: + return IsChild; + case RG_MAGIC_BEAN: + return IsChild; - // Bottle is not taken into account since a sword, hammer or stick are required - // for killing ganondorf and all of those can reflect the energy ball - // This will not be the case once ammo logic in taken into account as - // sticks are limited and using a bottle might become a requirement in that case - return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_LIGHT_ARROWS) && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)); - case RE_GANON: - return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_MASTER_SWORD); - case RE_DARK_LINK: - //RANDOTODO Dark link is buggy right now, retest when he is not - return CanJumpslash() || CanUse(RG_FAIRY_BOW); - case RE_ANUBIS: - //there's a restoration that allows beating them with mirror shield + some way to trigger their attack - return HasFireSource(); - case RE_BEAMOS: - return HasExplosives(); - case RE_PURPLE_LEEVER: - //dies on it's own, so this is the conditions to spawn it (killing 10 normal leevers) - //Sticks and Ice arrows work but will need ammo capacity logic - //other methods can damage them but not kill them, and they run when hit, making them impractical - return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD); - case RE_TENTACLE: - return CanUse(RG_BOOMERANG); - case RE_BARI: - return HookshotOrBoomerang() || CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || CanUse(RG_DINS_FIRE) || (TakeDamage() && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD))); - case RE_SHABOM: - //RANDOTODO when you add better damage logic, you can kill this by taking hits - return CanUse(RG_BOOMERANG) || CanUse(RG_NUTS) || CanJumpslash() || CanUse(RG_DINS_FIRE) || CanUse(RG_ICE_ARROWS); - case RE_OCTOROK: - return CanReflectNuts() || HookshotOrBoomerang() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMB_BAG) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - default: - SPDLOG_ERROR("CanKillEnemy reached `default`."); - assert(false); - return false; - } - } + // Songs + case RG_ZELDAS_LULLABY: + case RG_EPONAS_SONG: + case RG_PRELUDE_OF_LIGHT: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && + HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON); + case RG_SARIAS_SONG: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && + HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); + case RG_SUNS_SONG: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON) && + HasItem(RG_OCARINA_C_DOWN_BUTTON); + case RG_SONG_OF_TIME: + case RG_BOLERO_OF_FIRE: + case RG_REQUIEM_OF_SPIRIT: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && + HasItem(RG_OCARINA_C_DOWN_BUTTON); + case RG_SONG_OF_STORMS: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON) && + HasItem(RG_OCARINA_C_DOWN_BUTTON); + case RG_MINUET_OF_FOREST: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && + HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON); + case RG_SERENADE_OF_WATER: + case RG_NOCTURNE_OF_SHADOW: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && + HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); -//It is rare for Pass Enemy to need distance, this only happens when the enemy blocks a platform and you can't reach it before it blocks you -//an example is the Big Skulltula in water room of MQ deku, which is out of sword swing height but blocks off the whole SoT block -//Can we get past this enemy in a tight space? - bool Logic::CanPassEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wallOrFloor) { - if (CanKillEnemy(enemy, distance, wallOrFloor)){ + // Misc. Items + case RG_FISHING_POLE: + return HasItem(RG_CHILD_WALLET); // as long as you have enough rubies + case RG_EPONA: + return IsAdult && CanUse(RG_EPONAS_SONG); + + // Bottle Items + case RG_BOTTLE_WITH_BUGS: + return BugShrub || WanderingBugs || BugRock || GetInLogic(LOGIC_BUGS_ACCESS); + case RG_BOTTLE_WITH_FISH: + return LoneFish || FishGroup || + GetInLogic(LOGIC_FISH_ACCESS); // is there any need to care about lone vs group? + case RG_BOTTLE_WITH_BLUE_FIRE: // RANDOTODO should probably be better named + return BlueFireAccess || GetInLogic(LOGIC_BLUE_FIRE_ACCESS); + case RG_BOTTLE_WITH_FAIRY: + return FairyPot || GossipStoneFairy || BeanPlantFairy || ButterflyFairy || FreeFairies || FairyPond || + GetInLogic(LOGIC_FAIRY_ACCESS); + + default: + SPDLOG_ERROR("CanUse reached `default` for {}. Assuming intention is no extra requirements for use so " + "returning true, but HasItem should be used instead.", + static_cast(itemName)); + assert(false); return true; - } - switch(enemy) { - case RE_GOLD_SKULLTULA: - case RE_GOHMA_LARVA: - case RE_LIZALFOS: - case RE_DODONGO: //RANDOTODO do dodongos block the way in tight corridors? - case RE_MAD_SCRUB: - case RE_KEESE: - case RE_FIRE_KEESE: - case RE_BLUE_BUBBLE: - case RE_DEAD_HAND: - case RE_DEKU_BABA: - case RE_WITHERED_DEKU_BABA: - case RE_STALFOS: - case RE_FLARE_DANCER: - case RE_WOLFOS: - case RE_WHITE_WOLFOS: - case RE_FLOORMASTER: - case RE_MEG: - case RE_ARMOS: - case RE_FREEZARD: - case RE_SPIKE: - case RE_DARK_LINK: - case RE_ANUBIS: - case RE_WALLMASTER: - case RE_PURPLE_LEEVER: - case RE_OCTOROK: - return true; - case RE_BIG_SKULLTULA: - //hammer jumpslash can pass, but only on flat land where you can kill with hammer swing - return CanUse(RG_NUTS) || CanUse(RG_BOOMERANG); - case RE_LIKE_LIKE: - return CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG); - case RE_GIBDO: - case RE_REDEAD: - // we need a way to check if suns won't force a reload - return CanUse(RG_HOOKSHOT) || CanUse(RG_SUNS_SONG); - case RE_IRON_KNUCKLE: - case RE_BIG_OCTO: - return false; - case RE_GREEN_BUBBLE: - return TakeDamage() || CanUse(RG_NUTS) || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT); - default: - SPDLOG_ERROR("CanPassEnemy reached `default`."); - assert(false); - return false; - } } +} -//Can we avoid this enemy while climbing up a wall, or doing a difficult platforming challenge? -//use grounded if the challenge is such that the enemy interfears even if it cannot hit link out of the air - bool Logic::CanAvoidEnemy(RandomizerEnemy enemy, bool grounded, uint8_t quantity) { - //DISTANCE AND WALL ASSUMED, add more arguments later if needed - if (CanKillEnemy(enemy, ED_CLOSE, true, quantity)){ +bool Logic::HasProjectile(HasProjectileAge age) { + return HasExplosives() || + (age == HasProjectileAge::Child && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG))) || + (age == HasProjectileAge::Adult && (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW))) || + (age == HasProjectileAge::Both && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG)) && + (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW))) || + (age == HasProjectileAge::Either && + (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW))); +} + +bool Logic::HasBossSoul(RandomizerGet itemName) { + if (!ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS)) { return true; - } - switch(enemy) { - case RE_GOLD_SKULLTULA: + } + switch (itemName) { + case RG_GOHMA_SOUL: + case RG_KING_DODONGO_SOUL: + case RG_BARINADE_SOUL: + case RG_PHANTOM_GANON_SOUL: + case RG_VOLVAGIA_SOUL: + case RG_MORPHA_SOUL: + case RG_BONGO_BONGO_SOUL: + case RG_TWINROVA_SOUL: + return HasItem(itemName); + case RG_GANON_SOUL: + return ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON) ? HasItem(RG_GANON_SOUL) + : true; + default: + return false; + } +} + +// RANDOMISERTODO intergrate into HasItem +bool Logic::CanOpenOverworldDoor(RandomizerGet key) { + if (!ctx->GetOption(RSK_LOCK_OVERWORLD_DOORS)) { + return true; + } + + if (HasItem(RG_SKELETON_KEY)) { + return true; + } + + return HasItem(key); +} + +bool Logic::CanOpenUnderwaterChest() { + return ctx->GetTrickOption(RT_OPEN_UNDERWATER_CHEST) && CanUse(RG_IRON_BOOTS) && CanUse(RG_HOOKSHOT); +} + +uint8_t GetDifficultyValueFromString(Rando::Option& glitchOption) { + return 0; +} + +// todo rewrite glitch section + +bool Logic::CanEquipSwap(RandomizerGet itemName) { + if (!HasItem(itemName)) + return false; + + if (CanDoGlitch(GlitchType::EquipSwapDins) || CanDoGlitch(GlitchType::EquipSwap)) + return true; + + return false; +} + +bool Logic::CanDoGlitch(GlitchType glitch) { + // TODO: Uncomment when glitches are implemented + switch (glitch) { + case GlitchType::EquipSwapDins: + return ((IsAdult && HasItem(RG_DINS_FIRE)) || (IsChild && (HasItem(RG_STICKS) || HasItem(RG_DINS_FIRE)))) && + false; // GlitchEquipSwapDins; + case GlitchType::EquipSwap: // todo: add bunny hood to adult item equippable list and child trade item to child + // item equippable list + return ((IsAdult && (HasItem(RG_DINS_FIRE) || HasItem(RG_FARORES_WIND) || HasItem(RG_NAYRUS_LOVE))) || + (IsChild && (HasItem(RG_STICKS) || HasItem(RG_FAIRY_SLINGSHOT) || HasItem(RG_BOOMERANG) || + HasBottle() || CanUse(RG_NUTS) || HasItem(RG_FAIRY_OCARINA) || + HasItem(RG_LENS_OF_TRUTH) || HasExplosives() || GetAmmo(ITEM_BEAN) > 0 || + HasItem(RG_DINS_FIRE) || HasItem(RG_FARORES_WIND) || HasItem(RG_NAYRUS_LOVE)))) && + false; // GlitchEquipSwap; + } + + // Shouldn't be reached + return false; +} + +// RANDOTODO quantity is a placeholder for proper ammo use calculation logic. in time will want updating to account for +// ammo capacity Can we kill this enemy +bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wallOrFloor, uint8_t quantity, bool timer, + bool inWater) { + bool killed = false; + switch (enemy) { + case RE_GERUDO_GUARD: + case RE_BREAK_ROOM_GUARD: + return false; + case RE_GOLD_SKULLTULA: + switch (distance) { + case ED_CLOSE: + // hammer jumpslash cannot damage these, but hammer swing can + killed = CanUse(RG_MEGATON_HAMMER); + [[fallthrough]]; + case ED_SHORT_JUMPSLASH: + killed = killed || CanUse(RG_KOKIRI_SWORD); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + killed = killed || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); + [[fallthrough]]; + case ED_BOMB_THROW: + killed = killed || CanUse(RG_BOMB_BAG); + [[fallthrough]]; + case ED_BOOMERANG: + killed = killed || CanUse(RG_BOOMERANG) || CanUse(RG_DINS_FIRE); + [[fallthrough]]; + case ED_HOOKSHOT: + // RANDOTODO test dins and chu range in a practical example + killed = killed || CanUse(RG_HOOKSHOT); + [[fallthrough]]; + case ED_LONGSHOT: + killed = killed || CanUse(RG_LONGSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + [[fallthrough]]; + case ED_FAR: + killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + break; + } + return killed; + case RE_GOHMA_LARVA: + case RE_MAD_SCRUB: + case RE_DEKU_BABA: + return CanAttack(); + case RE_BIG_SKULLTULA: + switch (distance) { + case ED_CLOSE: + // hammer jumpslash cannot damage these, but hammer swing can + killed = CanUse(RG_MEGATON_HAMMER); + [[fallthrough]]; + case ED_SHORT_JUMPSLASH: + killed = killed || CanUse(RG_KOKIRI_SWORD); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + killed = killed || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); + [[fallthrough]]; + case ED_BOMB_THROW: + killed = killed || CanUse(RG_BOMB_BAG); + [[fallthrough]]; + case ED_BOOMERANG: + // RANDOTODO test dins and chu range in a practical example + killed = killed || CanUse(RG_DINS_FIRE); + [[fallthrough]]; + case ED_HOOKSHOT: + // RANDOTODO test dins and chu range in a practical example + killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + [[fallthrough]]; + case ED_LONGSHOT: + killed = killed || CanUse(RG_LONGSHOT); + [[fallthrough]]; + case ED_FAR: + killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + break; + } + return killed; + case RE_DODONGO: + return CanUseSword() || CanUse(RG_MEGATON_HAMMER) || (quantity <= 5 && CanUse(RG_STICKS)) || + HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + case RE_LIZALFOS: + return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + case RE_KEESE: + case RE_FIRE_KEESE: + switch (distance) { + case ED_CLOSE: + case ED_SHORT_JUMPSLASH: + killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + killed = killed || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); + [[fallthrough]]; + case ED_BOMB_THROW: + // RANDOTODO test dins and chu range in a practical example + killed = killed || (!inWater && CanUse(RG_BOMB_BAG)); + [[fallthrough]]; + case ED_BOOMERANG: + // RANDOTODO test dins and chu range in a practical example + killed = killed || CanUse(RG_BOOMERANG); + [[fallthrough]]; + case ED_HOOKSHOT: + // RANDOTODO test dins, bomb and chu range in a practical example + killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + [[fallthrough]]; + case ED_LONGSHOT: + killed = killed || CanUse(RG_LONGSHOT); + [[fallthrough]]; + case ED_FAR: + killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + break; + } + return killed; + case RE_BLUE_BUBBLE: + // RANDOTODO Trick to use shield hylian shield as child to stun these guys + // RANDOTODO check hammer damage + return BlastOrSmash() || CanUse(RG_FAIRY_BOW) || + ((CanJumpslashExceptHammer() || CanUse(RG_FAIRY_SLINGSHOT)) && + (CanUse(RG_NUTS) || HookshotOrBoomerang() || CanStandingShield())); + case RE_DEAD_HAND: + // RANDOTODO change Dead Hand trick to be sticks Dead Hand + return CanUseSword() || (CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_CHILD_DEADHAND)); + case RE_WITHERED_DEKU_BABA: + return CanUseSword() || CanUse(RG_BOOMERANG); + case RE_LIKE_LIKE: + case RE_FLOORMASTER: + return CanDamage(); + case RE_STALFOS: + // RANDOTODO Add trick to kill stalfos with sticks, and a second one for bombs without stunning. Higher ammo + // logic for bombs is also plausible + switch (distance) { + case ED_CLOSE: + case ED_SHORT_JUMPSLASH: + killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + killed = killed || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + killed = killed || CanUse(RG_BIGGORON_SWORD) || (quantity <= 1 && CanUse(RG_STICKS)); + [[fallthrough]]; + case ED_BOMB_THROW: + killed = killed || (quantity <= 2 && !timer && !inWater && + (CanUse(RG_NUTS) || HookshotOrBoomerang()) && CanUse(RG_BOMB_BAG)); + [[fallthrough]]; + case ED_BOOMERANG: + case ED_HOOKSHOT: + // RANDOTODO test dins and chu range in a practical example + killed = killed || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + [[fallthrough]]; + case ED_LONGSHOT: + case ED_FAR: + killed = killed || CanUse(RG_FAIRY_BOW); + break; + } + return killed; + // Needs 16 bombs, but is in default logic in N64, probably because getting the hits is quite easy. + // bow and sling can wake them and damage after they shed their armour, so could reduce ammo requirements for + // explosives to 10. requires 8 sticks to kill so would be a trick unless we apply higher stick bag logic + case RE_IRON_KNUCKLE: + return CanUseSword() || CanUse(RG_MEGATON_HAMMER) || HasExplosives(); + // To stun flare dancer with chus, you have to hit the flame under it while it is spinning. It should eventually + // return to spinning after dashing for a while if you miss the window it is possible to damage the core with + // explosives, but difficult to get all 4 hits in even with chus, and if it reconstructs the core heals, so it + // would be a trick. the core takes damage from hookshot even if it doesn't show Dins killing isn't hard, but is + // obscure and tight on single magic, so is a trick + case RE_FLARE_DANCER: + return CanUse(RG_MEGATON_HAMMER) || CanUse(RG_HOOKSHOT) || + (HasExplosives() && (CanJumpslashExceptHammer() || CanUse(RG_FAIRY_BOW) || + CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG))); + case RE_WOLFOS: + case RE_WHITE_WOLFOS: + case RE_WALLMASTER: + return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMBCHU_5) || + CanUse(RG_DINS_FIRE) || + (CanUse(RG_BOMB_BAG) && (CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG))); + case RE_GERUDO_WARRIOR: + return CanJumpslash() || CanUse(RG_FAIRY_BOW) || + (ctx->GetTrickOption(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON) && + (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMBCHU_5))); + case RE_GIBDO: + case RE_REDEAD: + return CanJumpslash() || CanUse(RG_DINS_FIRE); + case RE_MEG: + return CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || HasExplosives(); + case RE_ARMOS: + return BlastOrSmash() || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS) || + CanUse(RG_FAIRY_BOW) || + ((CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG)) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_FAIRY_SLINGSHOT))); + case RE_GREEN_BUBBLE: + // does not technically need to be stunned to kill with dins, but the flame must be off and timing it is + // awkward Also they don't trigger the kill room in ganons MQ if they die from dins? Vanilla bug? + return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || + HasExplosives() /* || (CanUse(RG_DINS_FIRE) && (CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || + CanUse(RG_BOOMERANG)))*/ + ; + case RE_DINOLFOS: + // stunning + bombs is possible but painful, as it loves to dodge the bombs and hookshot. it also dodges + // chus but if you cook it so it detonates under the dodge it usually gets caught on landing + return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || + (!timer && CanUse(RG_BOMBCHU_5)); + case RE_TORCH_SLUG: + return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_BOW); + case RE_FREEZARD: + return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || + CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_DINS_FIRE) || + CanUse(RG_FIRE_ARROWS); + case RE_SHELL_BLADE: + return CanJumpslash() || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || + CanUse(RG_DINS_FIRE); + case RE_SPIKE: + return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || + CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || + CanUse(RG_DINS_FIRE); + case RE_STINGER: + switch (distance) { + case ED_CLOSE: + case ED_SHORT_JUMPSLASH: + killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + killed = killed || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); + [[fallthrough]]; + case ED_BOMB_THROW: + // RANDOTODO test dins and chu range in a practical example + killed = killed || (!inWater && CanUse(RG_BOMB_BAG)); + [[fallthrough]]; + case ED_BOOMERANG: + case ED_HOOKSHOT: + // RANDOTODO test dins, bomb and chu range in a practical example + killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + [[fallthrough]]; + case ED_LONGSHOT: + killed = killed || CanUse(RG_LONGSHOT); + [[fallthrough]]; + case ED_FAR: + killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + break; + } + return killed; + case RE_BIG_OCTO: + // If chasing octo is annoying but with rolls you can catch him, and you need rang to get into this room + // without shenanigans anyway. Bunny makes it free + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_STICKS) || CanUse(RG_MASTER_SWORD); + case RE_GOHMA: + return HasBossSoul(RG_GOHMA_SOUL) && CanJumpslash() && + (CanUse(RG_NUTS) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || HookshotOrBoomerang()); + case RE_KING_DODONGO: + return HasBossSoul(RG_KING_DODONGO_SOUL) && CanJumpslash() && + (CanUse(RG_BOMB_BAG) || HasItem(RG_GORONS_BRACELET) || + (ctx->GetTrickOption(RT_DC_DODONGO_CHU) && IsAdult && CanUse(RG_BOMBCHU_5))); + case RE_BARINADE: + return HasBossSoul(RG_BARINADE_SOUL) && CanUse(RG_BOOMERANG) && CanJumpslashExceptHammer(); + case RE_PHANTOM_GANON: + return HasBossSoul(RG_PHANTOM_GANON_SOUL) && CanUseSword() && + (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT)); + case RE_VOLVAGIA: + return HasBossSoul(RG_VOLVAGIA_SOUL) && CanUse(RG_MEGATON_HAMMER); + case RE_MORPHA: + return HasBossSoul(RG_MORPHA_SOUL) && + (CanUse(RG_HOOKSHOT) || + (ctx->GetTrickOption(RT_WATER_MORPHA_WITHOUT_HOOKSHOT) && HasItem(RG_BRONZE_SCALE))) && + (CanUseSword() || CanUse(RG_MEGATON_HAMMER)); + case RE_BONGO_BONGO: + return HasBossSoul(RG_BONGO_BONGO_SOUL) && + (CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) && CanUseSword() && + (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || + ctx->GetTrickOption(RT_SHADOW_BONGO)); + case RE_TWINROVA: + return HasBossSoul(RG_TWINROVA_SOUL) && CanUse(RG_MIRROR_SHIELD) && + (CanUseSword() || CanUse(RG_MEGATON_HAMMER)); + case RE_GANONDORF: + // RANDOTODO: Trick to use hammer (no jumpslash) or stick (only jumpslash) instead of a sword to reflect the + // energy ball and either of them regardless of jumpslashing to damage and kill ganondorf + + // Bottle is not taken into account since a sword, hammer or stick are required + // for killing ganondorf and all of those can reflect the energy ball + // This will not be the case once ammo logic in taken into account as + // sticks are limited and using a bottle might become a requirement in that case + return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_LIGHT_ARROWS) && CanUseSword(); + case RE_GANON: + return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_MASTER_SWORD); + case RE_DARK_LINK: + // RANDOTODO Dark link is buggy right now, retest when he is not + return CanJumpslash() || CanUse(RG_FAIRY_BOW); + case RE_ANUBIS: + // there's a restoration that allows beating them with mirror shield + some way to trigger their attack + return HasFireSource(); + case RE_BEAMOS: + return HasExplosives(); + case RE_PURPLE_LEEVER: + // dies on it's own, so this is the conditions to spawn it (killing 10 normal leevers) + // Sticks and Ice arrows work but will need ammo capacity logic + // other methods can damage them but not kill them, and they run when hit, making them impractical + return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD); + case RE_TENTACLE: + return CanUse(RG_BOOMERANG); + case RE_BARI: + return HookshotOrBoomerang() || CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_MEGATON_HAMMER) || + CanUse(RG_STICKS) || CanUse(RG_DINS_FIRE) || (TakeDamage() && CanUseSword()); + case RE_SHABOM: + // RANDOTODO when you add better damage logic, you can kill this by taking hits + return CanUse(RG_BOOMERANG) || CanUse(RG_NUTS) || CanJumpslash() || CanUse(RG_DINS_FIRE) || + CanUse(RG_ICE_ARROWS); + case RE_OCTOROK: + return CanReflectNuts() || HookshotOrBoomerang() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || + CanUse(RG_BOMB_BAG) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + default: + SPDLOG_ERROR("CanKillEnemy reached `default`."); + assert(false); + return false; + } +} + +// It is rare for Pass Enemy to need distance, this only happens when the enemy blocks a platform and you can't reach it +// before it blocks you an example is the Big Skulltula in water room of MQ deku, which is out of sword swing height but +// blocks off the whole SoT block Can we get past this enemy in a tight space? +bool Logic::CanPassEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wallOrFloor) { + if (CanKillEnemy(enemy, distance, wallOrFloor)) { + return true; + } + switch (enemy) { + case RE_GOLD_SKULLTULA: + case RE_GOHMA_LARVA: + case RE_LIZALFOS: + case RE_DODONGO: // RANDOTODO do dodongos block the way in tight corridors? + case RE_MAD_SCRUB: + case RE_KEESE: + case RE_FIRE_KEESE: + case RE_BLUE_BUBBLE: + case RE_DEAD_HAND: + case RE_DEKU_BABA: + case RE_WITHERED_DEKU_BABA: + case RE_STALFOS: + case RE_FLARE_DANCER: + case RE_WOLFOS: + case RE_WHITE_WOLFOS: + case RE_FLOORMASTER: + case RE_MEG: + case RE_ARMOS: + case RE_FREEZARD: + case RE_SPIKE: + case RE_DARK_LINK: + case RE_ANUBIS: + case RE_WALLMASTER: + case RE_PURPLE_LEEVER: + case RE_OCTOROK: + return true; + case RE_GERUDO_GUARD: + return ctx->GetTrickOption(RT_PASS_GUARDS_WITH_NOTHING) || HasItem(RG_GERUDO_MEMBERSHIP_CARD) || + CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT); + case RE_BREAK_ROOM_GUARD: + return HasItem(RG_GERUDO_MEMBERSHIP_CARD) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT); + case RE_BIG_SKULLTULA: + // hammer jumpslash can pass, but only on flat land where you can kill with hammer swing + return CanUse(RG_NUTS) || CanUse(RG_BOOMERANG); + case RE_LIKE_LIKE: + return CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG); + case RE_GIBDO: + case RE_REDEAD: + // we need a way to check if suns won't force a reload + // RANDOTODO: check if stealthing past these guys works everywhere + return CanUse(RG_HOOKSHOT) || CanUse(RG_SUNS_SONG); + case RE_IRON_KNUCKLE: + case RE_BIG_OCTO: + return false; + case RE_GREEN_BUBBLE: + return TakeDamage() || CanUse(RG_NUTS) || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT); + default: + SPDLOG_ERROR("CanPassEnemy reached `default`."); + assert(false); + return false; + } +} + +// Can we avoid this enemy while climbing up a wall, or doing a difficult platforming challenge? +// use grounded if the challenge is such that the enemy interfears even if it cannot hit link out of the air +bool Logic::CanAvoidEnemy(RandomizerEnemy enemy, bool grounded, uint8_t quantity) { + // DISTANCE AND WALL ASSUMED, add more arguments later if needed + if (CanKillEnemy(enemy, ED_CLOSE, true, quantity)) { + return true; + } + switch (enemy) { + case RE_GOLD_SKULLTULA: case RE_GOHMA_LARVA: case RE_LIZALFOS: case RE_DODONGO: @@ -829,963 +901,989 @@ namespace Rando { case RE_WALLMASTER: case RE_ANUBIS: case RE_PURPLE_LEEVER: - return true; + return true; case RE_BEAMOS: - return !grounded || CanUse(RG_NUTS) || (quantity == 1 && (CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT))); + return !grounded || CanUse(RG_NUTS) || + (quantity == 1 && (CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT))); case RE_MAD_SCRUB: - return !grounded || CanUse(RG_NUTS); + return !grounded || CanUse(RG_NUTS); case RE_KEESE: case RE_FIRE_KEESE: - return CanUse(RG_NUTS); + return CanUse(RG_NUTS); case RE_BLUE_BUBBLE: - //RANDOTODO Trick to use shield hylian shield as child to stun these guys - return !grounded || CanUse(RG_NUTS) || HookshotOrBoomerang() || CanStandingShield(); + // RANDOTODO Trick to use shield hylian shield as child to stun these guys + return !grounded || CanUse(RG_NUTS) || HookshotOrBoomerang() || CanStandingShield(); default: - SPDLOG_ERROR("CanPassEnemy reached `default`."); - assert(false); - return false; - } - } - - bool Logic::CanGetEnemyDrop(RandomizerEnemy enemy, EnemyDistance distance, bool aboveLink) { - if (!CanKillEnemy(enemy, distance)){ + SPDLOG_ERROR("CanPassEnemy reached `default`."); + assert(false); return false; - } - if (distance <= ED_MASTER_SWORD_JUMPSLASH){ - return true; - } - bool drop = false; - switch(enemy) { - case RE_GOLD_SKULLTULA: - switch(distance){ - case ED_CLOSE: - case ED_SHORT_JUMPSLASH: - case ED_MASTER_SWORD_JUMPSLASH: - case ED_LONG_JUMPSLASH: - case ED_BOMB_THROW: - case ED_BOOMERANG: - drop = drop || CanUse(RG_BOOMERANG); - [[fallthrough]]; - case ED_HOOKSHOT: - drop = drop || CanUse(RG_HOOKSHOT); - [[fallthrough]]; - case ED_LONGSHOT: - drop = drop || CanUse(RG_LONGSHOT); - [[fallthrough]]; - case ED_FAR: - break; - //RANDOTODO double check all jumpslash kills that might be out of jump/backflip range - } - return drop; - break; - case RE_KEESE: - case RE_FIRE_KEESE: - return true; - default: - return aboveLink || (distance <= ED_BOOMERANG && CanUse(RG_BOOMERANG)); - } } +} - bool Logic::CanBreakMudWalls() { - return BlastOrSmash() || (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && BlueFire()); - } - - bool Logic::CanGetDekuBabaSticks() { - return (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_BOOMERANG)); - } - - bool Logic::CanGetDekuBabaNuts() { - return CanJumpslash() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_DINS_FIRE); - } - - bool Logic::CanHitEyeTargets() { - return CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT); - } - - bool Logic::CanDetonateBombFlowers() { - return CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_DINS_FIRE); - } - - bool Logic::CanDetonateUprightBombFlower() { - return CanDetonateBombFlowers() || HasItem(RG_GORONS_BRACELET); - } - - bool Logic::MQWaterLevel(RandoWaterLevel level) { - //For ease of reading, I will call the triforce emblem that sets the water to WL_LOW the "Low Emblem", the one that sets it to WL_MID the "Mid Emblem", and the one that sets it to WL_HIGH the "High Emblem" - switch(level){ - //While you have to go through WL_LOW to get to Mid, the requirements for WL_LOW are stricter than WL_MID because you can always go up to WL_MID and then could need to go back to WL_HIGH to reach the Low Emblem again - //Thanks to this caveat you need to be able to reach and play ZL to both the High and Low Emblems to have WL_LOW in logic. - //Alternativly a way to reach WL_LOW from WL_MID could exist, but all glitchless methods need you to do a Low-locked action - case WL_LOW: - return (CanWaterTempleHigh && CanWaterTempleLowFromHigh) || (CanWaterTempleLowFromMid && CanWaterTempleLowFromHigh); - case WL_LOW_OR_MID: - return (CanWaterTempleHigh && CanWaterTempleLowFromHigh) || (CanWaterTempleLowFromHigh && CanWaterTempleMiddle) || (CanWaterTempleLowFromMid && CanWaterTempleLowFromHigh); - //If we can set it to High out of logic we can just repeat what we did to lower the water in the first place as High is the default. - //Because of this you only need to be able to use the Low and Mid Emblems, WL_LOW could be skipped if it was ever possible to play ZL underwater. - case WL_MID: - return CanWaterTempleLowFromHigh && CanWaterTempleMiddle; - //Despite being the initial state of water temple, WL_HIGH has the extra requirement of making sure that, if we were to lower the water out of logic, we could put it back to WL_HIGH - //However because it is the default state, we do not need to check if we can actually change the water level, only to make sure we can return to WL_HIGH if we found the means to play ZL out of logic. - //There are 2 methods to lock yourself out after playing ZL already: Not being able to reach the High Emblem and being unable to replay ZL. (I will be ignoring other-age-access shenanigains) - //The former check would simply be a check to see if we can reach High Emblem, but we assume the water is WL_MID (as if we can set it to WL_LOW, we can set it to WL_MID, as Mid Emblem has no requirements) - //The latter check can be assumed for now but will want a revisit once OI tricks are added. - case WL_HIGH: - return ReachedWaterHighEmblem; - case WL_HIGH_OR_MID: - return ReachedWaterHighEmblem || (CanWaterTempleLowFromHigh && CanWaterTempleMiddle); - } - SPDLOG_ERROR("MQWaterLevel reached `return false;`. Missing case for a Water Level"); - assert(false); +bool Logic::CanGetEnemyDrop(RandomizerEnemy enemy, EnemyDistance distance, bool aboveLink) { + if (!CanKillEnemy(enemy, distance)) { return false; } - - Logic::Logic() { - - } - - uint8_t Logic::BottleCount() { - uint8_t count = 0; - if (CouldEmptyBigPoes){ - for (int i = SLOT_BOTTLE_1; i <= SLOT_BOTTLE_4; i++) { - uint8_t item = GetSaveContext()->inventory.items[i]; - switch (item) { - case ITEM_LETTER_RUTO: - if (DeliverLetter) { - count++; - } - break; - case ITEM_BIG_POE: - if (CanEmptyBigPoes) { - count++; - } - break; - case ITEM_NONE: - break; - default: - count++; - break; - } - } - } - return count; - } - - uint8_t Logic::OcarinaButtons(){ - return HasItem(RG_OCARINA_A_BUTTON) + HasItem(RG_OCARINA_C_LEFT_BUTTON) + HasItem(RG_OCARINA_C_RIGHT_BUTTON) + HasItem(RG_OCARINA_C_UP_BUTTON) + HasItem(RG_OCARINA_C_DOWN_BUTTON); - } - - bool Logic::HasBottle(){ - return BottleCount() >= 1; - } - - bool Logic::CanJumpslashExceptHammer() { - // Not including hammer as hammer jump attacks can be weird; - return CanUse(RG_STICKS) || CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD); - } - - bool Logic::CanJumpslash() { - return CanJumpslashExceptHammer() || CanUse(RG_MEGATON_HAMMER); - } - - bool Logic::CanHitSwitch(EnemyDistance distance, bool inWater) { - bool hit = false; - switch (distance){ - case ED_CLOSE: - case ED_SHORT_JUMPSLASH: - hit = CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MEGATON_HAMMER); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - hit = hit || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - hit = hit || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); - [[fallthrough]]; - case ED_BOMB_THROW: - hit = hit || (!inWater && CanUse(RG_BOMB_BAG)); - [[fallthrough]]; - case ED_BOOMERANG: - hit = hit || CanUse(RG_BOOMERANG); - [[fallthrough]]; - case ED_HOOKSHOT: - //RANDOTODO test chu range in a practical example - hit = hit || CanUse(RG_HOOKSHOT) || CanUse(RG_BOMBCHU_5) ; - [[fallthrough]]; - case ED_LONGSHOT: - hit = hit || CanUse(RG_LONGSHOT); - [[fallthrough]]; - case ED_FAR: - hit = hit || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - break; - } - return hit; - } - - bool Logic::CanDamage() { - return CanUse(RG_FAIRY_SLINGSHOT) || CanJumpslash() || HasExplosives() || CanUse(RG_DINS_FIRE) || CanUse(RG_FAIRY_BOW); - } - - bool Logic::CanAttack() { - return CanDamage() || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT); - } - - bool Logic::BombchusEnabled(){ - return ctx->GetOption(RSK_BOMBCHU_BAG) ? CheckInventory(ITEM_BOMBCHU, true) : HasItem(RG_BOMB_BAG); - } - - // TODO: Implement Ammo Drop Setting in place of bombchu drops - bool Logic::BombchuRefill(){ - return GetInLogic(LOGIC_BUY_BOMBCHUS) || CouldPlayBowling || CarpetMerchant || (ctx->GetOption(RSK_ENABLE_BOMBCHU_DROPS).Is(RO_AMMO_DROPS_ON/*_PLUS_BOMBCHU*/)); - } - - bool Logic::HookshotOrBoomerang(){ - return CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG); - } - - bool Logic::ScarecrowsSong(){ - return (ctx->GetOption(RSK_SKIP_SCARECROWS_SONG) && HasItem(RG_FAIRY_OCARINA) && OcarinaButtons() >= 2) - || (ChildScarecrow && AdultScarecrow); - } - - bool Logic::BlueFire(){ - return CanUse(RG_BOTTLE_WITH_BLUE_FIRE) || (ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && CanUse(RG_ICE_ARROWS)); - } - - bool Logic::CanBreakPots(){ + if (distance <= ED_MASTER_SWORD_JUMPSLASH) { return true; } - - bool Logic::HasExplosives(){ - return CanUse(RG_BOMB_BAG) || CanUse(RG_BOMBCHU_5); - } - - bool Logic::BlastOrSmash(){ - return HasExplosives() || CanUse(RG_MEGATON_HAMMER); - } - - bool Logic::CanSpawnSoilSkull(){ - return IsChild && CanUse(RG_BOTTLE_WITH_BUGS); - } - - bool Logic::CanReflectNuts(){ - return CanUse(RG_DEKU_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)); - } - - bool Logic::CanCutShrubs(){ - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_BOOMERANG) || HasExplosives() || CanUse(RG_MASTER_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_BIGGORON_SWORD); - } - - bool Logic::CanStunDeku(){ - return CanAttack() || CanUse(RG_NUTS) || CanReflectNuts(); - } - - bool Logic::CanLeaveForest(){ - return ctx->GetOption(RSK_FOREST).IsNot(RO_CLOSED_FOREST_ON) || IsAdult || DekuTreeClear || ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES); - } - - bool Logic::CallGossipFairyExceptSuns(){ - return CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SONG_OF_TIME); - } - - bool Logic::CallGossipFairy(){ - return CallGossipFairyExceptSuns() || CanUse(RG_SUNS_SONG); - } - - //the number returned by this is in half heart hits taken. - //RANDOTODO work in OoT side health instead for greater applicability (16 per heart) - uint8_t Logic::EffectiveHealth(){ - /* Multiplier will be: - 0 for half daamge - 1 for normal damage - 2 for double damage - 3 for quad damage - 4 for 8* damage - 5 for 16* damage - 10 for OHKO. - This is the number of shifts to apply, not a real multiplier - */ - uint8_t Multiplier = (ctx->GetOption(RSK_DAMAGE_MULTIPLIER).Get() < 6) ? ctx->GetOption(RSK_DAMAGE_MULTIPLIER).Get() : 10; - //(Hearts() << (2 + HasItem(RG_DOUBLE_DEFENSE))) is quarter hearts after DD - //>> Multiplier halves on normal and does nothing on half, meaning we're working with half hearts on normal damage - return ((Hearts() << (2 + HasItem(RG_DOUBLE_DEFENSE))) >> Multiplier) + - //As 1 is a quarter heart, (1 << Multiplier) is effectivly half-hearts of unmodified damage - //Adds an extra hit if the damage is not exact lethal - ((Hearts() << (2 + HasItem(RG_DOUBLE_DEFENSE))) % (1 << Multiplier) > 0); - } - - uint8_t Logic::Hearts(){ - return GetSaveContext()->healthCapacity / 16; - } - - uint8_t Logic::DungeonCount(){ - return DekuTreeClear + DodongosCavernClear + JabuJabusBellyClear + ForestTempleClear + FireTempleClear + WaterTempleClear + SpiritTempleClear + ShadowTempleClear; - } - - uint8_t Logic::StoneCount(){ - return HasItem(RG_KOKIRI_EMERALD) + HasItem(RG_GORON_RUBY) + HasItem(RG_ZORA_SAPPHIRE); - } - - uint8_t Logic::MedallionCount(){ - return HasItem(RG_FOREST_MEDALLION) + HasItem(RG_FIRE_MEDALLION) + HasItem(RG_WATER_MEDALLION) + HasItem(RG_SPIRIT_MEDALLION) + HasItem(RG_SHADOW_MEDALLION) + HasItem(RG_LIGHT_MEDALLION); - } - - uint8_t Logic::FireTimer(){ - return CanUse(RG_GORON_TUNIC) ? 255 : (ctx->GetTrickOption(RT_FEWER_TUNIC_REQUIREMENTS)) ? (Hearts() * 8) : 0; - } - - //Tunic is not required if you are using irons to do something that a simple gold scale dive could do, and you are not in water temple. (celing swimming and long walks through water do not count) - uint8_t Logic::WaterTimer(){ - return CanUse(RG_ZORA_TUNIC) ? 255 : (ctx->GetTrickOption(RT_FEWER_TUNIC_REQUIREMENTS)) ? (Hearts() * 8) : 0; - } - - bool Logic::TakeDamage(){ - return CanUse(RG_BOTTLE_WITH_FAIRY) || EffectiveHealth() != 1 || CanUse(RG_NAYRUS_LOVE); - } - - bool Logic::CanOpenBombGrotto(){ - return BlastOrSmash() && (HasItem(RG_STONE_OF_AGONY) || ctx->GetTrickOption(RT_GROTTOS_WITHOUT_AGONY)); - } - - bool Logic::CanOpenStormsGrotto(){ - return CanUse(RG_SONG_OF_STORMS) && (HasItem(RG_STONE_OF_AGONY) || ctx->GetTrickOption(RT_GROTTOS_WITHOUT_AGONY)); - } - - bool Logic::CanGetNightTimeGS(){ - return AtNight && (CanUse(RG_SUNS_SONG) || !ctx->GetOption(RSK_SKULLS_SUNS_SONG)); - } - - bool Logic::CanBreakUpperBeehives(){ - return HookshotOrBoomerang() || (ctx->GetTrickOption(RT_BOMBCHU_BEEHIVES) && CanUse(RG_BOMBCHU_5)); - } - - bool Logic::CanBreakLowerBeehives(){ - return CanBreakUpperBeehives() || CanUse(RG_BOMB_BAG); - } - - bool Logic::HasFireSource(){ - return CanUse(RG_DINS_FIRE) || CanUse(RG_FIRE_ARROWS); - } - - bool Logic::HasFireSourceWithTorch(){ - return HasFireSource() || CanUse(RG_STICKS); - } - -//Is this best off signaling what you have already traded, or what step you are currently on? - bool Logic::TradeQuestStep(RandomizerGet rg){ - if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)){ - return false; //This does not apply when we are shuffling trade items - } - bool hasState = false; - //Falling through each case to test each possibility - switch (rg){ - case RG_POCKET_EGG: - hasState = hasState || HasItem(RG_POCKET_EGG); - [[fallthrough]]; - case RG_COJIRO: - hasState = hasState || HasItem(RG_COJIRO); - [[fallthrough]]; - case RG_ODD_MUSHROOM: - hasState = hasState || HasItem(RG_ODD_MUSHROOM); - [[fallthrough]]; - case RG_ODD_POTION: - hasState = hasState || HasItem(RG_ODD_POTION); - [[fallthrough]]; - case RG_POACHERS_SAW: - hasState = hasState || HasItem(RG_POACHERS_SAW); - [[fallthrough]]; - case RG_BROKEN_SWORD: - hasState = hasState || HasItem(RG_BROKEN_SWORD); - [[fallthrough]]; - case RG_PRESCRIPTION: - hasState = hasState || HasItem(RG_PRESCRIPTION); - [[fallthrough]]; - case RG_EYEDROPS: - hasState = hasState || HasItem(RG_EYEDROPS); - [[fallthrough]]; - case RG_CLAIM_CHECK: - hasState = hasState || HasItem(RG_CLAIM_CHECK); - break; - default: - SPDLOG_ERROR("TradeQuestStep reached `return false;`. Missing case for RandomizerGet of {}", static_cast(rg)); - assert(false); - return false; - } - return hasState; - } - - bool Logic::CanFinishGerudoFortress(){ - return (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && SmallKeys(RR_GERUDO_FORTRESS, 4) && CanKillEnemy(RE_GERUDO_WARRIOR) && (HasItem(RG_GERUDO_MEMBERSHIP_CARD) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_KITCHEN))) || - (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST) && SmallKeys(RR_GERUDO_FORTRESS, 1) && CanKillEnemy(RE_GERUDO_WARRIOR)) || - ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE); - } - - bool Logic::CanStandingShield(){ - return CanUse(RG_MIRROR_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)) || CanUse(RG_DEKU_SHIELD); - } - - bool Logic::CanShield(){ - return CanUse(RG_MIRROR_SHIELD) || HasItem(RG_HYLIAN_SHIELD) || CanUse(RG_DEKU_SHIELD); - } - - bool Logic::CanUseProjectile(){ - return HasExplosives() || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG); - } - - bool Logic::CanBuildRainbowBridge(){ - return ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_ALWAYS_OPEN) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_VANILLA) && HasItem(RG_SHADOW_MEDALLION) && HasItem(RG_SPIRIT_MEDALLION) && CanUse(RG_LIGHT_ARROWS)) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES) && StoneCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).Get()) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS) && MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).Get()) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS) && StoneCount() + MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Get()) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS) && DungeonCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Get()) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS) && GetGSCount() >= ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Get()) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG) && HasItem(RG_GREG_RUPEE)); - } - - bool Logic::CanTriggerLACS(){ - return (ctx->LACSCondition() == RO_LACS_VANILLA && HasItem(RG_SHADOW_MEDALLION) && HasItem(RG_SPIRIT_MEDALLION)) || - (ctx->LACSCondition() == RO_LACS_STONES && StoneCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_STONE_COUNT).Get()) || - (ctx->LACSCondition() == RO_LACS_MEDALLIONS && MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_MEDALLION_COUNT).Get()) || - (ctx->LACSCondition() == RO_LACS_REWARDS && StoneCount() + MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_REWARD_COUNT).Get()) || - (ctx->LACSCondition() == RO_LACS_DUNGEONS && DungeonCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get()) || - (ctx->LACSCondition() == RO_LACS_TOKENS && GetGSCount() >= ctx->GetOption(RSK_LACS_TOKEN_COUNT).Get()); - } - - bool Logic::SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmount) { - return SmallKeys(dungeon, requiredAmount, requiredAmount); - } - - bool Logic::SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched) { - if (HasItem(RG_SKELETON_KEY)) { - return true; - } - switch (dungeon) { - case RR_FOREST_TEMPLE: - /*if (IsGlitched && (GetDifficultyValueFromString(GlitchHookshotJump_Boots) >= static_cast(GlitchDifficulty::INTERMEDIATE) || GetDifficultyValueFromString(GlitchHoverBoost) >= static_cast(GlitchDifficulty::NOVICE) || - (GetDifficultyValueFromString(GlitchHover) >= static_cast(GlitchDifficulty::NOVICE) && GetDifficultyValueFromString(GlitchISG) >= static_cast(GlitchDifficulty::INTERMEDIATE)))) { - return ForestTempleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_FOREST_TEMPLE) >= requiredAmountGlitchless; - - case RR_FIRE_TEMPLE: - /*if (IsGlitched && (GetDifficultyValueFromString(GlitchLedgeClip) >= static_cast(GlitchDifficulty::INTERMEDIATE) || GetDifficultyValueFromString(GlitchHover) >= static_cast(GlitchDifficulty::INTERMEDIATE))) { - return FireTempleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_FIRE_TEMPLE) >= requiredAmountGlitchless; - - case RR_WATER_TEMPLE: - /*if (IsGlitched && (false)) { - return WaterTempleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_WATER_TEMPLE) >= requiredAmountGlitchless; - - case RR_SPIRIT_TEMPLE: - /*if (IsGlitched && (false)) { - return SpiritTempleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_SPIRIT_TEMPLE) >= requiredAmountGlitchless; - - case RR_SHADOW_TEMPLE: - /*if (IsGlitched && (GetDifficultyValueFromString(GlitchHookshotClip) >= static_cast(GlitchDifficulty::NOVICE))) { - return ShadowTempleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_SHADOW_TEMPLE) >= requiredAmountGlitchless; - - case RR_BOTTOM_OF_THE_WELL: - /*if (IsGlitched && (false)) { - return BottomOfTheWellKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_BOTTOM_OF_THE_WELL) >= requiredAmountGlitchless; - - case RR_GERUDO_TRAINING_GROUND: - /*if (IsGlitched && (false)) { - return GerudoTrainingGroundsKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_GERUDO_TRAINING_GROUND) >= requiredAmountGlitchless; - - case RR_GANONS_CASTLE: - /*if (IsGlitched && (false)) { - return GanonsCastleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_INSIDE_GANONS_CASTLE) >= requiredAmountGlitchless; - - case RR_MARKET_TREASURE_CHEST_GAME: - /*if (IsGlitched && (false)) { - return TreasureGameKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_TREASURE_BOX_SHOP) >= requiredAmountGlitchless; - - case RR_GERUDO_FORTRESS: - return GetSmallKeyCount(SCENE_THIEVES_HIDEOUT) >= requiredAmountGlitchless; - - default: - return false; - } - } - - std::map Logic::RandoGetToEquipFlag = { - { RG_KOKIRI_SWORD, EQUIP_FLAG_SWORD_KOKIRI }, - { RG_MASTER_SWORD, EQUIP_FLAG_SWORD_MASTER }, - { RG_BIGGORON_SWORD, EQUIP_FLAG_SWORD_BGS }, - { RG_DEKU_SHIELD, EQUIP_FLAG_SHIELD_DEKU }, - { RG_HYLIAN_SHIELD, EQUIP_FLAG_SHIELD_HYLIAN }, - { RG_MIRROR_SHIELD, EQUIP_FLAG_SHIELD_MIRROR }, - { RG_GORON_TUNIC, EQUIP_FLAG_TUNIC_GORON }, - { RG_ZORA_TUNIC, EQUIP_FLAG_TUNIC_ZORA }, - { RG_BUY_DEKU_SHIELD, EQUIP_FLAG_SHIELD_DEKU }, - { RG_BUY_HYLIAN_SHIELD, EQUIP_FLAG_SHIELD_HYLIAN }, - { RG_BUY_GORON_TUNIC, EQUIP_FLAG_TUNIC_GORON }, - { RG_BUY_ZORA_TUNIC, EQUIP_FLAG_TUNIC_ZORA }, - { RG_IRON_BOOTS, EQUIP_FLAG_BOOTS_IRON }, - { RG_HOVER_BOOTS, EQUIP_FLAG_BOOTS_HOVER } - }; - - std::map Logic::RandoGetToRandInf = { - { RG_ZELDAS_LETTER, RAND_INF_ZELDAS_LETTER }, - { RG_WEIRD_EGG, RAND_INF_WEIRD_EGG }, - { RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL }, - { RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL }, - { RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL }, - { RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL }, - { RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL }, - { RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL }, - { RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL }, - { RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL }, - { RG_GANON_SOUL, RAND_INF_GANON_SOUL }, - { RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A }, - { RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP }, - { RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN }, - { RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT }, - { RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT }, - { RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY }, - { RG_GREG_RUPEE, RAND_INF_GREG_FOUND }, - { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }, - { RG_GUARD_HOUSE_KEY, RAND_INF_GUARD_HOUSE_KEY_OBTAINED }, - { RG_MARKET_BAZAAR_KEY, RAND_INF_MARKET_BAZAAR_KEY_OBTAINED }, - { RG_MARKET_POTION_SHOP_KEY, RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED }, - { RG_MASK_SHOP_KEY, RAND_INF_MASK_SHOP_KEY_OBTAINED }, - { RG_MARKET_SHOOTING_GALLERY_KEY, RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED }, - { RG_BOMBCHU_BOWLING_KEY, RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED }, - { RG_TREASURE_CHEST_GAME_BUILDING_KEY, RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED }, - { RG_BOMBCHU_SHOP_KEY, RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED }, - { RG_RICHARDS_HOUSE_KEY, RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED }, - { RG_ALLEY_HOUSE_KEY, RAND_INF_ALLEY_HOUSE_KEY_OBTAINED }, - { RG_KAK_BAZAAR_KEY, RAND_INF_KAK_BAZAAR_KEY_OBTAINED }, - { RG_KAK_POTION_SHOP_KEY, RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED }, - { RG_BOSS_HOUSE_KEY, RAND_INF_BOSS_HOUSE_KEY_OBTAINED }, - { RG_GRANNYS_POTION_SHOP_KEY, RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED }, - { RG_SKULLTULA_HOUSE_KEY, RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED }, - { RG_IMPAS_HOUSE_KEY, RAND_INF_IMPAS_HOUSE_KEY_OBTAINED }, - { RG_WINDMILL_KEY, RAND_INF_WINDMILL_KEY_OBTAINED }, - { RG_KAK_SHOOTING_GALLERY_KEY, RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED }, - { RG_DAMPES_HUT_KEY, RAND_INF_DAMPES_HUT_KEY_OBTAINED }, - { RG_TALONS_HOUSE_KEY, RAND_INF_TALONS_HOUSE_KEY_OBTAINED }, - { RG_STABLES_KEY, RAND_INF_STABLES_KEY_OBTAINED }, - { RG_BACK_TOWER_KEY, RAND_INF_BACK_TOWER_KEY_OBTAINED }, - { RG_HYLIA_LAB_KEY, RAND_INF_HYLIA_LAB_KEY_OBTAINED }, - { RG_FISHING_HOLE_KEY, RAND_INF_FISHING_HOLE_KEY_OBTAINED }, - }; - - std::map Logic::RandoGetToDungeonScene = { - { RG_FOREST_TEMPLE_SMALL_KEY, SCENE_FOREST_TEMPLE }, - { RG_FIRE_TEMPLE_SMALL_KEY, SCENE_FIRE_TEMPLE }, - { RG_WATER_TEMPLE_SMALL_KEY, SCENE_WATER_TEMPLE }, - { RG_SPIRIT_TEMPLE_SMALL_KEY, SCENE_SPIRIT_TEMPLE }, - { RG_SHADOW_TEMPLE_SMALL_KEY, SCENE_SHADOW_TEMPLE }, - { RG_BOTTOM_OF_THE_WELL_SMALL_KEY, SCENE_BOTTOM_OF_THE_WELL }, - { RG_GERUDO_TRAINING_GROUND_SMALL_KEY, SCENE_GERUDO_TRAINING_GROUND }, - { RG_GERUDO_FORTRESS_SMALL_KEY, SCENE_THIEVES_HIDEOUT }, - { RG_GANONS_CASTLE_SMALL_KEY, SCENE_INSIDE_GANONS_CASTLE }, - { RG_FOREST_TEMPLE_KEY_RING, SCENE_FOREST_TEMPLE }, - { RG_FIRE_TEMPLE_KEY_RING, SCENE_FIRE_TEMPLE }, - { RG_WATER_TEMPLE_KEY_RING, SCENE_WATER_TEMPLE }, - { RG_SPIRIT_TEMPLE_KEY_RING, SCENE_SPIRIT_TEMPLE }, - { RG_SHADOW_TEMPLE_KEY_RING, SCENE_SHADOW_TEMPLE }, - { RG_BOTTOM_OF_THE_WELL_KEY_RING, SCENE_BOTTOM_OF_THE_WELL }, - { RG_GERUDO_TRAINING_GROUND_KEY_RING, SCENE_GERUDO_TRAINING_GROUND }, - { RG_GERUDO_FORTRESS_KEY_RING, SCENE_THIEVES_HIDEOUT }, - { RG_GANONS_CASTLE_KEY_RING, SCENE_INSIDE_GANONS_CASTLE }, - { RG_FOREST_TEMPLE_BOSS_KEY, SCENE_FOREST_TEMPLE }, - { RG_FIRE_TEMPLE_BOSS_KEY, SCENE_FIRE_TEMPLE }, - { RG_WATER_TEMPLE_BOSS_KEY, SCENE_WATER_TEMPLE }, - { RG_SPIRIT_TEMPLE_BOSS_KEY, SCENE_SPIRIT_TEMPLE }, - { RG_SHADOW_TEMPLE_BOSS_KEY, SCENE_SHADOW_TEMPLE }, - { RG_GANONS_CASTLE_BOSS_KEY, SCENE_INSIDE_GANONS_CASTLE }, - { RG_DEKU_TREE_MAP, SCENE_DEKU_TREE }, - { RG_DODONGOS_CAVERN_MAP, SCENE_DODONGOS_CAVERN }, - { RG_JABU_JABUS_BELLY_MAP, SCENE_JABU_JABU }, - { RG_FOREST_TEMPLE_MAP, SCENE_FOREST_TEMPLE }, - { RG_FIRE_TEMPLE_MAP, SCENE_FIRE_TEMPLE }, - { RG_WATER_TEMPLE_MAP, SCENE_WATER_TEMPLE }, - { RG_SPIRIT_TEMPLE_MAP, SCENE_SPIRIT_TEMPLE }, - { RG_SHADOW_TEMPLE_MAP, SCENE_SHADOW_TEMPLE }, - { RG_BOTTOM_OF_THE_WELL_MAP, SCENE_BOTTOM_OF_THE_WELL }, - { RG_ICE_CAVERN_MAP, SCENE_ICE_CAVERN }, - { RG_DEKU_TREE_COMPASS, SCENE_DEKU_TREE }, - { RG_DODONGOS_CAVERN_COMPASS, SCENE_DODONGOS_CAVERN }, - { RG_JABU_JABUS_BELLY_COMPASS, SCENE_JABU_JABU }, - { RG_FOREST_TEMPLE_COMPASS, SCENE_FOREST_TEMPLE }, - { RG_FIRE_TEMPLE_COMPASS, SCENE_FIRE_TEMPLE }, - { RG_WATER_TEMPLE_COMPASS, SCENE_WATER_TEMPLE }, - { RG_SPIRIT_TEMPLE_COMPASS, SCENE_SPIRIT_TEMPLE }, - { RG_SHADOW_TEMPLE_COMPASS, SCENE_SHADOW_TEMPLE }, - { RG_BOTTOM_OF_THE_WELL_COMPASS, SCENE_BOTTOM_OF_THE_WELL }, - { RG_ICE_CAVERN_COMPASS, SCENE_ICE_CAVERN }, - { RG_TREASURE_GAME_SMALL_KEY, SCENE_TREASURE_BOX_SHOP } - }; - - std::map Logic::RandoGetToQuestItem = { - { RG_FOREST_MEDALLION, QUEST_MEDALLION_FOREST }, - { RG_FIRE_MEDALLION, QUEST_MEDALLION_FIRE }, - { RG_WATER_MEDALLION, QUEST_MEDALLION_WATER }, - { RG_SPIRIT_MEDALLION, QUEST_MEDALLION_SPIRIT }, - { RG_SHADOW_MEDALLION, QUEST_MEDALLION_SHADOW }, - { RG_LIGHT_MEDALLION, QUEST_MEDALLION_LIGHT }, - { RG_MINUET_OF_FOREST, QUEST_SONG_MINUET }, - { RG_BOLERO_OF_FIRE, QUEST_SONG_BOLERO }, - { RG_SERENADE_OF_WATER, QUEST_SONG_SERENADE }, - { RG_REQUIEM_OF_SPIRIT, QUEST_SONG_REQUIEM }, - { RG_NOCTURNE_OF_SHADOW, QUEST_SONG_NOCTURNE }, - { RG_PRELUDE_OF_LIGHT, QUEST_SONG_PRELUDE }, - { RG_ZELDAS_LULLABY, QUEST_SONG_LULLABY }, - { RG_EPONAS_SONG, QUEST_SONG_EPONA }, - { RG_SARIAS_SONG, QUEST_SONG_SARIA }, - { RG_SUNS_SONG, QUEST_SONG_SUN }, - { RG_SONG_OF_TIME, QUEST_SONG_TIME }, - { RG_SONG_OF_STORMS, QUEST_SONG_STORMS }, - { RG_KOKIRI_EMERALD, QUEST_KOKIRI_EMERALD }, - { RG_GORON_RUBY, QUEST_GORON_RUBY }, - { RG_ZORA_SAPPHIRE, QUEST_ZORA_SAPPHIRE }, - { RG_STONE_OF_AGONY, QUEST_STONE_OF_AGONY }, - { RG_GERUDO_MEMBERSHIP_CARD, QUEST_GERUDO_CARD }, - }; - - std::map BottleRandomizerGetToItemID = { - { RG_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED }, - { RG_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN }, - { RG_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE }, - { RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY }, - { RG_BOTTLE_WITH_FISH, ITEM_FISH }, - { RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE }, - { RG_BOTTLE_WITH_BUGS, ITEM_BUG }, - { RG_BOTTLE_WITH_POE, ITEM_POE }, - { RG_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE }, - }; - - uint32_t HookshotLookup[3] = { ITEM_NONE, ITEM_HOOKSHOT, ITEM_LONGSHOT }; - uint32_t OcarinaLookup[3] = { ITEM_NONE, ITEM_OCARINA_FAIRY, ITEM_OCARINA_TIME }; - - void Logic::ApplyItemEffect(Item& item, bool state) { - auto randoGet = item.GetRandomizerGet(); - if (item.GetGIEntry()->objectId == OBJECT_GI_STICK) { - SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); - } - if (item.GetGIEntry()->objectId == OBJECT_GI_NUTS) { - SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); - } - switch (item.GetItemType()) { - case ITEMTYPE_ITEM: - { - switch (randoGet) { - case RG_STONE_OF_AGONY: - case RG_GERUDO_MEMBERSHIP_CARD: - SetQuestItem(RandoGetToQuestItem.at(randoGet), state); - break; - case RG_WEIRD_EGG: - SetRandoInf(RAND_INF_WEIRD_EGG, state); - break; - case RG_ZELDAS_LETTER: - SetRandoInf(RAND_INF_ZELDAS_LETTER, state); - break; - case RG_DOUBLE_DEFENSE: - mSaveContext->isDoubleDefenseAcquired = state; - break; - case RG_POCKET_EGG: - case RG_COJIRO: - case RG_ODD_MUSHROOM: - case RG_ODD_POTION: - case RG_POACHERS_SAW: - case RG_BROKEN_SWORD: - case RG_PRESCRIPTION: - case RG_EYEBALL_FROG: - case RG_EYEDROPS: - case RG_CLAIM_CHECK: - SetRandoInf(randoGet - RG_POCKET_EGG + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, state); - break; - case RG_PROGRESSIVE_HOOKSHOT: - { - uint8_t i; - for (i = 0; i < 3; i++) { - if (CurrentInventory(ITEM_HOOKSHOT) == HookshotLookup[i]) { - break; - } - } - auto newItem = i + (!state ? -1 : 1); - if (newItem < 0) { - newItem = 0; - } - else if (newItem > 2) { - newItem = 2; - } - SetInventory(ITEM_HOOKSHOT, HookshotLookup[newItem]); - } break; - case RG_PROGRESSIVE_STRENGTH: - { - auto currentLevel = CurrentUpgrade(UPG_STRENGTH); - auto newLevel = currentLevel + (!state ? -1 : 1); - SetUpgrade(UPG_STRENGTH, newLevel); - } break; - case RG_PROGRESSIVE_BOMB_BAG: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_BOMB_BAG_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_BOMB_BAG, true); + bool drop = false; + switch (enemy) { + case RE_GOLD_SKULLTULA: + switch (distance) { + case ED_CLOSE: + case ED_SHORT_JUMPSLASH: + case ED_MASTER_SWORD_JUMPSLASH: + case ED_LONG_JUMPSLASH: + case ED_BOMB_THROW: + case ED_BOOMERANG: + drop = drop || CanUse(RG_BOOMERANG); + [[fallthrough]]; + case ED_HOOKSHOT: + drop = drop || CanUse(RG_HOOKSHOT); + [[fallthrough]]; + case ED_LONGSHOT: + drop = drop || CanUse(RG_LONGSHOT); + [[fallthrough]]; + case ED_FAR: break; - } - auto currentLevel = CurrentUpgrade(UPG_BOMB_BAG); - auto newLevel = currentLevel + (!state ? -1 : 1); - if (currentLevel == 0 && state || currentLevel == 1 && !state) { - SetInventory(ITEM_BOMB, (!state ? ITEM_NONE : ITEM_BOMB)); - } - SetUpgrade(UPG_BOMB_BAG, newLevel); - } break; - case RG_PROGRESSIVE_BOW: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_QUIVER_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_QUIVER, true); - break; - } - auto currentLevel = CurrentUpgrade(UPG_QUIVER); - auto newLevel = currentLevel + (!state ? -1 : 1); - if (currentLevel == 0 && state || currentLevel == 1 && !state) { - SetInventory(ITEM_BOW, (!state ? ITEM_NONE : ITEM_BOW)); - } - SetUpgrade(UPG_QUIVER, newLevel); - } break; - case RG_PROGRESSIVE_SLINGSHOT: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_BULLET_BAG_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_BULLET_BAG, true); - break; - } - auto currentLevel = CurrentUpgrade(UPG_BULLET_BAG); - auto newLevel = currentLevel + (!state ? -1 : 1); - if (currentLevel == 0 && state || currentLevel == 1 && !state) { - SetInventory(ITEM_SLINGSHOT, (!state ? ITEM_NONE : ITEM_SLINGSHOT)); - } - SetUpgrade(UPG_BULLET_BAG, newLevel); - } break; - case RG_PROGRESSIVE_WALLET: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_WALLET_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_MONEY, true); - break; - } - auto currentLevel = CurrentUpgrade(UPG_WALLET); - if (!CheckRandoInf(RAND_INF_HAS_WALLET) && state) { - SetRandoInf(RAND_INF_HAS_WALLET, true); - } - else if (currentLevel == 0 && !state) { - SetRandoInf(RAND_INF_HAS_WALLET, false); - } - else { - auto newLevel = currentLevel + (!state ? -1 : 1); - SetUpgrade(UPG_WALLET, newLevel); - } - } break; - case RG_PROGRESSIVE_SCALE: - { - auto currentLevel = CurrentUpgrade(UPG_SCALE); - if (!CheckRandoInf(RAND_INF_CAN_SWIM) && state) { - SetRandoInf(RAND_INF_CAN_SWIM, true); - } - else if (currentLevel == 0 && !state) { - SetRandoInf(RAND_INF_CAN_SWIM, false); - } - else { - auto newLevel = currentLevel + (!state ? -1 : 1); - SetUpgrade(UPG_SCALE, newLevel); - } - } break; - case RG_PROGRESSIVE_NUT_UPGRADE: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_NUT_UPGRADE_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE, true); - break; - } - auto currentLevel = CurrentUpgrade(UPG_NUTS); - auto newLevel = currentLevel + (!state ? -1 : 1); - if (currentLevel == 0 && state || currentLevel == 1 && !state) { - SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); - } - SetUpgrade(UPG_NUTS, newLevel); - } break; - case RG_PROGRESSIVE_STICK_UPGRADE: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_STICK_UPGRADE_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE, true); - break; - } - auto currentLevel = CurrentUpgrade(UPG_STICKS); - auto newLevel = currentLevel + (!state ? -1 : 1); - if (currentLevel == 0 && state || currentLevel == 1 && !state) { - SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); - } - SetUpgrade(UPG_STICKS, newLevel); - } break; - case RG_PROGRESSIVE_BOMBCHUS: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_BOMBCHU_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_BOMBCHUS, true); - break; - } - SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); - } break; - case RG_PROGRESSIVE_MAGIC_METER: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_MAGIC_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_MAGIC_METER, true); - break; - } - mSaveContext->magicLevel += (!state ? -1 : 1); - } break; - case RG_PROGRESSIVE_OCARINA: - { - uint8_t i; - for (i = 0; i < 3; i++) { - if (CurrentInventory(ITEM_OCARINA_FAIRY) == OcarinaLookup[i]) { - break; - } - } - i += (!state ? -1 : 1); - if (i < 0) { - i = 0; - } - else if (i > 2) { - i = 2; - } - SetInventory(ITEM_OCARINA_FAIRY, OcarinaLookup[i]); - } break; - case RG_HEART_CONTAINER: - mSaveContext->healthCapacity += (!state ? -16 : 16); - break; - case RG_PIECE_OF_HEART: - mSaveContext->healthCapacity += (!state ? -4 : 4); - break; - case RG_BOOMERANG: - case RG_LENS_OF_TRUTH: - case RG_MEGATON_HAMMER: - case RG_DINS_FIRE: - case RG_FARORES_WIND: - case RG_NAYRUS_LOVE: - case RG_FIRE_ARROWS: - case RG_ICE_ARROWS: - case RG_LIGHT_ARROWS: - SetInventory(item.GetGIEntry()->itemId, (!state ? ITEM_NONE : item.GetGIEntry()->itemId)); - break; - case RG_MAGIC_BEAN: - case RG_MAGIC_BEAN_PACK: - { - auto change = (item.GetRandomizerGet() == RG_MAGIC_BEAN ? 1 : 10); - auto current = GetAmmo(ITEM_BEAN); - SetAmmo(ITEM_BEAN, current + (!state ? -change : change)); - } break; - case RG_EMPTY_BOTTLE: - case RG_BOTTLE_WITH_MILK: - case RG_BOTTLE_WITH_RED_POTION: - case RG_BOTTLE_WITH_GREEN_POTION: - case RG_BOTTLE_WITH_BLUE_POTION: - case RG_BOTTLE_WITH_FAIRY: - case RG_BOTTLE_WITH_FISH: - case RG_BOTTLE_WITH_BLUE_FIRE: - case RG_BOTTLE_WITH_BUGS: - case RG_BOTTLE_WITH_POE: - case RG_BOTTLE_WITH_BIG_POE: - { - uint8_t slot = SLOT_BOTTLE_1; - while (slot != SLOT_BOTTLE_4) { - if (mSaveContext->inventory.items[slot] == ITEM_NONE) { - break; - } - slot++; - } - uint16_t itemId = item.GetGIEntry()->itemId; - if (BottleRandomizerGetToItemID.contains(randoGet)) { - itemId = BottleRandomizerGetToItemID[randoGet]; - } - if (randoGet == RG_BOTTLE_WITH_BIG_POE) { - BigPoes++; - } - mSaveContext->inventory.items[slot] = itemId; - } break; - case RG_RUTOS_LETTER: - SetEventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER, state); - break; - case RG_GOHMA_SOUL: - case RG_KING_DODONGO_SOUL: - case RG_BARINADE_SOUL: - case RG_PHANTOM_GANON_SOUL: - case RG_VOLVAGIA_SOUL: - case RG_MORPHA_SOUL: - case RG_BONGO_BONGO_SOUL: - case RG_TWINROVA_SOUL: - case RG_GANON_SOUL: - case RG_OCARINA_A_BUTTON: - case RG_OCARINA_C_UP_BUTTON: - case RG_OCARINA_C_DOWN_BUTTON: - case RG_OCARINA_C_LEFT_BUTTON: - case RG_OCARINA_C_RIGHT_BUTTON: - case RG_GREG_RUPEE: - case RG_FISHING_POLE: - case RG_GUARD_HOUSE_KEY: - case RG_MARKET_BAZAAR_KEY: - case RG_MARKET_POTION_SHOP_KEY: - case RG_MASK_SHOP_KEY: - case RG_MARKET_SHOOTING_GALLERY_KEY: - case RG_BOMBCHU_BOWLING_KEY: - case RG_TREASURE_CHEST_GAME_BUILDING_KEY: - case RG_BOMBCHU_SHOP_KEY: - case RG_RICHARDS_HOUSE_KEY: - case RG_ALLEY_HOUSE_KEY: - case RG_KAK_BAZAAR_KEY: - case RG_KAK_POTION_SHOP_KEY: - case RG_BOSS_HOUSE_KEY: - case RG_GRANNYS_POTION_SHOP_KEY: - case RG_SKULLTULA_HOUSE_KEY: - case RG_IMPAS_HOUSE_KEY: - case RG_WINDMILL_KEY: - case RG_KAK_SHOOTING_GALLERY_KEY: - case RG_DAMPES_HUT_KEY: - case RG_TALONS_HOUSE_KEY: - case RG_STABLES_KEY: - case RG_BACK_TOWER_KEY: - case RG_HYLIA_LAB_KEY: - case RG_FISHING_HOLE_KEY: - SetRandoInf(RandoGetToRandInf.at(randoGet), state); - break; - case RG_TRIFORCE_PIECE: - mSaveContext->ship.quest.data.randomizer.triforcePiecesCollected += (!state ? -1 : 1); - break; - case RG_BOMBCHU_5: - case RG_BOMBCHU_10: - case RG_BOMBCHU_20: - SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); - break; - default: - break; + // RANDOTODO double check all jumpslash kills that might be out of jump/backflip range } + return drop; + break; + case RE_KEESE: + case RE_FIRE_KEESE: + return true; + default: + return aboveLink || (distance <= ED_BOOMERANG && CanUse(RG_BOOMERANG)); + } +} + +bool Logic::CanBreakMudWalls() { + return BlastOrSmash() || (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && BlueFire()); +} + +bool Logic::CanGetDekuBabaSticks() { + return CanUseSword() || CanUse(RG_BOOMERANG); +} + +bool Logic::CanGetDekuBabaNuts() { + return CanJumpslash() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || HasExplosives() || + CanUse(RG_DINS_FIRE); +} + +bool Logic::CanHitEyeTargets() { + return CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT); +} + +bool Logic::CanDetonateBombFlowers() { + return CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_DINS_FIRE); +} + +bool Logic::CanDetonateUprightBombFlower() { + return CanDetonateBombFlowers() || HasItem(RG_GORONS_BRACELET) || + (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && CanUse(RG_BOTTLE_WITH_BLUE_FIRE) && + (EffectiveHealth() != 1 || CanUse(RG_NAYRUS_LOVE))); +} + +bool Logic::MQWaterLevel(RandoWaterLevel level) { + // For ease of reading, I will call the triforce emblem that sets the water to WL_LOW the "Low Emblem", the one that + // sets it to WL_MID the "Mid Emblem", and the one that sets it to WL_HIGH the "High Emblem" + switch (level) { + // While you have to go through WL_LOW to get to Mid, the requirements for WL_LOW are stricter than WL_MID + // because you can always go up to WL_MID and then could need to go back to WL_HIGH to reach the Low Emblem + // again Thanks to this caveat you need to be able to reach and play ZL to both the High and Low Emblems to have + // WL_LOW in logic. Alternativly a way to reach WL_LOW from WL_MID could exist, but all glitchless methods need + // you to do a Low-locked action + case WL_LOW: + return (CanWaterTempleHigh && CanWaterTempleLowFromHigh) || + (CanWaterTempleLowFromMid && CanWaterTempleLowFromHigh); + case WL_LOW_OR_MID: + return (CanWaterTempleHigh && CanWaterTempleLowFromHigh) || + (CanWaterTempleLowFromHigh && CanWaterTempleMiddle) || + (CanWaterTempleLowFromMid && CanWaterTempleLowFromHigh); + // If we can set it to High out of logic we can just repeat what we did to lower the water in the first place as + // High is the default. Because of this you only need to be able to use the Low and Mid Emblems, WL_LOW could be + // skipped if it was ever possible to play ZL underwater. + case WL_MID: + return CanWaterTempleLowFromHigh && CanWaterTempleMiddle; + // Despite being the initial state of water temple, WL_HIGH has the extra requirement of making sure that, if we + // were to lower the water out of logic, we could put it back to WL_HIGH However because it is the default + // state, we do not need to check if we can actually change the water level, only to make sure we can return to + // WL_HIGH if we found the means to play ZL out of logic. There are 2 methods to lock yourself out after playing + // ZL already: Not being able to reach the High Emblem and being unable to replay ZL. (I will be ignoring + // other-age-access shenanigains) The former check would simply be a check to see if we can reach High Emblem, + // but we assume the water is WL_MID (as if we can set it to WL_LOW, we can set it to WL_MID, as Mid Emblem has + // no requirements) The latter check can be assumed for now but will want a revisit once OI tricks are added. + case WL_HIGH: + return ReachedWaterHighEmblem; + case WL_HIGH_OR_MID: + return ReachedWaterHighEmblem || (CanWaterTempleLowFromHigh && CanWaterTempleMiddle); + } + SPDLOG_ERROR("MQWaterLevel reached `return false;`. Missing case for a Water Level"); + assert(false); + return false; +} + +Logic::Logic() { +} + +uint8_t Logic::BottleCount() { + uint8_t count = 0; + for (int i = SLOT_BOTTLE_1; i <= SLOT_BOTTLE_4; i++) { + uint8_t item = GetSaveContext()->inventory.items[i]; + switch (item) { + case ITEM_LETTER_RUTO: + if (DeliverLetter) { + count++; + } + break; + case ITEM_BIG_POE: + if (CanEmptyBigPoes) { + count++; + } + break; + case ITEM_NONE: + break; + default: + count++; + break; } - break; - case ITEMTYPE_EQUIP: - { + } + return count; +} + +uint8_t Logic::OcarinaButtons() { + return HasItem(RG_OCARINA_A_BUTTON) + HasItem(RG_OCARINA_C_LEFT_BUTTON) + HasItem(RG_OCARINA_C_RIGHT_BUTTON) + + HasItem(RG_OCARINA_C_UP_BUTTON) + HasItem(RG_OCARINA_C_DOWN_BUTTON); +} + +bool Logic::HasBottle() { + return BottleCount() >= 1; +} + +bool Logic::CanUseSword() { + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD); +} + +bool Logic::CanJumpslashExceptHammer() { + // Not including hammer as hammer jump attacks can be weird; + return CanUse(RG_STICKS) || CanUseSword(); +} + +bool Logic::CanJumpslash() { + return CanJumpslashExceptHammer() || CanUse(RG_MEGATON_HAMMER); +} + +bool Logic::CanHitSwitch(EnemyDistance distance, bool inWater) { + bool hit = false; + switch (distance) { + case ED_CLOSE: + case ED_SHORT_JUMPSLASH: + hit = CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MEGATON_HAMMER); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + hit = hit || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + hit = hit || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); + [[fallthrough]]; + case ED_BOMB_THROW: + hit = hit || (!inWater && CanUse(RG_BOMB_BAG)); + [[fallthrough]]; + case ED_BOOMERANG: + hit = hit || CanUse(RG_BOOMERANG); + [[fallthrough]]; + case ED_HOOKSHOT: + // RANDOTODO test chu range in a practical example + hit = hit || CanUse(RG_HOOKSHOT) || CanUse(RG_BOMBCHU_5); + [[fallthrough]]; + case ED_LONGSHOT: + hit = hit || CanUse(RG_LONGSHOT); + [[fallthrough]]; + case ED_FAR: + hit = hit || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + break; + } + return hit; +} + +bool Logic::CanDamage() { + return CanUse(RG_FAIRY_SLINGSHOT) || CanJumpslash() || HasExplosives() || CanUse(RG_DINS_FIRE) || + CanUse(RG_FAIRY_BOW); +} + +bool Logic::CanAttack() { + return CanDamage() || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT); +} + +bool Logic::BombchusEnabled() { + return ctx->GetOption(RSK_BOMBCHU_BAG) ? CheckInventory(ITEM_BOMBCHU, true) : HasItem(RG_BOMB_BAG); +} + +// TODO: Implement Ammo Drop Setting in place of bombchu drops +bool Logic::BombchuRefill() { + return GetInLogic(LOGIC_BUY_BOMBCHUS) || CouldPlayBowling || CarpetMerchant || + (ctx->GetOption(RSK_ENABLE_BOMBCHU_DROPS).Is(RO_AMMO_DROPS_ON /*_PLUS_BOMBCHU*/)); +} + +bool Logic::HookshotOrBoomerang() { + return CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG); +} + +bool Logic::ScarecrowsSong() { + return (ctx->GetOption(RSK_SKIP_SCARECROWS_SONG) && HasItem(RG_FAIRY_OCARINA) && OcarinaButtons() >= 2) || + (ChildScarecrow && AdultScarecrow); +} + +bool Logic::BlueFire() { + return CanUse(RG_BOTTLE_WITH_BLUE_FIRE) || (ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && CanUse(RG_ICE_ARROWS)); +} + +bool Logic::CanBreakPots() { + return true; +} + +bool Logic::CanBreakCrates() { + return true; +} + +bool Logic::CanBreakSmallCrates() { + return true; +} + +bool Logic::HasExplosives() { + return CanUse(RG_BOMB_BAG) || CanUse(RG_BOMBCHU_5); +} + +bool Logic::BlastOrSmash() { + return HasExplosives() || CanUse(RG_MEGATON_HAMMER); +} + +bool Logic::CanSpawnSoilSkull() { + return IsChild && CanUse(RG_BOTTLE_WITH_BUGS); +} + +bool Logic::CanReflectNuts() { + return CanUse(RG_DEKU_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)); +} + +bool Logic::CanCutShrubs() { + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_BOOMERANG) || HasExplosives() || CanUse(RG_MASTER_SWORD) || + CanUse(RG_MEGATON_HAMMER) || CanUse(RG_BIGGORON_SWORD) || HasItem(RG_GORONS_BRACELET); +} + +bool Logic::CanStunDeku() { + return CanAttack() || CanUse(RG_NUTS) || CanReflectNuts(); +} + +bool Logic::CanLeaveForest() { + return ctx->GetOption(RSK_FOREST).IsNot(RO_CLOSED_FOREST_ON) || IsAdult || DekuTreeClear || + ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES); +} + +bool Logic::CallGossipFairyExceptSuns() { + return CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SONG_OF_TIME); +} + +bool Logic::CallGossipFairy() { + return CallGossipFairyExceptSuns() || CanUse(RG_SUNS_SONG); +} + +// the number returned by this is in half heart hits taken. +// RANDOTODO work in OoT side health instead for greater applicability (16 per heart) +uint8_t Logic::EffectiveHealth() { + /* Multiplier will be: + 0 for half daamge + 1 for normal damage + 2 for double damage + 3 for quad damage + 4 for 8* damage + 5 for 16* damage + 10 for OHKO. + This is the number of shifts to apply, not a real multiplier + */ + uint8_t Multiplier = + (ctx->GetOption(RSK_DAMAGE_MULTIPLIER).Get() < 6) ? ctx->GetOption(RSK_DAMAGE_MULTIPLIER).Get() : 10; + //(Hearts() << (2 + HasItem(RG_DOUBLE_DEFENSE))) is quarter hearts after DD + //>> Multiplier halves on normal and does nothing on half, meaning we're working with half hearts on normal damage + return ((Hearts() << (2 + HasItem(RG_DOUBLE_DEFENSE))) >> Multiplier) + + // As 1 is a quarter heart, (1 << Multiplier) is effectivly half-hearts of unmodified damage + // Adds an extra hit if the damage is not exact lethal + ((Hearts() << (2 + HasItem(RG_DOUBLE_DEFENSE))) % (1 << Multiplier) > 0); +} + +uint8_t Logic::Hearts() { + return GetSaveContext()->healthCapacity / 16; +} + +uint8_t Logic::DungeonCount() { + return DekuTreeClear + DodongosCavernClear + JabuJabusBellyClear + ForestTempleClear + FireTempleClear + + WaterTempleClear + SpiritTempleClear + ShadowTempleClear; +} + +uint8_t Logic::StoneCount() { + return HasItem(RG_KOKIRI_EMERALD) + HasItem(RG_GORON_RUBY) + HasItem(RG_ZORA_SAPPHIRE); +} + +uint8_t Logic::MedallionCount() { + return HasItem(RG_FOREST_MEDALLION) + HasItem(RG_FIRE_MEDALLION) + HasItem(RG_WATER_MEDALLION) + + HasItem(RG_SPIRIT_MEDALLION) + HasItem(RG_SHADOW_MEDALLION) + HasItem(RG_LIGHT_MEDALLION); +} + +uint8_t Logic::FireTimer() { + return CanUse(RG_GORON_TUNIC) ? 255 : (ctx->GetTrickOption(RT_FEWER_TUNIC_REQUIREMENTS)) ? (Hearts() * 8) : 0; +} + +// Tunic is not required if you are using irons to do something that a simple gold scale dive could do, and you are not +// in water temple. (celing swimming and long walks through water do not count) +uint8_t Logic::WaterTimer() { + return CanUse(RG_ZORA_TUNIC) ? 255 : (ctx->GetTrickOption(RT_FEWER_TUNIC_REQUIREMENTS)) ? (Hearts() * 8) : 0; +} + +bool Logic::TakeDamage() { + return CanUse(RG_BOTTLE_WITH_FAIRY) || EffectiveHealth() != 1 || CanUse(RG_NAYRUS_LOVE); +} + +bool Logic::CanOpenBombGrotto() { + return BlastOrSmash() && (HasItem(RG_STONE_OF_AGONY) || ctx->GetTrickOption(RT_GROTTOS_WITHOUT_AGONY)); +} + +bool Logic::CanOpenStormsGrotto() { + return CanUse(RG_SONG_OF_STORMS) && (HasItem(RG_STONE_OF_AGONY) || ctx->GetTrickOption(RT_GROTTOS_WITHOUT_AGONY)); +} + +bool Logic::CanGetNightTimeGS() { + return AtNight && (CanUse(RG_SUNS_SONG) || !ctx->GetOption(RSK_SKULLS_SUNS_SONG)); +} + +bool Logic::CanBreakUpperBeehives() { + return HookshotOrBoomerang() || (ctx->GetTrickOption(RT_BOMBCHU_BEEHIVES) && CanUse(RG_BOMBCHU_5)); +} + +bool Logic::CanBreakLowerBeehives() { + return CanBreakUpperBeehives() || CanUse(RG_BOMB_BAG); +} + +bool Logic::HasFireSource() { + return CanUse(RG_DINS_FIRE) || CanUse(RG_FIRE_ARROWS); +} + +bool Logic::HasFireSourceWithTorch() { + return HasFireSource() || CanUse(RG_STICKS); +} + +// Is this best off signaling what you have already traded, or what step you are currently on? +bool Logic::TradeQuestStep(RandomizerGet rg) { + if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)) { + return false; // This does not apply when we are shuffling trade items + } + bool hasState = false; + // Falling through each case to test each possibility + switch (rg) { + case RG_POCKET_EGG: + hasState = hasState || HasItem(RG_POCKET_EGG); + [[fallthrough]]; + case RG_COJIRO: + hasState = hasState || HasItem(RG_COJIRO); + [[fallthrough]]; + case RG_ODD_MUSHROOM: + hasState = hasState || HasItem(RG_ODD_MUSHROOM); + [[fallthrough]]; + case RG_ODD_POTION: + hasState = hasState || HasItem(RG_ODD_POTION); + [[fallthrough]]; + case RG_POACHERS_SAW: + hasState = hasState || HasItem(RG_POACHERS_SAW); + [[fallthrough]]; + case RG_BROKEN_SWORD: + hasState = hasState || HasItem(RG_BROKEN_SWORD); + [[fallthrough]]; + case RG_PRESCRIPTION: + hasState = hasState || HasItem(RG_PRESCRIPTION); + [[fallthrough]]; + case RG_EYEDROPS: + hasState = hasState || HasItem(RG_EYEDROPS); + [[fallthrough]]; + case RG_CLAIM_CHECK: + hasState = hasState || HasItem(RG_CLAIM_CHECK); + break; + default: + SPDLOG_ERROR("TradeQuestStep reached `return false;`. Missing case for RandomizerGet of {}", + static_cast(rg)); + assert(false); + return false; + } + return hasState; +} + +bool Logic::CanStandingShield() { + return CanUse(RG_MIRROR_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)) || CanUse(RG_DEKU_SHIELD); +} + +bool Logic::CanShield() { + return CanUse(RG_MIRROR_SHIELD) || HasItem(RG_HYLIAN_SHIELD) || CanUse(RG_DEKU_SHIELD); +} + +bool Logic::CanUseProjectile() { + return HasExplosives() || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_SLINGSHOT) || + CanUse(RG_BOOMERANG); +} + +bool Logic::CanBuildRainbowBridge() { + return ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_ALWAYS_OPEN) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_VANILLA) && HasItem(RG_SHADOW_MEDALLION) && + HasItem(RG_SPIRIT_MEDALLION) && CanUse(RG_LIGHT_ARROWS)) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES) && + StoneCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= + ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).Get()) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS) && + MedallionCount() + + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= + ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).Get()) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS) && + StoneCount() + MedallionCount() + + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= + ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Get()) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS) && + DungeonCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= + ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Get()) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS) && + GetGSCount() >= ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Get()) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG) && HasItem(RG_GREG_RUPEE)); +} + +bool Logic::CanTriggerLACS() { + return (ctx->LACSCondition() == RO_LACS_VANILLA && HasItem(RG_SHADOW_MEDALLION) && HasItem(RG_SPIRIT_MEDALLION)) || + (ctx->LACSCondition() == RO_LACS_STONES && + StoneCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= + ctx->GetOption(RSK_LACS_STONE_COUNT).Get()) || + (ctx->LACSCondition() == RO_LACS_MEDALLIONS && + MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= + ctx->GetOption(RSK_LACS_MEDALLION_COUNT).Get()) || + (ctx->LACSCondition() == RO_LACS_REWARDS && + StoneCount() + MedallionCount() + + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= + ctx->GetOption(RSK_LACS_REWARD_COUNT).Get()) || + (ctx->LACSCondition() == RO_LACS_DUNGEONS && + DungeonCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= + ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get()) || + (ctx->LACSCondition() == RO_LACS_TOKENS && GetGSCount() >= ctx->GetOption(RSK_LACS_TOKEN_COUNT).Get()); +} + +bool Logic::SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmount) { + return SmallKeys(dungeon, requiredAmount, requiredAmount); +} + +bool Logic::SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched) { + if (HasItem(RG_SKELETON_KEY)) { + return true; + } + switch (dungeon) { + case RR_FOREST_TEMPLE: + /*if (IsGlitched && (GetDifficultyValueFromString(GlitchHookshotJump_Boots) >= + static_cast(GlitchDifficulty::INTERMEDIATE) || GetDifficultyValueFromString(GlitchHoverBoost) >= + static_cast(GlitchDifficulty::NOVICE) || (GetDifficultyValueFromString(GlitchHover) >= + static_cast(GlitchDifficulty::NOVICE) && GetDifficultyValueFromString(GlitchISG) >= + static_cast(GlitchDifficulty::INTERMEDIATE)))) { return ForestTempleKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_FOREST_TEMPLE) >= requiredAmountGlitchless; + + case RR_FIRE_TEMPLE: + /*if (IsGlitched && (GetDifficultyValueFromString(GlitchLedgeClip) >= + static_cast(GlitchDifficulty::INTERMEDIATE) || GetDifficultyValueFromString(GlitchHover) >= + static_cast(GlitchDifficulty::INTERMEDIATE))) { return FireTempleKeys >= requiredAmountGlitched; + }*/ + // If the Fire Temple loop lock is removed, Small key Count is set to 1 before starting + return GetSmallKeyCount(SCENE_FIRE_TEMPLE) >= requiredAmountGlitchless; + + case RR_WATER_TEMPLE: + /*if (IsGlitched && (false)) { + return WaterTempleKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_WATER_TEMPLE) >= requiredAmountGlitchless; + + case RR_SPIRIT_TEMPLE: + /*if (IsGlitched && (false)) { + return SpiritTempleKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_SPIRIT_TEMPLE) >= requiredAmountGlitchless; + + case RR_SHADOW_TEMPLE: + /*if (IsGlitched && (GetDifficultyValueFromString(GlitchHookshotClip) >= + static_cast(GlitchDifficulty::NOVICE))) { return ShadowTempleKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_SHADOW_TEMPLE) >= requiredAmountGlitchless; + + case RR_BOTTOM_OF_THE_WELL: + /*if (IsGlitched && (false)) { + return BottomOfTheWellKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_BOTTOM_OF_THE_WELL) >= requiredAmountGlitchless; + + case RR_GERUDO_TRAINING_GROUND: + /*if (IsGlitched && (false)) { + return GerudoTrainingGroundsKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_GERUDO_TRAINING_GROUND) >= requiredAmountGlitchless; + + case RR_GANONS_CASTLE: + /*if (IsGlitched && (false)) { + return GanonsCastleKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_INSIDE_GANONS_CASTLE) >= requiredAmountGlitchless; + + case RR_MARKET_TREASURE_CHEST_GAME: + /*if (IsGlitched && (false)) { + return TreasureGameKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_TREASURE_BOX_SHOP) >= requiredAmountGlitchless; + + case RR_GF_OUTSKIRTS: + return GetSmallKeyCount(SCENE_THIEVES_HIDEOUT) >= requiredAmountGlitchless; + + default: + return false; + } +} + +std::map Logic::RandoGetToEquipFlag = { + { RG_KOKIRI_SWORD, EQUIP_FLAG_SWORD_KOKIRI }, { RG_MASTER_SWORD, EQUIP_FLAG_SWORD_MASTER }, + { RG_BIGGORON_SWORD, EQUIP_FLAG_SWORD_BGS }, { RG_DEKU_SHIELD, EQUIP_FLAG_SHIELD_DEKU }, + { RG_HYLIAN_SHIELD, EQUIP_FLAG_SHIELD_HYLIAN }, { RG_MIRROR_SHIELD, EQUIP_FLAG_SHIELD_MIRROR }, + { RG_GORON_TUNIC, EQUIP_FLAG_TUNIC_GORON }, { RG_ZORA_TUNIC, EQUIP_FLAG_TUNIC_ZORA }, + { RG_BUY_DEKU_SHIELD, EQUIP_FLAG_SHIELD_DEKU }, { RG_BUY_HYLIAN_SHIELD, EQUIP_FLAG_SHIELD_HYLIAN }, + { RG_BUY_GORON_TUNIC, EQUIP_FLAG_TUNIC_GORON }, { RG_BUY_ZORA_TUNIC, EQUIP_FLAG_TUNIC_ZORA }, + { RG_IRON_BOOTS, EQUIP_FLAG_BOOTS_IRON }, { RG_HOVER_BOOTS, EQUIP_FLAG_BOOTS_HOVER } +}; + +std::map Logic::RandoGetToRandInf = { + { RG_ZELDAS_LETTER, RAND_INF_ZELDAS_LETTER }, + { RG_WEIRD_EGG, RAND_INF_WEIRD_EGG }, + { RG_RUTOS_LETTER, RAND_INF_OBTAINED_RUTOS_LETTER }, + { RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL }, + { RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL }, + { RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL }, + { RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL }, + { RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL }, + { RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL }, + { RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL }, + { RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL }, + { RG_GANON_SOUL, RAND_INF_GANON_SOUL }, + { RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A }, + { RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP }, + { RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN }, + { RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT }, + { RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT }, + { RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY }, + { RG_GREG_RUPEE, RAND_INF_GREG_FOUND }, + { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }, + { RG_GUARD_HOUSE_KEY, RAND_INF_GUARD_HOUSE_KEY_OBTAINED }, + { RG_MARKET_BAZAAR_KEY, RAND_INF_MARKET_BAZAAR_KEY_OBTAINED }, + { RG_MARKET_POTION_SHOP_KEY, RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED }, + { RG_MASK_SHOP_KEY, RAND_INF_MASK_SHOP_KEY_OBTAINED }, + { RG_MARKET_SHOOTING_GALLERY_KEY, RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED }, + { RG_BOMBCHU_BOWLING_KEY, RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED }, + { RG_TREASURE_CHEST_GAME_BUILDING_KEY, RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED }, + { RG_BOMBCHU_SHOP_KEY, RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED }, + { RG_RICHARDS_HOUSE_KEY, RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED }, + { RG_ALLEY_HOUSE_KEY, RAND_INF_ALLEY_HOUSE_KEY_OBTAINED }, + { RG_KAK_BAZAAR_KEY, RAND_INF_KAK_BAZAAR_KEY_OBTAINED }, + { RG_KAK_POTION_SHOP_KEY, RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED }, + { RG_BOSS_HOUSE_KEY, RAND_INF_BOSS_HOUSE_KEY_OBTAINED }, + { RG_GRANNYS_POTION_SHOP_KEY, RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED }, + { RG_SKULLTULA_HOUSE_KEY, RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED }, + { RG_IMPAS_HOUSE_KEY, RAND_INF_IMPAS_HOUSE_KEY_OBTAINED }, + { RG_WINDMILL_KEY, RAND_INF_WINDMILL_KEY_OBTAINED }, + { RG_KAK_SHOOTING_GALLERY_KEY, RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED }, + { RG_DAMPES_HUT_KEY, RAND_INF_DAMPES_HUT_KEY_OBTAINED }, + { RG_TALONS_HOUSE_KEY, RAND_INF_TALONS_HOUSE_KEY_OBTAINED }, + { RG_STABLES_KEY, RAND_INF_STABLES_KEY_OBTAINED }, + { RG_BACK_TOWER_KEY, RAND_INF_BACK_TOWER_KEY_OBTAINED }, + { RG_HYLIA_LAB_KEY, RAND_INF_HYLIA_LAB_KEY_OBTAINED }, + { RG_FISHING_HOLE_KEY, RAND_INF_FISHING_HOLE_KEY_OBTAINED }, +}; + +std::map Logic::RandoGetToDungeonScene = { + { RG_FOREST_TEMPLE_SMALL_KEY, SCENE_FOREST_TEMPLE }, + { RG_FIRE_TEMPLE_SMALL_KEY, SCENE_FIRE_TEMPLE }, + { RG_WATER_TEMPLE_SMALL_KEY, SCENE_WATER_TEMPLE }, + { RG_SPIRIT_TEMPLE_SMALL_KEY, SCENE_SPIRIT_TEMPLE }, + { RG_SHADOW_TEMPLE_SMALL_KEY, SCENE_SHADOW_TEMPLE }, + { RG_BOTTOM_OF_THE_WELL_SMALL_KEY, SCENE_BOTTOM_OF_THE_WELL }, + { RG_GERUDO_TRAINING_GROUND_SMALL_KEY, SCENE_GERUDO_TRAINING_GROUND }, + { RG_GERUDO_FORTRESS_SMALL_KEY, SCENE_THIEVES_HIDEOUT }, + { RG_GANONS_CASTLE_SMALL_KEY, SCENE_INSIDE_GANONS_CASTLE }, + { RG_FOREST_TEMPLE_KEY_RING, SCENE_FOREST_TEMPLE }, + { RG_FIRE_TEMPLE_KEY_RING, SCENE_FIRE_TEMPLE }, + { RG_WATER_TEMPLE_KEY_RING, SCENE_WATER_TEMPLE }, + { RG_SPIRIT_TEMPLE_KEY_RING, SCENE_SPIRIT_TEMPLE }, + { RG_SHADOW_TEMPLE_KEY_RING, SCENE_SHADOW_TEMPLE }, + { RG_BOTTOM_OF_THE_WELL_KEY_RING, SCENE_BOTTOM_OF_THE_WELL }, + { RG_GERUDO_TRAINING_GROUND_KEY_RING, SCENE_GERUDO_TRAINING_GROUND }, + { RG_GERUDO_FORTRESS_KEY_RING, SCENE_THIEVES_HIDEOUT }, + { RG_GANONS_CASTLE_KEY_RING, SCENE_INSIDE_GANONS_CASTLE }, + { RG_FOREST_TEMPLE_BOSS_KEY, SCENE_FOREST_TEMPLE }, + { RG_FIRE_TEMPLE_BOSS_KEY, SCENE_FIRE_TEMPLE }, + { RG_WATER_TEMPLE_BOSS_KEY, SCENE_WATER_TEMPLE }, + { RG_SPIRIT_TEMPLE_BOSS_KEY, SCENE_SPIRIT_TEMPLE }, + { RG_SHADOW_TEMPLE_BOSS_KEY, SCENE_SHADOW_TEMPLE }, + { RG_GANONS_CASTLE_BOSS_KEY, SCENE_INSIDE_GANONS_CASTLE }, + { RG_DEKU_TREE_MAP, SCENE_DEKU_TREE }, + { RG_DODONGOS_CAVERN_MAP, SCENE_DODONGOS_CAVERN }, + { RG_JABU_JABUS_BELLY_MAP, SCENE_JABU_JABU }, + { RG_FOREST_TEMPLE_MAP, SCENE_FOREST_TEMPLE }, + { RG_FIRE_TEMPLE_MAP, SCENE_FIRE_TEMPLE }, + { RG_WATER_TEMPLE_MAP, SCENE_WATER_TEMPLE }, + { RG_SPIRIT_TEMPLE_MAP, SCENE_SPIRIT_TEMPLE }, + { RG_SHADOW_TEMPLE_MAP, SCENE_SHADOW_TEMPLE }, + { RG_BOTTOM_OF_THE_WELL_MAP, SCENE_BOTTOM_OF_THE_WELL }, + { RG_ICE_CAVERN_MAP, SCENE_ICE_CAVERN }, + { RG_DEKU_TREE_COMPASS, SCENE_DEKU_TREE }, + { RG_DODONGOS_CAVERN_COMPASS, SCENE_DODONGOS_CAVERN }, + { RG_JABU_JABUS_BELLY_COMPASS, SCENE_JABU_JABU }, + { RG_FOREST_TEMPLE_COMPASS, SCENE_FOREST_TEMPLE }, + { RG_FIRE_TEMPLE_COMPASS, SCENE_FIRE_TEMPLE }, + { RG_WATER_TEMPLE_COMPASS, SCENE_WATER_TEMPLE }, + { RG_SPIRIT_TEMPLE_COMPASS, SCENE_SPIRIT_TEMPLE }, + { RG_SHADOW_TEMPLE_COMPASS, SCENE_SHADOW_TEMPLE }, + { RG_BOTTOM_OF_THE_WELL_COMPASS, SCENE_BOTTOM_OF_THE_WELL }, + { RG_ICE_CAVERN_COMPASS, SCENE_ICE_CAVERN }, + { RG_TREASURE_GAME_SMALL_KEY, SCENE_TREASURE_BOX_SHOP } +}; + +std::map Logic::RandoGetToQuestItem = { + { RG_FOREST_MEDALLION, QUEST_MEDALLION_FOREST }, + { RG_FIRE_MEDALLION, QUEST_MEDALLION_FIRE }, + { RG_WATER_MEDALLION, QUEST_MEDALLION_WATER }, + { RG_SPIRIT_MEDALLION, QUEST_MEDALLION_SPIRIT }, + { RG_SHADOW_MEDALLION, QUEST_MEDALLION_SHADOW }, + { RG_LIGHT_MEDALLION, QUEST_MEDALLION_LIGHT }, + { RG_MINUET_OF_FOREST, QUEST_SONG_MINUET }, + { RG_BOLERO_OF_FIRE, QUEST_SONG_BOLERO }, + { RG_SERENADE_OF_WATER, QUEST_SONG_SERENADE }, + { RG_REQUIEM_OF_SPIRIT, QUEST_SONG_REQUIEM }, + { RG_NOCTURNE_OF_SHADOW, QUEST_SONG_NOCTURNE }, + { RG_PRELUDE_OF_LIGHT, QUEST_SONG_PRELUDE }, + { RG_ZELDAS_LULLABY, QUEST_SONG_LULLABY }, + { RG_EPONAS_SONG, QUEST_SONG_EPONA }, + { RG_SARIAS_SONG, QUEST_SONG_SARIA }, + { RG_SUNS_SONG, QUEST_SONG_SUN }, + { RG_SONG_OF_TIME, QUEST_SONG_TIME }, + { RG_SONG_OF_STORMS, QUEST_SONG_STORMS }, + { RG_KOKIRI_EMERALD, QUEST_KOKIRI_EMERALD }, + { RG_GORON_RUBY, QUEST_GORON_RUBY }, + { RG_ZORA_SAPPHIRE, QUEST_ZORA_SAPPHIRE }, + { RG_STONE_OF_AGONY, QUEST_STONE_OF_AGONY }, + { RG_GERUDO_MEMBERSHIP_CARD, QUEST_GERUDO_CARD }, +}; + +std::map BottleRandomizerGetToItemID = { + { RG_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED }, + { RG_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN }, + { RG_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE }, + { RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY }, + { RG_BOTTLE_WITH_FISH, ITEM_FISH }, + { RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE }, + { RG_BOTTLE_WITH_BUGS, ITEM_BUG }, + { RG_BOTTLE_WITH_POE, ITEM_POE }, + { RG_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE }, +}; + +uint32_t HookshotLookup[3] = { ITEM_NONE, ITEM_HOOKSHOT, ITEM_LONGSHOT }; +uint32_t OcarinaLookup[3] = { ITEM_NONE, ITEM_OCARINA_FAIRY, ITEM_OCARINA_TIME }; + +void Logic::ApplyItemEffect(Item& item, bool state) { + auto randoGet = item.GetRandomizerGet(); + if (item.GetGIEntry()->objectId == OBJECT_GI_STICK) { + SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); + } + if (item.GetGIEntry()->objectId == OBJECT_GI_NUTS) { + SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); + } + switch (item.GetItemType()) { + case ITEMTYPE_ITEM: { + switch (randoGet) { + case RG_STONE_OF_AGONY: + case RG_GERUDO_MEMBERSHIP_CARD: + SetQuestItem(RandoGetToQuestItem.at(randoGet), state); + break; + case RG_WEIRD_EGG: + SetRandoInf(RAND_INF_WEIRD_EGG, state); + break; + case RG_ZELDAS_LETTER: + SetRandoInf(RAND_INF_ZELDAS_LETTER, state); + break; + case RG_DOUBLE_DEFENSE: + mSaveContext->isDoubleDefenseAcquired = state; + break; + case RG_POCKET_EGG: + SetRandoInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, state); + break; + case RG_COJIRO: + case RG_ODD_MUSHROOM: + case RG_ODD_POTION: + case RG_POACHERS_SAW: + case RG_BROKEN_SWORD: + case RG_PRESCRIPTION: + case RG_EYEBALL_FROG: + case RG_EYEDROPS: + case RG_CLAIM_CHECK: + SetRandoInf(randoGet - RG_COJIRO + RAND_INF_ADULT_TRADES_HAS_COJIRO, state); + break; + case RG_PROGRESSIVE_HOOKSHOT: { + uint8_t i; + for (i = 0; i < 3; i++) { + if (CurrentInventory(ITEM_HOOKSHOT) == HookshotLookup[i]) { + break; + } + } + auto newItem = i + (!state ? -1 : 1); + if (newItem < 0) { + newItem = 0; + } else if (newItem > 2) { + newItem = 2; + } + SetInventory(ITEM_HOOKSHOT, HookshotLookup[newItem]); + } break; + case RG_PROGRESSIVE_STRENGTH: { + auto currentLevel = CurrentUpgrade(UPG_STRENGTH); + auto newLevel = currentLevel + (!state ? -1 : 1); + SetUpgrade(UPG_STRENGTH, newLevel); + } break; + case RG_PROGRESSIVE_BOMB_BAG: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_BOMB_BAG_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_BOMB_BAG, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_BOMB_BAG); + auto newLevel = currentLevel + (!state ? -1 : 1); + if (currentLevel == 0 && state || currentLevel == 1 && !state) { + SetInventory(ITEM_BOMB, (!state ? ITEM_NONE : ITEM_BOMB)); + } + SetUpgrade(UPG_BOMB_BAG, newLevel); + } break; + case RG_PROGRESSIVE_BOW: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_QUIVER_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_QUIVER, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_QUIVER); + auto newLevel = currentLevel + (!state ? -1 : 1); + if (currentLevel == 0 && state || currentLevel == 1 && !state) { + SetInventory(ITEM_BOW, (!state ? ITEM_NONE : ITEM_BOW)); + } + SetUpgrade(UPG_QUIVER, newLevel); + } break; + case RG_PROGRESSIVE_SLINGSHOT: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_BULLET_BAG_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_BULLET_BAG, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_BULLET_BAG); + auto newLevel = currentLevel + (!state ? -1 : 1); + if (currentLevel == 0 && state || currentLevel == 1 && !state) { + SetInventory(ITEM_SLINGSHOT, (!state ? ITEM_NONE : ITEM_SLINGSHOT)); + } + SetUpgrade(UPG_BULLET_BAG, newLevel); + } break; + case RG_PROGRESSIVE_WALLET: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_WALLET_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_MONEY, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_WALLET); + if (!CheckRandoInf(RAND_INF_HAS_WALLET) && state) { + SetRandoInf(RAND_INF_HAS_WALLET, true); + } else if (currentLevel == 0 && !state) { + SetRandoInf(RAND_INF_HAS_WALLET, false); + } else { + auto newLevel = currentLevel + (!state ? -1 : 1); + SetUpgrade(UPG_WALLET, newLevel); + } + } break; + case RG_PROGRESSIVE_SCALE: { + auto currentLevel = CurrentUpgrade(UPG_SCALE); + if (!CheckRandoInf(RAND_INF_CAN_SWIM) && state) { + SetRandoInf(RAND_INF_CAN_SWIM, true); + } else if (currentLevel == 0 && !state) { + SetRandoInf(RAND_INF_CAN_SWIM, false); + } else { + auto newLevel = currentLevel + (!state ? -1 : 1); + SetUpgrade(UPG_SCALE, newLevel); + } + } break; + case RG_PROGRESSIVE_NUT_UPGRADE: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_NUT_UPGRADE_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_NUTS); + auto newLevel = currentLevel + (!state ? -1 : 1); + if (currentLevel == 0 && state || currentLevel == 1 && !state) { + SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); + } + SetUpgrade(UPG_NUTS, newLevel); + } break; + case RG_PROGRESSIVE_STICK_UPGRADE: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_STICK_UPGRADE_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_STICKS); + auto newLevel = currentLevel + (!state ? -1 : 1); + if (currentLevel == 0 && state || currentLevel == 1 && !state) { + SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); + } + SetUpgrade(UPG_STICKS, newLevel); + } break; + case RG_PROGRESSIVE_BOMBCHUS: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_BOMBCHU_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_BOMBCHUS, true); + break; + } + SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); + } break; + case RG_PROGRESSIVE_MAGIC_METER: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_MAGIC_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_MAGIC_METER, true); + break; + } + mSaveContext->magicLevel += (!state ? -1 : 1); + } break; + case RG_PROGRESSIVE_OCARINA: { + uint8_t i; + for (i = 0; i < 3; i++) { + if (CurrentInventory(ITEM_OCARINA_FAIRY) == OcarinaLookup[i]) { + break; + } + } + i += (!state ? -1 : 1); + if (i < 0) { + i = 0; + } else if (i > 2) { + i = 2; + } + SetInventory(ITEM_OCARINA_FAIRY, OcarinaLookup[i]); + } break; + case RG_HEART_CONTAINER: + mSaveContext->healthCapacity += (!state ? -16 : 16); + break; + case RG_PIECE_OF_HEART: + mSaveContext->healthCapacity += (!state ? -4 : 4); + break; + case RG_BOOMERANG: + case RG_LENS_OF_TRUTH: + case RG_MEGATON_HAMMER: + case RG_DINS_FIRE: + case RG_FARORES_WIND: + case RG_NAYRUS_LOVE: + case RG_FIRE_ARROWS: + case RG_ICE_ARROWS: + case RG_LIGHT_ARROWS: + SetInventory(item.GetGIEntry()->itemId, (!state ? ITEM_NONE : item.GetGIEntry()->itemId)); + break; + case RG_MAGIC_BEAN: + case RG_MAGIC_BEAN_PACK: { + auto change = (item.GetRandomizerGet() == RG_MAGIC_BEAN ? 1 : 10); + auto current = GetAmmo(ITEM_BEAN); + SetAmmo(ITEM_BEAN, current + (!state ? -change : change)); + } break; + case RG_EMPTY_BOTTLE: + case RG_BOTTLE_WITH_MILK: + case RG_BOTTLE_WITH_RED_POTION: + case RG_BOTTLE_WITH_GREEN_POTION: + case RG_BOTTLE_WITH_BLUE_POTION: + case RG_BOTTLE_WITH_FAIRY: + case RG_BOTTLE_WITH_FISH: + case RG_BOTTLE_WITH_BLUE_FIRE: + case RG_BOTTLE_WITH_BUGS: + case RG_BOTTLE_WITH_POE: + case RG_BOTTLE_WITH_BIG_POE: { + uint8_t slot = SLOT_BOTTLE_1; + while (slot != SLOT_BOTTLE_4) { + if (mSaveContext->inventory.items[slot] == ITEM_NONE) { + break; + } + slot++; + } + uint16_t itemId = item.GetGIEntry()->itemId; + if (BottleRandomizerGetToItemID.contains(randoGet)) { + itemId = BottleRandomizerGetToItemID[randoGet]; + } + if (randoGet == RG_BOTTLE_WITH_BIG_POE) { + BigPoes++; + } + mSaveContext->inventory.items[slot] = static_cast(itemId); + } break; + case RG_RUTOS_LETTER: + SetRandoInf(RAND_INF_OBTAINED_RUTOS_LETTER, state); + break; + case RG_GOHMA_SOUL: + case RG_KING_DODONGO_SOUL: + case RG_BARINADE_SOUL: + case RG_PHANTOM_GANON_SOUL: + case RG_VOLVAGIA_SOUL: + case RG_MORPHA_SOUL: + case RG_BONGO_BONGO_SOUL: + case RG_TWINROVA_SOUL: + case RG_GANON_SOUL: + case RG_OCARINA_A_BUTTON: + case RG_OCARINA_C_UP_BUTTON: + case RG_OCARINA_C_DOWN_BUTTON: + case RG_OCARINA_C_LEFT_BUTTON: + case RG_OCARINA_C_RIGHT_BUTTON: + case RG_GREG_RUPEE: + case RG_FISHING_POLE: + case RG_GUARD_HOUSE_KEY: + case RG_MARKET_BAZAAR_KEY: + case RG_MARKET_POTION_SHOP_KEY: + case RG_MASK_SHOP_KEY: + case RG_MARKET_SHOOTING_GALLERY_KEY: + case RG_BOMBCHU_BOWLING_KEY: + case RG_TREASURE_CHEST_GAME_BUILDING_KEY: + case RG_BOMBCHU_SHOP_KEY: + case RG_RICHARDS_HOUSE_KEY: + case RG_ALLEY_HOUSE_KEY: + case RG_KAK_BAZAAR_KEY: + case RG_KAK_POTION_SHOP_KEY: + case RG_BOSS_HOUSE_KEY: + case RG_GRANNYS_POTION_SHOP_KEY: + case RG_SKULLTULA_HOUSE_KEY: + case RG_IMPAS_HOUSE_KEY: + case RG_WINDMILL_KEY: + case RG_KAK_SHOOTING_GALLERY_KEY: + case RG_DAMPES_HUT_KEY: + case RG_TALONS_HOUSE_KEY: + case RG_STABLES_KEY: + case RG_BACK_TOWER_KEY: + case RG_HYLIA_LAB_KEY: + case RG_FISHING_HOLE_KEY: + SetRandoInf(RandoGetToRandInf.at(randoGet), state); + break; + case RG_TRIFORCE_PIECE: + mSaveContext->ship.quest.data.randomizer.triforcePiecesCollected += (!state ? -1 : 1); + break; + case RG_BOMBCHU_5: + case RG_BOMBCHU_10: + case RG_BOMBCHU_20: + SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); + break; + default: + break; + } + } break; + case ITEMTYPE_EQUIP: { RandomizerGet itemRG = item.GetRandomizerGet(); - if (itemRG == RG_GIANTS_KNIFE) { + if (itemRG == RG_GIANTS_KNIFE || itemRG == RG_DEKU_SHIELD || itemRG == RG_HYLIAN_SHIELD) { return; } uint32_t equipId = RandoGetToEquipFlag.find(itemRG)->second; @@ -1794,15 +1892,13 @@ namespace Rando { if (equipId == EQUIP_FLAG_SWORD_BGS) { mSaveContext->bgsFlag = false; } - } - else { + } else { mSaveContext->inventory.equipment |= equipId; if (equipId == EQUIP_FLAG_SWORD_BGS) { mSaveContext->bgsFlag = true; } } - } - break; + } break; case ITEMTYPE_DUNGEONREWARD: case ITEMTYPE_SONG: SetQuestItem(RandoGetToQuestItem.find(item.GetRandomizerGet())->second, state); @@ -1817,8 +1913,7 @@ namespace Rando { SetDungeonItem(DUNGEON_KEY_BOSS, RandoGetToDungeonScene.find(item.GetRandomizerGet())->second, state); break; case ITEMTYPE_FORTRESS_SMALLKEY: - case ITEMTYPE_SMALLKEY: - { + case ITEMTYPE_SMALLKEY: { auto randoGet = item.GetRandomizerGet(); auto keyring = randoGet >= RG_FOREST_TEMPLE_KEY_RING && randoGet <= RG_GANONS_CASTLE_KEY_RING; auto dungeonIndex = RandoGetToDungeonScene.find(randoGet)->second; @@ -1826,16 +1921,13 @@ namespace Rando { if (!state) { if (keyring) { count = 0; - } - else { + } else { count -= 1; } - } - else { + } else { if (keyring) { count = 10; - } - else { + } else { count += 1; } } @@ -1848,353 +1940,447 @@ namespace Rando { break; case ITEMTYPE_DROP: case ITEMTYPE_REFILL: - case ITEMTYPE_SHOP: - { + case ITEMTYPE_SHOP: { RandomizerGet itemRG = item.GetRandomizerGet(); - if (itemRG == RG_BUY_HYLIAN_SHIELD || itemRG == RG_BUY_DEKU_SHIELD || itemRG == RG_BUY_GORON_TUNIC || itemRG == RG_BUY_ZORA_TUNIC) { + if (itemRG == RG_BUY_HYLIAN_SHIELD || itemRG == RG_BUY_DEKU_SHIELD || itemRG == RG_BUY_GORON_TUNIC || + itemRG == RG_BUY_ZORA_TUNIC) { uint32_t equipId = RandoGetToEquipFlag.find(itemRG)->second; if (!state) { mSaveContext->inventory.equipment &= ~equipId; - } - else { + } else { mSaveContext->inventory.equipment |= equipId; } } switch (itemRG) { - case RG_DEKU_NUTS_5: - case RG_DEKU_NUTS_10: - case RG_BUY_DEKU_NUTS_5: - case RG_BUY_DEKU_NUTS_10: - SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); - break; - case RG_DEKU_STICK_1: - case RG_BUY_DEKU_STICK_1: - case RG_STICKS: - SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); - break; - case RG_BOMBCHU_5: - case RG_BOMBCHU_10: - case RG_BOMBCHU_20: - SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); - break; - default: - break; + case RG_DEKU_NUTS_5: + case RG_DEKU_NUTS_10: + case RG_BUY_DEKU_NUTS_5: + case RG_BUY_DEKU_NUTS_10: + SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); + break; + case RG_DEKU_STICK_1: + case RG_BUY_DEKU_STICK_1: + case RG_STICKS: + SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); + break; + case RG_BOMBCHU_5: + case RG_BOMBCHU_10: + case RG_BOMBCHU_20: + SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); + break; + default: + break; } } break; - } } +} - SaveContext* Logic::GetSaveContext() { - if (mSaveContext == nullptr) { - NewSaveContext(); - } - return mSaveContext; - } - - void Logic::SetSaveContext(SaveContext* context) { - mSaveContext = context; - } - - void Logic::InitSaveContext() { - mSaveContext->totalDays = 0; - mSaveContext->bgsDayCount = 0; - - mSaveContext->deaths = 0; - for (int i = 0; i < ARRAY_COUNT(mSaveContext->playerName); i++) { - mSaveContext->playerName[i] = 0x3E; - } - mSaveContext->n64ddFlag = 0; - mSaveContext->healthCapacity = 0x30; - mSaveContext->health = 0x30; - mSaveContext->magicLevel = 0; - mSaveContext->magic = 0x30; - mSaveContext->rupees = 0; - mSaveContext->swordHealth = 0; - mSaveContext->naviTimer = 0; - mSaveContext->isMagicAcquired = 0; - mSaveContext->isDoubleMagicAcquired = 0; - mSaveContext->isDoubleDefenseAcquired = 0; - mSaveContext->bgsFlag = 0; - mSaveContext->ocarinaGameRoundNum = 0; - for (int button = 0; button < ARRAY_COUNT(mSaveContext->childEquips.buttonItems); button++) { - mSaveContext->childEquips.buttonItems[button] = ITEM_NONE; - } - for (int button = 0; button < ARRAY_COUNT(mSaveContext->childEquips.cButtonSlots); button++) { - mSaveContext->childEquips.cButtonSlots[button] = SLOT_NONE; - } - mSaveContext->childEquips.equipment = 0; - for (int button = 0; button < ARRAY_COUNT(mSaveContext->adultEquips.buttonItems); button++) { - mSaveContext->adultEquips.buttonItems[button] = ITEM_NONE; - } - for (int button = 0; button < ARRAY_COUNT(mSaveContext->adultEquips.cButtonSlots); button++) { - mSaveContext->adultEquips.cButtonSlots[button] = SLOT_NONE; - } - mSaveContext->adultEquips.equipment = 0; - mSaveContext->unk_54 = 0; - mSaveContext->savedSceneNum = SCENE_LINKS_HOUSE; - - // Equipment - for (int button = 0; button < ARRAY_COUNT(mSaveContext->equips.buttonItems); button++) { - mSaveContext->equips.buttonItems[button] = ITEM_NONE; - } - for (int button = 0; button < ARRAY_COUNT(mSaveContext->equips.cButtonSlots); button++) { - mSaveContext->equips.cButtonSlots[button] = SLOT_NONE; - } - mSaveContext->equips.equipment = 0; - - // Inventory - for (int item = 0; item < ARRAY_COUNT(mSaveContext->inventory.items); item++) { - mSaveContext->inventory.items[item] = ITEM_NONE; - } - for (int ammo = 0; ammo < ARRAY_COUNT(mSaveContext->inventory.ammo); ammo++) { - mSaveContext->inventory.ammo[ammo] = 0; - } - mSaveContext->inventory.equipment = 0; - mSaveContext->inventory.upgrades = 0; - mSaveContext->inventory.questItems = 0; - for (int dungeon = 0; dungeon < ARRAY_COUNT(mSaveContext->inventory.dungeonItems); dungeon++) { - mSaveContext->inventory.dungeonItems[dungeon] = 0; - } - for (int dungeon = 0; dungeon < ARRAY_COUNT(mSaveContext->inventory.dungeonKeys); dungeon++) { - mSaveContext->inventory.dungeonKeys[dungeon] = 0x0; - } - mSaveContext->inventory.defenseHearts = 0; - mSaveContext->inventory.gsTokens = 0; - for (int scene = 0; scene < ARRAY_COUNT(mSaveContext->sceneFlags); scene++) { - mSaveContext->sceneFlags[scene].chest = 0; - mSaveContext->sceneFlags[scene].swch = 0; - mSaveContext->sceneFlags[scene].clear = 0; - mSaveContext->sceneFlags[scene].collect = 0; - mSaveContext->sceneFlags[scene].unk = 0; - mSaveContext->sceneFlags[scene].rooms = 0; - mSaveContext->sceneFlags[scene].floors = 0; - } - mSaveContext->fw.pos.x = 0; - mSaveContext->fw.pos.y = 0; - mSaveContext->fw.pos.z = 0; - mSaveContext->fw.yaw = 0; - mSaveContext->fw.playerParams = 0; - mSaveContext->fw.entranceIndex = 0; - mSaveContext->fw.roomIndex = 0; - mSaveContext->fw.set = 0; - mSaveContext->fw.tempSwchFlags = 0; - mSaveContext->fw.tempCollectFlags = 0; - for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->gsFlags); flag++) { - mSaveContext->gsFlags[flag] = 0; - } - for (int highscore = 0; highscore < ARRAY_COUNT(mSaveContext->highScores); highscore++) { - mSaveContext->highScores[highscore] = 0; - } - for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->eventChkInf); flag++) { - mSaveContext->eventChkInf[flag] = 0; - } - for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->itemGetInf); flag++) { - mSaveContext->itemGetInf[flag] = 0; - } - for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->infTable); flag++) { - mSaveContext->infTable[flag] = 0; - } - mSaveContext->worldMapAreaData = 0; - mSaveContext->scarecrowLongSongSet = 0; - for (int i = 0; i < ARRAY_COUNT(mSaveContext->scarecrowLongSong); i++) { - mSaveContext->scarecrowLongSong[i].noteIdx = 0; - mSaveContext->scarecrowLongSong[i].unk_01 = 0; - mSaveContext->scarecrowLongSong[i].unk_02 = 0; - mSaveContext->scarecrowLongSong[i].volume = 0; - mSaveContext->scarecrowLongSong[i].vibrato = 0; - mSaveContext->scarecrowLongSong[i].tone = 0; - mSaveContext->scarecrowLongSong[i].semitone = 0; - } - mSaveContext->scarecrowSpawnSongSet = 0; - for (int i = 0; i < ARRAY_COUNT(mSaveContext->scarecrowSpawnSong); i++) { - mSaveContext->scarecrowSpawnSong[i].noteIdx = 0; - mSaveContext->scarecrowSpawnSong[i].unk_01 = 0; - mSaveContext->scarecrowSpawnSong[i].unk_02 = 0; - mSaveContext->scarecrowSpawnSong[i].volume = 0; - mSaveContext->scarecrowSpawnSong[i].vibrato = 0; - mSaveContext->scarecrowSpawnSong[i].tone = 0; - mSaveContext->scarecrowSpawnSong[i].semitone = 0; - } - - mSaveContext->horseData.scene = SCENE_HYRULE_FIELD; - mSaveContext->horseData.pos.x = -1840; - mSaveContext->horseData.pos.y = 72; - mSaveContext->horseData.pos.z = 5497; - mSaveContext->horseData.angle = -0x6AD9; - mSaveContext->magicLevel = 0; - mSaveContext->infTable[29] = 1; - mSaveContext->sceneFlags[5].swch = 0x40000000; - - // SoH specific - mSaveContext->ship.backupFW = mSaveContext->fw; - mSaveContext->ship.pendingSale = ITEM_NONE; - mSaveContext->ship.pendingSaleMod = MOD_NONE; - mSaveContext->ship.pendingIceTrapCount = 0; - - // Init with normal quest unless only an MQ rom is provided - mSaveContext->ship.quest.id = OTRGlobals::Instance->HasOriginal() ? QUEST_NORMAL : QUEST_MASTER; - - //RANDOTODO (ADD ITEMLOCATIONS TO GSAVECONTEXT) - } - - void Logic::NewSaveContext() { - if (mSaveContext != nullptr && mSaveContext != &gSaveContext) { - free(mSaveContext); - } - mSaveContext = new SaveContext(); - InitSaveContext(); - } - - uint8_t Logic::InventorySlot(uint32_t item) { - return gItemSlots[item]; - } - - uint32_t Logic::CurrentUpgrade(uint32_t upgrade) { - return (mSaveContext->inventory.upgrades & gUpgradeMasks[upgrade]) >> gUpgradeShifts[upgrade]; - } - - uint32_t Logic::CurrentInventory(uint32_t item) { - return mSaveContext->inventory.items[InventorySlot(item)]; - } - - void Logic::SetUpgrade(uint32_t upgrade, uint8_t level) { - mSaveContext->inventory.upgrades &= gUpgradeNegMasks[upgrade]; - mSaveContext->inventory.upgrades |= level << gUpgradeShifts[upgrade]; - } - - bool Logic::CheckInventory(uint32_t item, bool exact) { - auto current = mSaveContext->inventory.items[InventorySlot(item)]; - return exact ? (current == item) : (current != ITEM_NONE); - } - - void Logic::SetInventory(uint32_t itemSlot, uint32_t item) { - mSaveContext->inventory.items[InventorySlot(itemSlot)] = item; - } - - bool Logic::CheckEquipment(uint32_t equipFlag) { - return (equipFlag & mSaveContext->inventory.equipment); - } - - bool Logic::CheckQuestItem(uint32_t item) { - return ((1 << item) & mSaveContext->inventory.questItems); - } - - void Logic::SetQuestItem(uint32_t item, bool state) { - if (!state) { - mSaveContext->inventory.questItems &= ~(1 << item); - } else { - mSaveContext->inventory.questItems |= (1 << item); - } - } - - uint8_t Logic::GetSmallKeyCount(uint32_t dungeonIndex) { - return mSaveContext->inventory.dungeonKeys[dungeonIndex]; - } - - void Logic::SetSmallKeyCount(uint32_t dungeonIndex, uint8_t count) { - mSaveContext->inventory.dungeonKeys[dungeonIndex] = count; - } - - bool Logic::CheckDungeonItem(uint32_t item, uint32_t dungeonIndex) { - return mSaveContext->inventory.dungeonItems[dungeonIndex] & gBitFlags[item]; - } - - void Logic::SetDungeonItem(uint32_t item, uint32_t dungeonIndex, bool state) { - if (!state) { - mSaveContext->inventory.dungeonItems[dungeonIndex] &= ~gBitFlags[item]; - } else { - mSaveContext->inventory.dungeonItems[dungeonIndex] |= gBitFlags[item]; - } - } - - bool Logic::CheckRandoInf(uint32_t flag) { - return mSaveContext->ship.randomizerInf[flag >> 4] & (1 << (flag & 0xF)); - } - - void Logic::SetRandoInf(uint32_t flag, bool state) { - if (!state) { - mSaveContext->ship.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF)); - } else { - mSaveContext->ship.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); - } - } - - bool Logic::CheckEventChkInf(int32_t flag) { - return mSaveContext->eventChkInf[flag >> 4] & (1 << (flag & 0xF)); - } - - void Logic::SetEventChkInf(int32_t flag, bool state) { - if (!state) { - mSaveContext->eventChkInf[flag >> 4] &= ~(1 << (flag & 0xF)); - } else { - mSaveContext->eventChkInf[flag >> 4] |= (1 << (flag & 0xF)); - } - } - - uint8_t Logic::GetGSCount() { - return mSaveContext->inventory.gsTokens; - } - - uint8_t Logic::GetAmmo(uint32_t item) { - return mSaveContext->inventory.ammo[gItemSlots[item]]; - } - - void Logic::SetAmmo(uint32_t item, uint8_t count) { - mSaveContext->inventory.ammo[gItemSlots[item]] = count; - } - - void Logic::SetContext(std::shared_ptr _ctx) { - ctx = _ctx; - } - - bool Logic::GetInLogic(LogicVal logicVal) { - return inLogic[logicVal]; - } - - void Logic::SetInLogic(LogicVal logicVal, bool value) { - inLogic[logicVal] = value; - } - - void Logic::Reset() { +SaveContext* Logic::GetSaveContext() { + if (mSaveContext == nullptr) { NewSaveContext(); - StartPerformanceTimer(PT_LOGIC_RESET); - memset(inLogic, false, sizeof(inLogic)); - //Settings-dependent variables - IsKeysanity = ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || - ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || - ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE); - AmmoCanDrop = /*AmmoDrops.IsNot(AMMODROPS_NONE) TODO: AmmoDrop setting*/ true; + } + return mSaveContext; +} - //Child item logic - SkullMask = false; - MaskOfTruth = false; +void Logic::SetSaveContext(SaveContext* context) { + mSaveContext = context; +} - //Adult logic - FreedEpona = false; - //BigPoe = false; +void Logic::InitSaveContext() { + mSaveContext->totalDays = 0; + mSaveContext->bgsDayCount = 0; - //Trade Quest Events - WakeUpAdultTalon = false; + mSaveContext->deaths = 0; + for (int i = 0; i < ARRAY_COUNT(mSaveContext->playerName); i++) { + mSaveContext->playerName[i] = 0x3E; + } + mSaveContext->n64ddFlag = 0; + mSaveContext->healthCapacity = 0x30; + mSaveContext->health = 0x30; + mSaveContext->magicLevel = 0; + mSaveContext->magic = 0x30; + mSaveContext->rupees = 0; + mSaveContext->swordHealth = 0; + mSaveContext->naviTimer = 0; + mSaveContext->isMagicAcquired = 0; + mSaveContext->isDoubleMagicAcquired = 0; + mSaveContext->isDoubleDefenseAcquired = 0; + mSaveContext->bgsFlag = 0; + mSaveContext->ocarinaGameRoundNum = 0; + for (int button = 0; button < ARRAY_COUNT(mSaveContext->childEquips.buttonItems); button++) { + mSaveContext->childEquips.buttonItems[button] = ITEM_NONE; + } + for (int button = 0; button < ARRAY_COUNT(mSaveContext->childEquips.cButtonSlots); button++) { + mSaveContext->childEquips.cButtonSlots[button] = SLOT_NONE; + } + mSaveContext->childEquips.equipment = 0; + for (int button = 0; button < ARRAY_COUNT(mSaveContext->adultEquips.buttonItems); button++) { + mSaveContext->adultEquips.buttonItems[button] = ITEM_NONE; + } + for (int button = 0; button < ARRAY_COUNT(mSaveContext->adultEquips.cButtonSlots); button++) { + mSaveContext->adultEquips.cButtonSlots[button] = SLOT_NONE; + } + mSaveContext->adultEquips.equipment = 0; + mSaveContext->unk_54 = 0; + mSaveContext->savedSceneNum = SCENE_LINKS_HOUSE; - //Dungeon Clears - DekuTreeClear = false; - DodongosCavernClear = false; - JabuJabusBellyClear = false; - ForestTempleClear = false; - FireTempleClear = false; - WaterTempleClear = false; - SpiritTempleClear = false; - ShadowTempleClear = false; + // Equipment + for (int button = 0; button < ARRAY_COUNT(mSaveContext->equips.buttonItems); button++) { + mSaveContext->equips.buttonItems[button] = ITEM_NONE; + } + for (int button = 0; button < ARRAY_COUNT(mSaveContext->equips.cButtonSlots); button++) { + mSaveContext->equips.cButtonSlots[button] = SLOT_NONE; + } + mSaveContext->equips.equipment = 0; - //Trial Clears - ForestTrialClear = false; - FireTrialClear = false; - WaterTrialClear = false; - SpiritTrialClear = false; - ShadowTrialClear = false; - LightTrialClear = false; + // Inventory + for (int item = 0; item < ARRAY_COUNT(mSaveContext->inventory.items); item++) { + mSaveContext->inventory.items[item] = ITEM_NONE; + } + for (int ammo = 0; ammo < ARRAY_COUNT(mSaveContext->inventory.ammo); ammo++) { + mSaveContext->inventory.ammo[ammo] = 0; + } + mSaveContext->inventory.equipment = 0; + mSaveContext->inventory.upgrades = 0; + mSaveContext->inventory.questItems = 0; + for (int dungeon = 0; dungeon < ARRAY_COUNT(mSaveContext->inventory.dungeonItems); dungeon++) { + mSaveContext->inventory.dungeonItems[dungeon] = 0; + } + for (int dungeon = 0; dungeon < ARRAY_COUNT(mSaveContext->inventory.dungeonKeys); dungeon++) { + mSaveContext->inventory.dungeonKeys[dungeon] = 0x0; + } + mSaveContext->inventory.defenseHearts = 0; + mSaveContext->inventory.gsTokens = 0; + for (int scene = 0; scene < ARRAY_COUNT(mSaveContext->sceneFlags); scene++) { + mSaveContext->sceneFlags[scene].chest = 0; + mSaveContext->sceneFlags[scene].swch = 0; + mSaveContext->sceneFlags[scene].clear = 0; + mSaveContext->sceneFlags[scene].collect = 0; + mSaveContext->sceneFlags[scene].unk = 0; + mSaveContext->sceneFlags[scene].rooms = 0; + mSaveContext->sceneFlags[scene].floors = 0; + } + mSaveContext->fw.pos.x = 0; + mSaveContext->fw.pos.y = 0; + mSaveContext->fw.pos.z = 0; + mSaveContext->fw.yaw = 0; + mSaveContext->fw.playerParams = 0; + mSaveContext->fw.entranceIndex = 0; + mSaveContext->fw.roomIndex = 0; + mSaveContext->fw.set = 0; + mSaveContext->fw.tempSwchFlags = 0; + mSaveContext->fw.tempCollectFlags = 0; + for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->gsFlags); flag++) { + mSaveContext->gsFlags[flag] = 0; + } + for (int highscore = 0; highscore < ARRAY_COUNT(mSaveContext->highScores); highscore++) { + mSaveContext->highScores[highscore] = 0; + } + for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->eventChkInf); flag++) { + mSaveContext->eventChkInf[flag] = 0; + } + for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->itemGetInf); flag++) { + mSaveContext->itemGetInf[flag] = 0; + } + for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->infTable); flag++) { + mSaveContext->infTable[flag] = 0; + } + mSaveContext->worldMapAreaData = 0; + mSaveContext->scarecrowLongSongSet = 0; + for (int i = 0; i < ARRAY_COUNT(mSaveContext->scarecrowLongSong); i++) { + mSaveContext->scarecrowLongSong[i].noteIdx = 0; + mSaveContext->scarecrowLongSong[i].unk_01 = 0; + mSaveContext->scarecrowLongSong[i].unk_02 = 0; + mSaveContext->scarecrowLongSong[i].volume = 0; + mSaveContext->scarecrowLongSong[i].vibrato = 0; + mSaveContext->scarecrowLongSong[i].tone = 0; + mSaveContext->scarecrowLongSong[i].semitone = 0; + } + mSaveContext->scarecrowSpawnSongSet = 0; + for (int i = 0; i < ARRAY_COUNT(mSaveContext->scarecrowSpawnSong); i++) { + mSaveContext->scarecrowSpawnSong[i].noteIdx = 0; + mSaveContext->scarecrowSpawnSong[i].unk_01 = 0; + mSaveContext->scarecrowSpawnSong[i].unk_02 = 0; + mSaveContext->scarecrowSpawnSong[i].volume = 0; + mSaveContext->scarecrowSpawnSong[i].vibrato = 0; + mSaveContext->scarecrowSpawnSong[i].tone = 0; + mSaveContext->scarecrowSpawnSong[i].semitone = 0; + } - //Ocarina C Buttons + mSaveContext->horseData.scene = SCENE_HYRULE_FIELD; + mSaveContext->horseData.pos.x = -1840; + mSaveContext->horseData.pos.y = 72; + mSaveContext->horseData.pos.z = 5497; + mSaveContext->horseData.angle = -0x6AD9; + mSaveContext->magicLevel = 0; + mSaveContext->infTable[29] = 1; + mSaveContext->sceneFlags[5].swch = 0x40000000; + + // SoH specific + mSaveContext->ship.backupFW = mSaveContext->fw; + mSaveContext->ship.pendingSale = ITEM_NONE; + mSaveContext->ship.pendingSaleMod = MOD_NONE; + mSaveContext->ship.pendingIceTrapCount = 0; + + // Init with normal quest unless only an MQ rom is provided + mSaveContext->ship.quest.id = OTRGlobals::Instance->HasOriginal() ? QUEST_NORMAL : QUEST_MASTER; + + // RANDOTODO (ADD ITEMLOCATIONS TO GSAVECONTEXT) +} + +void Logic::NewSaveContext() { + if (mSaveContext != nullptr && mSaveContext != &gSaveContext) { + free(mSaveContext); + } + mSaveContext = new SaveContext(); + InitSaveContext(); +} + +uint8_t Logic::InventorySlot(uint32_t item) { + return gItemSlots[item]; +} + +uint32_t Logic::CurrentUpgrade(uint32_t upgrade) { + return (mSaveContext->inventory.upgrades & gUpgradeMasks[upgrade]) >> gUpgradeShifts[upgrade]; +} + +uint32_t Logic::CurrentInventory(uint32_t item) { + return mSaveContext->inventory.items[InventorySlot(item)]; +} + +void Logic::SetUpgrade(uint32_t upgrade, uint8_t level) { + mSaveContext->inventory.upgrades &= gUpgradeNegMasks[upgrade]; + mSaveContext->inventory.upgrades |= level << gUpgradeShifts[upgrade]; +} + +bool Logic::CheckInventory(uint32_t item, bool exact) { + auto current = mSaveContext->inventory.items[InventorySlot(item)]; + return exact ? (current == item) : (current != ITEM_NONE); +} + +void Logic::SetInventory(uint32_t itemSlot, uint32_t item) { + mSaveContext->inventory.items[InventorySlot(itemSlot)] = item; +} + +bool Logic::CheckEquipment(uint32_t equipFlag) { + return (equipFlag & mSaveContext->inventory.equipment); +} + +bool Logic::CheckQuestItem(uint32_t item) { + return ((1 << item) & mSaveContext->inventory.questItems); +} + +void Logic::SetQuestItem(uint32_t item, bool state) { + if (!state) { + mSaveContext->inventory.questItems &= ~(1 << item); + } else { + mSaveContext->inventory.questItems |= (1 << item); + } +} + +// Get the swch bit positions for the dungeon +const std::vector& GetDungeonSmallKeyDoors(SceneID sceneId) { + static const std::vector emptyVector; + + auto dungeonInfo = Rando::Context::GetInstance()->GetDungeons()->GetDungeonFromScene(sceneId); + if (dungeonInfo == nullptr) { + return emptyVector; + } + + bool masterQuest = dungeonInfo->IsMQ(); + + // Create a unique key for the dungeon and master quest + uint8_t key = sceneId | (masterQuest << 7); + + static std::unordered_map> dungeonSmallKeyDoors; + auto foundEntry = dungeonSmallKeyDoors.find(key); + if (foundEntry != dungeonSmallKeyDoors.end()) { + return foundEntry->second; + } + dungeonSmallKeyDoors[key] = {}; + + // Get the scene path + SceneTableEntry* sceneTableEntry = &gSceneTable[sceneId]; + std::string scenePath = + StringHelper::Sprintf("scenes/%s/%s/%s", masterQuest ? "mq" : "nonmq", sceneTableEntry->sceneFile.fileName, + sceneTableEntry->sceneFile.fileName); + + // Load the scene + std::shared_ptr scene = std::dynamic_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResource(scenePath)); + if (scene == nullptr) { + return emptyVector; + } + + // Find the SetTransitionActorList command + std::shared_ptr transitionActorListCommand = nullptr; + for (auto& command : scene->commands) { + if (command->cmdId == SOH::SceneCommandID::SetTransitionActorList) { + transitionActorListCommand = std::dynamic_pointer_cast(command); + break; + } + } + if (transitionActorListCommand == nullptr) { + return emptyVector; + } + + // Find the bit position for the small key doors + for (auto& transitionActor : transitionActorListCommand->transitionActorList) { + if (transitionActor.id == ACTOR_EN_DOOR) { + uint8_t doorType = (transitionActor.params >> 7) & 7; + if (doorType == DOOR_LOCKED) { + dungeonSmallKeyDoors[key].emplace_back(transitionActor.params & 0x3F); + } + } else if (transitionActor.id == ACTOR_DOOR_SHUTTER) { + uint8_t doorType = (transitionActor.params >> 7) & 15; + if (doorType == SHUTTER_BACK_LOCKED || doorType == SHUTTER_BOSS || doorType == SHUTTER_KEY_LOCKED) { + dungeonSmallKeyDoors[key].emplace_back(transitionActor.params & 0x3F); + } + } + } + + return dungeonSmallKeyDoors[key]; +} + +int8_t Logic::GetUsedSmallKeyCount(SceneID sceneId) { + const auto& smallKeyDoors = GetDungeonSmallKeyDoors(sceneId); + + // Get the swch value for the scene + uint32_t swch; + if (gPlayState != nullptr && gPlayState->sceneNum == sceneId) { + swch = gPlayState->actorCtx.flags.swch; + } else { + swch = mSaveContext->sceneFlags[sceneId].swch; + } + + // Count the number of small keys doors unlocked + int8_t unlockedSmallKeyDoors = 0; + for (auto& smallKeyDoor : smallKeyDoors) { + unlockedSmallKeyDoors += swch >> smallKeyDoor & 1; + } + + // RANDOTODO: Account for MQ Water trick that causes the basement lock to unlock when the player clears the stalfos + // pit. + return unlockedSmallKeyDoors; +} + +uint8_t Logic::GetSmallKeyCount(uint32_t dungeonIndex) { + int8_t dungeonKeys = mSaveContext->inventory.dungeonKeys[dungeonIndex]; + if (dungeonKeys == -1) { + // never got keys, so can't have used keys + return 0; + } + return dungeonKeys + GetUsedSmallKeyCount(SceneID(dungeonIndex)); +} + +void Logic::SetSmallKeyCount(uint32_t dungeonIndex, uint8_t count) { + mSaveContext->inventory.dungeonKeys[dungeonIndex] = count; +} + +bool Logic::CheckDungeonItem(uint32_t item, uint32_t dungeonIndex) { + return mSaveContext->inventory.dungeonItems[dungeonIndex] & gBitFlags[item]; +} + +void Logic::SetDungeonItem(uint32_t item, uint32_t dungeonIndex, bool state) { + if (!state) { + mSaveContext->inventory.dungeonItems[dungeonIndex] &= ~gBitFlags[item]; + } else { + mSaveContext->inventory.dungeonItems[dungeonIndex] |= gBitFlags[item]; + } +} + +bool Logic::CheckRandoInf(uint32_t flag) { + return mSaveContext->ship.randomizerInf[flag >> 4] & (1 << (flag & 0xF)); +} + +void Logic::SetRandoInf(uint32_t flag, bool state) { + if (!state) { + mSaveContext->ship.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF)); + } else { + mSaveContext->ship.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); + } +} + +bool Logic::CheckEventChkInf(int32_t flag) { + return mSaveContext->eventChkInf[flag >> 4] & (1 << (flag & 0xF)); +} + +void Logic::SetEventChkInf(int32_t flag, bool state) { + if (!state) { + mSaveContext->eventChkInf[flag >> 4] &= ~(1 << (flag & 0xF)); + } else { + mSaveContext->eventChkInf[flag >> 4] |= (1 << (flag & 0xF)); + } +} + +uint8_t Logic::GetGSCount() { + return static_cast(mSaveContext->inventory.gsTokens); +} + +uint8_t Logic::GetAmmo(uint32_t item) { + return mSaveContext->inventory.ammo[gItemSlots[item]]; +} + +void Logic::SetAmmo(uint32_t item, uint8_t count) { + mSaveContext->inventory.ammo[gItemSlots[item]] = count; +} + +void Logic::SetContext(std::shared_ptr _ctx) { + ctx = _ctx; +} + +bool Logic::GetInLogic(LogicVal logicVal) { + return inLogic[logicVal]; +} + +void Logic::SetInLogic(LogicVal logicVal, bool value) { + inLogic[logicVal] = value; +} + +void Logic::Reset(bool resetSaveContext /*= true*/) { + if (resetSaveContext) { + NewSaveContext(); + } + StartPerformanceTimer(PT_LOGIC_RESET); + memset(inLogic, false, sizeof(inLogic)); + // Settings-dependent variables + IsFireLoopLocked = ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || + ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD) || + ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON); + + // AmmoCanDrop = /*AmmoDrops.IsNot(AMMODROPS_NONE)*/ false; TODO: AmmoDrop setting + + // Child item logic + SkullMask = false; + MaskOfTruth = false; + + // Adult logic + FreedEpona = false; + // BigPoe = false; + + // Trade Quest Events + WakeUpAdultTalon = false; + + // Dungeon Clears + DekuTreeClear = false; + DodongosCavernClear = false; + JabuJabusBellyClear = false; + ForestTempleClear = false; + FireTempleClear = false; + WaterTempleClear = false; + SpiritTempleClear = false; + ShadowTempleClear = false; + + // Trial Clears + ForestTrialClear = false; + FireTrialClear = false; + WaterTrialClear = false; + SpiritTrialClear = false; + ShadowTrialClear = false; + LightTrialClear = false; + + if (resetSaveContext) { + // Ocarina C Buttons bool ocBtnShuffle = ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS).Is(true); SetRandoInf(RAND_INF_HAS_OCARINA_A, !ocBtnShuffle); SetRandoInf(RAND_INF_HAS_OCARINA_C_UP, !ocBtnShuffle); @@ -2202,145 +2388,153 @@ namespace Rando { SetRandoInf(RAND_INF_HAS_OCARINA_C_LEFT, !ocBtnShuffle); SetRandoInf(RAND_INF_HAS_OCARINA_C_RIGHT, !ocBtnShuffle); - //Progressive Items + // Progressive Items SetUpgrade(UPG_STICKS, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG).Is(true) ? 0 : 1); SetUpgrade(UPG_NUTS, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG).Is(true) ? 0 : 1); - //If we're not shuffling swim, we start with it + // If we're not shuffling swim, we start with it if (ctx->GetOption(RSK_SHUFFLE_SWIM).Is(false)) { SetRandoInf(RAND_INF_CAN_SWIM, true); } - //If we're not shuffling child's wallet, we start with it + // If we're not shuffling child's wallet, we start with it if (ctx->GetOption(RSK_SHUFFLE_CHILD_WALLET).Is(false)) { SetRandoInf(RAND_INF_HAS_WALLET, true); } - //If we're not shuffling fishing pole, we start with it + // If we're not shuffling fishing pole, we start with it if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE).Is(false)) { SetRandoInf(RAND_INF_FISHING_POLE_FOUND, true); } - //If not keysanity, start with 1 logical key to account for automatically unlocking the basement door in vanilla FiT - if (!IsKeysanity && ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla()) { + // If not keysanity, start with 1 logical key to account for automatically unlocking the basement door in + // vanilla FiT + if (!IsFireLoopLocked && ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla()) { SetSmallKeyCount(SCENE_FIRE_TEMPLE, 1); } - - //Bottle Count - Bottles = 0; - NumBottles = 0; - CanEmptyBigPoes = false; - - //Drops and Bottle Contents Access - NutPot = false; - NutCrate = false; - DekuBabaNuts = false; - StickPot = false; - DekuBabaSticks = false; - BugShrub = false; - WanderingBugs = false; - BugRock = false; - BlueFireAccess = false; - FishGroup = false; - LoneFish = false; - GossipStoneFairy = false; - BeanPlantFairy = false; - ButterflyFairy = false; - FairyPot = false; - FreeFairies = false; - FairyPond = false; - - PieceOfHeart = 0; - HeartContainer = 0; - - /* --- HELPERS, EVENTS, AND LOCATION ACCESS --- */ - /* These are used to simplify reading the logic, but need to be updated - / every time a base value is updated. */ - - ChildScarecrow = false; - AdultScarecrow = false; - - CouldPlayBowling = false; - IsChild = false; - IsAdult = false; - //CanPlantBean = false; - BigPoeKill = false; - BigPoes = 0; - - BaseHearts = ctx->GetOption(RSK_STARTING_HEARTS).Get() + 1; - - - //Bridge Requirements - BuiltRainbowBridge = false; - - //Other - AtDay = false; - AtNight = false; - GetSaveContext()->linkAge = !ctx->GetOption(RSK_SELECTED_STARTING_AGE).Get(); - - //Events - ShowedMidoSwordAndShield = false; - CarpenterRescue = false; - GF_GateOpen = false; - GtG_GateOpen = false; - DampesWindmillAccess = false; - DrainWell = false; - GoronCityChildFire = false; - GCWoodsWarpOpen = false; - GCDaruniasDoorOpenChild = false; - StopGCRollingGoronAsAdult = false; - CanWaterTempleLowFromHigh = false; - CanWaterTempleLowFromMid = false; - CanWaterTempleMiddle = false; - CanWaterTempleHigh = false; - KakarikoVillageGateOpen = false; - KingZoraThawed = false; - ForestTempleJoelle = false; - ForestTempleBeth = false; - ForestTempleAmy = false; - ForestTempleMeg = false; - FireLoopSwitch = false; - LinksCow = false; - DeliverLetter = false; - ClearMQDCUpperLobbyRocks = false; - LoweredWaterInsideBotw = false; - OpenedWestRoomMQBotw = false; - OpenedMiddleHoleMQBotw = false; - BrokeDeku1FWeb = false; - ClearedMQDekuSERoom = false; - MQDekuWaterRoomTorches = false; - PushedDekuBasementBlock = false; - OpenedLowestGoronCage = false; - OpenedUpperFireShortcut = false; - HitFireTemplePlatform = false; - OpenedFireMQFireMazeDoor = false; - MQForestBlockRoomTargets = false; - ForestCanTwistHallway = false; - ForestClearBelowBowChest = false; - ForestOpenBossCorridor = false; - ShadowTrialFirstChest = false; - MQGTGMazeSwitch = false; - GTGPlatformSilverRupees = false; - MQJabuHolesRoomDoor = false; - JabuWestTentacle = false; - JabuEastTentacle = false; - JabuNorthTentacle = false; - LoweredJabuPath = false; - MQJabuLiftRoomCow = false; - MQShadowFloorSpikeRupees = false; - ShadowShortcutBlock = false; - MQWaterStalfosPit = false; - MQWaterDragonTorches = false; - MQWaterB1Switch = false; - //MQWaterPillarSoTBlock = false; - MQWaterOpenedPillarB1 = false; - MQSpiritCrawlBoulder = false; - MQSpiritMapRoomEnemies = false; - MQSpirit3SunsEnemies = false; - Spirit1FSilverRupees = false; - JabuRutoInB1 = false; - JabuRutoIn1F = false; - - StopPerformanceTimer(PT_LOGIC_RESET); } + + // Bottle Count + Bottles = 0; + NumBottles = 0; + CanEmptyBigPoes = false; + + // Drops and Bottle Contents Access + NutPot = false; + NutCrate = false; + DekuBabaNuts = false; + StickPot = false; + DekuBabaSticks = false; + BugShrub = false; + WanderingBugs = false; + BugRock = false; + BlueFireAccess = false; + FishGroup = false; + LoneFish = false; + GossipStoneFairy = false; + BeanPlantFairy = false; + ButterflyFairy = false; + FairyPot = false; + FreeFairies = false; + FairyPond = false; + + PieceOfHeart = 0; + HeartContainer = 0; + + /* --- HELPERS, EVENTS, AND LOCATION ACCESS --- */ + /* These are used to simplify reading the logic, but need to be updated + / every time a base value is updated. */ + + ChildScarecrow = false; + AdultScarecrow = false; + + CouldPlayBowling = false; + IsChild = false; + IsAdult = false; + // CanPlantBean = false; + BigPoeKill = false; + BigPoes = 0; + + BaseHearts = ctx->GetOption(RSK_STARTING_HEARTS).Get() + 1; + + // Bridge Requirements + BuiltRainbowBridge = false; + + // Other + AtDay = false; + AtNight = false; + if (resetSaveContext) { + GetSaveContext()->linkAge = !ctx->GetOption(RSK_SELECTED_STARTING_AGE).Get(); + } + + // Events + ShowedMidoSwordAndShield = false; + THCouldFree1TorchCarpenter = false; + THCouldFreeDoubleCellCarpenter = false; + TH_CouldFreeDeadEndCarpenter = false; + THCouldRescueSlopeCarpenter = false; + GF_GateOpen = false; + GtG_GateOpen = false; + DampesWindmillAccess = false; + DrainWell = false; + GoronCityChildFire = false; + GCWoodsWarpOpen = false; + GCDaruniasDoorOpenChild = false; + StopGCRollingGoronAsAdult = false; + CanWaterTempleLowFromHigh = false; + CanWaterTempleLowFromMid = false; + CanWaterTempleMiddle = false; + CanWaterTempleHigh = false; + KakarikoVillageGateOpen = false; + KingZoraThawed = false; + ForestTempleJoelle = false; + ForestTempleBeth = false; + ForestTempleAmy = false; + ForestTempleMeg = false; + FireLoopSwitch = false; + LinksCow = false; + DeliverLetter = false; + ClearMQDCUpperLobbyRocks = false; + LoweredWaterInsideBotw = false; + OpenedWestRoomMQBotw = false; + OpenedMiddleHoleMQBotw = false; + BrokeDeku1FWeb = false; + ClearedMQDekuSERoom = false; + MQDekuWaterRoomTorches = false; + PushedDekuBasementBlock = false; + OpenedLowestGoronCage = false; + OpenedUpperFireShortcut = false; + HitFireTemplePlatform = false; + OpenedFireMQFireMazeDoor = false; + MQForestBlockRoomTargets = false; + ForestCanTwistHallway = false; + ForestClearBelowBowChest = false; + ForestOpenBossCorridor = false; + ShadowTrialFirstChest = false; + MQGTGMazeSwitch = false; + MQGTGRightSideSwitch = false; + GTGPlatformSilverRupees = false; + MQJabuHolesRoomDoor = false; + JabuWestTentacle = false; + JabuEastTentacle = false; + JabuNorthTentacle = false; + LoweredJabuPath = false; + MQJabuLiftRoomCow = false; + MQShadowFloorSpikeRupees = false; + ShadowShortcutBlock = false; + MQWaterStalfosPit = false; + MQWaterDragonTorches = false; + MQWaterB1Switch = false; + // MQWaterPillarSoTBlock = false; + MQWaterOpenedPillarB1 = false; + MQSpiritCrawlBoulder = false; + MQSpiritMapRoomEnemies = false; + MQSpirit3SunsEnemies = false; + Spirit1FSilverRupees = false; + JabuRutoIn1F = false; + + CalculatingAvailableChecks = false; + + StopPerformanceTimer(PT_LOGIC_RESET); } +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 4286cc5c36..ba9ab60d0b 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -59,15 +59,13 @@ class Logic { bool LightTrialClear = false; // Logical keysanity - bool IsKeysanity = false; + bool IsFireLoopLocked = false; // Bottle Count uint8_t Bottles = 0; uint8_t NumBottles = 0; - //this event covers if the player can currently empty big poes in logic + // this event covers if the player can currently empty big poes in logic bool CanEmptyBigPoes = false; - //this check covers if the generation has confirmed that it's possible to empty big poes if needed as adult - bool CouldEmptyBigPoes = true; // Drops and Bottle Contents Access bool NutPot = false; @@ -87,7 +85,7 @@ class Logic { bool FairyPot = false; bool FreeFairies = false; bool FairyPond = false; - bool AmmoCanDrop = false; + bool AmmoCanDrop = true; uint8_t PieceOfHeart = 0; uint8_t HeartContainer = 0; @@ -112,7 +110,11 @@ class Logic { // Events bool ShowedMidoSwordAndShield = false; - bool CarpenterRescue = false; + bool THCouldFree1TorchCarpenter = false; + bool THCouldFreeDoubleCellCarpenter = false; + bool TH_CouldFreeDeadEndCarpenter = false; + bool THCouldRescueSlopeCarpenter = false; + bool THRescuedAllCarpenters = false; bool GF_GateOpen = false; bool GtG_GateOpen = false; bool DampesWindmillAccess = false; @@ -151,7 +153,7 @@ class Logic { bool OpenedFireMQFireMazeDoor = false; bool MQForestBlockRoomTargets = false; bool ForestCanTwistHallway = false; - bool ForestClearBelowBowChest = false; //a better name that covers both versions would be nice + bool ForestClearBelowBowChest = false; // a better name that covers both versions would be nice bool ForestOpenBossCorridor = false; bool ShadowTrialFirstChest = false; bool MQGTGMazeSwitch = false; @@ -168,18 +170,20 @@ class Logic { bool MQWaterStalfosPit = false; bool MQWaterDragonTorches = false; bool MQWaterB1Switch = false; - //bool MQWaterPillarSoTBlock = false; should be irrelevant. SHOULD. + // bool MQWaterPillarSoTBlock = false; should be irrelevant. SHOULD. bool MQWaterOpenedPillarB1 = false; bool MQSpiritCrawlBoulder = false; bool MQSpiritMapRoomEnemies = false; bool MQSpiritTimeTravelChest = false; bool MQSpirit3SunsEnemies = false; bool Spirit1FSilverRupees = false; - bool JabuRutoInB1 = false; bool JabuRutoIn1F = false; /* --- END OF HELPERS AND LOCATION ACCESS --- */ + bool CalculatingAvailableChecks = false; + bool ACProcessUndiscoveredExits = false; + SaveContext* mSaveContext = nullptr; Logic(); bool CanUse(RandomizerGet itemName); @@ -189,9 +193,11 @@ class Logic { bool CanOpenOverworldDoor(RandomizerGet itemName); bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmount); bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched); + bool CanOpenUnderwaterChest(); bool CanDoGlitch(GlitchType glitch); bool CanEquipSwap(RandomizerGet itemName); - bool CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance = ED_CLOSE, bool wallOrFloor = true, uint8_t quantity = 1, bool timer = false, bool inWater = false); + bool CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance = ED_CLOSE, bool wallOrFloor = true, + uint8_t quantity = 1, bool timer = false, bool inWater = false); bool CanPassEnemy(RandomizerEnemy enemy, EnemyDistance distance = ED_CLOSE, bool wallOrFloor = true); bool CanAvoidEnemy(RandomizerEnemy enemy, bool grounded = false, uint8_t quantity = 1); bool CanGetEnemyDrop(RandomizerEnemy enemy, EnemyDistance distance = ED_CLOSE, bool aboveLink = false); @@ -205,6 +211,7 @@ class Logic { uint8_t BottleCount(); uint8_t OcarinaButtons(); bool HasBottle(); + bool CanUseSword(); bool CanJumpslashExceptHammer(); bool CanJumpslash(); bool CanHitSwitch(EnemyDistance distance = ED_CLOSE, bool inWater = false); @@ -238,16 +245,17 @@ class Logic { bool CanBreakUpperBeehives(); bool CanBreakLowerBeehives(); bool CanBreakPots(); + bool CanBreakCrates(); + bool CanBreakSmallCrates(); bool HasFireSource(); bool HasFireSourceWithTorch(); bool TradeQuestStep(RandomizerGet rg); - bool CanFinishGerudoFortress(); bool CanStandingShield(); bool CanShield(); bool CanUseProjectile(); bool CanBuildRainbowBridge(); bool CanTriggerLACS(); - void Reset(); + void Reset(bool resetSaveContext = true); void SetContext(std::shared_ptr _ctx); bool GetInLogic(LogicVal logicVal); void SetInLogic(LogicVal logicVal, bool remove); @@ -261,6 +269,7 @@ class Logic { bool CheckEquipment(uint32_t item); bool CheckQuestItem(uint32_t item); void SetQuestItem(uint32_t item, bool state); + int8_t GetUsedSmallKeyCount(SceneID sceneId); uint8_t GetSmallKeyCount(uint32_t dungeonIndex); void SetSmallKeyCount(uint32_t dungeonIndex, uint8_t count); bool CheckDungeonItem(uint32_t item, uint32_t dungeonIndex); diff --git a/soh/soh/Enhancements/randomizer/option.cpp b/soh/soh/Enhancements/randomizer/option.cpp index e032d1a2d4..f027fd0668 100644 --- a/soh/soh/Enhancements/randomizer/option.cpp +++ b/soh/soh/Enhancements/randomizer/option.cpp @@ -2,35 +2,38 @@ #include "libultraship/bridge.h" #include #include +#include "soh/SohGui/SohGui.hpp" #include "soh/SohGui/UIWidgets.hpp" +#include namespace Rando { Option Option::Bool(RandomizerSettingKey key_, std::string name_, std::vector options_, const OptionCategory category_, std::string cvarName_, std::string description_, WidgetType widgetType_, const uint8_t defaultOption_, const bool defaultHidden_, int imFlags_) { - return {static_cast(key_), std::move(name_), std::move(options_), category_, - std::move(cvarName_), std::move(description_), widgetType_, defaultOption_, defaultHidden_, imFlags_}; + return { static_cast(key_), std::move(name_), std::move(options_), category_, std::move(cvarName_), + std::move(description_), widgetType_, defaultOption_, defaultHidden_, imFlags_ }; } Option Option::Bool(RandomizerSettingKey key_, std::string name_, std::string cvarName_, std::string description_, const int imFlags_, const WidgetType widgetType_, const bool defaultOption_) { - return Option(key_, std::move(name_), {"Off", "On"}, OptionCategory::Setting, std::move(cvarName_), + return Option(key_, std::move(name_), { "Off", "On" }, OptionCategory::Setting, std::move(cvarName_), std::move(description_), widgetType_, defaultOption_, false, imFlags_); } Option Option::U8(RandomizerSettingKey key_, std::string name_, std::vector options_, const OptionCategory category_, std::string cvarName_, std::string description_, WidgetType widgetType_, const uint8_t defaultOption_, const bool defaultHidden_, int imFlags_) { - return {static_cast(key_), std::move(name_), std::move(options_), category_, std::move(cvarName_), - std::move(description_), widgetType_, defaultOption_, defaultHidden_, imFlags_}; + return { static_cast(key_), std::move(name_), std::move(options_), category_, std::move(cvarName_), + std::move(description_), widgetType_, defaultOption_, defaultHidden_, imFlags_ }; } Option Option::LogicTrick(RandomizerTrick rt_, std::string name_) { - return Option(rt_, std::move(name_), { "Disabled", "Enabled" }, OptionCategory::Setting, "", - "", WidgetType::Checkbox, 0, false, IMFLAG_NONE); + return Option(rt_, std::move(name_), { "Disabled", "Enabled" }, OptionCategory::Setting, "", "", + WidgetType::Checkbox, 0, false, IMFLAG_NONE); } -OptionValue::OptionValue(uint8_t val) : mVal(val) {} +OptionValue::OptionValue(uint8_t val) : mVal(val) { +} uint8_t OptionValue::Get() { return mVal; @@ -60,8 +63,8 @@ const std::string& Option::GetDescription() const { return description; } -uint8_t Option::GetMenuOptionIndex() const { - return menuSelection; +uint8_t Option::GetOptionIndex() const { + return CVarGetInteger(cvarName.c_str(), defaultOption); } const std::string& Option::GetOptionText(size_t index) const { @@ -72,18 +75,6 @@ const std::string& Option::GetCVarName() const { return cvarName; } -void Option::SaveCVar() const { - if (!cvarName.empty()) { - CVarSetInteger(cvarName.c_str(), GetMenuOptionIndex()); - } -} - -void Option::SetFromCVar() { - if (!cvarName.empty()) { - SetMenuIndex(CVarGetInteger(cvarName.c_str(), defaultOption)); - } -} - void Option::SetDelayedOption() { delayedSelection = contextSelection; } @@ -92,18 +83,11 @@ void Option::RestoreDelayedOption() { contextSelection = delayedSelection; } -void Option::SetMenuIndex(size_t idx) { - menuSelection = idx; - if (menuSelection > options.size() - 1) { - menuSelection = options.size() - 1; - } -} - -void Option::SetContextIndex(size_t idx) { +void Option::SetContextIndex(uint8_t idx) { // TODO: Set to Context's OptionValue array. contextSelection = idx; - if (contextSelection > options.size() - 1) { - contextSelection = options.size() - 1; + if (contextSelection > static_cast(options.size() - 1)) { + contextSelection = static_cast(options.size() - 1); } } @@ -120,8 +104,8 @@ bool Option::IsHidden() const { } void Option::ChangeOptions(std::vector opts) { - if (menuSelection >= opts.size()) { - menuSelection = opts.size() - 1; + if (GetOptionIndex() >= opts.size()) { + CVarSetInteger(cvarName.c_str(), static_cast(opts.size() - 1)); } options = std::move(opts); } @@ -130,11 +114,10 @@ void Option::Enable() { disabled = false; } -void Option::Disable(std::string text, const UIWidgets::CheckboxGraphics graphic) { - if (!disabled || disabledText != text || disabledGraphic != graphic) { +void Option::Disable(std::string text) { + if (!disabled || disabledText != text) { disabled = true; disabledText = std::move(text); - disabledGraphic = graphic; } } @@ -149,9 +132,6 @@ bool Option::RenderImGui() { case WidgetType::Checkbox: changed = RenderCheckbox(); break; - case WidgetType::TristateCheckbox: - changed = RenderTristateCheckbox(); - break; case WidgetType::Combobox: changed = RenderCombobox(); break; @@ -159,7 +139,6 @@ bool Option::RenderImGui() { changed = RenderSlider(); break; } - UIWidgets::Spacer(0); ImGui::EndGroup(); return changed; } @@ -191,7 +170,7 @@ uint8_t Option::GetValueFromText(const std::string text) { } void Option::SetContextIndexFromText(const std::string text) { - if (optionsTextToVar.contains(text)){ + if (optionsTextToVar.contains(text)) { SetContextIndex(optionsTextToVar[text]); } else { SPDLOG_ERROR("Option {} does not have a var named {}.", name, text); @@ -205,130 +184,67 @@ Option::Option(size_t key_, std::string name_, std::vector options_ : key(key_), name(std::move(name_)), options(std::move(options_)), category(category_), cvarName(std::move(cvarName_)), description(std::move(description_)), widgetType(widgetType_), defaultOption(defaultOption_), defaultHidden(defaultHidden_), imFlags(imFlags_) { - menuSelection = contextSelection = defaultOption; + contextSelection = defaultOption; hidden = defaultHidden; PopulateTextToNum(); - SetFromCVar(); } bool Option::RenderCheckbox() { bool changed = false; - if (disabled) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } bool val = static_cast(CVarGetInteger(cvarName.c_str(), defaultOption)); - if (CustomCheckbox(name.c_str(), &val, disabled, disabledGraphic)) { + UIWidgets::CheckboxOptions widgetOptions = static_cast( + UIWidgets::CheckboxOptions().Color(THEME_COLOR).Tooltip(description.c_str())); + widgetOptions.disabled = disabled; + if (UIWidgets::Checkbox(name.c_str(), &val, widgetOptions)) { CVarSetInteger(cvarName.c_str(), val); changed = true; Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - if (!description.empty()) { - UIWidgets::InsertHelpHoverText(description.c_str()); - } - if (disabled) { - UIWidgets::ReEnableComponent(disabledText.c_str()); - } - return changed; -} - -bool Option::RenderTristateCheckbox() { - bool changed = false; - if (disabled) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - int val = CVarGetInteger(cvarName.c_str(), defaultOption); - if (CustomCheckboxTristate(name.c_str(), &val, disabled, disabledGraphic)) { - CVarSetInteger(cvarName.c_str(), val); - changed = true; - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - if (!description.empty()) { - UIWidgets::InsertHelpHoverText(description.c_str()); - } - if (disabled) { - UIWidgets::ReEnableComponent(disabledText.c_str()); - } return changed; } bool Option::RenderCombobox() { bool changed = false; - if (disabled) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - ImGui::Text("%s", name.c_str()); uint8_t selected = CVarGetInteger(cvarName.c_str(), defaultOption); - if (selected >= options.size()) { - selected = options.size(); + if (selected >= static_cast(options.size())) { + selected = static_cast(options.size()); CVarSetInteger(cvarName.c_str(), selected); changed = true; Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - if (!description.empty()) { - UIWidgets::InsertHelpHoverText(description.c_str()); + UIWidgets::ComboboxOptions widgetOptions = + UIWidgets::ComboboxOptions().Color(THEME_COLOR).Tooltip(description.c_str()); + if (this->GetKey() == RSK_LOGIC_RULES) { + widgetOptions = widgetOptions.LabelPosition(UIWidgets::LabelPositions::None) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right); } - const std::string comboName = std::string("##") + std::string(cvarName); - if (ImGui::BeginCombo(comboName.c_str(), options[selected].c_str())) { - for (size_t i = 0; i < options.size(); i++) { - if (!options[i].empty()) { - if (ImGui::Selectable(options[i].c_str(), i == selected)) { - CVarSetInteger(cvarName.c_str(), static_cast(i)); - changed = true; - selected = i; - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - } - } - ImGui::EndCombo(); - } - if (disabled) { - UIWidgets::ReEnableComponent(disabledText.c_str()); + widgetOptions.disabled = disabled; + if (UIWidgets::Combobox(name.c_str(), &selected, options, widgetOptions)) { + CVarSetInteger(cvarName.c_str(), static_cast(selected)); + changed = true; + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } return changed; } bool Option::RenderSlider() { bool changed = false; - int val = GetMenuOptionIndex(); + int val = CVarGetInteger(cvarName.c_str(), defaultOption); if (val > options.size() - 1) { - val = options.size() - 1; - CVarSetInteger(cvarName.c_str(), val); + val = static_cast(options.size()) - 1; changed = true; } - if (disabled) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - const std::string formatName = name + ": %s"; - ImGui::Text(formatName.c_str(), options[val].c_str()); - if (!description.empty()) { - UIWidgets::InsertHelpHoverText(description.c_str()); - } - UIWidgets::Spacer(0); - ImGui::BeginGroup(); - const std::string MinusBTNName = " - ##" + cvarName; - if (ImGui::Button(MinusBTNName.c_str())) { - val--; + UIWidgets::IntSliderOptions widgetOptions = UIWidgets::IntSliderOptions() + .Color(THEME_COLOR) + .Min(0) + .Max(static_cast(options.size() - 1)) + .Tooltip(description.c_str()) + .Format(options[val].c_str()) + .DefaultValue(defaultOption); + widgetOptions.disabled = disabled; + if (UIWidgets::SliderInt(name.c_str(), &val, widgetOptions)) { changed = true; } - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - ImGui::PushItemWidth(std::min(ImGui::GetContentRegionAvail().x - 30.0f, 260.0f)); - const std::string id = "##Slider" + cvarName; - if (ImGui::SliderInt(id.c_str(), &val, 0, static_cast(options.size()) - 1, "", ImGuiSliderFlags_AlwaysClamp)) { - changed = true; - } - ImGui::PopItemWidth(); - const std::string PlusBTNName = " + ##" + cvarName; - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - if (ImGui::Button(PlusBTNName.c_str())) { - val++; - changed = true; - } - ImGui::EndGroup(); - if (disabled) { - UIWidgets::ReEnableComponent(disabledText.c_str()); - } if (val < 0) { val = 0; changed = true; @@ -339,33 +255,36 @@ bool Option::RenderSlider() { } if (changed) { CVarSetInteger(cvarName.c_str(), val); - SetFromCVar(); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } return changed; } -void Option::PopulateTextToNum(){ - for (uint8_t count = 0; count < options.size(); count++){ +void Option::PopulateTextToNum() { + for (uint8_t count = 0; count < options.size(); count++) { optionsTextToVar[options[count]] = count; } } -LocationOption::LocationOption(RandomizerCheck key_, const std::string& name_) : - Option(key_, name_, {"Included", "Excluded"}, OptionCategory::Setting, "", "", WidgetType::Checkbox, - RO_LOCATION_INCLUDE, false, IMFLAG_NONE) {} +LocationOption::LocationOption(RandomizerCheck key_, const std::string& name_) + : Option(key_, name_, { "Included", "Excluded" }, OptionCategory::Setting, "", "", WidgetType::Checkbox, + RO_LOCATION_INCLUDE, false, IMFLAG_NONE) { +} RandomizerCheck LocationOption::GetKey() const { return static_cast(key); } -TrickOption::TrickOption(RandomizerTrick key_, const RandomizerCheckQuest quest_, const RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_) : - Option(key_, name_, {"Disabled", "Enabled"}, OptionCategory::Setting, "", - std::move(description_), WidgetType::Checkbox, 0, false, IMFLAG_NONE), - mQuest(quest_), mArea(area_), mTags(std::move(tags_)) {} +TrickOption::TrickOption(RandomizerTrick key_, const RandomizerCheckQuest quest_, const RandomizerArea area_, + std::set tags_, const std::string& name_, std::string description_) + : Option(key_, name_, { "Disabled", "Enabled" }, OptionCategory::Setting, "", std::move(description_), + WidgetType::Checkbox, 0, false, IMFLAG_NONE), + mQuest(quest_), mArea(area_), mTags(std::move(tags_)) { +} -TrickOption TrickOption::LogicTrick(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_) { - return {key_, quest_, area_, std::move(tags_), name_, std::move(description_)}; +TrickOption TrickOption::LogicTrick(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, + std::set tags_, const std::string& name_, std::string description_) { + return { key_, quest_, area_, std::move(tags_), name_, std::move(description_) }; } RandomizerTrick TrickOption::GetKey() const { @@ -390,8 +309,8 @@ const std::set& TrickOption::GetTags() const { OptionGroup::OptionGroup(std::string name, std::vector options, const OptionGroupType groupType, const WidgetContainerType containerType, std::string description) - : mName(std::move(name)), mOptions(std::move(options)), mGroupType(groupType), - mContainerType(containerType), mDescription(std::move(description)) { + : mName(std::move(name)), mOptions(std::move(options)), mGroupType(groupType), mContainerType(containerType), + mDescription(std::move(description)) { } OptionGroup::OptionGroup(std::string name, std::vector subGroups, const OptionGroupType groupType, @@ -402,14 +321,12 @@ OptionGroup::OptionGroup(std::string name, std::vector subGroups, OptionGroup OptionGroup::SubGroup(std::string name, std::vector options, const WidgetContainerType containerType, std::string description) { - return {std::move(name), std::move(options), OptionGroupType::SUBGROUP, containerType, - std::move(description)}; + return { std::move(name), std::move(options), OptionGroupType::SUBGROUP, containerType, std::move(description) }; } OptionGroup OptionGroup::SubGroup(std::string name, std::vector subGroups, const WidgetContainerType containerType, std::string description) { - return {std::move(name), std::move(subGroups), OptionGroupType::SUBGROUP, containerType, - std::move(description)}; + return { std::move(name), std::move(subGroups), OptionGroupType::SUBGROUP, containerType, std::move(description) }; } const std::string& OptionGroup::GetName() const { @@ -451,9 +368,12 @@ void OptionGroup::Disable() { bool OptionGroup::RenderImGui() const { // NOLINT(*-no-recursion) ImGuiWindow* window = ImGui::GetCurrentWindow(); bool changed = false; - ImGui::BeginDisabled(mDisabled); + ImGui::BeginDisabled(mDisabled || CVarGetInteger(CVAR_SETTING("DisableChanges"), 0) || + CVarGetInteger(CVAR_GENERAL("RandoGenerating"), 0) || + CVarGetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0)); if (mContainerType == WidgetContainerType::TABLE) { - if (ImGui::BeginTable(mName.c_str(), static_cast(mSubGroups.size()), ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { + if (ImGui::BeginTable(mName.c_str(), static_cast(mSubGroups.size()), + ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { for (const auto column : mSubGroups) { if (column->GetContainerType() == WidgetContainerType::COLUMN) { ImGui::TableSetupColumn(column->GetName().c_str(), ImGuiTableColumnFlags_WidthStretch, 200.0f); @@ -465,7 +385,7 @@ bool OptionGroup::RenderImGui() const { // NOLINT(*-no-recursion) ImGui::TableSetColumnIndex(i); ImGui::TableHeader(mSubGroups[i]->GetName().c_str()); if (!mSubGroups[i]->GetDescription().empty()) { - UIWidgets::SetLastItemHoverText(mSubGroups[i]->GetDescription().c_str()); + UIWidgets::Tooltip(mSubGroups[i]->GetDescription().c_str()); } } ImGui::PopItemFlag(); @@ -473,12 +393,10 @@ bool OptionGroup::RenderImGui() const { // NOLINT(*-no-recursion) } } if (mContainerType == WidgetContainerType::SECTION && !mName.empty()) { - UIWidgets::PaddedSeparator(); - ImGui::Text("%s", mName.c_str()); + ImGui::SeparatorText(mName.c_str()); if (!mDescription.empty()) { - UIWidgets::InsertHelpHoverText(mDescription.c_str()); + UIWidgets::Tooltip(mDescription.c_str()); } - UIWidgets::PaddedSeparator(); } if (mContainerType == WidgetContainerType::COLUMN) { ImGui::TableNextColumn(); @@ -507,9 +425,6 @@ bool OptionGroup::RenderImGui() const { // NOLINT(*-no-recursion) if (option->HasFlag(IMFLAG_UNINDENT)) { ImGui::Unindent(); } - if (option->HasFlag(IMFLAG_SEPARATOR_BOTTOM)) { - UIWidgets::PaddedSeparator(false, true); - } } } if (mContainerType == WidgetContainerType::COLUMN) { diff --git a/soh/soh/Enhancements/randomizer/option.h b/soh/soh/Enhancements/randomizer/option.h index d2291463b2..55a06ed86d 100644 --- a/soh/soh/Enhancements/randomizer/option.h +++ b/soh/soh/Enhancements/randomizer/option.h @@ -1,6 +1,7 @@ #pragma once -#include "soh/SohGui/UIWidgets.hpp" +#ifndef RANDOPTION_H +#define RANDOPTION_H #include #include @@ -15,29 +16,31 @@ namespace Rando { enum ImGuiMenuFlags { - IMFLAG_NONE = 0, - IMFLAG_SEPARATOR_BOTTOM = 1 << 0, /** Adds a padded separator below the widget. */ - IMFLAG_SEPARATOR_TOP = 1 << 1, /** Adds a padded separator above the widget. */ - IMFLAG_INDENT = 1 << 2, /** Indents this widget and all proceeding widgets. */ - IMFLAG_UNINDENT = 1 << 3, /** Unindents this widget and all proceeding widgets. */ + IMFLAG_NONE = 0, + IMFLAG_SEPARATOR_BOTTOM = 1 << 0, /** Adds a padded separator below the widget. */ + IMFLAG_SEPARATOR_TOP = 1 << 1, /** Adds a padded separator above the widget. */ + IMFLAG_INDENT = 1 << 2, /** Indents this widget and all proceeding widgets. */ + IMFLAG_UNINDENT = 1 << 3, /** Unindents this widget and all proceeding widgets. */ }; /** * @brief Affects how options are handled when writing a spoiler/patch file */ enum class OptionCategory { - Setting, /** An option that typically affects the logic/item pool/etc. of the seed. Typically gets written out to the spoiler file. */ - Toggle, /** An option that typically affects other options rather than affecting the seed directly. i.e. A toggle for randomizing the values of other options. */ + Setting, /** An option that typically affects the logic/item pool/etc. of the seed. Typically gets written out to + the spoiler file. */ + Toggle, /** An option that typically affects other options rather than affecting the seed directly. i.e. A toggle + for randomizing the values of other options. */ }; /** * @brief Controls how this option is rendered in the menu. */ enum class WidgetType { - Checkbox, /** Default for Bools, not compatible if options.size() > 2. */ - TristateCheckbox, /** Compatible with U8s, not compatible if options.size() != 3. */ - Combobox, /** Default for U8s, works with U8s and Bools. */ - Slider, /** Compatible with U8s. If constructed with NumOpts, consider using this. Technically can be used for Bool or non-NumOpts options but it would be a bit weird semantically. */ + Checkbox, /** Default for Bools, not compatible if options.size() > 2. */ + Combobox, /** Default for U8s, works with U8s and Bools. */ + Slider, /** Compatible with U8s. If constructed with NumOpts, consider using this. Technically can be used for Bool + or non-NumOpts options but it would be a bit weird semantically. */ }; class OptionValue { @@ -47,15 +50,15 @@ class OptionValue { /** * @brief Returns the value of the OptionValue's mVal - * - * @return uint8_t + * + * @return uint8_t */ uint8_t Get(); /** * @brief Set the OptionValue's mVal to the provided val. - * - * @param val + * + * @param val */ void Set(uint8_t val); @@ -146,8 +149,8 @@ class Option { * @return Option */ static Option Bool(RandomizerSettingKey key_, std::string name_, std::string cvarName_, - std::string description_ = "", int imFlags_ = IMFLAG_SEPARATOR_BOTTOM, - WidgetType widgetType_ = WidgetType::Checkbox, bool defaultOption_ = false); + std::string description_ = "", int imFlags_ = IMFLAG_SEPARATOR_BOTTOM, + WidgetType widgetType_ = WidgetType::Checkbox, bool defaultOption_ = false); /** * @brief Constructs a U8 Option. @@ -192,8 +195,8 @@ class Option { /** * @brief Get the Key Option - * - * @return const RandomizerSettingKey + * + * @return const RandomizerSettingKey */ RandomizerSettingKey GetKey() const; @@ -207,9 +210,9 @@ class Option { /** * @brief Get the text of the Option value of the selected index. - * - * @param index - * @return const std::string& + * + * @param index + * @return const std::string& */ const std::string& GetOptionText(size_t index) const; @@ -225,19 +228,7 @@ class Option { * * @return uint8_t */ - uint8_t GetMenuOptionIndex() const; - - /** - * @brief Sets the CVar corresponding to the property `cvarName` equal to the value - * of the property `selectedValue`. - */ - void SaveCVar() const; - - /** - * @brief Sets the value of property `selectedValue` equal to the CVar corresponding - * to the property `cvarName`. - */ - void SetFromCVar(); + uint8_t GetOptionIndex() const; /** * @brief Set the delayedOption to the currently selected index so it can be restored later. @@ -250,18 +241,11 @@ class Option { void RestoreDelayedOption(); /** - * @brief Set the menu index for this Option. Also calls `SetVariable()`. + * @brief Set the rando context index for this Option. * * @param idx the index to set as the selected index. */ - void SetMenuIndex(size_t idx); - - /** - * @brief Set the rando context index for this Option. Also calls `SetVariable()`. - * - * @param idx the index to set as the selected index. - */ - void SetContextIndex(size_t idx); + void SetContextIndex(uint8_t idx); /** * @brief Hides this Option in the menu. (Not currently being used afaik, we prefer to @@ -298,7 +282,7 @@ class Option { * "Enable" in this context refers to the ability to change the option in the * settings menu. The actual value of the option is not decided by whether or not * the option is "Enabled". - */ + */ void Enable(); /** @@ -312,13 +296,13 @@ class Option { * @param graphic What graphic to display in a disabled checkbox. Defaults to an * "X" symbol. */ - void Disable(std::string text, UIWidgets::CheckboxGraphics graphic = UIWidgets::CheckboxGraphics::Cross); + void Disable(std::string text); bool IsCategory(OptionCategory category) const; /** * @brief Automatically renders a widget for this option in ImGui, based on the various * properties of this Option. Typically, Bool options are rendered as Checkboxes and - * U8 options are rendered as Comboboxes, but this can be overriden during construction with + * U8 options are rendered as Comboboxes, but this can be overridden during construction with * the `widgetType` property. */ bool RenderImGui(); @@ -331,7 +315,7 @@ class Option { uint8_t GetValueFromText(std::string text); void SetContextIndexFromText(std::string text); -protected: + protected: Option(size_t key_, std::string name_, std::vector options_, OptionCategory category_, std::string cvarName_, std::string description_, WidgetType widgetType_, uint8_t defaultOption_, bool defaultHidden_, int imFlags_); @@ -339,13 +323,11 @@ protected: private: bool RenderCheckbox(); - bool RenderTristateCheckbox(); bool RenderCombobox(); bool RenderSlider(); void PopulateTextToNum(); std::string name; std::vector options; - uint8_t menuSelection = 0; uint8_t contextSelection = 0; uint8_t delayedSelection = 0; bool hidden = false; @@ -357,20 +339,19 @@ protected: bool defaultHidden = false; int imFlags = IMFLAG_NONE; bool disabled = false; - UIWidgets::CheckboxGraphics disabledGraphic = UIWidgets::CheckboxGraphics::Cross; std::string disabledText; std::unordered_map optionsTextToVar = {}; }; class LocationOption : public Option { -public: - LocationOption() = default; - LocationOption(RandomizerCheck key_, const std::string& name_); - RandomizerCheck GetKey() const; + public: + LocationOption() = default; + LocationOption(RandomizerCheck key_, const std::string& name_); + RandomizerCheck GetKey() const; }; class TrickOption : public Option { -public: + public: TrickOption() = default; /** * @brief A convenience function for constructing the Option for a trick. @@ -383,7 +364,8 @@ public: * @param description_ A brief description of the trick. * @return Option */ - static TrickOption LogicTrick(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_); + static TrickOption LogicTrick(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, + std::set tags_, const std::string& name_, std::string description_); RandomizerTrick GetKey() const; @@ -411,8 +393,9 @@ public: const std::set& GetTags() const; -private: - TrickOption(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_); + private: + TrickOption(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, + const std::string& name_, std::string description_); RandomizerCheckQuest mQuest; RandomizerArea mArea; std::set mTags; @@ -424,11 +407,11 @@ enum class OptionGroupType { }; enum class WidgetContainerType { - BASIC, /** Barebones container, just lists the options within. */ - SECTION, /** Similar to Barebones, but has a header with the section name. */ - COLUMN, /** Signifies the container should be the start of new column within a table. */ - TABLE, /** Signifies the container is a table (should contain other subgroups with type column)*/ - TABBED, /** Signifies this container's contents should be contained within a tabbed interface. */ + BASIC, /** Barebones container, just lists the options within. */ + SECTION, /** Similar to Barebones, but has a header with the section name. */ + COLUMN, /** Signifies the container should be the start of new column within a table. */ + TABLE, /** Signifies the container is a table (should contain other subgroups with type column)*/ + TABBED, /** Signifies this container's contents should be contained within a tabbed interface. */ }; class OptionGroup { @@ -458,7 +441,8 @@ class OptionGroup { * @param containerType Specifies the type of container this widget should render as in ImGui. * @param description A description that can appear in a tooltip in ImGui. */ - OptionGroup(std::string name, std::vector subGroups, OptionGroupType groupType = OptionGroupType::DEFAULT, + OptionGroup(std::string name, std::vector subGroups, + OptionGroupType groupType = OptionGroupType::DEFAULT, WidgetContainerType containerType = WidgetContainerType::BASIC, std::string description = ""); /** @@ -471,7 +455,8 @@ class OptionGroup { * @param description A description that can appear in a tooltip in ImGui. * @return OptionGroup */ - static OptionGroup SubGroup(std::string name, std::vector options, WidgetContainerType containerType = WidgetContainerType::BASIC, + static OptionGroup SubGroup(std::string name, std::vector options, + WidgetContainerType containerType = WidgetContainerType::BASIC, std::string description = ""); /** @@ -484,7 +469,8 @@ class OptionGroup { * @param description A description that can appear in a tooltip in ImGui. * @return OptionGroup */ - static OptionGroup SubGroup(std::string name, std::vector subGroups, WidgetContainerType containerType = WidgetContainerType::BASIC, + static OptionGroup SubGroup(std::string name, std::vector subGroups, + WidgetContainerType containerType = WidgetContainerType::BASIC, std::string description = ""); /** @@ -546,4 +532,6 @@ class OptionGroup { std::string mDescription; bool mDisabled = false; }; -} // namespace Rando \ No newline at end of file +} // namespace Rando + +#endif // RANDOPTION_H \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index a3184765f1..16c89a1c41 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -2,18 +2,19 @@ namespace Rando { void Settings::CreateOptionDescriptions() { - mOptionDescriptions[RSK_FOREST] = "Determines if Kokiri forest can be left for the Lost Woods bridge or the Deku Tree.\n" - "\n" - "On - Kokiri Sword & Deku Shield are required to access " - "the Deku Tree, and completing the Deku Tree is required to " - "access the Lost Woods Bridge Exit.\n" - "\n" - "Deku Only - Kokiri boy no longer blocks the path to the Bridge " - "but Mido still requires the Kokiri Sword and Deku Shield " - "to access the tree.\n" - "\n" - "Off - Mido no longer blocks the path to the Deku Tree. Kokiri " - "boy no longer blocks the path out of the forest."; + mOptionDescriptions[RSK_FOREST] = + "Determines if Kokiri forest can be left for the Lost Woods bridge or the Deku Tree.\n" + "\n" + "On - Kokiri Sword & Deku Shield are required to access " + "the Deku Tree, and completing the Deku Tree is required to " + "access the Lost Woods Bridge Exit.\n" + "\n" + "Deku Only - Kokiri boy no longer blocks the path to the Bridge " + "but Mido still requires the Kokiri Sword and Deku Shield " + "to access the tree.\n" + "\n" + "Off - Mido no longer blocks the path to the Deku Tree. Kokiri " + "boy no longer blocks the path out of the forest."; mOptionDescriptions[RSK_KAK_GATE] = "Closed - The gate will remain closed until Zelda's Letter " "is shown to the guard.\n" "\n" @@ -41,22 +42,24 @@ void Settings::CreateOptionDescriptions() { "\n" "Open - Sleeping Waterfall is always open. " "Link may always enter Zora's Domain."; - mOptionDescriptions[RSK_LOCK_OVERWORLD_DOORS] = "Add locks to all wooden overworld doors, requiring specific small keys to open them"; + mOptionDescriptions[RSK_LOCK_OVERWORLD_DOORS] = + "Add locks to all wooden overworld doors, requiring specific small keys to open them"; mOptionDescriptions[RSK_STARTING_AGE] = "Choose which age Link will start as.\n\n" "Starting as adult means you start with the Master Sword in your inventory.\n" "The child option is forcefully set if it would conflict with other options."; - mOptionDescriptions[RSK_GERUDO_FORTRESS] = "Sets the state of the carpenters captured by Gerudo " - "in Gerudo Fortress, and with it the number of guards that spawn.\n" - "\n" - "Normal - All 4 carpenters are required to be saved.\n" - "\n" - "Fast - Only the bottom left carpenter requires rescuing.\n" - "\n" - "Free - The bridge is repaired from the start, and Nabooru cannot spawn.\n" - "If the Gerudo Membership Card isn't shuffled, you start with it.\n" - "\n" - "Only \"Normal\" is compatible with Gerudo Fortress Key Rings."; + mOptionDescriptions[RSK_GERUDO_FORTRESS] = + "Sets the state of the carpenters captured by Gerudo " + "in Gerudo Fortress, and with it the number of guards that spawn.\n" + "\n" + "Normal - All 4 carpenters are required to be saved.\n" + "\n" + "Fast - Only the bottom left carpenter requires rescuing.\n" + "\n" + "Free - The bridge is repaired from the start, and Nabooru cannot spawn.\n" + "If the Gerudo Membership Card isn't shuffled, you start with it.\n" + "\n" + "Only \"Normal\" is compatible with Gerudo Fortress Key Rings."; mOptionDescriptions[RSK_RAINBOW_BRIDGE] = "Alters the requirements to open the bridge to Ganon's Castle.\n" "\n" @@ -111,13 +114,13 @@ void Settings::CreateOptionDescriptions() { "Selection Only - Specify which dungeons are Vanilla, Master Quest or a 50/50 between the two.\n" "Differs from Random Number in that they are rolled individually, making the exact total a bell curve."; mOptionDescriptions[RSK_MQ_DUNGEON_SET] = - "Choose specific Dungeons to be Master Quest or Vanilla.\n" - "\n" - "If Master Quest Dungeons is set to Set Number or Random, the dungeons chosen " - "to be Master Quest here will count towards that total. Any Dungeons set to Vanilla " - "here will be guaranteed to be Vanilla. If Set Number is higher than the amount of dungeons " - "set to either MQ or Random here, you will have fewer MQ Dungeons than the number you " - "set."; + "Choose specific Dungeons to be Master Quest or Vanilla.\n" + "\n" + "If Master Quest Dungeons is set to Set Number or Random, the dungeons chosen " + "to be Master Quest here will count towards that total. Any Dungeons set to Vanilla " + "here will be guaranteed to be Vanilla. If Set Number is higher than the amount of dungeons " + "set to either MQ or Random here, you will have fewer MQ Dungeons than the number you " + "set."; mOptionDescriptions[RSK_TRIFORCE_HUNT] = "Pieces of the Triforce of Courage have been scattered across the world. Find them all to finish the game!\n\n" "When the required amount of pieces have been found, the game is saved and Ganon's Boss key is given " @@ -193,6 +196,8 @@ void Settings::CreateOptionDescriptions() { mOptionDescriptions[RSK_MIX_INTERIOR_ENTRANCES] = "Interior entrances will be part of the mixed pool."; mOptionDescriptions[RSK_MIX_GROTTO_ENTRANCES] = "Grotto entrances will be part of the mixed pool."; mOptionDescriptions[RSK_SHUFFLE_SONGS] = + "Off - Songs will appear at their vanilla locations.\n" + "\n" "Song locations - Songs will only appear at locations that normally teach songs.\n" "\n" "Dungeon rewards - Songs appear after beating a major dungeon boss.\n" @@ -224,12 +229,11 @@ void Settings::CreateOptionDescriptions() { "\n" "Adult Link will start with a second free item instead of the Master Sword.\n" "If you haven't found the Master Sword before facing Ganon, you won't receive it during the fight."; - mOptionDescriptions[RSK_SHUFFLE_CHILD_WALLET] = - "Enabling this shuffles the Child's Wallet into the item pool.\n" - "\n" - "You will not be able to carry any rupees until you find a wallet."; - mOptionDescriptions[RSK_INCLUDE_TYCOON_WALLET] = - "Enabling this adds an extra Progressive Wallet to the pool and adds a new 999 capacity tier after Giant's Wallet.\n"; + mOptionDescriptions[RSK_SHUFFLE_CHILD_WALLET] = "Enabling this shuffles the Child's Wallet into the item pool.\n" + "\n" + "You will not be able to carry any rupees until you find a wallet."; + mOptionDescriptions[RSK_INCLUDE_TYCOON_WALLET] = "Enabling this adds an extra Progressive Wallet to the pool and " + "adds a new 999 capacity tier after Giant's Wallet.\n"; mOptionDescriptions[RSK_SHUFFLE_OCARINA] = "Enabling this shuffles the Fairy Ocarina and the Ocarina of Time into the item pool.\n" "\n" @@ -259,62 +263,79 @@ void Settings::CreateOptionDescriptions() { "\n" "The Gerudo Card is required to enter the Gerudo Training Ground, opening " "the gate to Haunted Wasteland and the Horseback Archery minigame."; - mOptionDescriptions[RSK_SHUFFLE_POTS] = "Pots will drop a randomized item the first time they're broken and collected. This does not include the flying pots." - " Pots will have a different appearance when they hold a randomized item.\n" - "With this option enabled, Ganon's boss key door is moved further up the stairs to\n" - "allow access to the pots before obtaining Ganon's Boss Key.\n" - "\n" - "Off - Pots will not be shuffled.\n" - "\n" - "Dungeons - Only shuffle pots that are within dungeons.\n" - "\n" - "Overworld - Only shuffle pots that are outside of dungeons.\n" - "\n" - "All pots - Shuffle all pots."; - mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE] = "Shuffles the fishing pole into the item pool.\n" + mOptionDescriptions[RSK_SHUFFLE_POTS] = + "Pots will drop a randomized item the first time they're broken and collected. This does not include the " + "flying pots." + " Pots will have a different appearance when they hold a randomized item.\n" + "With this option enabled, Ganon's boss key door is moved further up the stairs to\n" + "allow access to the pots before obtaining Ganon's Boss Key.\n" "\n" - "The fishing pole is required to play the fishing pond minigame."; - mOptionDescriptions[RSK_INFINITE_UPGRADES] = "Adds upgrades that hold infinite quantities of items (bombs, arrows, etc.).\n" + "Off - Pots will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle pots that are within dungeons.\n" + "\n" + "Overworld - Only shuffle pots that are outside of dungeons.\n" + "\n" + "All pots - Shuffle all pots."; + mOptionDescriptions[RSK_SHUFFLE_CRATES] = + "Crates will drop a randomized item the first time they're broken and collected. " + "Crates will have a different appearance when they hold a randomized item.\n" + "\n" + "Off - Crates will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle crates that are within dungeons.\n" + "\n" + "Overworld - Only shuffle crates that are outside of dungeons.\n" + "\n" + "All Crates - Shuffle all crates."; + mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE] = "Shuffles the fishing pole into the item pool.\n" + "\n" + "The fishing pole is required to play the fishing pond minigame."; + mOptionDescriptions[RSK_INFINITE_UPGRADES] = + "Adds upgrades that hold infinite quantities of items (bombs, arrows, etc.).\n" "\n" "Progressive - The infinite upgrades are obtained after getting the last normal capacity upgrade.\n" "\n" - "Condensed Progressive - The infinite upgrades are obtained as the first capacity upgrade (doesn't apply to the infinite wallet or to infinite magic)."; + "Condensed Progressive - The infinite upgrades are obtained as the first capacity upgrade (doesn't apply to " + "the infinite wallet or to infinite magic)."; mOptionDescriptions[RSK_SHUFFLE_DEKU_STICK_BAG] = "Shuffles the Deku Stick bag into the item pool.\n" - "\n" - "The Deku Stick bag is required to hold Deku Sticks."; + "\n" + "The Deku Stick bag is required to hold Deku Sticks."; mOptionDescriptions[RSK_SHUFFLE_DEKU_NUT_BAG] = "Shuffles the Deku Nut bag into the item pool.\n" + "\n" + "The Deku Nut bag is required to hold Deku Nuts."; + mOptionDescriptions[RSK_SHOPSANITY] = + "Off - All shop items will be the same as vanilla.\n" "\n" - "The Deku Nut bag is required to hold Deku Nuts."; - mOptionDescriptions[RSK_SHOPSANITY] = "Off - All shop items will be the same as vanilla.\n" - "\n" - "Specific Count - Vanilla shop items will be shuffled among different shops, and " - "each shop will contain a specific number (0-7) of non-vanilla shop items.\n" - "\n" - "Random - Vanilla shop items will be shuffled among different shops, and " - "each shop will contain a random number (1-7) of non-vanilla shop items."; - mOptionDescriptions[RSK_SHOPSANITY_COUNT] = "0 Items - Vanilla shop items will be shuffled among different shops.\n" - "\n" - "1-7 Items - Vanilla shop items will be shuffled among different shops, and " - "each shop will contain 1-7 non-vanilla shop items.\n" - /* - "\n" - "8 Items - All shops will contain 8 non-vanilla shop items.\n" - */; + "Specific Count - Vanilla shop items will be shuffled among different shops, and " + "each shop will contain a specific number (0-7) of non-vanilla shop items.\n" + "\n" + "Random - Vanilla shop items will be shuffled among different shops, and " + "each shop will contain a random number (1-7) of non-vanilla shop items."; + mOptionDescriptions[RSK_SHOPSANITY_COUNT] = + "0 Items - Vanilla shop items will be shuffled among different shops.\n" + "\n" + "1-7 Items - Vanilla shop items will be shuffled among different shops, and " + "each shop will contain 1-7 non-vanilla shop items.\n" + /* + "\n" + "8 Items - All shops will contain 8 non-vanilla shop items.\n" + */ + ; mOptionDescriptions[RSK_SHOPSANITY_PRICES] = "Vanilla - The same price as the item it replaced.\n" "Cheap Balanced - Prices will range between 0 to 95 rupees, favoring lower numbers.\n" "Balanced - Prices will range between 0 to 300 rupees, favoring lower numbers.\n" "Fixed - A fixed number.\n" "Range - A random point between specific ranges.\n" - "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if that wallet is chosen."; - mOptionDescriptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE] = - "The price for Shopsanity checks."; + "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if " + "that wallet is chosen."; + mOptionDescriptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE] = "The price for Shopsanity checks."; mOptionDescriptions[RSK_SHOPSANITY_PRICES_RANGE_1] = "The first part of the inclusive range of prices to allow for Shopsanity checks."; mOptionDescriptions[RSK_SHOPSANITY_PRICES_RANGE_2] = "The second part of the inclusive range of prices to allow for Shopsanity checks."; - mOptionDescriptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT] = - "The chance for Shopsanity checks to be free."; + mOptionDescriptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT] = "The chance for Shopsanity checks to be free."; mOptionDescriptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT] = "The chance for Shopsanity checks to be purchasable with Child's Wallet (1-99)."; mOptionDescriptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT] = @@ -327,16 +348,24 @@ void Settings::CreateOptionDescriptions() { "After choosing a price, set it to the affordable amount based on the wallet required.\n\n" "Affordable prices per tier: starter = 1, adult = 100, giant = 201, tycoon = 501\n\n" "Use this to enable wallet tier locking, but make shop items not as expensive as they could be."; - mOptionDescriptions[RSK_FISHSANITY] = "Off - Fish will not be shuffled. No changes will be made to fishing behavior.\n\n" - "Shuffle only Hyrule Loach - Allows you to earn an item by catching the Hyrule Loach at the fishing pond and giving it to the owner.\n\n" - "Shuffle Fishing Pond - The fishing pond's fish will be shuffled. Catching a fish in the fishing pond will grant a reward.\n\n" - "Shuffle Overworld Fish - Fish in generic grottos and Zora's Domain will be shuffled. Catching a fish in a bottle will give a reward.\n\n" + mOptionDescriptions[RSK_FISHSANITY] = + "Off - Fish will not be shuffled. No changes will be made to fishing behavior.\n\n" + "Shuffle only Hyrule Loach - Allows you to earn an item by catching the Hyrule Loach at the fishing pond and " + "giving it to the owner.\n\n" + "Shuffle Fishing Pond - The fishing pond's fish will be shuffled. Catching a fish in the fishing pond will " + "grant a reward.\n\n" + "Shuffle Overworld Fish - Fish in generic grottos and Zora's Domain will be shuffled. Catching a fish in a " + "bottle will give a reward.\n\n" "Shuffle Both - Both overworld fish and fish in the fishing pond will be shuffled."; - mOptionDescriptions[RSK_FISHSANITY_POND_COUNT] = "The number of fish to randomize in the fishing pool.\n\n" - "If set to maximum, each fish will have a unique check, including a Hyrule Loach which appears only as child, and " + mOptionDescriptions[RSK_FISHSANITY_POND_COUNT] = + "The number of fish to randomize in the fishing pool.\n\n" + "If set to maximum, each fish will have a unique check, including a Hyrule Loach which appears only as child, " + "and " "uncaught fish will be given a visual indicator to distinguish from already-caught fish.\n\n" "Otherwise, any fish caught in the pond will give a reward, until all rewards have been given."; - mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT] = "Enabling this will split the fishing pond fish by age, making fishing pond fish grant different rewards as child and adult.\n\n" + mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT] = + "Enabling this will split the fishing pond fish by age, making fishing pond fish grant different rewards as " + "child and adult.\n\n" "If disabled, then the child pond will be shuffled and shared between both ages.\n\n" "Note that, as child, there is a second loach available in the pond!"; mOptionDescriptions[RSK_SHUFFLE_SCRUBS] = @@ -353,15 +382,14 @@ void Settings::CreateOptionDescriptions() { "Balanced - Prices will range between 0 to 300 rupees, favoring lower numbers.\n" "Fixed - A fixed number.\n" "Range - A random point between specific ranges.\n" - "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if that wallet is chosen."; - mOptionDescriptions[RSK_SCRUBS_PRICES_FIXED_PRICE] = - "The price for Scrub checks."; + "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if " + "that wallet is chosen."; + mOptionDescriptions[RSK_SCRUBS_PRICES_FIXED_PRICE] = "The price for Scrub checks."; mOptionDescriptions[RSK_SCRUBS_PRICES_RANGE_1] = "The first part of the inclusive range of prices to allow for Scrub checks."; mOptionDescriptions[RSK_SCRUBS_PRICES_RANGE_2] = "The second part of the inclusive range of prices to allow for Scrub checks."; - mOptionDescriptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT] = - "The chance for Scrub checks to be free."; + mOptionDescriptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT] = "The chance for Scrub checks to be free."; mOptionDescriptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT] = "The chance for Scrub checks to be purchasable with Child's Wallet (1-99)."; mOptionDescriptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT] = @@ -374,8 +402,7 @@ void Settings::CreateOptionDescriptions() { "After choosing a price, set it to the affordable amount based on the wallet required.\n\n" "Affordable prices per tier: starter = 1, adult = 100, giant = 201, tycoon = 501\n\n" "Use this to enable wallet tier locking, but make scrub items not as expensive as they could be."; - mOptionDescriptions[RSK_SHUFFLE_BEEHIVES] = - "Beehives give a randomized item from the pool when broken."; + mOptionDescriptions[RSK_SHUFFLE_BEEHIVES] = "Beehives give a randomized item from the pool when broken."; mOptionDescriptions[RSK_SHUFFLE_COWS] = "Cows give a randomized item from the pool upon performing Epona's Song in front of them."; mOptionDescriptions[RSK_SHUFFLE_MERCHANTS] = @@ -397,15 +424,14 @@ void Settings::CreateOptionDescriptions() { "Balanced - Prices will range between 0 to 300 rupees, favoring lower numbers.\n" "Fixed - A fixed number.\n" "Range - A random point between specific ranges.\n" - "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if that wallet is chosen."; - mOptionDescriptions[RSK_MERCHANT_PRICES_FIXED_PRICE] = - "The price for Merchant checks."; + "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if " + "that wallet is chosen."; + mOptionDescriptions[RSK_MERCHANT_PRICES_FIXED_PRICE] = "The price for Merchant checks."; mOptionDescriptions[RSK_MERCHANT_PRICES_RANGE_1] = "The first part of the inclusive range of prices to allow for Merchant checks."; mOptionDescriptions[RSK_MERCHANT_PRICES_RANGE_2] = "The second part of the inclusive range of prices to allow for Merchant checks."; - mOptionDescriptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT] = - "The chance for Merchant checks to be free."; + mOptionDescriptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT] = "The chance for Merchant checks to be free."; mOptionDescriptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT] = "The chance for Merchant checks to be purchasable with Child's Wallet (1-99)."; mOptionDescriptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT] = @@ -437,18 +463,29 @@ void Settings::CreateOptionDescriptions() { "have collected all 100 Gold Skulltula Tokens.\n" "\n" "You can still talk to him multiple times to get Huge Rupees."; - mOptionDescriptions[RSK_SHUFFLE_FREESTANDING] = "Freestanding rupees & hearts are shuffles to random items. " - "Freestanding heart pieces and small keys are already shuffled by default.\n" - "\n" - "Off - freestanding rupees & hearts will not be shuffled.\n" - "\n" - "Dungeons - Only freestanding rupees & hearts that are within dungeons.\n" - "\n" - "Overworld - Only freestanding rupees & hearts that are outside of dungeons.\n" - "\n" - "All Items - Shuffle all freestanding rupees & hearts."; - mOptionDescriptions[RSK_SHUFFLE_FAIRIES] = - "Shuffle fairy locations."; + mOptionDescriptions[RSK_SHUFFLE_FREESTANDING] = + "Freestanding rupees & hearts are shuffles to random items. " + "Freestanding heart pieces and small keys are already shuffled by default.\n" + "\n" + "Off - freestanding rupees & hearts will not be shuffled.\n" + "\n" + "Dungeons - Only freestanding rupees & hearts that are within dungeons.\n" + "\n" + "Overworld - Only freestanding rupees & hearts that are outside of dungeons.\n" + "\n" + "All Items - Shuffle all freestanding rupees & hearts."; + mOptionDescriptions[RSK_SHUFFLE_FAIRIES] = "Shuffle fairy locations."; + mOptionDescriptions[RSK_SHUFFLE_GRASS] = + "Grass/Bushes will drop a randomized item the first time they're cut and collected. " + "Grass/Bushes will have a different appearance when they hold a randomized item.\n" + "\n" + "Off - Grass/Bushes will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle grass/bushes that are within dungeons.\n" + "\n" + "Overworld - Only shuffle grass/bushes that are outside of dungeons.\n" + "\n" + "All Grass/Bushes - Shuffle all grass/bushes."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] = "Shuffles the location of Spiritual Stones and medallions.\n" "Vanilla - Spiritual Stones and medallions will be given from their respective boss.\n" @@ -558,7 +595,6 @@ void Settings::CreateOptionDescriptions() { "\n" "Greg as Wildcard - Greg does not change logic, Greg helps obtain GBK, max number of " "rewards on slider does not change."; - mOptionDescriptions[RSK_CUCCO_COUNT] = "The amount of cuccos needed to claim the reward from Anju the Cucco Lady."; mOptionDescriptions[RSK_BIG_POE_COUNT] = "The Poe collector will give a reward for turning in this many Big Poes."; mOptionDescriptions[RSK_SKIP_CHILD_STEALTH] = "The crawlspace into Hyrule Castle goes straight to Zelda, skipping the guards."; @@ -632,7 +668,8 @@ void Settings::CreateOptionDescriptions() { mOptionDescriptions[RSK_GANONDORF_HINT] = "Talking to Ganondorf in his boss room will tell you the location of the Light Arrows and Master Sword." "If this option is enabled and Ganondorf is reachable without these items, Gossip Stones will never hint the " - "appropriate items.";//RANDOTODO make this hint text about no dupe hints a global hint for static hints. Add to navi? + "appropriate items."; // RANDOTODO make this hint text about no dupe hints a global hint for static hints. Add + // to navi? mOptionDescriptions[RSK_SHEIK_LA_HINT] = "Talking to Sheik inside Ganon's Castle will tell you the location of the Light Arrows." "If this option is enabled and Sheik is reachable without Light Arrows, Gossip Stones will never hint the " @@ -641,29 +678,46 @@ void Settings::CreateOptionDescriptions() { "Reading the diary of Dampé the gravekeeper as adult will tell you the location of one of the Hookshots."; mOptionDescriptions[RSK_GREG_HINT] = "Talking to the chest game owner after buying a key will tell you the location of Greg the Green Rupee."; - mOptionDescriptions[RSK_LOACH_HINT] = - "Talking to the fishing pond owner and asking to talk about something will tell you what's the reward for the Hyrule Loach."; + mOptionDescriptions[RSK_LOACH_HINT] = "Talking to the fishing pond owner and asking to talk about something will " + "tell you what's the reward for the Hyrule Loach."; mOptionDescriptions[RSK_SARIA_HINT] = "Talking to Saria either in person or through Saria's Song will tell you the " "location of a progressive magic meter."; - mOptionDescriptions[RSK_FISHING_POLE_HINT] = "Talking to the fishing pond owner without the fishing pole will tell you its location."; - mOptionDescriptions[RSK_OOT_HINT] = "Sheik in the Temple of Time will tell you the item and song on the Ocarina of Time."; + mOptionDescriptions[RSK_FISHING_POLE_HINT] = + "Talking to the fishing pond owner without the fishing pole will tell you its location."; + mOptionDescriptions[RSK_OOT_HINT] = + "Sheik in the Temple of Time will tell you the item and song on the Ocarina of Time."; mOptionDescriptions[RSK_FROGS_HINT] = "Standing near the pedestal for the frogs in Zora's River will tell you the " "reward for the frogs' Ocarina game."; - mOptionDescriptions[RSK_BIGGORON_HINT] = "Talking to Biggoron will tell you the item he will give you in exchange for the Claim Check."; - mOptionDescriptions[RSK_BIG_POES_HINT] = "Talking to the Poe Collector in the Market Guardhouse while adult will tell you what you receive for handing in Big Poes."; - mOptionDescriptions[RSK_CHICKENS_HINT] = "Talking to Anju as a child will tell you the item she will give you for delivering her cuccos to the pen."; - mOptionDescriptions[RSK_MALON_HINT] = "Talking to Malon as adult will tell you the item on \"Link's cow\", the cow you win from beating her time on the Lon Lon Obstacle Course."; - mOptionDescriptions[RSK_HBA_HINT] = "Talking to the Horseback Archery gerudo in Gerudo Fortress, or the nearby sign, will tell you what you win for scoring 1000 and 1500 points on Horseback Archery."; - mOptionDescriptions[RSK_WARP_SONG_HINTS] = "Playing a warp song will tell you where it leads. (If warp song destinations are vanilla, this is always enabled.)"; + mOptionDescriptions[RSK_BIGGORON_HINT] = + "Talking to Biggoron will tell you the item he will give you in exchange for the Claim Check."; + mOptionDescriptions[RSK_BIG_POES_HINT] = "Talking to the Poe Collector in the Market Guardhouse while adult will " + "tell you what you receive for handing in Big Poes."; + mOptionDescriptions[RSK_CHICKENS_HINT] = + "Talking to Anju as a child will tell you the item she will give you for delivering her cuccos to the pen."; + mOptionDescriptions[RSK_MALON_HINT] = "Talking to Malon as adult will tell you the item on \"Link's cow\", the cow " + "you win from beating her time on the Lon Lon Obstacle Course."; + mOptionDescriptions[RSK_HBA_HINT] = + "Talking to the Horseback Archery gerudo in Gerudo Fortress, or the nearby sign, will tell you what you win " + "for scoring 1000 and 1500 points on Horseback Archery."; + mOptionDescriptions[RSK_WARP_SONG_HINTS] = "Playing a warp song will tell you where it leads. (If warp song " + "destinations are vanilla, this is always enabled.)"; mOptionDescriptions[RSK_SCRUB_TEXT_HINT] = "Business scrubs will reveal the identity of what they're selling."; - mOptionDescriptions[RSK_MERCHANT_TEXT_HINT] = "Merchants will reveal the identity of what they're selling (Shops are not affected by this setting)."; - mOptionDescriptions[RSK_KAK_10_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 10 tokens will tell you the reward."; - mOptionDescriptions[RSK_KAK_20_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 20 tokens will tell you the reward."; - mOptionDescriptions[RSK_KAK_30_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 30 tokens will tell you the reward."; - mOptionDescriptions[RSK_KAK_40_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 40 tokens will tell you the reward."; - mOptionDescriptions[RSK_KAK_50_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 50 tokens will tell you the reward."; - mOptionDescriptions[RSK_KAK_100_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 100 tokens will tell you the reward."; - mOptionDescriptions[RSK_MASK_SHOP_HINT] = "Reading the mask shop sign will tell you rewards from showing masks at the Deku Theatre."; + mOptionDescriptions[RSK_MERCHANT_TEXT_HINT] = + "Merchants will reveal the identity of what they're selling (Shops are not affected by this setting)."; + mOptionDescriptions[RSK_KAK_10_SKULLS_HINT] = + "Talking to the Cursed Resident in the Skulltula House who is saved after 10 tokens will tell you the reward."; + mOptionDescriptions[RSK_KAK_20_SKULLS_HINT] = + "Talking to the Cursed Resident in the Skulltula House who is saved after 20 tokens will tell you the reward."; + mOptionDescriptions[RSK_KAK_30_SKULLS_HINT] = + "Talking to the Cursed Resident in the Skulltula House who is saved after 30 tokens will tell you the reward."; + mOptionDescriptions[RSK_KAK_40_SKULLS_HINT] = + "Talking to the Cursed Resident in the Skulltula House who is saved after 40 tokens will tell you the reward."; + mOptionDescriptions[RSK_KAK_50_SKULLS_HINT] = + "Talking to the Cursed Resident in the Skulltula House who is saved after 50 tokens will tell you the reward."; + mOptionDescriptions[RSK_KAK_100_SKULLS_HINT] = + "Talking to the Cursed Resident in the Skulltula House who is saved after 100 tokens will tell you the reward."; + mOptionDescriptions[RSK_MASK_SHOP_HINT] = + "Reading the mask shop sign will tell you rewards from showing masks at the Deku Theatre."; mOptionDescriptions[RSK_FULL_WALLETS] = "Start with a full wallet. All wallet upgrades come filled with rupees."; mOptionDescriptions[RSK_BOMBCHU_BAG] = "Bombchus require their own bag to be found before use. Without this setting, any Bombchu requirement " @@ -681,7 +735,8 @@ void Settings::CreateOptionDescriptions() { mOptionDescriptions[RSK_BLUE_FIRE_ARROWS] = "Ice Arrows act like Blue Fire, making them able to melt red ice. " "Item placement logic will respect this option, so it might be required to use this to progress."; - mOptionDescriptions[RSK_SKELETON_KEY] = "Adds a new item called the \"Skeleton Key\", it unlocks every dungeon door locked by a small key."; + mOptionDescriptions[RSK_SKELETON_KEY] = + "Adds a new item called the \"Skeleton Key\", it unlocks every dungeon door locked by a small key."; mOptionDescriptions[RSK_SUNLIGHT_ARROWS] = "Light Arrows can be used to light up the sun switches instead of using the Mirror Shield. " "Item placement logic will respect this option, so it might be required to use this to progress."; @@ -699,7 +754,9 @@ void Settings::CreateOptionDescriptions() { "location is reachable. When disabled, only " "required items and locations to beat the game " "will be guaranteed reachable."; - mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS] = "Shuffles 8 boss souls (one for each blue warp dungeon). A boss will not appear until you collect its respective soul." - "\n\"On + Ganon\" will also hide Ganon and Ganondorf behind a boss soul."; + mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS] = + "Shuffles 8 boss souls (one for each blue warp dungeon). A boss will not appear until you collect its " + "respective soul." + "\n\"On + Ganon\" will also hide Ganon and Ganondorf behind a boss soul."; } } // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 44831c7c04..abfa8f3b63 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -11,14 +11,13 @@ #include "3drando/rando_main.hpp" #include "3drando/random.hpp" #include "soh/ResourceManagerHelpers.h" -#include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "3drando/custom_messages.hpp" -#include "soh/SohGui/UIWidgets.hpp" #include #include #include "../custom-message/CustomMessageTypes.h" #include "../item-tables/ItemTableManager.h" -#include "../presets.h" +#include "../Presets/Presets.h" #include "../../../src/overlays/actors/ovl_En_GirlA/z_en_girla.h" #include #include "randomizer_check_objects.h" @@ -27,9 +26,10 @@ #include #include #include "draw.h" +#include "soh/OTRGlobals.h" +#include "soh/SohGui/UIWidgets.hpp" #include "static_data.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include #include "randomizer_settings_window.h" #include "savefile.h" #include "entrance.h" @@ -65,69 +65,326 @@ const std::string Randomizer::NaviRandoMessageTableID = "RandomizerNavi"; const std::string Randomizer::IceTrapRandoMessageTableID = "RandomizerIceTrap"; const std::string Randomizer::randoMiscHintsTableID = "RandomizerMiscHints"; -static const char* englishRupeeNames[175] = { - "[P]", "Bad RNG Rolls", "Bananas", "Beanbean Coins", "Beans", - "Beli", "Bells", "Berries", "Bison Dollars", "Bitcoin", - "Blue Essence", "Bolts", "Bones", "Boondollars", "Bottle Caps", - "Bratwürste", "Bucks", "BugFrags", "Canadian Dollars", "Cards", - "Chaos Orbs", "Clams", "Coal", "Cocoa Beans", "Coins", - "Cookies", "Copper", "Cor", "Cornflakes", "Credits", - "Crimebucks", "Crystal Shards", "Cubits", "Cucumbers", "Dalmations", - "Dampécoin", "Dark Elixir", "Darseks", "Dead Memes", "Diamonds", - "DNA", "Doge", "Dogecoin", "Doll Hairs", "Dollars", - "Dollarydoos", "Dosh", "Doubloons", "Dwarfbucks", "Elexit", - "Emeralds", "Energon", "Eris", "Ether", "Euro", - "Experience", "Extinction Points", "Floopies", "Flurbos", "FPS", - "Friends", "Frog Coins", "Gald", "Gekz", "Gems", - "Geo", "Gil", "Glimmer", "Glitches", "Gold", - "Gold Dragons", "Goober Dollars", "Green Herbs", "Greg Siblings", "Grouses", - "Gummybears", "Hell", "Hyrule Loaches", "Ice Traps", "ISK", - "Jiggies", "KF7 Ammo", "Kinstones", "Kremcoins", "Kroner", - "Leaves", "Lemmings", "Lien", "Lira", "Lumber", - "Lungmen Dollars", "Macca", "Mana", "Mann Co. Keys", "Meat", - "Meat Stacks", "Medaparts", "Meseta", "Mesetas", "Minerals", - "Monopoly Money", "Moons", "Mora", "Mumbo Tokens", "Munny", - "Mushrooms", "Mysteries", "Neopoints", "Notes", "Nuyen", - "Orbs", "Ore", "Pix", "Pixels", "Plastyks", - "Platinum", "Pokédollars", "Pokémon", "Poko", "Pokos", - "Potch", "Pounds", "Power Pellets", "Primogems", "Réals", - "Refined Metal", "Remote Mines", "Retweets", "Rhinu", "Rings", - "Riot Points", "Robux", "Rubies", "Rubles", "Runite Ore", - "Rupees", "Saint Quartz", "Septims", "Shekels", "Shillings", - "Silver", "Simoleons", "Smackaroos", "Social Credit", "Souls", - "Spent Casings", "Spice", "Spondulicks", "Spoons", "Star Bits", - "Star Chips", "Stars", "Stones of Jordan", "Store Credit", "Strawbs", - "Studs", "Super Sea Snails", "Talent", "Teef", "Telecrystals", - "Tiberium", "TokKul", "Toys", "Turnips", "Upvotes", - "V-Bucks", "Vespene Gas", "Watts", "Widgets", "Woolongs", - "World Dollars", "Wumpa Fruit", "Yen", "Zenny", "Zorkmids" +static const char* englishRupeeNames[188] = { + "[P]", + "Bad RNG Rolls", + "Baht", + "Bananas", + "Beanbean Coins", + "Beans", + "Beli", + "Bells", + "Berries", + "Bison Dollars", + "Bitcoin", + "Blue Essence", + "Bolts", + "Bones", + "Boondollars", + "Bottle Caps", + "Bratwürste", + "Bucks", + "BugFrags", + "Canadian Dollars", + "Cards", + "Cents", + "Chaos Orbs", + "Clams", + "Coal", + "Cocoa Beans", + "Coins", + "Cookies", + "Copper", + "Cor", + "Cornflakes", + "Credits", + "Crimebucks", + "Crystal Shards", + "Cubits", + "Cucumbers", + "Dalmations", + "Dampécoin", + "Dark Elixir", + "Darseks", + "Dead Memes", + "Diamonds", + "Dimes", + "Dinars", + "DNA", + "Doll Hairs", + "Dollars", + "Dollarydoos", + "Dosh", + "Doubloons", + "Drakes", + "Dwarfbucks", + "ECU", + "Elexit", + "Emeralds", + "Energon", + "Eris", + "Ether", + "Euro", + "Experience", + "Extinction Points", + "Floopies", + "Flurbos", + "FPS", + "Friends", + "Frog Coins", + "Gald", + "Gekz", + "Gems", + "Geo", + "Gil", + "Glimmer", + "Glitches", + "Gold", + "Gold Dragons", + "Goober Dollars", + "Green Herbs", + "Greg Siblings", + "Grouses", + "Gummybears", + "Hell", + "Hyrule Loaches", + "Ice Traps", + "ISK", + "Jiggies", + "KF7 Ammo", + "Kinstones", + "Kremcoins", + "Kronor", + "Leaves", + "Lemmings", + "Lien", + "Lira", + "Lumber", + "Lungmen Dollars", + "Macca", + "Mana", + "Mann Co. Keys", + "Meat", + "Meat Stacks", + "Medaparts", + "Meseta", + "Mesetas", + "Minerals", + "Monopoly Money", + "Moons", + "Mora", + "Mumbo Tokens", + "Munny", + "Mushrooms", + "Mysteries", + "Naira", + "Neopoints", + "Nickels", + "Notes", + "Nuyen", + "Orbs", + "Ore", + "Pence", + "Pix", + "Pixels", + "Plastyks", + "Platinum", + "Pokédollars", + "Pokémon", + "Poko", + "Pokos", + "Potch", + "Pounds", + "Power Pellets", + "Primogems", + "Rand", + "Reais", + "Refined Metal", + "Remote Mines", + "Retweets", + "Rhinu", + "Rials", + "Rings", + "Riot Points", + "Riyals", + "Robux", + "Rubies", + "Rubles", + "Runite Ore", + "Rupees", + "Saint Quartz", + "Sapphires", + "Septims", + "Shekels", + "Shillings", + "Silver", + "Simoleons", + "Smackaroos", + "Social Credit", + "Souls", + "Spent Casings", + "Spice", + "Spondulicks", + "Spoons", + "Star Bits", + "Star Chips", + "Stars", + "Stones of Jordan", + "Store Credit", + "Strawbs", + "Studs", + "Super Sea Snails", + "Talent", + "Teef", + "Telecrystals", + "Tiberium", + "TokKul", + "Toys", + "Turnips", + "Upvotes", + "V-Bucks", + "Vespene Gas", + "Watts", + "Widgets", + "Won", + "Woolongs", + "World Dollars", + "Wumpa Fruit", + "Yen", + "Yuan", + "Zenny", + "Zorkmids", }; -static const char* germanRupeeNames[65] = { - "Bananen", "Bitcoin", "Bonbons", "Bratwürste", "Brause UFOs", - "Brötchen", "Cent", "Diamanten", "Diridari", "Dogecoin", - "ECU", "Elexit", "Erz", "Erzbrocken", "Euro", - "EXP", "Forint", "Franken", "Freunde", "Gil", - "Gold", "Groschen", "Gulden", "Gummibären", "Heller", - "Juwelen", "Karolin", "Kartoffeln", "Kies", "Knete", - "Knochen", "Kohle", "Kraniche", "Kreuzer", "Kronen", - "Kronkorken", "Kröten", "Mark", "Mäuse", "Monde", - "Moorhühner", "Moos", "Münzen", "Penunze", "Pesa", - "Pfandflaschen", "Pfennig", "Pfund", "Pilze", "Plastiks", - "Pokédollar", "Radieschen", "Rappen", "Rubine", "Saphire", - "Schilling", "Seelen", "Smaragde", "Steine", "Sterne", - "Sternis", "Tael", "Taler", "Wagenchips", "Zenny" -}; +static const char* germanRupeeNames[114] = { "Baht", + "Baklava", + "Bananen", + "Bitcoin", + "Bonbons", + "Bonschen", + "Brause UFOs", + "Bucks", + "Burek", + "Cent", + "Chickenwing", + "Diamanten", + "Dinar", + "Diridari", + "Dogecoin", + "Dollar", + "Draken", + "ECU", + "Eis", + "Elexit", + "Erz", + "Erzbrocken", + "Ethereum", + "Euro", + "EXP", + "Fartcoin", + "Forint", + "Franken", + "Freunde", + "Geister", + "Gil", + "Gold", + "Groschen", + "Gulden", + "Haribo", + "Heller", + "Juwelen", + "Kapseln", + "Karolin", + "Kartoffeln", + "Keks", + "Kies", + "Knete", + "Knochen", + "Knuspertaler", + "Kohle", + "Kraniche", + "Kreuzer", + "Kronen", + "Kronkorken", + "Lauchcoins", + "Lira", + "Mana", + "Mark", + "Monde", + "Moos", + "Naira", + "Nugget", + "Penunze", + "Pesa", + "Peso", + "Pfandflaschen", + "Pfennig", + "Pfund", + "Pillen", + "Pilze", + "Plastiks", + "Pok\x96" + "dollar", + "Poster", + "Puzzle", + "Radieschen", + "Rand", + "Rappen", + "Real", + "Rial", + "Riesennugget", + "Riyal", + "Rubine", + "Rupien", + "Saphire", + "Schilling", + "Schokobon", + "Seelen", + "Septime", + "Shitcoin", + "Smaragde", + "Solana", + "Sosis", + "Steine", + "Sterne", + "Sternis", + "Tael", + "Taler", + "Tokens", + "Wagenchips", + "Won", + "Wumpas", + "Yen", + "Yuan", + "Zenny", + "M\x93use", + "M\x9Enzen", + "Kr\x9Bten", + "D\x9Bner", + "W\x9Erstchen", + "Kn\x9B" + "del", + "R\x9Bsti", + "H\x9Brnli", + "R\x9E" + "ebli", + "K\x9B" + "fte", + "Bratw\x9E" + "rste", + "Br\x98" + "tchen", + "Gummib\x93" + "ren", + "Moorh\x9E" + "hner" }; -static const char* frenchRupeeNames[40] = { - "Anneaux", "Baguettes", "Balles", "Bananes", "Bitcoin", - "Blés", "Bling", "Capsules", "Centimes", "Champignons", - "Clochettes", "Crédits", "Croissants", "Diamants", "Dogecoin", - "Dollars", "Émeraudes", "Éthers", "Étoiles", "Euros", - "Florens", "Francs", "Galds", "Gils", "Grouses", - "Halos", "Joyaux", "Lunes", "Mailles", "Munnies", - "Orbes", "Orens", "Pépètes", "Pièces", "Plastyks", - "Pokédollars", "Pokémon", "Radis", "Rubis", "Zennies" +static const char* frenchRupeeNames[39] = { + "Anneaux", "Baguettes", "Balles", "Bananes", "Bitcoin", "Blés", "Bling", "Capsules", + "Centimes", "Champignons", "Clochettes", "Crédits", "Croissants", "Diamants", "Dollars", "Émeraudes", + "Éthers", "Étoiles", "Euros", "Florens", "Francs", "Galds", "Gils", "Grouses", + "Halos", "Joyaux", "Lunes", "Mailles", "Munnies", "Orbes", "Orens", "Pépètes", + "Pièces", "Plastyks", "Pokédollars", "Pokémon", "Radis", "Rubis", "Zennies", }; Randomizer::Randomizer() { @@ -166,7 +423,7 @@ std::unordered_map spoilerFileDungeonToScene = { { "Ganon's Castle", SCENE_INSIDE_GANONS_CASTLE } }; -std::unordered_map getItemIdToItemId = { +std::unordered_map getItemIdToItemId = { { GI_BOW, ITEM_BOW }, { GI_ARROW_FIRE, ITEM_ARROW_FIRE }, { GI_DINS_FIRE, ITEM_DINS_FIRE }, @@ -205,26 +462,42 @@ std::unordered_map getItemIdToItemId = { { GI_PRESCRIPTION, ITEM_PRESCRIPTION }, { GI_FROG, ITEM_FROG }, { GI_EYEDROPS, ITEM_EYEDROPS }, - { GI_CLAIM_CHECK, ITEM_CLAIM_CHECK } + { GI_CLAIM_CHECK, ITEM_CLAIM_CHECK }, }; +#ifdef _MSC_VER #pragma optimize("", off) +#else #pragma GCC push_options -#pragma GCC optimize ("O0") +#pragma GCC optimize("O0") +#endif bool Randomizer::SpoilerFileExists(const char* spoilerFileName) { if (strcmp(spoilerFileName, "") != 0) { std::ifstream spoilerFileStream(SohUtils::Sanitize(spoilerFileName)); - if (!spoilerFileStream) { - return false; - } else { - return true; + if (spoilerFileStream) { + nlohmann::json contents; + spoilerFileStream >> contents; + spoilerFileStream.close(); + if (contents.contains("version") && + strcmp(std::string(contents["version"]).c_str(), (char*)gBuildVersion) == 0) { + return true; + } else { + SohGui::RegisterPopup( + "Old Spoiler Version", + "The spoiler file located at\n" + std::string(spoilerFileName) + + "\nwas made by a version that doesn't match the currently running version.\n" + + "Loading for this file has been cancelled."); + } } } return false; } -#pragma GCC pop_options +#ifdef _MSC_VER #pragma optimize("", on) +#else +#pragma GCC pop_options +#endif void Randomizer::LoadHintMessages() { auto ctx = Rando::Context::GetInstance(); @@ -232,65 +505,69 @@ void Randomizer::LoadHintMessages() { CustomMessageManager::Instance->ClearMessageTable(Randomizer::hintMessageTableID); CustomMessageManager::Instance->AddCustomMessageTable(Randomizer::hintMessageTableID); - //Extra Hints + // Extra Hints CustomMessageManager::Instance->ClearMessageTable(Randomizer::randoMiscHintsTableID); CustomMessageManager::Instance->AddCustomMessageTable(Randomizer::randoMiscHintsTableID); - // Bow Shooting Gallery reminder - CustomMessageManager::Instance->CreateMessage(Randomizer::hintMessageTableID, TEXT_SHOOTING_GALLERY_MAN_COME_BACK_WITH_BOW, + CustomMessageManager::Instance->CreateMessage( + Randomizer::hintMessageTableID, TEXT_SHOOTING_GALLERY_MAN_COME_BACK_WITH_BOW, CustomMessage("Come back when you have your own bow and you'll get a #different prize#!", - "Komm wieder sobald Du Deinen eigenen Bogen hast, um einen #speziellen Preis# zu erhalten!", - "J'aurai #une autre récompense# pour toi lorsque tu auras ton propre arc.", - {QM_RED})); + "Komm wieder sobald Du Deinen eigenen Bogen hast, um einen #speziellen Preis# zu erhalten!", + "J'aurai #une autre récompense# pour toi lorsque tu auras ton propre arc.", { QM_RED })); // Warp Song Mysterious text - CustomMessageManager::Instance->CreateMessage(Randomizer::hintMessageTableID, TEXT_WARP_MINUET_OF_FOREST, + CustomMessageManager::Instance->CreateMessage( + Randomizer::hintMessageTableID, TEXT_WARP_MINUET_OF_FOREST, CustomMessage("Warp to&#a mysterious place?#&" + CustomMessages::TWO_WAY_CHOICE() + "#OK&No#", - "Zu&#einem mysteriösen Ort#?&" + CustomMessages::TWO_WAY_CHOICE() + "#OK&No#", - "Se téléporter vers&#un endroit mystérieux#?&" + CustomMessages::TWO_WAY_CHOICE() + "#OK!&Non#", - {QM_RED, QM_GREEN})); + "Das Ziel ist&#ein mysteriöser Ort#!&" + CustomMessages::TWO_WAY_CHOICE() + "#Ja!&Nein!#", + "Se téléporter vers&#un endroit mystérieux#?&" + CustomMessages::TWO_WAY_CHOICE() + "#OK!&Non#", + { QM_RED, QM_GREEN })); // Lake Hylia water level system - CustomMessageManager::Instance->CreateMessage(Randomizer::hintMessageTableID, TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN, - CustomMessage("Water level control system.&Keep away!", - "Wasserstand Kontrollsystem&Finger weg!", - "Système de contrôle du niveau&d'eau.&Ne pas toucher!")); - CustomMessageManager::Instance->CreateMessage(Randomizer::hintMessageTableID, TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI, - CustomMessage("%cThis switch is rustier than you think.^%cSomething must be wrong with the pipe system in the %bWater Temple%c.", - "%cDieser Schalter scheint rostiger zu sein als er aussieht.^%cEtwas muss mit dem Leitungssystem im %bWassertempel%c nicht stimmen.", - "%cCet interrupteur est très rouillé.^%cIl doit y avoir un problème avec la tuyauterie du %bTemple de l'Eau%c.")); + CustomMessageManager::Instance->CreateMessage( + Randomizer::hintMessageTableID, TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN, + CustomMessage("Water level control system.&Keep away!", "Wasserstand Kontrollsystem&Finger weg!", + "Système de contrôle du niveau&d'eau.&Ne pas toucher!")); + CustomMessageManager::Instance->CreateMessage( + Randomizer::hintMessageTableID, TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI, + CustomMessage("%cThis switch is rustier than you think.^%cSomething must be wrong with the pipe system in the " + "%bWater Temple%c.", + "%cDieser Schalter scheint rostiger zu sein als er aussieht.^%cEtwas muss mit dem Leitungssystem " + "im %bWassertempel%c nicht stimmen.", + "%cCet interrupteur est très rouillé.^%cIl doit y avoir un problème avec la tuyauterie du " + "%bTemple de l'Eau%c.")); } // Reference soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.h std::unordered_map randomizerGetToEnGirlShopItem = { - { RG_BUY_DEKU_NUTS_5, SI_DEKU_NUTS_5 }, - { RG_BUY_ARROWS_30, SI_ARROWS_30 }, - { RG_BUY_ARROWS_50, SI_ARROWS_50 }, - { RG_BUY_BOMBS_525, SI_BOMBS_5_R25 }, - { RG_BUY_DEKU_NUTS_10, SI_DEKU_NUTS_10 }, - { RG_BUY_DEKU_STICK_1, SI_DEKU_STICK }, - { RG_BUY_BOMBS_10, SI_BOMBS_10 }, - { RG_BUY_FISH, SI_FISH }, + { RG_BUY_DEKU_NUTS_5, SI_DEKU_NUTS_5 }, + { RG_BUY_ARROWS_30, SI_ARROWS_30 }, + { RG_BUY_ARROWS_50, SI_ARROWS_50 }, + { RG_BUY_BOMBS_525, SI_BOMBS_5_R25 }, + { RG_BUY_DEKU_NUTS_10, SI_DEKU_NUTS_10 }, + { RG_BUY_DEKU_STICK_1, SI_DEKU_STICK }, + { RG_BUY_BOMBS_10, SI_BOMBS_10 }, + { RG_BUY_FISH, SI_FISH }, { RG_BUY_RED_POTION_30, SI_RED_POTION_R30 }, - { RG_BUY_GREEN_POTION, SI_GREEN_POTION }, - { RG_BUY_BLUE_POTION, SI_BLUE_POTION }, + { RG_BUY_GREEN_POTION, SI_GREEN_POTION }, + { RG_BUY_BLUE_POTION, SI_BLUE_POTION }, { RG_BUY_HYLIAN_SHIELD, SI_HYLIAN_SHIELD }, - { RG_BUY_DEKU_SHIELD, SI_DEKU_SHIELD }, - { RG_BUY_GORON_TUNIC, SI_GORON_TUNIC }, - { RG_BUY_ZORA_TUNIC, SI_ZORA_TUNIC }, - { RG_BUY_HEART, SI_RECOVERY_HEART }, - { RG_BUY_BOMBCHUS_10, SI_BOMBCHU_10_1 }, - { RG_BUY_BOMBCHUS_20, SI_BOMBCHU_20_1 }, + { RG_BUY_DEKU_SHIELD, SI_DEKU_SHIELD }, + { RG_BUY_GORON_TUNIC, SI_GORON_TUNIC }, + { RG_BUY_ZORA_TUNIC, SI_ZORA_TUNIC }, + { RG_BUY_HEART, SI_RECOVERY_HEART }, + { RG_BUY_BOMBCHUS_10, SI_BOMBCHU_10_1 }, + { RG_BUY_BOMBCHUS_20, SI_BOMBCHU_20_1 }, { RG_BUY_DEKU_SEEDS_30, SI_DEKU_SEEDS_30 }, - { RG_BUY_BLUE_FIRE, SI_BLUE_FIRE }, - { RG_BUY_BOTTLE_BUG, SI_BUGS }, - { RG_BUY_POE, SI_POE }, + { RG_BUY_BLUE_FIRE, SI_BLUE_FIRE }, + { RG_BUY_BOTTLE_BUG, SI_BUGS }, + { RG_BUY_POE, SI_POE }, { RG_BUY_FAIRYS_SPIRIT, SI_FAIRY }, - { RG_BUY_ARROWS_10, SI_ARROWS_10 }, - { RG_BUY_BOMBS_20, SI_BOMBS_20 }, - { RG_BUY_BOMBS_30, SI_BOMBS_30 }, - { RG_BUY_BOMBS_535, SI_BOMBS_5_R35 }, + { RG_BUY_ARROWS_10, SI_ARROWS_10 }, + { RG_BUY_BOMBS_20, SI_BOMBS_20 }, + { RG_BUY_BOMBS_30, SI_BOMBS_30 }, + { RG_BUY_BOMBS_535, SI_BOMBS_5_R35 }, { RG_BUY_RED_POTION_40, SI_RED_POTION_R40 }, { RG_BUY_RED_POTION_50, SI_RED_POTION_R50 }, }; @@ -300,112 +577,139 @@ void Randomizer::LoadMerchantMessages() { CustomMessageManager::Instance->ClearMessageTable(Randomizer::merchantMessageTableID); CustomMessageManager::Instance->AddCustomMessageTable(Randomizer::merchantMessageTableID); - // Prices have a chance of being 0, and the "sell" message below doesn't really make sense for a free item, so adding a "free" variation here - CustomMessageManager::Instance->CreateMessage(Randomizer::merchantMessageTableID, TEXT_SCRUB_RANDOM_FREE, - CustomMessage("\x12\x38\x82" "All right! You win! In return for sparing me, I will give you a #[[1]]#!&Please, take it!\x07\x10\xA3", - "\x12\x38\x82" "In Ordnung! Du gewinnst! Im Austausch dafür, dass Du mich verschont hast, werde ich Dir einen #[[1]]# geben!\x07\x10\xA3", - "\x12\x38\x82" "J'me rends! Laisse-moi partir et en échange, je te donne un #[[1]]#! Vas-y prends le!\x07\x10\xA3", - {QM_GREEN})); - CustomMessageManager::Instance->CreateMessage(Randomizer::merchantMessageTableID, TEXT_SCRUB_RANDOM, - CustomMessage("\x12\x38\x82" "All right! You win! In return for sparing me, I will sell you a #[[1]]#! #[[2]] Rupees# it is!\x07\x10\xA3", - "\x12\x38\x82" "Ich gebe auf! Ich verkaufe Dir einen #[[1]]# für #[[2]] Rubine#!\x07\x10\xA3", - "\x12\x38\x82" "J'abandonne! Tu veux bien m'acheter un #[[1]]#? Ça fera #[[2]] Rubis#!\x07\x10\xA3", - {QM_GREEN, QM_YELLOW})); + // Prices have a chance of being 0, and the "sell" message below doesn't really make sense for a free item, so + // adding a "free" variation here + CustomMessageManager::Instance->CreateMessage( + Randomizer::merchantMessageTableID, TEXT_SCRUB_RANDOM_FREE, + CustomMessage( + "\x12\x38\x82" + "All right! You win! In return for sparing me, I will give you a #[[1]]#!&Please, take it!\x07\x10\xA3", + "\x12\x38\x82" + "In Ordnung! Du gewinnst! Im Austausch dafür, dass Du mich verschont hast, werde ich Dir #[[1]]# " + "geben!\x07\x10\xA3", + "\x12\x38\x82" + "J'me rends! Laisse-moi partir et en échange, je te donne un #[[1]]#! Vas-y prends le!\x07\x10\xA3", + { QM_GREEN })); + CustomMessageManager::Instance->CreateMessage( + Randomizer::merchantMessageTableID, TEXT_SCRUB_RANDOM, + CustomMessage("\x12\x38\x82" + "All right! You win! In return for sparing me, I will sell you a #[[1]]#! #[[2]] Rupees# it " + "is!\x07\x10\xA3", + "\x12\x38\x82" + "Ich gebe auf! Ich verkaufe Dir #[[1]]# für #[[2]] Rubine#!\x07\x10\xA3", + "\x12\x38\x82" + "J'abandonne! Tu veux bien m'acheter un #[[1]]#? Ça fera #[[2]] Rubis#!\x07\x10\xA3", + { QM_GREEN, QM_YELLOW })); - //Carpet Salesman + // Carpet Salesman CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_ARMS_DEALER, CustomMessage("Finally! Now I can go back to being an #arms dealer#!", - /*german*/"Endlich! Schon bald kann ich wieder #Krabbelminen-Händler# sein!", - /*french*/"Squalala! Je vais enfin pouvoir #prendre des vacances#!", - {QM_RED})); + /*german*/ "Endlich! Schon bald kann ich wieder #Krabbelminen-Händler# sein!", + /*french*/ "Squalala! Je vais enfin pouvoir #prendre des vacances#!", { QM_RED })); // Each shop item has two messages, one for when the cursor is over it, and one for when you select it and are // prompted buy/don't buy CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM, - CustomMessage("\x08#[[1]]# #[[2]]_Rupees#&Special deal! #ONE LEFT#!&Get it while it lasts!\x0A\x02", - "\x08#[[1]]# #[[2]]_Rubine#&Sonderangebot! #NUR NOCH EINES VERFÜGBAR#!&Beeilen Sie sich!\x0A\x02", - "\x08#[[1]]# #[[2]]_Rubis#&Offre spéciale! #DERNIER EN STOCK#!&Faites vite!\x0A\x02", - {QM_GREEN, QM_YELLOW, QM_RED})); + CustomMessage( + "\x08#[[1]]# #[[2]]_Rupees#&Special deal! #ONE LEFT#!&Get it while it lasts!\x0A\x02", + "\x08#[[1]]# #[[2]]_Rubine#&#NUR EIN EXEMPLAR AUF LAGER!#&Schlag zu solange Du noch kannst!\x0A\x02", + "\x08#[[1]]# #[[2]]_Rubis#&#DERNIER EN STOCK#!&Faites vite!\x0A\x02", { QM_GREEN, QM_YELLOW, QM_RED })); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM_CONFIRM, CustomMessage("\x08#[[1]]# #[[2]]_Rupees#\x09\x1B#Buy&Don't buy#\x09\x02", - "\x08#[[1]]# #[[2]]_Rubine#\x09\x1B#Kaufen&Nicht kaufen#\x09\x02", - "\x08#[[1]]# #[[2]]_Rubis#\x09\x1B#Acheter&Ne pas acheter#\x09\x02", - {QM_GREEN, QM_YELLOW, QM_GREEN})); - + "\x08#[[1]]# #[[2]]_Rubine#\x09\x1B#Kaufen&Nicht kaufen#\x09\x02", + "\x08#[[1]]# #[[2]]_Rubis#\x09\x1B#Acheter&Ne pas acheter#\x09\x02", + { QM_GREEN, QM_YELLOW, QM_GREEN })); + CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_BEAN_SALESMAN_BUY_FOR_10, - CustomMessage("I tried to be a #magic bean# salesman, but it turns out my marketing skills weren't worth " - "beans!^Anyway, want to buy #[[1]]# for #[[2]] Rupees#?\x1B#Yes&No#", - /*german*/ "Möchten Sie #[[1]]# für #[[2]] Rubine# kaufen?\x1B#Ja&Nein#", - /*french*/ "J'ai essayé d'être un vendeur de #haricots magiques#, mais j'étais mauvais au niveau du marketing et ça " - "me courait sur le haricot...^Enfin bref, ça te dirait de m'acheter #[[1]]# pour #[[2]] Rubis#?\x1B#Oui&Non#", - {QM_RED, QM_GREEN, QM_YELLOW, QM_GREEN})); + CustomMessage( + "I tried to be a #magic bean# salesman, but it turns out my marketing skills weren't worth " + "beans!^Anyway, want to buy #[[1]]# for #[[2]] Rupees#?\x1B#Yes&No#", + /*german*/ + "Ich habe versucht ein Vertreter für #Wundererbsen# zu werden, doch meine Verhandlungskünste waren nicht " + "die Bohne wert. Ach egal...^" + "Willst Du #[[1]]#?&Deine letzte Chance!^Mein Spezial-Preis!&#[[2]] Rubine#! Greif zu!\x1B#Ja!&Nein!#", + /*french*/ + "J'ai essayé d'être un vendeur de #haricots magiques#, mais j'étais mauvais au niveau du marketing et ça " + "me courait sur le haricot...^Enfin bref, ça te dirait de m'acheter #[[1]]# pour #[[2]] " + "Rubis#?\x1B#Oui&Non#", + { QM_RED, QM_GREEN, QM_YELLOW, QM_GREEN })); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_BEAN_SALESMAN_BUY_FOR_100, - CustomMessage("I never thought I'd say this, but I'm selling the last #Magic Bean#.^#99 Rupees#, no less.\x1B#Yes&No#", - "Ich hätte nie gedacht, daß ich das sage, aber ich verkaufe die letzte^#Wundererbse# für #99 Rubine#.\x1B&#Ja&Nein#", - "Je te vends mon dernier #Haricot&magique# pour #99 Rubis#.\x1B&#AcheterNe pas acheter#", - {QM_RED, QM_YELLOW, QM_GREEN})); + CustomMessage( + "I never thought I'd say this, but I'm selling the last #Magic Bean#.^#99 Rupees#, no less.\x1B#Yes&No#", + "Ich hätte nie gedacht, daß ich das sage, aber ich verkaufe die letzte^#Wundererbse# für #99 " + "Rubine#.\x1B&#Ja!&Nein!#", + "Je te vends mon dernier #Haricot&magique# pour #99 Rubis#.\x1B&#AcheterNe pas acheter#", + { QM_RED, QM_YELLOW, QM_GREEN })); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_MEDIGORON, CustomMessage("How about buying #[[1]]# for #[[2]] Rupees#?\x1B#Buy&Don't buy#", - /*german*/ "Möchtest Du #[[1]]# für #[[2]] Rubine# kaufen?\x1B#Klar!&Nie im Leben!#", - /*french*/ "Veux-tu acheter #[[1]]# pour #[[2]] rubis#?\x1B#Acheter&Ne pas acheter#", - {QM_GREEN, QM_YELLOW, QM_GREEN})); - /*spanish*/ // ¿Me compras #[[1]]# por #[[2]] rupias#?\x1B#Comprar&No comprar# + /*german*/ "Möchtest Du #[[1]]#?^Für #[[2]] Rubine#!\x1B#Klar!&Nie im Leben!#", + /*french*/ "Veux-tu acheter #[[1]]# pour #[[2]] rubis#?\x1B#Acheter&Ne pas acheter#", + { QM_GREEN, QM_YELLOW, QM_GREEN })); + /*spanish*/ // ¿Me compras #[[1]]# por #[[2]] rupias#?\x1B#Comprar&No comprar# + + CustomMessage firstCarpet = CustomMessage( + "Welcome!^I am selling stuff, strange and rare, from all over the world to everybody. Today's special is...^", + /*german*/ + "Willkommen!^Ich verkaufe hier allerlei Kuriositäten. Stets sonderliche und seltene Ware aus " + "aller Welt für jedermann. Das heutige Angebot...^", + /*french*/ "Bienvenue!^Je vends des objets rares et merveilleux du monde entier. En spécial aujourd'hui...^"); + /*spanish*/ // ¡Acércate!^Vendo productos extraños y difíciles de encontrar... De todo el mundo a todo el mundo. La + // oferta de hoy es...^#¡ - CustomMessage firstCarpet = CustomMessage("Welcome!^I am selling stuff, strange and rare, from all over the world to everybody. Today's special is...^", - /*german*/ "Sei gegrüßt!^Ich verkaufe allerlei Kuriositäten. Stets sonderliche und seltene Ware aus " - "aller Welt für jedermann. Das heutige Angebot bleibt...^", - /*french*/ "Bienvenue!^Je vends des objets rares et merveilleux du monde entier. En spécial aujourd'hui...^"); - /*spanish*/ // ¡Acércate!^Vendo productos extraños y difíciles de encontrar... De todo el mundo a todo el mundo. La oferta de hoy es...^#¡ - CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_MYSTERIOUS, firstCarpet + - CustomMessage("Terrifying! I won't tell you what it is until I see the #money#...^How about #[[2]] Rupees#?&&" - "\x1B#Buy&Don't buy#", - /*german*/ "Furchterregend, oder? Ich erzähle Euch mehr, wenn ich #Geld# sehe...^Wie wär's mit #[[2]] Rubinen#?&&" - "\x1B#Aber sicher!&Ich bin weg!#", - /*french*/ "Terrible! Mais montre tes #rubis# avant que je te dise ce que c'est...^Disons #[[2]] " - "rubis#?&&\x1B#Acheter&Ne pas acheter#", - {QM_RED, QM_YELLOW, QM_GREEN})); - /*spanish*/ // ¡Terrorífico! No te revelaré su nombre hasta que vea el #dinero#...^#[[2]] rupias#, ¿qué te parece?&&" - // "\x1B#Comprar&No comprar# + CustomMessage( + "Terrifying! I won't tell you what it is until I see the #money#...^How about #[[2]] Rupees#?&&" + "\x1B#Buy&Don't buy#", + /*german*/ + "Furchterregend, oder? Ich erzähle Euch mehr, wenn ich #Geld# sehe...^Wie wär's mit #[[2]] Rubinen#?&&" + "\x1B#Aber sicher!&Ich bin weg!#", + /*french*/ + "Terrible! Mais montre tes #rubis# avant que je te dise ce que c'est...^Disons #[[2]] " + "rubis#?&&\x1B#Acheter&Ne pas acheter#", + { QM_RED, QM_YELLOW, QM_GREEN })); + /*spanish*/ // ¡Terrorífico! No te revelaré su nombre hasta que vea el #dinero#...^#[[2]] rupias#, ¿qué te + // parece?&&" + // "\x1B#Comprar&No comprar# CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_1, firstCarpet + - CustomMessage("#[[1]]!# It's real, I promise! A lonely man such as myself wouldn't #lie# to you, hmm?^" - "How about #[[2]] Rupees#?\x1B#Buy&Don't buy#", - /*german*/ "#[[1]]#! Ich kann versichern, es ist ein aufrichtiges Angebot!^Ein einsamer Mann wie ich würde Dich doch " - "nicht #anlügen#, oder?^Wie wär's mit #[[2]] Rubinen#?\x1B#Aber sicher!&Ich bin weg!#", - /*french*/ "#[[1]]!# C'est vrai! J'te jure! Un gars comme moi ne te #mentirai# pas tu ne crois pas?^Disons #[[2]] " - "rubis#?\x1B#Acheter&Ne pas acheter#", - {QM_GREEN, QM_RED, QM_YELLOW})); + CustomMessage( + "#[[1]]!# It's real, I promise! A lonely man such as myself wouldn't #lie# to you, hmm?^" + "How about #[[2]] Rupees#?\x1B#Buy&Don't buy#", + /*german*/ + "#[[1]]#! Ich kann versichern, es ist ein aufrichtiges Angebot!^Ein einsamer Mann wie ich würde Euch " + "doch " + "nicht #anlügen#, oder?^Wie wär's mit #[[2]] Rubinen#?\x1B#Aber sicher!&Ich bin weg!#", + /*french*/ + "#[[1]]!# C'est vrai! J'te jure! Un gars comme moi ne te #mentirai# pas tu ne crois pas?^Disons #[[2]] " + "rubis#?\x1B#Acheter&Ne pas acheter#", + { QM_GREEN, QM_RED, QM_YELLOW })); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_GRANNYS_SHOP, CustomMessage("#[[1]]#! How about #[[2]] Rupees#?\x1B#Buy&Don't buy#", - /*german*/ "#[[1]]#! Sagen wir #[[2]] Rubine#?\x1B#Gerne!&Auf keinen Fall!#", - /*french*/ "#[[1]]#! Que dis-tu de #[[2]] rubis#?\x1B#Acheter&Ne pas acheter#", - {QM_GREEN, QM_YELLOW, QM_GREEN}, {true})); - // /*spanish*/#[[1]]#. Vendo por #[[2]] rupias#.&\x1B#Comprar&No comprar# + /*german*/ "#[[1]]#! Sagen wir #[[2]] Rubine#?\x1B#Gerne!&Auf keinen Fall!#", + /*french*/ "#[[1]]#! Que dis-tu de #[[2]] rubis#?\x1B#Acheter&Ne pas acheter#", + { QM_GREEN, QM_YELLOW, QM_GREEN }, { true })); + // /*spanish*/#[[1]]#. Vendo por #[[2]] rupias#.&\x1B#Comprar&No comprar# } std::map trialFlagToTrialKey = { - { EVENTCHKINF_COMPLETED_LIGHT_TRIAL, TK_LIGHT_TRIAL, }, - { EVENTCHKINF_COMPLETED_FOREST_TRIAL, TK_FOREST_TRIAL, }, - { EVENTCHKINF_COMPLETED_FIRE_TRIAL, TK_FIRE_TRIAL, }, - { EVENTCHKINF_COMPLETED_WATER_TRIAL, TK_WATER_TRIAL, }, - { EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, TK_SPIRIT_TRIAL, }, - { EVENTCHKINF_COMPLETED_SHADOW_TRIAL, TK_SHADOW_TRIAL, } + { EVENTCHKINF_COMPLETED_LIGHT_TRIAL, TK_LIGHT_TRIAL }, { EVENTCHKINF_COMPLETED_FOREST_TRIAL, TK_FOREST_TRIAL }, + { EVENTCHKINF_COMPLETED_FIRE_TRIAL, TK_FIRE_TRIAL }, { EVENTCHKINF_COMPLETED_WATER_TRIAL, TK_WATER_TRIAL }, + { EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, TK_SPIRIT_TRIAL }, { EVENTCHKINF_COMPLETED_SHADOW_TRIAL, TK_SHADOW_TRIAL }, }; bool Randomizer::IsTrialRequired(s32 trialFlag) { @@ -455,9 +759,11 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_DEKU) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; case RG_HYLIAN_SHIELD: case RG_BUY_HYLIAN_SHIELD: - return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_HYLIAN) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_HYLIAN) ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_MIRROR_SHIELD: - return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_MIRROR) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_MIRROR) ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_GORON_TUNIC: case RG_BUY_GORON_TUNIC: return !CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; @@ -471,27 +777,34 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe // Inventory Items case RG_PROGRESSIVE_STICK_UPGRADE: - return infiniteUpgrades != RO_INF_UPGRADES_OFF ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (CUR_UPG_VALUE(UPG_STICKS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE + : CAN_OBTAIN) + : (CUR_UPG_VALUE(UPG_STICKS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_DEKU_STICK_1: case RG_BUY_DEKU_STICK_1: - return CUR_UPG_VALUE(UPG_STICKS) || !OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG).Get() - ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; + return CUR_UPG_VALUE(UPG_STICKS) || + !OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG).Get() + ? CAN_OBTAIN + : CANT_OBTAIN_NEED_UPGRADE; case RG_PROGRESSIVE_NUT_UPGRADE: - return infiniteUpgrades != RO_INF_UPGRADES_OFF ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (CUR_UPG_VALUE(UPG_NUTS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE + : CAN_OBTAIN) + : (CUR_UPG_VALUE(UPG_NUTS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_DEKU_NUTS_5: case RG_DEKU_NUTS_10: case RG_BUY_DEKU_NUTS_5: case RG_BUY_DEKU_NUTS_10: - return CUR_UPG_VALUE(UPG_NUTS) || !OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG).Get() - ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; + return CUR_UPG_VALUE(UPG_NUTS) || + !OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG).Get() + ? CAN_OBTAIN + : CANT_OBTAIN_NEED_UPGRADE; case RG_PROGRESSIVE_BOMB_BAG: - return infiniteUpgrades != RO_INF_UPGRADES_OFF ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (CUR_UPG_VALUE(UPG_BOMB_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG) ? CANT_OBTAIN_ALREADY_HAVE + : CAN_OBTAIN) + : (CUR_UPG_VALUE(UPG_BOMB_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_BOMBS_5: case RG_BOMBS_10: case RG_BOMBS_20: @@ -502,9 +815,9 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_BUY_BOMBS_30: return CUR_UPG_VALUE(UPG_BOMB_BAG) ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; case RG_PROGRESSIVE_BOW: - return infiniteUpgrades != RO_INF_UPGRADES_OFF ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (CUR_UPG_VALUE(UPG_QUIVER) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) + : (CUR_UPG_VALUE(UPG_QUIVER) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_ARROWS_5: case RG_ARROWS_10: case RG_ARROWS_30: @@ -513,9 +826,10 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_BUY_ARROWS_50: return CUR_UPG_VALUE(UPG_QUIVER) ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; case RG_PROGRESSIVE_SLINGSHOT: - return infiniteUpgrades != RO_INF_UPGRADES_OFF ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (CUR_UPG_VALUE(UPG_BULLET_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG) ? CANT_OBTAIN_ALREADY_HAVE + : CAN_OBTAIN) + : (CUR_UPG_VALUE(UPG_BULLET_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_DEKU_SEEDS_30: case RG_BUY_DEKU_SEEDS_30: return CUR_UPG_VALUE(UPG_BULLET_BAG) ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; @@ -533,7 +847,8 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_BOMBCHU_20: case RG_BUY_BOMBCHUS_10: case RG_BUY_BOMBCHUS_20: - case RG_PROGRESSIVE_BOMBCHUS: //RANDOTODO Do we want bombchu refills to exist seperatly from bombchu bags? If so, this needs changing. + case RG_PROGRESSIVE_BOMBCHUS: // RANDOTODO Do we want bombchu refills to exist seperatly from bombchu bags? If + // so, this needs changing. return CAN_OBTAIN; case RG_PROGRESSIVE_HOOKSHOT: switch (INV_CONTENT(ITEM_HOOKSHOT)) { @@ -634,9 +949,10 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_PROGRESSIVE_MAGIC_METER: case RG_MAGIC_SINGLE: case RG_MAGIC_DOUBLE: - return infiniteUpgrades != RO_INF_UPGRADES_OFF ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (gSaveContext.magicLevel < 2 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER) ? CANT_OBTAIN_ALREADY_HAVE + : CAN_OBTAIN) + : (gSaveContext.magicLevel < 2 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_FISHING_POLE: return !Flags_GetRandomizerInf(RAND_INF_FISHING_POLE_FOUND) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; @@ -704,7 +1020,8 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_SHADOW_TEMPLE_COMPASS: return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_SHADOW_TEMPLE) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; case RG_BOTTOM_OF_THE_WELL_COMPASS: - return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_BOTTOM_OF_THE_WELL) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_BOTTOM_OF_THE_WELL) ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_ICE_CAVERN_COMPASS: return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_ICE_CAVERN) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; case RG_FOREST_TEMPLE_BOSS_KEY: @@ -720,25 +1037,46 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_GANONS_CASTLE_BOSS_KEY: return !CHECK_DUNGEON_ITEM(DUNGEON_KEY_BOSS, SCENE_GANONS_TOWER) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; case RG_FOREST_TEMPLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_FOREST_TEMPLE] < FOREST_TEMPLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_FOREST_TEMPLE] < FOREST_TEMPLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_FIRE_TEMPLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_FIRE_TEMPLE] < FIRE_TEMPLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_FIRE_TEMPLE] < FIRE_TEMPLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_WATER_TEMPLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_WATER_TEMPLE] < WATER_TEMPLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_WATER_TEMPLE] < WATER_TEMPLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_SPIRIT_TEMPLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] < SPIRIT_TEMPLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] < SPIRIT_TEMPLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_SHADOW_TEMPLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] < SHADOW_TEMPLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] < SHADOW_TEMPLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_BOTTOM_OF_THE_WELL_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] < BOTTOM_OF_THE_WELL_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] < BOTTOM_OF_THE_WELL_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_GERUDO_TRAINING_GROUND_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] < GERUDO_TRAINING_GROUND_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] < + GERUDO_TRAINING_GROUND_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_GERUDO_FORTRESS_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_THIEVES_HIDEOUT] < GERUDO_FORTRESS_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_THIEVES_HIDEOUT] < GERUDO_FORTRESS_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_GANONS_CASTLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] < GANONS_CASTLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] < GANONS_CASTLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_TREASURE_GAME_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_TREASURE_BOX_SHOP] < TREASURE_GAME_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_TREASURE_BOX_SHOP] < TREASURE_GAME_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; // Dungeon Rewards case RG_KOKIRI_EMERALD: @@ -794,761 +1132,2132 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe // There has been some talk about potentially just using the RC identifier to store flags rather than randomizer inf, so // for now we're not going to store randomzierInf in the randomizer check objects, we're just going to map them 1:1 here std::map rcToRandomizerInf = { - { RC_KF_LINKS_HOUSE_COW, RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW }, - { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT }, - { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT }, - { RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE }, - { RC_LW_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR }, - { RC_LW_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT }, - { RC_SFM_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR }, - { RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT }, - { RC_HF_DEKU_SCRUB_GROTTO, RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO }, - { RC_HF_COW_GROTTO_COW, RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW }, - { RC_LH_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT }, - { RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT }, - { RC_LH_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER }, - { RC_GV_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR }, - { RC_GV_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT }, - { RC_GV_COW, RAND_INF_COWS_MILKED_GV_COW }, - { RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR }, - { RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT }, - { RC_KAK_IMPAS_HOUSE_COW, RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW }, - { RC_DMT_COW_GROTTO_COW, RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW }, - { RC_GC_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT }, - { RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT }, - { RC_GC_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER }, - { RC_DMC_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB }, - { RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT }, - { RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT }, - { RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER }, - { RC_ZR_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR }, - { RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT }, - { RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT }, - { RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT }, - { RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER }, - { RC_LLR_STABLES_LEFT_COW, RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW }, - { RC_LLR_STABLES_RIGHT_COW, RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW }, - { RC_LLR_TOWER_LEFT_COW, RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW }, - { RC_LLR_TOWER_RIGHT_COW, RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW }, - { RC_DEKU_TREE_MQ_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB }, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT }, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS }, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT }, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY }, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR }, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT }, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE }, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS }, - { RC_JABU_JABUS_BELLY_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB }, - { RC_JABU_JABUS_BELLY_MQ_COW, RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW }, - { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT }, - { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT }, - { RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT }, - { RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT }, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT }, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT }, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER }, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT }, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT }, - { RC_KF_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1 }, - { RC_KF_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2 }, - { RC_KF_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3 }, - { RC_KF_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4 }, - { RC_KF_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5 }, - { RC_KF_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6 }, - { RC_KF_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7 }, - { RC_KF_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8 }, - { RC_GC_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1 }, - { RC_GC_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2 }, - { RC_GC_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3 }, - { RC_GC_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4 }, - { RC_GC_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5 }, - { RC_GC_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6 }, - { RC_GC_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7 }, - { RC_GC_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8 }, - { RC_ZD_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1 }, - { RC_ZD_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2 }, - { RC_ZD_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3 }, - { RC_ZD_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4 }, - { RC_ZD_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5 }, - { RC_ZD_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6 }, - { RC_ZD_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7 }, - { RC_ZD_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8 }, - { RC_KAK_BAZAAR_ITEM_1, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1 }, - { RC_KAK_BAZAAR_ITEM_2, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2 }, - { RC_KAK_BAZAAR_ITEM_3, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3 }, - { RC_KAK_BAZAAR_ITEM_4, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4 }, - { RC_KAK_BAZAAR_ITEM_5, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5 }, - { RC_KAK_BAZAAR_ITEM_6, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6 }, - { RC_KAK_BAZAAR_ITEM_7, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7 }, - { RC_KAK_BAZAAR_ITEM_8, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8 }, - { RC_KAK_POTION_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1 }, - { RC_KAK_POTION_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2 }, - { RC_KAK_POTION_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3 }, - { RC_KAK_POTION_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4 }, - { RC_KAK_POTION_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5 }, - { RC_KAK_POTION_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6 }, - { RC_KAK_POTION_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7 }, - { RC_KAK_POTION_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8 }, - { RC_MARKET_BAZAAR_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1 }, - { RC_MARKET_BAZAAR_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2 }, - { RC_MARKET_BAZAAR_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3 }, - { RC_MARKET_BAZAAR_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4 }, - { RC_MARKET_BAZAAR_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5 }, - { RC_MARKET_BAZAAR_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6 }, - { RC_MARKET_BAZAAR_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7 }, - { RC_MARKET_BAZAAR_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8 }, - { RC_MARKET_POTION_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1 }, - { RC_MARKET_POTION_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2 }, - { RC_MARKET_POTION_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3 }, - { RC_MARKET_POTION_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4 }, - { RC_MARKET_POTION_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5 }, - { RC_MARKET_POTION_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6 }, - { RC_MARKET_POTION_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7 }, - { RC_MARKET_POTION_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8 }, - { RC_TOT_MASTER_SWORD, RAND_INF_TOT_MASTER_SWORD }, - { RC_GC_MEDIGORON, RAND_INF_MERCHANTS_MEDIGORON }, - { RC_KAK_GRANNYS_SHOP, RAND_INF_MERCHANTS_GRANNYS_SHOP }, - { RC_WASTELAND_BOMBCHU_SALESMAN, RAND_INF_MERCHANTS_CARPET_SALESMAN }, - { RC_ZR_MAGIC_BEAN_SALESMAN, RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN }, - { RC_LW_TRADE_COJIRO, RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO }, - { RC_GV_TRADE_SAW, RAND_INF_ADULT_TRADES_GV_TRADE_SAW }, - { RC_DMT_TRADE_BROKEN_SWORD, RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD }, - { RC_LH_TRADE_FROG, RAND_INF_ADULT_TRADES_LH_TRADE_FROG }, - { RC_DMT_TRADE_EYEDROPS, RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS }, - { RC_LH_CHILD_FISHING, RAND_INF_CHILD_FISHING }, - { RC_LH_ADULT_FISHING, RAND_INF_ADULT_FISHING }, - { RC_MARKET_10_BIG_POES, RAND_INF_10_BIG_POES }, - { RC_KAK_100_GOLD_SKULLTULA_REWARD, RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD }, - { RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT }, - { RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT }, - { RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT }, - { RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT }, - { RC_LW_DEKU_SCRUB_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO }, - { RC_SFM_STORMS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_SFM_STORMS_GROTTO }, - { RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT }, - { RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT }, - { RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT }, - { RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT }, - { RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT }, - { RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT }, - { RC_HF_INSIDE_FENCE_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO }, - { RC_LLR_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LLR_GROTTO }, - { RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT }, - { RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT }, - { RC_DMT_COW_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_DMT_COW_GROTTO }, - { RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT }, - { RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT }, - { RC_GC_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_GC_GROTTO }, - { RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT }, - { RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT }, - { RC_DMC_HAMMER_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO }, - { RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT }, - { RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT }, - { RC_ZR_STORMS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_ZR_STORMS_GROTTO }, - { RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT }, - { RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT }, - { RC_ZD_BEHIND_KING_ZORA_BEEHIVE, RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA }, - { RC_LH_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LH_GROTTO }, - { RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO }, - { RC_COLOSSUS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_COLOSSUS_GROTTO }, - { RC_LH_CHILD_FISH_1, RAND_INF_CHILD_FISH_1 }, - { RC_LH_CHILD_FISH_2, RAND_INF_CHILD_FISH_2 }, - { RC_LH_CHILD_FISH_3, RAND_INF_CHILD_FISH_3 }, - { RC_LH_CHILD_FISH_4, RAND_INF_CHILD_FISH_4 }, - { RC_LH_CHILD_FISH_5, RAND_INF_CHILD_FISH_5 }, - { RC_LH_CHILD_FISH_6, RAND_INF_CHILD_FISH_6 }, - { RC_LH_CHILD_FISH_7, RAND_INF_CHILD_FISH_7 }, - { RC_LH_CHILD_FISH_8, RAND_INF_CHILD_FISH_8 }, - { RC_LH_CHILD_FISH_9, RAND_INF_CHILD_FISH_9 }, - { RC_LH_CHILD_FISH_10, RAND_INF_CHILD_FISH_10 }, - { RC_LH_CHILD_FISH_11, RAND_INF_CHILD_FISH_11 }, - { RC_LH_CHILD_FISH_12, RAND_INF_CHILD_FISH_12 }, - { RC_LH_CHILD_FISH_13, RAND_INF_CHILD_FISH_13 }, - { RC_LH_CHILD_FISH_14, RAND_INF_CHILD_FISH_14 }, - { RC_LH_CHILD_FISH_15, RAND_INF_CHILD_FISH_15 }, - { RC_LH_CHILD_LOACH_1, RAND_INF_CHILD_LOACH_1 }, - { RC_LH_CHILD_LOACH_2, RAND_INF_CHILD_LOACH_2 }, - { RC_LH_ADULT_FISH_1, RAND_INF_ADULT_FISH_1 }, - { RC_LH_ADULT_FISH_2, RAND_INF_ADULT_FISH_2 }, - { RC_LH_ADULT_FISH_3, RAND_INF_ADULT_FISH_3 }, - { RC_LH_ADULT_FISH_4, RAND_INF_ADULT_FISH_4 }, - { RC_LH_ADULT_FISH_5, RAND_INF_ADULT_FISH_5 }, - { RC_LH_ADULT_FISH_6, RAND_INF_ADULT_FISH_6 }, - { RC_LH_ADULT_FISH_7, RAND_INF_ADULT_FISH_7 }, - { RC_LH_ADULT_FISH_8, RAND_INF_ADULT_FISH_8 }, - { RC_LH_ADULT_FISH_9, RAND_INF_ADULT_FISH_9 }, - { RC_LH_ADULT_FISH_10, RAND_INF_ADULT_FISH_10 }, - { RC_LH_ADULT_FISH_11, RAND_INF_ADULT_FISH_11 }, - { RC_LH_ADULT_FISH_12, RAND_INF_ADULT_FISH_12 }, - { RC_LH_ADULT_FISH_13, RAND_INF_ADULT_FISH_13 }, - { RC_LH_ADULT_FISH_14, RAND_INF_ADULT_FISH_14 }, - { RC_LH_ADULT_FISH_15, RAND_INF_ADULT_FISH_15 }, - { RC_LH_ADULT_LOACH, RAND_INF_ADULT_LOACH }, - { RC_ZR_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO }, - { RC_DMC_UPPER_GROTTO_FISH, RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO }, - { RC_DMT_STORMS_GROTTO_FISH, RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO }, - { RC_KAK_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO }, - { RC_HF_NEAR_MARKET_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO }, - { RC_HF_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO }, - { RC_HF_SOUTHEAST_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO }, - { RC_LW_NEAR_SHORTCUTS_GROTTO_FISH, RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO }, - { RC_KF_STORMS_GROTTO_FISH, RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO }, - { RC_ZD_FISH_1, RAND_INF_ZD_FISH_1 }, - { RC_ZD_FISH_2, RAND_INF_ZD_FISH_2 }, - { RC_ZD_FISH_3, RAND_INF_ZD_FISH_3 }, - { RC_ZD_FISH_4, RAND_INF_ZD_FISH_4 }, - { RC_ZD_FISH_5, RAND_INF_ZD_FISH_5 }, - - { RC_KF_LINKS_HOUSE_POT, RAND_INF_KF_LINKS_HOUSE_POT }, - { RC_KF_TWINS_HOUSE_POT_1, RAND_INF_KF_TWINS_HOUSE_POT_1 }, - { RC_KF_TWINS_HOUSE_POT_2, RAND_INF_KF_TWINS_HOUSE_POT_2 }, - { RC_KF_BROTHERS_HOUSE_POT_1, RAND_INF_KF_BROTHERS_HOUSE_POT_1 }, - { RC_KF_BROTHERS_HOUSE_POT_2, RAND_INF_KF_BROTHERS_HOUSE_POT_2 }, - { RC_GF_BREAK_ROOM_POT_1, RAND_INF_GF_BREAK_ROOM_POT_1 }, - { RC_GF_BREAK_ROOM_POT_2, RAND_INF_GF_BREAK_ROOM_POT_2 }, - { RC_GF_KITCHEN_POT_1, RAND_INF_GF_KITCHEN_POT_1 }, - { RC_GF_KITCHEN_POT_2, RAND_INF_GF_KITCHEN_POT_2 }, - { RC_GF_NORTH_F1_CARPENTER_POT_1, RAND_INF_GF_NORTH_F1_CARPENTER_POT_1 }, - { RC_GF_NORTH_F1_CARPENTER_POT_2, RAND_INF_GF_NORTH_F1_CARPENTER_POT_2 }, - { RC_GF_NORTH_F1_CARPENTER_POT_3, RAND_INF_GF_NORTH_F1_CARPENTER_POT_3 }, - { RC_GF_NORTH_F2_CARPENTER_POT_1, RAND_INF_GF_NORTH_F2_CARPENTER_POT_1 }, - { RC_GF_NORTH_F2_CARPENTER_POT_2, RAND_INF_GF_NORTH_F2_CARPENTER_POT_2 }, - { RC_GF_SOUTH_F1_CARPENTER_POT_1, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1 }, - { RC_GF_SOUTH_F1_CARPENTER_POT_2, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2 }, - { RC_GF_SOUTH_F1_CARPENTER_POT_3, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4 }, - { RC_WASTELAND_NEAR_GS_POT_1, RAND_INF_WASTELAND_NEAR_GS_POT_1 }, - { RC_WASTELAND_NEAR_GS_POT_2, RAND_INF_WASTELAND_NEAR_GS_POT_2 }, - { RC_WASTELAND_NEAR_GS_POT_3, RAND_INF_WASTELAND_NEAR_GS_POT_3 }, - { RC_WASTELAND_NEAR_GS_POT_4, RAND_INF_WASTELAND_NEAR_GS_POT_4 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_1, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_2, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_3, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_4, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_5, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_6, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_7, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_8, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_9, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_10, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_11, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_12, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_13, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_14, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_15, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_16, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_17, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_18, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_19, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_20, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_21, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_22, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_23, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_24, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_25, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_26, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_27, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_28, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_29, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_30, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_31, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_32, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_33, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_34, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_35, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_36, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_37, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_38, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_39, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_40, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_41, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_42, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_43, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_44, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_1, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_2, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_3, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_4, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_5, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_6, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_7, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_8, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_9, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_10, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_11, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11 }, - { RC_MK_BACK_ALLEY_HOUSE_POT_1, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1 }, - { RC_MK_BACK_ALLEY_HOUSE_POT_2, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2 }, - { RC_MK_BACK_ALLEY_HOUSE_POT_3, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3 }, - { RC_KAK_NEAR_POTION_SHOP_POT_1, RAND_INF_KAK_NEAR_POTION_SHOP_POT_1 }, - { RC_KAK_NEAR_POTION_SHOP_POT_2, RAND_INF_KAK_NEAR_POTION_SHOP_POT_2 }, - { RC_KAK_NEAR_POTION_SHOP_POT_3, RAND_INF_KAK_NEAR_POTION_SHOP_POT_3 }, - { RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1 }, - { RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2 }, - { RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3 }, - { RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1 }, - { RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2 }, - { RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3 }, - { RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1 }, - { RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2 }, - { RC_GY_DAMPES_GRAVE_POT_1, RAND_INF_GY_DAMPES_GRAVE_POT_1 }, - { RC_GY_DAMPES_GRAVE_POT_2, RAND_INF_GY_DAMPES_GRAVE_POT_2 }, - { RC_GY_DAMPES_GRAVE_POT_3, RAND_INF_GY_DAMPES_GRAVE_POT_3 }, - { RC_GY_DAMPES_GRAVE_POT_4, RAND_INF_GY_DAMPES_GRAVE_POT_4 }, - { RC_GY_DAMPES_GRAVE_POT_5, RAND_INF_GY_DAMPES_GRAVE_POT_5 }, - { RC_GY_DAMPES_GRAVE_POT_6, RAND_INF_GY_DAMPES_GRAVE_POT_6 }, - { RC_GC_LOWER_STAIRCASE_POT_1, RAND_INF_GC_LOWER_STAIRCASE_POT_1 }, - { RC_GC_LOWER_STAIRCASE_POT_2, RAND_INF_GC_LOWER_STAIRCASE_POT_2 }, - { RC_GC_UPPER_STAIRCASE_POT_1, RAND_INF_GC_UPPER_STAIRCASE_POT_1 }, - { RC_GC_UPPER_STAIRCASE_POT_2, RAND_INF_GC_UPPER_STAIRCASE_POT_2 }, - { RC_GC_UPPER_STAIRCASE_POT_3, RAND_INF_GC_UPPER_STAIRCASE_POT_3 }, - { RC_GC_MEDIGORON_POT_1, RAND_INF_GC_MEDIGORON_POT_1 }, - { RC_GC_DARUNIA_POT_1, RAND_INF_GC_DARUNIA_POT_1 }, - { RC_GC_DARUNIA_POT_2, RAND_INF_GC_DARUNIA_POT_2 }, - { RC_GC_DARUNIA_POT_3, RAND_INF_GC_DARUNIA_POT_3 }, - { RC_DMC_NEAR_GC_POT_1, RAND_INF_DMC_NEAR_GC_POT_1 }, - { RC_DMC_NEAR_GC_POT_2, RAND_INF_DMC_NEAR_GC_POT_2 }, - { RC_DMC_NEAR_GC_POT_3, RAND_INF_DMC_NEAR_GC_POT_3 }, - { RC_DMC_NEAR_GC_POT_4, RAND_INF_DMC_NEAR_GC_POT_4 }, - { RC_ZD_NEAR_SHOP_POT_1, RAND_INF_ZD_NEAR_SHOP_POT_1 }, - { RC_ZD_NEAR_SHOP_POT_2, RAND_INF_ZD_NEAR_SHOP_POT_2 }, - { RC_ZD_NEAR_SHOP_POT_3, RAND_INF_ZD_NEAR_SHOP_POT_3 }, - { RC_ZD_NEAR_SHOP_POT_4, RAND_INF_ZD_NEAR_SHOP_POT_4 }, - { RC_ZD_NEAR_SHOP_POT_5, RAND_INF_ZD_NEAR_SHOP_POT_5 }, - { RC_ZF_HIDDEN_CAVE_POT_1, RAND_INF_ZF_HIDDEN_CAVE_POT_1 }, - { RC_ZF_HIDDEN_CAVE_POT_2, RAND_INF_ZF_HIDDEN_CAVE_POT_2 }, - { RC_ZF_HIDDEN_CAVE_POT_3, RAND_INF_ZF_HIDDEN_CAVE_POT_3 }, - { RC_ZF_NEAR_JABU_POT_1, RAND_INF_ZF_NEAR_JABU_POT_1 }, - { RC_ZF_NEAR_JABU_POT_2, RAND_INF_ZF_NEAR_JABU_POT_2 }, - { RC_ZF_NEAR_JABU_POT_3, RAND_INF_ZF_NEAR_JABU_POT_3 }, - { RC_ZF_NEAR_JABU_POT_4, RAND_INF_ZF_NEAR_JABU_POT_4 }, - { RC_LLR_FRONT_POT_1, RAND_INF_LLR_FRONT_POT_1 }, - { RC_LLR_FRONT_POT_2, RAND_INF_LLR_FRONT_POT_2 }, - { RC_LLR_FRONT_POT_3, RAND_INF_LLR_FRONT_POT_3 }, - { RC_LLR_FRONT_POT_4, RAND_INF_LLR_FRONT_POT_4 }, - { RC_LLR_RAIN_SHED_POT_1, RAND_INF_LLR_RAIN_SHED_POT_1 }, - { RC_LLR_RAIN_SHED_POT_2, RAND_INF_LLR_RAIN_SHED_POT_2 }, - { RC_LLR_RAIN_SHED_POT_3, RAND_INF_LLR_RAIN_SHED_POT_3 }, - { RC_LLR_TALONS_HOUSE_POT_1, RAND_INF_LLR_TALONS_HOUSE_POT_1 }, - { RC_LLR_TALONS_HOUSE_POT_2, RAND_INF_LLR_TALONS_HOUSE_POT_2 }, - { RC_LLR_TALONS_HOUSE_POT_3, RAND_INF_LLR_TALONS_HOUSE_POT_3 }, - { RC_HF_COW_GROTTO_POT_1, RAND_INF_HF_COW_GROTTO_POT_1 }, - { RC_HF_COW_GROTTO_POT_2, RAND_INF_HF_COW_GROTTO_POT_2 }, - { RC_HC_STORMS_GROTTO_POT_1, RAND_INF_HC_STORMS_GROTTO_POT_1 }, - { RC_HC_STORMS_GROTTO_POT_2, RAND_INF_HC_STORMS_GROTTO_POT_2 }, - { RC_HC_STORMS_GROTTO_POT_3, RAND_INF_HC_STORMS_GROTTO_POT_3 }, - { RC_HC_STORMS_GROTTO_POT_4, RAND_INF_HC_STORMS_GROTTO_POT_4 }, - { RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1 }, - { RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2 }, - { RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3 }, - { RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6 }, - { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1 }, - { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2 }, - { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3 }, - { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4 }, - { RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1 }, - { RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2 }, - { RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3 }, - { RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4 }, - { RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1 }, - { RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2 }, - { RC_DODONGOS_CAVERN_BLADE_POT_1, RAND_INF_DODONGOS_CAVERN_BLADE_POT_1 }, - { RC_DODONGOS_CAVERN_BLADE_POT_2, RAND_INF_DODONGOS_CAVERN_BLADE_POT_2 }, - { RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1 }, - { RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2 }, - { RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1 }, - { RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2 }, - { RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3 }, - { RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4 }, - { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1 }, - { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2 }, - { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_1, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_2, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_3, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_4, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_5, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_6, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6 }, - { RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1 }, - { RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2 }, - { RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3 }, - { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1 }, - { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2 }, - { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3 }, - { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4 }, - { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5 }, - { RC_FOREST_TEMPLE_LOBBY_POT_1, RAND_INF_FOREST_TEMPLE_LOBBY_POT_1 }, - { RC_FOREST_TEMPLE_LOBBY_POT_2, RAND_INF_FOREST_TEMPLE_LOBBY_POT_2 }, - { RC_FOREST_TEMPLE_LOBBY_POT_3, RAND_INF_FOREST_TEMPLE_LOBBY_POT_3 }, - { RC_FOREST_TEMPLE_LOBBY_POT_4, RAND_INF_FOREST_TEMPLE_LOBBY_POT_4 }, - { RC_FOREST_TEMPLE_LOBBY_POT_5, RAND_INF_FOREST_TEMPLE_LOBBY_POT_5 }, - { RC_FOREST_TEMPLE_LOBBY_POT_6, RAND_INF_FOREST_TEMPLE_LOBBY_POT_6 }, - { RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1 }, - { RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2 }, - { RC_FOREST_TEMPLE_GREEN_POE_POT_1, RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1 }, - { RC_FOREST_TEMPLE_GREEN_POE_POT_2, RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2 }, - { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1 }, - { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2 }, - { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3 }, - { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4 }, - { RC_FOREST_TEMPLE_BLUE_POE_POT_1, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1 }, - { RC_FOREST_TEMPLE_BLUE_POE_POT_2, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2 }, - { RC_FOREST_TEMPLE_BLUE_POE_POT_3, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3 }, - { RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1 }, - { RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2 }, - { RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1 }, - { RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2 }, - { RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3 }, - { RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4 }, - { RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1 }, - { RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2 }, - { RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4 }, - { RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1 }, - { RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2 }, - { RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1 }, - { RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2 }, - { RC_WATER_TEMPLE_TORCH_POT_1, RAND_INF_WATER_TEMPLE_TORCH_POT_1 }, - { RC_WATER_TEMPLE_TORCH_POT_2, RAND_INF_WATER_TEMPLE_TORCH_POT_2 }, - { RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1 }, - { RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2 }, - { RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3 }, - { RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1 }, - { RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2 }, - { RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1 }, - { RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2 }, - { RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3 }, - { RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4 }, - { RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1 }, - { RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2 }, - { RC_WATER_TEMPLE_RIVER_POT_1, RAND_INF_WATER_TEMPLE_RIVER_POT_1 }, - { RC_WATER_TEMPLE_RIVER_POT_2, RAND_INF_WATER_TEMPLE_RIVER_POT_2 }, - { RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1 }, - { RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2 }, - { RC_WATER_TEMPLE_BOSS_KEY_POT_1, RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1 }, - { RC_WATER_TEMPLE_BOSS_KEY_POT_2, RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2 }, - { RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1 }, - { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1 }, - { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2 }, - { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3 }, - { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4 }, - { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5 }, - { RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1 }, - { RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2 }, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1 }, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2 }, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3 }, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4 }, - { RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1 }, - { RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2 }, - { RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1 }, - { RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1 }, - { RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2 }, - { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1 }, - { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2 }, - { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3 }, - { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4 }, - { RC_SPIRIT_TEMPLE_LOBBY_POT_1, RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1 }, - { RC_SPIRIT_TEMPLE_LOBBY_POT_2, RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2 }, - { RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1 }, - { RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2 }, - { RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3 }, - { RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4 }, - { RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1 }, - { RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1 }, - { RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6 }, - { RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1 }, - { RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3 }, - { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3 }, - { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4 }, - { RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1 }, - { RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12 }, - { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3 }, - { RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT }, - { RC_ICE_CAVERN_HALL_POT_1, RAND_INF_ICE_CAVERN_HALL_POT_1 }, - { RC_ICE_CAVERN_HALL_POT_2, RAND_INF_ICE_CAVERN_HALL_POT_2 }, - { RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1 }, - { RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2 }, - { RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3 }, - { RC_ICE_CAVERN_NEAR_END_POT_1, RAND_INF_ICE_CAVERN_NEAR_END_POT_1 }, - { RC_ICE_CAVERN_NEAR_END_POT_2, RAND_INF_ICE_CAVERN_NEAR_END_POT_2 }, - { RC_ICE_CAVERN_FROZEN_POT_1, RAND_INF_ICE_CAVERN_FROZEN_POT_1 }, + { RC_KF_LINKS_HOUSE_COW, RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW }, + { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT }, + { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT }, + { RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE }, + { RC_LW_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR }, + { RC_LW_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT }, + { RC_SFM_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR }, + { RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT }, + { RC_HF_DEKU_SCRUB_GROTTO, RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO }, + { RC_HF_COW_GROTTO_COW, RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW }, + { RC_LH_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT }, + { RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT }, + { RC_LH_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER }, + { RC_GV_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR }, + { RC_GV_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT }, + { RC_GV_COW, RAND_INF_COWS_MILKED_GV_COW }, + { RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR }, + { RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT }, + { RC_KAK_IMPAS_HOUSE_COW, RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW }, + { RC_DMT_COW_GROTTO_COW, RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW }, + { RC_GC_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT }, + { RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT }, + { RC_GC_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER }, + { RC_DMC_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB }, + { RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT }, + { RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT }, + { RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER }, + { RC_ZR_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR }, + { RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT }, + { RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT }, + { RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT }, + { RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER }, + { RC_LLR_STABLES_LEFT_COW, RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW }, + { RC_LLR_STABLES_RIGHT_COW, RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW }, + { RC_LLR_TOWER_LEFT_COW, RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW }, + { RC_LLR_TOWER_RIGHT_COW, RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW }, + { RC_DEKU_TREE_MQ_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB }, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, + RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT }, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, + RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS }, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, + RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT }, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY }, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR }, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, + RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT }, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE }, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS }, + { RC_JABU_JABUS_BELLY_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB }, + { RC_JABU_JABUS_BELLY_MQ_COW, RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW }, + { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT }, + { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT }, + { RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT }, + { RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT }, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT }, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT }, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER }, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT }, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT }, + { RC_KF_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1 }, + { RC_KF_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2 }, + { RC_KF_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3 }, + { RC_KF_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4 }, + { RC_KF_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5 }, + { RC_KF_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6 }, + { RC_KF_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7 }, + { RC_KF_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8 }, + { RC_GC_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1 }, + { RC_GC_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2 }, + { RC_GC_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3 }, + { RC_GC_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4 }, + { RC_GC_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5 }, + { RC_GC_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6 }, + { RC_GC_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7 }, + { RC_GC_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8 }, + { RC_ZD_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1 }, + { RC_ZD_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2 }, + { RC_ZD_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3 }, + { RC_ZD_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4 }, + { RC_ZD_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5 }, + { RC_ZD_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6 }, + { RC_ZD_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7 }, + { RC_ZD_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8 }, + { RC_KAK_BAZAAR_ITEM_1, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1 }, + { RC_KAK_BAZAAR_ITEM_2, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2 }, + { RC_KAK_BAZAAR_ITEM_3, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3 }, + { RC_KAK_BAZAAR_ITEM_4, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4 }, + { RC_KAK_BAZAAR_ITEM_5, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5 }, + { RC_KAK_BAZAAR_ITEM_6, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6 }, + { RC_KAK_BAZAAR_ITEM_7, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7 }, + { RC_KAK_BAZAAR_ITEM_8, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8 }, + { RC_KAK_POTION_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1 }, + { RC_KAK_POTION_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2 }, + { RC_KAK_POTION_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3 }, + { RC_KAK_POTION_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4 }, + { RC_KAK_POTION_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5 }, + { RC_KAK_POTION_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6 }, + { RC_KAK_POTION_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7 }, + { RC_KAK_POTION_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8 }, + { RC_MARKET_BAZAAR_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1 }, + { RC_MARKET_BAZAAR_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2 }, + { RC_MARKET_BAZAAR_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3 }, + { RC_MARKET_BAZAAR_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4 }, + { RC_MARKET_BAZAAR_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5 }, + { RC_MARKET_BAZAAR_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6 }, + { RC_MARKET_BAZAAR_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7 }, + { RC_MARKET_BAZAAR_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8 }, + { RC_MARKET_POTION_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1 }, + { RC_MARKET_POTION_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2 }, + { RC_MARKET_POTION_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3 }, + { RC_MARKET_POTION_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4 }, + { RC_MARKET_POTION_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5 }, + { RC_MARKET_POTION_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6 }, + { RC_MARKET_POTION_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7 }, + { RC_MARKET_POTION_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8 }, + { RC_TOT_MASTER_SWORD, RAND_INF_TOT_MASTER_SWORD }, + { RC_GC_MEDIGORON, RAND_INF_MERCHANTS_MEDIGORON }, + { RC_KAK_GRANNYS_SHOP, RAND_INF_MERCHANTS_GRANNYS_SHOP }, + { RC_WASTELAND_BOMBCHU_SALESMAN, RAND_INF_MERCHANTS_CARPET_SALESMAN }, + { RC_ZR_MAGIC_BEAN_SALESMAN, RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN }, + { RC_LW_TRADE_COJIRO, RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO }, + { RC_GV_TRADE_SAW, RAND_INF_ADULT_TRADES_GV_TRADE_SAW }, + { RC_DMT_TRADE_BROKEN_SWORD, RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD }, + { RC_LH_TRADE_FROG, RAND_INF_ADULT_TRADES_LH_TRADE_FROG }, + { RC_DMT_TRADE_EYEDROPS, RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS }, + { RC_LH_CHILD_FISHING, RAND_INF_CHILD_FISHING }, + { RC_LH_ADULT_FISHING, RAND_INF_ADULT_FISHING }, + { RC_MARKET_10_BIG_POES, RAND_INF_10_BIG_POES }, + { RC_KAK_100_GOLD_SKULLTULA_REWARD, RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD }, + { RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT }, + { RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT }, + { RC_LW_DEKU_SCRUB_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO }, + { RC_SFM_STORMS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_SFM_STORMS_GROTTO }, + { RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT }, + { RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT }, + { RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT }, + { RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT }, + { RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT }, + { RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT }, + { RC_HF_INSIDE_FENCE_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO }, + { RC_LLR_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LLR_GROTTO }, + { RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT }, + { RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT }, + { RC_DMT_COW_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_DMT_COW_GROTTO }, + { RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT }, + { RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT }, + { RC_GC_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_GC_GROTTO }, + { RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT }, + { RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT }, + { RC_DMC_HAMMER_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO }, + { RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT }, + { RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT }, + { RC_ZR_STORMS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_ZR_STORMS_GROTTO }, + { RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT }, + { RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT }, + { RC_ZD_BEHIND_KING_ZORA_BEEHIVE, RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA }, + { RC_LH_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LH_GROTTO }, + { RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO }, + { RC_COLOSSUS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_COLOSSUS_GROTTO }, + { RC_LH_CHILD_FISH_1, RAND_INF_CHILD_FISH_1 }, + { RC_LH_CHILD_FISH_2, RAND_INF_CHILD_FISH_2 }, + { RC_LH_CHILD_FISH_3, RAND_INF_CHILD_FISH_3 }, + { RC_LH_CHILD_FISH_4, RAND_INF_CHILD_FISH_4 }, + { RC_LH_CHILD_FISH_5, RAND_INF_CHILD_FISH_5 }, + { RC_LH_CHILD_FISH_6, RAND_INF_CHILD_FISH_6 }, + { RC_LH_CHILD_FISH_7, RAND_INF_CHILD_FISH_7 }, + { RC_LH_CHILD_FISH_8, RAND_INF_CHILD_FISH_8 }, + { RC_LH_CHILD_FISH_9, RAND_INF_CHILD_FISH_9 }, + { RC_LH_CHILD_FISH_10, RAND_INF_CHILD_FISH_10 }, + { RC_LH_CHILD_FISH_11, RAND_INF_CHILD_FISH_11 }, + { RC_LH_CHILD_FISH_12, RAND_INF_CHILD_FISH_12 }, + { RC_LH_CHILD_FISH_13, RAND_INF_CHILD_FISH_13 }, + { RC_LH_CHILD_FISH_14, RAND_INF_CHILD_FISH_14 }, + { RC_LH_CHILD_FISH_15, RAND_INF_CHILD_FISH_15 }, + { RC_LH_CHILD_LOACH_1, RAND_INF_CHILD_LOACH_1 }, + { RC_LH_CHILD_LOACH_2, RAND_INF_CHILD_LOACH_2 }, + { RC_LH_ADULT_FISH_1, RAND_INF_ADULT_FISH_1 }, + { RC_LH_ADULT_FISH_2, RAND_INF_ADULT_FISH_2 }, + { RC_LH_ADULT_FISH_3, RAND_INF_ADULT_FISH_3 }, + { RC_LH_ADULT_FISH_4, RAND_INF_ADULT_FISH_4 }, + { RC_LH_ADULT_FISH_5, RAND_INF_ADULT_FISH_5 }, + { RC_LH_ADULT_FISH_6, RAND_INF_ADULT_FISH_6 }, + { RC_LH_ADULT_FISH_7, RAND_INF_ADULT_FISH_7 }, + { RC_LH_ADULT_FISH_8, RAND_INF_ADULT_FISH_8 }, + { RC_LH_ADULT_FISH_9, RAND_INF_ADULT_FISH_9 }, + { RC_LH_ADULT_FISH_10, RAND_INF_ADULT_FISH_10 }, + { RC_LH_ADULT_FISH_11, RAND_INF_ADULT_FISH_11 }, + { RC_LH_ADULT_FISH_12, RAND_INF_ADULT_FISH_12 }, + { RC_LH_ADULT_FISH_13, RAND_INF_ADULT_FISH_13 }, + { RC_LH_ADULT_FISH_14, RAND_INF_ADULT_FISH_14 }, + { RC_LH_ADULT_FISH_15, RAND_INF_ADULT_FISH_15 }, + { RC_LH_ADULT_LOACH, RAND_INF_ADULT_LOACH }, + { RC_ZR_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO }, + { RC_DMC_UPPER_GROTTO_FISH, RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO }, + { RC_DMT_STORMS_GROTTO_FISH, RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO }, + { RC_KAK_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO }, + { RC_HF_NEAR_MARKET_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO }, + { RC_HF_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO }, + { RC_HF_SOUTHEAST_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_FISH, RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO }, + { RC_KF_STORMS_GROTTO_FISH, RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO }, + { RC_ZD_FISH_1, RAND_INF_ZD_FISH_1 }, + { RC_ZD_FISH_2, RAND_INF_ZD_FISH_2 }, + { RC_ZD_FISH_3, RAND_INF_ZD_FISH_3 }, + { RC_ZD_FISH_4, RAND_INF_ZD_FISH_4 }, + { RC_ZD_FISH_5, RAND_INF_ZD_FISH_5 }, + // Grass + { RC_KF_CHILD_GRASS_1, RAND_INF_KF_CHILD_GRASS_1 }, + { RC_KF_CHILD_GRASS_2, RAND_INF_KF_CHILD_GRASS_2 }, + { RC_KF_CHILD_GRASS_3, RAND_INF_KF_CHILD_GRASS_3 }, + { RC_KF_CHILD_GRASS_4, RAND_INF_KF_CHILD_GRASS_4 }, + { RC_KF_CHILD_GRASS_5, RAND_INF_KF_CHILD_GRASS_5 }, + { RC_KF_CHILD_GRASS_6, RAND_INF_KF_CHILD_GRASS_6 }, + { RC_KF_CHILD_GRASS_7, RAND_INF_KF_CHILD_GRASS_7 }, + { RC_KF_CHILD_GRASS_8, RAND_INF_KF_CHILD_GRASS_8 }, + { RC_KF_CHILD_GRASS_9, RAND_INF_KF_CHILD_GRASS_9 }, + { RC_KF_CHILD_GRASS_10, RAND_INF_KF_CHILD_GRASS_10 }, + { RC_KF_CHILD_GRASS_11, RAND_INF_KF_CHILD_GRASS_11 }, + { RC_KF_CHILD_GRASS_12, RAND_INF_KF_CHILD_GRASS_12 }, + { RC_KF_CHILD_GRASS_MAZE_1, RAND_INF_KF_CHILD_GRASS_MAZE_1 }, + { RC_KF_CHILD_GRASS_MAZE_2, RAND_INF_KF_CHILD_GRASS_MAZE_2 }, + { RC_KF_CHILD_GRASS_MAZE_3, RAND_INF_KF_CHILD_GRASS_MAZE_3 }, + { RC_KF_ADULT_GRASS_1, RAND_INF_KF_ADULT_GRASS_1 }, + { RC_KF_ADULT_GRASS_2, RAND_INF_KF_ADULT_GRASS_2 }, + { RC_KF_ADULT_GRASS_3, RAND_INF_KF_ADULT_GRASS_3 }, + { RC_KF_ADULT_GRASS_4, RAND_INF_KF_ADULT_GRASS_4 }, + { RC_KF_ADULT_GRASS_5, RAND_INF_KF_ADULT_GRASS_5 }, + { RC_KF_ADULT_GRASS_6, RAND_INF_KF_ADULT_GRASS_6 }, + { RC_KF_ADULT_GRASS_7, RAND_INF_KF_ADULT_GRASS_7 }, + { RC_KF_ADULT_GRASS_8, RAND_INF_KF_ADULT_GRASS_8 }, + { RC_KF_ADULT_GRASS_9, RAND_INF_KF_ADULT_GRASS_9 }, + { RC_KF_ADULT_GRASS_10, RAND_INF_KF_ADULT_GRASS_10 }, + { RC_KF_ADULT_GRASS_11, RAND_INF_KF_ADULT_GRASS_11 }, + { RC_KF_ADULT_GRASS_12, RAND_INF_KF_ADULT_GRASS_12 }, + { RC_KF_ADULT_GRASS_13, RAND_INF_KF_ADULT_GRASS_13 }, + { RC_KF_ADULT_GRASS_14, RAND_INF_KF_ADULT_GRASS_14 }, + { RC_KF_ADULT_GRASS_15, RAND_INF_KF_ADULT_GRASS_15 }, + { RC_KF_ADULT_GRASS_16, RAND_INF_KF_ADULT_GRASS_16 }, + { RC_KF_ADULT_GRASS_17, RAND_INF_KF_ADULT_GRASS_17 }, + { RC_KF_ADULT_GRASS_18, RAND_INF_KF_ADULT_GRASS_18 }, + { RC_KF_ADULT_GRASS_19, RAND_INF_KF_ADULT_GRASS_19 }, + { RC_KF_ADULT_GRASS_20, RAND_INF_KF_ADULT_GRASS_20 }, + { RC_LW_GRASS_1, RAND_INF_LW_GRASS_1 }, + { RC_LW_GRASS_2, RAND_INF_LW_GRASS_2 }, + { RC_LW_GRASS_3, RAND_INF_LW_GRASS_3 }, + { RC_LW_GRASS_4, RAND_INF_LW_GRASS_4 }, + { RC_LW_GRASS_5, RAND_INF_LW_GRASS_5 }, + { RC_LW_GRASS_6, RAND_INF_LW_GRASS_6 }, + { RC_LW_GRASS_7, RAND_INF_LW_GRASS_7 }, + { RC_LW_GRASS_8, RAND_INF_LW_GRASS_8 }, + { RC_LW_GRASS_9, RAND_INF_LW_GRASS_9 }, + { RC_MARKET_GRASS_1, RAND_INF_MARKET_GRASS_1 }, + { RC_MARKET_GRASS_2, RAND_INF_MARKET_GRASS_2 }, + { RC_MARKET_GRASS_3, RAND_INF_MARKET_GRASS_3 }, + { RC_MARKET_GRASS_4, RAND_INF_MARKET_GRASS_4 }, + { RC_MARKET_GRASS_5, RAND_INF_MARKET_GRASS_5 }, + { RC_MARKET_GRASS_6, RAND_INF_MARKET_GRASS_6 }, + { RC_MARKET_GRASS_7, RAND_INF_MARKET_GRASS_7 }, + { RC_MARKET_GRASS_8, RAND_INF_MARKET_GRASS_8 }, + { RC_HC_GRASS_1, RAND_INF_HC_GRASS_1 }, + { RC_HC_GRASS_2, RAND_INF_HC_GRASS_2 }, + { RC_KAK_GRASS_1, RAND_INF_KAK_GRASS_1 }, + { RC_KAK_GRASS_2, RAND_INF_KAK_GRASS_2 }, + { RC_KAK_GRASS_3, RAND_INF_KAK_GRASS_3 }, + { RC_KAK_GRASS_4, RAND_INF_KAK_GRASS_4 }, + { RC_KAK_GRASS_5, RAND_INF_KAK_GRASS_5 }, + { RC_KAK_GRASS_6, RAND_INF_KAK_GRASS_6 }, + { RC_KAK_GRASS_7, RAND_INF_KAK_GRASS_7 }, + { RC_KAK_GRASS_8, RAND_INF_KAK_GRASS_8 }, + { RC_GY_GRASS_1, RAND_INF_GY_GRASS_1 }, + { RC_GY_GRASS_2, RAND_INF_GY_GRASS_2 }, + { RC_GY_GRASS_3, RAND_INF_GY_GRASS_3 }, + { RC_GY_GRASS_4, RAND_INF_GY_GRASS_4 }, + { RC_GY_GRASS_5, RAND_INF_GY_GRASS_5 }, + { RC_GY_GRASS_6, RAND_INF_GY_GRASS_6 }, + { RC_GY_GRASS_7, RAND_INF_GY_GRASS_7 }, + { RC_GY_GRASS_8, RAND_INF_GY_GRASS_8 }, + { RC_GY_GRASS_9, RAND_INF_GY_GRASS_9 }, + { RC_GY_GRASS_10, RAND_INF_GY_GRASS_10 }, + { RC_GY_GRASS_11, RAND_INF_GY_GRASS_11 }, + { RC_GY_GRASS_12, RAND_INF_GY_GRASS_12 }, + { RC_LH_GRASS_1, RAND_INF_LH_GRASS_1 }, + { RC_LH_GRASS_2, RAND_INF_LH_GRASS_2 }, + { RC_LH_GRASS_3, RAND_INF_LH_GRASS_3 }, + { RC_LH_GRASS_4, RAND_INF_LH_GRASS_4 }, + { RC_LH_GRASS_5, RAND_INF_LH_GRASS_5 }, + { RC_LH_GRASS_6, RAND_INF_LH_GRASS_6 }, + { RC_LH_GRASS_7, RAND_INF_LH_GRASS_7 }, + { RC_LH_GRASS_8, RAND_INF_LH_GRASS_8 }, + { RC_LH_GRASS_9, RAND_INF_LH_GRASS_9 }, + { RC_LH_GRASS_10, RAND_INF_LH_GRASS_10 }, + { RC_LH_GRASS_11, RAND_INF_LH_GRASS_11 }, + { RC_LH_GRASS_12, RAND_INF_LH_GRASS_12 }, + { RC_LH_GRASS_13, RAND_INF_LH_GRASS_13 }, + { RC_LH_GRASS_14, RAND_INF_LH_GRASS_14 }, + { RC_LH_GRASS_15, RAND_INF_LH_GRASS_15 }, + { RC_LH_GRASS_16, RAND_INF_LH_GRASS_16 }, + { RC_LH_GRASS_17, RAND_INF_LH_GRASS_17 }, + { RC_LH_GRASS_18, RAND_INF_LH_GRASS_18 }, + { RC_LH_GRASS_19, RAND_INF_LH_GRASS_19 }, + { RC_LH_GRASS_20, RAND_INF_LH_GRASS_20 }, + { RC_LH_GRASS_21, RAND_INF_LH_GRASS_21 }, + { RC_LH_GRASS_22, RAND_INF_LH_GRASS_22 }, + { RC_LH_GRASS_23, RAND_INF_LH_GRASS_23 }, + { RC_LH_GRASS_24, RAND_INF_LH_GRASS_24 }, + { RC_LH_GRASS_25, RAND_INF_LH_GRASS_25 }, + { RC_LH_GRASS_26, RAND_INF_LH_GRASS_26 }, + { RC_LH_GRASS_27, RAND_INF_LH_GRASS_27 }, + { RC_LH_GRASS_28, RAND_INF_LH_GRASS_28 }, + { RC_LH_GRASS_29, RAND_INF_LH_GRASS_29 }, + { RC_LH_GRASS_30, RAND_INF_LH_GRASS_30 }, + { RC_LH_GRASS_31, RAND_INF_LH_GRASS_31 }, + { RC_LH_GRASS_32, RAND_INF_LH_GRASS_32 }, + { RC_LH_GRASS_33, RAND_INF_LH_GRASS_33 }, + { RC_LH_GRASS_34, RAND_INF_LH_GRASS_34 }, + { RC_LH_GRASS_35, RAND_INF_LH_GRASS_35 }, + { RC_LH_GRASS_36, RAND_INF_LH_GRASS_36 }, + { RC_LH_CHILD_GRASS_1, RAND_INF_LH_CHILD_GRASS_1 }, + { RC_LH_CHILD_GRASS_2, RAND_INF_LH_CHILD_GRASS_2 }, + { RC_LH_CHILD_GRASS_3, RAND_INF_LH_CHILD_GRASS_3 }, + { RC_LH_CHILD_GRASS_4, RAND_INF_LH_CHILD_GRASS_4 }, + { RC_LH_WARP_PAD_GRASS_1, RAND_INF_LH_WARP_PAD_GRASS_1 }, + { RC_LH_WARP_PAD_GRASS_2, RAND_INF_LH_WARP_PAD_GRASS_2 }, + { RC_HF_NEAR_KF_GRASS_1, RAND_INF_HF_NEAR_KF_GRASS_1 }, + { RC_HF_NEAR_KF_GRASS_2, RAND_INF_HF_NEAR_KF_GRASS_2 }, + { RC_HF_NEAR_KF_GRASS_3, RAND_INF_HF_NEAR_KF_GRASS_3 }, + { RC_HF_NEAR_KF_GRASS_4, RAND_INF_HF_NEAR_KF_GRASS_4 }, + { RC_HF_NEAR_KF_GRASS_5, RAND_INF_HF_NEAR_KF_GRASS_5 }, + { RC_HF_NEAR_KF_GRASS_6, RAND_INF_HF_NEAR_KF_GRASS_6 }, + { RC_HF_NEAR_KF_GRASS_7, RAND_INF_HF_NEAR_KF_GRASS_7 }, + { RC_HF_NEAR_KF_GRASS_8, RAND_INF_HF_NEAR_KF_GRASS_8 }, + { RC_HF_NEAR_KF_GRASS_9, RAND_INF_HF_NEAR_KF_GRASS_9 }, + { RC_HF_NEAR_KF_GRASS_10, RAND_INF_HF_NEAR_KF_GRASS_10 }, + { RC_HF_NEAR_KF_GRASS_11, RAND_INF_HF_NEAR_KF_GRASS_11 }, + { RC_HF_NEAR_KF_GRASS_12, RAND_INF_HF_NEAR_KF_GRASS_12 }, + { RC_HF_NEAR_MARKET_GRASS_1, RAND_INF_HF_NEAR_MARKET_GRASS_1 }, + { RC_HF_NEAR_MARKET_GRASS_2, RAND_INF_HF_NEAR_MARKET_GRASS_2 }, + { RC_HF_NEAR_MARKET_GRASS_3, RAND_INF_HF_NEAR_MARKET_GRASS_3 }, + { RC_HF_NEAR_MARKET_GRASS_4, RAND_INF_HF_NEAR_MARKET_GRASS_4 }, + { RC_HF_NEAR_MARKET_GRASS_5, RAND_INF_HF_NEAR_MARKET_GRASS_5 }, + { RC_HF_NEAR_MARKET_GRASS_6, RAND_INF_HF_NEAR_MARKET_GRASS_6 }, + { RC_HF_NEAR_MARKET_GRASS_7, RAND_INF_HF_NEAR_MARKET_GRASS_7 }, + { RC_HF_NEAR_MARKET_GRASS_8, RAND_INF_HF_NEAR_MARKET_GRASS_8 }, + { RC_HF_NEAR_MARKET_GRASS_9, RAND_INF_HF_NEAR_MARKET_GRASS_9 }, + { RC_HF_NEAR_MARKET_GRASS_10, RAND_INF_HF_NEAR_MARKET_GRASS_10 }, + { RC_HF_NEAR_MARKET_GRASS_11, RAND_INF_HF_NEAR_MARKET_GRASS_11 }, + { RC_HF_NEAR_MARKET_GRASS_12, RAND_INF_HF_NEAR_MARKET_GRASS_12 }, + { RC_HF_SOUTH_GRASS_1, RAND_INF_HF_SOUTH_GRASS_1 }, + { RC_HF_SOUTH_GRASS_2, RAND_INF_HF_SOUTH_GRASS_2 }, + { RC_HF_SOUTH_GRASS_3, RAND_INF_HF_SOUTH_GRASS_3 }, + { RC_HF_SOUTH_GRASS_4, RAND_INF_HF_SOUTH_GRASS_4 }, + { RC_HF_SOUTH_GRASS_5, RAND_INF_HF_SOUTH_GRASS_5 }, + { RC_HF_SOUTH_GRASS_6, RAND_INF_HF_SOUTH_GRASS_6 }, + { RC_HF_SOUTH_GRASS_7, RAND_INF_HF_SOUTH_GRASS_7 }, + { RC_HF_SOUTH_GRASS_8, RAND_INF_HF_SOUTH_GRASS_8 }, + { RC_HF_SOUTH_GRASS_9, RAND_INF_HF_SOUTH_GRASS_9 }, + { RC_HF_SOUTH_GRASS_10, RAND_INF_HF_SOUTH_GRASS_10 }, + { RC_HF_SOUTH_GRASS_11, RAND_INF_HF_SOUTH_GRASS_11 }, + { RC_HF_SOUTH_GRASS_12, RAND_INF_HF_SOUTH_GRASS_12 }, + { RC_HF_CENTRAL_GRASS_1, RAND_INF_HF_CENTRAL_GRASS_1 }, + { RC_HF_CENTRAL_GRASS_2, RAND_INF_HF_CENTRAL_GRASS_2 }, + { RC_HF_CENTRAL_GRASS_3, RAND_INF_HF_CENTRAL_GRASS_3 }, + { RC_HF_CENTRAL_GRASS_4, RAND_INF_HF_CENTRAL_GRASS_4 }, + { RC_HF_CENTRAL_GRASS_5, RAND_INF_HF_CENTRAL_GRASS_5 }, + { RC_HF_CENTRAL_GRASS_6, RAND_INF_HF_CENTRAL_GRASS_6 }, + { RC_HF_CENTRAL_GRASS_7, RAND_INF_HF_CENTRAL_GRASS_7 }, + { RC_HF_CENTRAL_GRASS_8, RAND_INF_HF_CENTRAL_GRASS_8 }, + { RC_HF_CENTRAL_GRASS_9, RAND_INF_HF_CENTRAL_GRASS_9 }, + { RC_HF_CENTRAL_GRASS_10, RAND_INF_HF_CENTRAL_GRASS_10 }, + { RC_HF_CENTRAL_GRASS_11, RAND_INF_HF_CENTRAL_GRASS_11 }, + { RC_HF_CENTRAL_GRASS_12, RAND_INF_HF_CENTRAL_GRASS_12 }, + { RC_ZR_GRASS_1, RAND_INF_ZR_GRASS_1 }, + { RC_ZR_GRASS_2, RAND_INF_ZR_GRASS_2 }, + { RC_ZR_GRASS_3, RAND_INF_ZR_GRASS_3 }, + { RC_ZR_GRASS_4, RAND_INF_ZR_GRASS_4 }, + { RC_ZR_GRASS_5, RAND_INF_ZR_GRASS_5 }, + { RC_ZR_GRASS_6, RAND_INF_ZR_GRASS_6 }, + { RC_ZR_GRASS_7, RAND_INF_ZR_GRASS_7 }, + { RC_ZR_GRASS_8, RAND_INF_ZR_GRASS_8 }, + { RC_ZR_GRASS_9, RAND_INF_ZR_GRASS_9 }, + { RC_ZR_GRASS_10, RAND_INF_ZR_GRASS_10 }, + { RC_ZR_GRASS_11, RAND_INF_ZR_GRASS_11 }, + { RC_ZR_GRASS_12, RAND_INF_ZR_GRASS_12 }, + { RC_ZR_NEAR_FREESTANDING_POH_GRASS, RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS }, + // Grotto Grass + { RC_KF_STORMS_GROTTO_GRASS_1, RAND_INF_KF_STORMS_GROTTO_GRASS_1 }, + { RC_KF_STORMS_GROTTO_GRASS_2, RAND_INF_KF_STORMS_GROTTO_GRASS_2 }, + { RC_KF_STORMS_GROTTO_GRASS_3, RAND_INF_KF_STORMS_GROTTO_GRASS_3 }, + { RC_KF_STORMS_GROTTO_GRASS_4, RAND_INF_KF_STORMS_GROTTO_GRASS_4 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4 }, + { RC_HF_OPEN_GROTTO_GRASS_1, RAND_INF_HF_OPEN_GROTTO_GRASS_1 }, + { RC_HF_OPEN_GROTTO_GRASS_2, RAND_INF_HF_OPEN_GROTTO_GRASS_2 }, + { RC_HF_OPEN_GROTTO_GRASS_3, RAND_INF_HF_OPEN_GROTTO_GRASS_3 }, + { RC_HF_OPEN_GROTTO_GRASS_4, RAND_INF_HF_OPEN_GROTTO_GRASS_4 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_1, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_2, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_3, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_4, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4 }, + { RC_HF_COW_GROTTO_GRASS_1, RAND_INF_HF_COW_GROTTO_GRASS_1 }, + { RC_HF_COW_GROTTO_GRASS_2, RAND_INF_HF_COW_GROTTO_GRASS_2 }, + { RC_KAK_OPEN_GROTTO_GRASS_1, RAND_INF_KAK_OPEN_GROTTO_GRASS_1 }, + { RC_KAK_OPEN_GROTTO_GRASS_2, RAND_INF_KAK_OPEN_GROTTO_GRASS_2 }, + { RC_KAK_OPEN_GROTTO_GRASS_3, RAND_INF_KAK_OPEN_GROTTO_GRASS_3 }, + { RC_KAK_OPEN_GROTTO_GRASS_4, RAND_INF_KAK_OPEN_GROTTO_GRASS_4 }, + { RC_DMT_STORMS_GROTTO_GRASS_1, RAND_INF_DMT_STORMS_GROTTO_GRASS_1 }, + { RC_DMT_STORMS_GROTTO_GRASS_2, RAND_INF_DMT_STORMS_GROTTO_GRASS_2 }, + { RC_DMT_STORMS_GROTTO_GRASS_3, RAND_INF_DMT_STORMS_GROTTO_GRASS_3 }, + { RC_DMT_STORMS_GROTTO_GRASS_4, RAND_INF_DMT_STORMS_GROTTO_GRASS_4 }, + { RC_DMT_COW_GROTTO_GRASS_1, RAND_INF_DMT_COW_GROTTO_GRASS_1 }, + { RC_DMT_COW_GROTTO_GRASS_2, RAND_INF_DMT_COW_GROTTO_GRASS_2 }, + { RC_DMC_UPPER_GROTTO_GRASS_1, RAND_INF_DMC_UPPER_GROTTO_GRASS_1 }, + { RC_DMC_UPPER_GROTTO_GRASS_2, RAND_INF_DMC_UPPER_GROTTO_GRASS_2 }, + { RC_DMC_UPPER_GROTTO_GRASS_3, RAND_INF_DMC_UPPER_GROTTO_GRASS_3 }, + { RC_DMC_UPPER_GROTTO_GRASS_4, RAND_INF_DMC_UPPER_GROTTO_GRASS_4 }, + { RC_ZR_OPEN_GROTTO_GRASS_1, RAND_INF_ZR_OPEN_GROTTO_GRASS_1 }, + { RC_ZR_OPEN_GROTTO_GRASS_2, RAND_INF_ZR_OPEN_GROTTO_GRASS_2 }, + { RC_ZR_OPEN_GROTTO_GRASS_3, RAND_INF_ZR_OPEN_GROTTO_GRASS_3 }, + { RC_ZR_OPEN_GROTTO_GRASS_4, RAND_INF_ZR_OPEN_GROTTO_GRASS_4 }, + // Dungeon Grass + { RC_DEKU_TREE_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_LOBBY_GRASS_1 }, + { RC_DEKU_TREE_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_LOBBY_GRASS_2 }, + { RC_DEKU_TREE_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_LOBBY_GRASS_3 }, + { RC_DEKU_TREE_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_LOBBY_GRASS_4 }, + { RC_DEKU_TREE_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_LOBBY_GRASS_5 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4 }, + { RC_DEKU_TREE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4 }, + { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3 }, + { RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS }, + { RC_DODONGOS_CAVERN_BLADE_GRASS, RAND_INF_DODONGOS_CAVERN_BLADE_GRASS }, + { RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS }, + { RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3 }, + // MQ Dungeon Grass + { RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS }, + { RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS }, + { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1 }, + { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3 }, + { RC_JABU_JABUS_BELLY_MQ_JIGGLIES_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4 }, + // Shared Dungeon Grass + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8 }, + // End Grass - { RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1 }, - { RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2 }, - { RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1 }, - { RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2 }, - { RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1 }, - { RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2 }, - { RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1 }, - { RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2 }, - { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6 }, - { RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1 }, - { RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2 }, - { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1 }, - { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2 }, - { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3 }, - { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4 }, - { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1 }, - { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2 }, - { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3 }, - { RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1 }, - { RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2 }, - { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1 }, - { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2 }, - { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3 }, - { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3 }, - { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3 }, - { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3 }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3 }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3 }, - { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2 }, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3 }, - { RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4 }, - { RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3 }, - { RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4 }, - { RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT }, - { RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3 }, - { RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT }, - { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3 }, - { RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1 }, - { RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2 }, - { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1 }, - { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2 }, - { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1 }, - { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2 }, - { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3 }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1 }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2 }, - { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1 }, - { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2 }, - { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3 }, - { RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1 }, - { RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2 }, - { RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1 }, - { RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2 }, - { RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3 }, - { RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4 }, - { RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5 }, - { RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8 }, - { RC_ICE_CAVERN_MQ_ENTRANCE_POT, RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT }, - { RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1 }, - { RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2 }, - { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1 }, - { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2 }, - { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3 }, - { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4 }, - { RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1 }, - { RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2 }, - { RC_ICE_CAVERN_MQ_COMPASS_POT_1, RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1 }, - { RC_ICE_CAVERN_MQ_COMPASS_POT_2, RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3 }, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4 }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3 }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4 }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5 }, - { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3 }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4 }, - { RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2 }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1 }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2 }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3 }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4 }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5 }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1 }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2 }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3 }, - { RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1 }, - { RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2 }, - { RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3 }, - { RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4 }, - { RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5 }, - { RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1 }, - { RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2 }, - { RC_WATER_TEMPLE_MQ_RIVER_POT_1, RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1 }, - { RC_WATER_TEMPLE_MQ_RIVER_POT_2, RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2 }, - { RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1 }, - { RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2 }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1 }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2 }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1 }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2 }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3 }, - { RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1 }, - { RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2 }, - { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1 }, - { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2 }, - { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3 }, - { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4 }, - { RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT }, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1 }, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2 }, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1 }, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2 }, + { RC_KF_LINKS_HOUSE_POT, RAND_INF_KF_LINKS_HOUSE_POT }, + { RC_KF_TWINS_HOUSE_POT_1, RAND_INF_KF_TWINS_HOUSE_POT_1 }, + { RC_KF_TWINS_HOUSE_POT_2, RAND_INF_KF_TWINS_HOUSE_POT_2 }, + { RC_KF_BROTHERS_HOUSE_POT_1, RAND_INF_KF_BROTHERS_HOUSE_POT_1 }, + { RC_KF_BROTHERS_HOUSE_POT_2, RAND_INF_KF_BROTHERS_HOUSE_POT_2 }, + { RC_TH_BREAK_ROOM_FRONT_POT, RAND_INF_TH_BREAK_ROOM_FRONT_POT }, + { RC_TH_BREAK_ROOM_BACK_POT, RAND_INF_TH_BREAK_ROOM_BACK_POT }, + { RC_TH_KITCHEN_POT_1, RAND_INF_TH_KITCHEN_POT_1 }, + { RC_TH_KITCHEN_POT_2, RAND_INF_TH_KITCHEN_POT_2 }, + { RC_TH_1_TORCH_CELL_RIGHT_POT, RAND_INF_TH_1_TORCH_CELL_RIGHT_POT }, + { RC_TH_1_TORCH_CELL_MID_POT, RAND_INF_TH_1_TORCH_CELL_MID_POT }, + { RC_TH_1_TORCH_CELL_LEFT_POT, RAND_INF_TH_1_TORCH_CELL_LEFT_POT }, + { RC_TH_STEEP_SLOPE_RIGHT_POT, RAND_INF_TH_STEEP_SLOPE_RIGHT_POT }, + { RC_TH_STEEP_SLOPE_LEFT_POT, RAND_INF_TH_STEEP_SLOPE_LEFT_POT }, + { RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, RAND_INF_TH_NEAR_DOUBLE_CELL_RIGHT_POT }, + { RC_TH_NEAR_DOUBLE_CELL_MID_POT, RAND_INF_TH_NEAR_DOUBLE_CELL_MID_POT }, + { RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, RAND_INF_NEAR_DOUBLE_CELL_LEFT_POT }, + { RC_TH_RIGHTMOST_JAILED_POT, RAND_INF_TH_RIGHTMOST_JAILED_POT }, + { RC_TH_RIGHT_MIDDLE_JAILED_POT, RAND_INF_TH_RIGHT_MIDDLE_JAILED_POT }, + { RC_TH_LEFT_MIDDLE_JAILED_POT, RAND_INF_TH_LEFT_MIDDLE_JAILED_POT }, + { RC_TH_LEFTMOST_JAILED_POT, RAND_INF_TH_LEFTMOST_JAILED_POT }, + { RC_WASTELAND_NEAR_GS_POT_1, RAND_INF_WASTELAND_NEAR_GS_POT_1 }, + { RC_WASTELAND_NEAR_GS_POT_2, RAND_INF_WASTELAND_NEAR_GS_POT_2 }, + { RC_WASTELAND_NEAR_GS_POT_3, RAND_INF_WASTELAND_NEAR_GS_POT_3 }, + { RC_WASTELAND_NEAR_GS_POT_4, RAND_INF_WASTELAND_NEAR_GS_POT_4 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_1, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_2, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_3, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_4, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_5, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_6, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_7, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_8, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_9, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_10, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_11, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_12, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_13, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_14, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_15, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_16, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_17, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_18, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_19, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_20, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_21, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_22, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_23, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_24, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_25, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_26, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_27, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_28, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_29, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_30, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_31, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_32, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_33, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_34, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_35, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_36, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_37, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_38, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_39, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_40, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_41, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_42, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_43, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_44, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_1, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_2, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_3, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_4, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_5, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_6, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_7, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_8, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_9, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_10, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_11, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11 }, + { RC_MK_BACK_ALLEY_HOUSE_POT_1, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1 }, + { RC_MK_BACK_ALLEY_HOUSE_POT_2, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2 }, + { RC_MK_BACK_ALLEY_HOUSE_POT_3, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3 }, + { RC_KAK_NEAR_POTION_SHOP_POT_1, RAND_INF_KAK_NEAR_POTION_SHOP_POT_1 }, + { RC_KAK_NEAR_POTION_SHOP_POT_2, RAND_INF_KAK_NEAR_POTION_SHOP_POT_2 }, + { RC_KAK_NEAR_POTION_SHOP_POT_3, RAND_INF_KAK_NEAR_POTION_SHOP_POT_3 }, + { RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1 }, + { RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2 }, + { RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3 }, + { RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1 }, + { RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2 }, + { RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3 }, + { RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1 }, + { RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2 }, + { RC_GY_DAMPES_GRAVE_POT_1, RAND_INF_GY_DAMPES_GRAVE_POT_1 }, + { RC_GY_DAMPES_GRAVE_POT_2, RAND_INF_GY_DAMPES_GRAVE_POT_2 }, + { RC_GY_DAMPES_GRAVE_POT_3, RAND_INF_GY_DAMPES_GRAVE_POT_3 }, + { RC_GY_DAMPES_GRAVE_POT_4, RAND_INF_GY_DAMPES_GRAVE_POT_4 }, + { RC_GY_DAMPES_GRAVE_POT_5, RAND_INF_GY_DAMPES_GRAVE_POT_5 }, + { RC_GY_DAMPES_GRAVE_POT_6, RAND_INF_GY_DAMPES_GRAVE_POT_6 }, + { RC_GC_LOWER_STAIRCASE_POT_1, RAND_INF_GC_LOWER_STAIRCASE_POT_1 }, + { RC_GC_LOWER_STAIRCASE_POT_2, RAND_INF_GC_LOWER_STAIRCASE_POT_2 }, + { RC_GC_UPPER_STAIRCASE_POT_1, RAND_INF_GC_UPPER_STAIRCASE_POT_1 }, + { RC_GC_UPPER_STAIRCASE_POT_2, RAND_INF_GC_UPPER_STAIRCASE_POT_2 }, + { RC_GC_UPPER_STAIRCASE_POT_3, RAND_INF_GC_UPPER_STAIRCASE_POT_3 }, + { RC_GC_MEDIGORON_POT_1, RAND_INF_GC_MEDIGORON_POT_1 }, + { RC_GC_DARUNIA_POT_1, RAND_INF_GC_DARUNIA_POT_1 }, + { RC_GC_DARUNIA_POT_2, RAND_INF_GC_DARUNIA_POT_2 }, + { RC_GC_DARUNIA_POT_3, RAND_INF_GC_DARUNIA_POT_3 }, + { RC_DMC_NEAR_GC_POT_1, RAND_INF_DMC_NEAR_GC_POT_1 }, + { RC_DMC_NEAR_GC_POT_2, RAND_INF_DMC_NEAR_GC_POT_2 }, + { RC_DMC_NEAR_GC_POT_3, RAND_INF_DMC_NEAR_GC_POT_3 }, + { RC_DMC_NEAR_GC_POT_4, RAND_INF_DMC_NEAR_GC_POT_4 }, + { RC_ZD_NEAR_SHOP_POT_1, RAND_INF_ZD_NEAR_SHOP_POT_1 }, + { RC_ZD_NEAR_SHOP_POT_2, RAND_INF_ZD_NEAR_SHOP_POT_2 }, + { RC_ZD_NEAR_SHOP_POT_3, RAND_INF_ZD_NEAR_SHOP_POT_3 }, + { RC_ZD_NEAR_SHOP_POT_4, RAND_INF_ZD_NEAR_SHOP_POT_4 }, + { RC_ZD_NEAR_SHOP_POT_5, RAND_INF_ZD_NEAR_SHOP_POT_5 }, + { RC_ZF_HIDDEN_CAVE_POT_1, RAND_INF_ZF_HIDDEN_CAVE_POT_1 }, + { RC_ZF_HIDDEN_CAVE_POT_2, RAND_INF_ZF_HIDDEN_CAVE_POT_2 }, + { RC_ZF_HIDDEN_CAVE_POT_3, RAND_INF_ZF_HIDDEN_CAVE_POT_3 }, + { RC_ZF_NEAR_JABU_POT_1, RAND_INF_ZF_NEAR_JABU_POT_1 }, + { RC_ZF_NEAR_JABU_POT_2, RAND_INF_ZF_NEAR_JABU_POT_2 }, + { RC_ZF_NEAR_JABU_POT_3, RAND_INF_ZF_NEAR_JABU_POT_3 }, + { RC_ZF_NEAR_JABU_POT_4, RAND_INF_ZF_NEAR_JABU_POT_4 }, + { RC_LLR_FRONT_POT_1, RAND_INF_LLR_FRONT_POT_1 }, + { RC_LLR_FRONT_POT_2, RAND_INF_LLR_FRONT_POT_2 }, + { RC_LLR_FRONT_POT_3, RAND_INF_LLR_FRONT_POT_3 }, + { RC_LLR_FRONT_POT_4, RAND_INF_LLR_FRONT_POT_4 }, + { RC_LLR_RAIN_SHED_POT_1, RAND_INF_LLR_RAIN_SHED_POT_1 }, + { RC_LLR_RAIN_SHED_POT_2, RAND_INF_LLR_RAIN_SHED_POT_2 }, + { RC_LLR_RAIN_SHED_POT_3, RAND_INF_LLR_RAIN_SHED_POT_3 }, + { RC_LLR_TALONS_HOUSE_POT_1, RAND_INF_LLR_TALONS_HOUSE_POT_1 }, + { RC_LLR_TALONS_HOUSE_POT_2, RAND_INF_LLR_TALONS_HOUSE_POT_2 }, + { RC_LLR_TALONS_HOUSE_POT_3, RAND_INF_LLR_TALONS_HOUSE_POT_3 }, + { RC_HF_COW_GROTTO_POT_1, RAND_INF_HF_COW_GROTTO_POT_1 }, + { RC_HF_COW_GROTTO_POT_2, RAND_INF_HF_COW_GROTTO_POT_2 }, + { RC_HC_STORMS_GROTTO_POT_1, RAND_INF_HC_STORMS_GROTTO_POT_1 }, + { RC_HC_STORMS_GROTTO_POT_2, RAND_INF_HC_STORMS_GROTTO_POT_2 }, + { RC_HC_STORMS_GROTTO_POT_3, RAND_INF_HC_STORMS_GROTTO_POT_3 }, + { RC_HC_STORMS_GROTTO_POT_4, RAND_INF_HC_STORMS_GROTTO_POT_4 }, + { RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1 }, + { RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2 }, + { RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3 }, + { RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6 }, + { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1 }, + { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2 }, + { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3 }, + { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4 }, + { RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1 }, + { RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2 }, + { RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3 }, + { RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4 }, + { RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1 }, + { RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2 }, + { RC_DODONGOS_CAVERN_BLADE_POT_1, RAND_INF_DODONGOS_CAVERN_BLADE_POT_1 }, + { RC_DODONGOS_CAVERN_BLADE_POT_2, RAND_INF_DODONGOS_CAVERN_BLADE_POT_2 }, + { RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1 }, + { RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2 }, + { RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1 }, + { RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2 }, + { RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3 }, + { RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4 }, + { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1 }, + { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2 }, + { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_1, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_2, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_3, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_4, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_5, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_6, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6 }, + { RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1 }, + { RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2 }, + { RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3 }, + { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1 }, + { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2 }, + { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3 }, + { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4 }, + { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5 }, + { RC_FOREST_TEMPLE_LOBBY_POT_1, RAND_INF_FOREST_TEMPLE_LOBBY_POT_1 }, + { RC_FOREST_TEMPLE_LOBBY_POT_2, RAND_INF_FOREST_TEMPLE_LOBBY_POT_2 }, + { RC_FOREST_TEMPLE_LOBBY_POT_3, RAND_INF_FOREST_TEMPLE_LOBBY_POT_3 }, + { RC_FOREST_TEMPLE_LOBBY_POT_4, RAND_INF_FOREST_TEMPLE_LOBBY_POT_4 }, + { RC_FOREST_TEMPLE_LOBBY_POT_5, RAND_INF_FOREST_TEMPLE_LOBBY_POT_5 }, + { RC_FOREST_TEMPLE_LOBBY_POT_6, RAND_INF_FOREST_TEMPLE_LOBBY_POT_6 }, + { RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1 }, + { RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2 }, + { RC_FOREST_TEMPLE_GREEN_POE_POT_1, RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1 }, + { RC_FOREST_TEMPLE_GREEN_POE_POT_2, RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2 }, + { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1 }, + { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2 }, + { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3 }, + { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4 }, + { RC_FOREST_TEMPLE_BLUE_POE_POT_1, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1 }, + { RC_FOREST_TEMPLE_BLUE_POE_POT_2, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2 }, + { RC_FOREST_TEMPLE_BLUE_POE_POT_3, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3 }, + { RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1 }, + { RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2 }, + { RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1 }, + { RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2 }, + { RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3 }, + { RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4 }, + { RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1 }, + { RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2 }, + { RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4 }, + { RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1 }, + { RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2 }, + { RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1 }, + { RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2 }, + { RC_WATER_TEMPLE_TORCH_POT_1, RAND_INF_WATER_TEMPLE_TORCH_POT_1 }, + { RC_WATER_TEMPLE_TORCH_POT_2, RAND_INF_WATER_TEMPLE_TORCH_POT_2 }, + { RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1 }, + { RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2 }, + { RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3 }, + { RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1 }, + { RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2 }, + { RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1 }, + { RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2 }, + { RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3 }, + { RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4 }, + { RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1 }, + { RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2 }, + { RC_WATER_TEMPLE_RIVER_POT_1, RAND_INF_WATER_TEMPLE_RIVER_POT_1 }, + { RC_WATER_TEMPLE_RIVER_POT_2, RAND_INF_WATER_TEMPLE_RIVER_POT_2 }, + { RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1 }, + { RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2 }, + { RC_WATER_TEMPLE_BOSS_KEY_POT_1, RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1 }, + { RC_WATER_TEMPLE_BOSS_KEY_POT_2, RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2 }, + { RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1 }, + { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1 }, + { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2 }, + { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3 }, + { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4 }, + { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5 }, + { RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1 }, + { RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2 }, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1 }, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2 }, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3 }, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4 }, + { RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1 }, + { RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2 }, + { RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1 }, + { RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1 }, + { RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2 }, + { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1 }, + { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2 }, + { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3 }, + { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4 }, + { RC_SPIRIT_TEMPLE_LOBBY_POT_1, RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1 }, + { RC_SPIRIT_TEMPLE_LOBBY_POT_2, RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2 }, + { RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1 }, + { RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2 }, + { RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3 }, + { RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4 }, + { RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1 }, + { RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1 }, + { RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6 }, + { RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1 }, + { RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3 }, + { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3 }, + { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4 }, + { RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1 }, + { RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12 }, + { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3 }, + { RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT }, + { RC_ICE_CAVERN_HALL_POT_1, RAND_INF_ICE_CAVERN_HALL_POT_1 }, + { RC_ICE_CAVERN_HALL_POT_2, RAND_INF_ICE_CAVERN_HALL_POT_2 }, + { RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1 }, + { RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2 }, + { RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3 }, + { RC_ICE_CAVERN_NEAR_END_POT_1, RAND_INF_ICE_CAVERN_NEAR_END_POT_1 }, + { RC_ICE_CAVERN_NEAR_END_POT_2, RAND_INF_ICE_CAVERN_NEAR_END_POT_2 }, + { RC_ICE_CAVERN_FROZEN_POT_1, RAND_INF_ICE_CAVERN_FROZEN_POT_1 }, + + { RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1 }, + { RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2 }, + { RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1 }, + { RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2 }, + { RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1 }, + { RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2 }, + { RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1 }, + { RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2 }, + { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6 }, + { RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1 }, + { RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2 }, + { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1 }, + { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2 }, + { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3 }, + { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4 }, + { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1 }, + { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2 }, + { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3 }, + { RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1 }, + { RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2 }, + { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1 }, + { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2 }, + { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3 }, + { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3 }, + { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3 }, + { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3 }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3 }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2 }, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3 }, + { RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4 }, + { RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3 }, + { RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4 }, + { RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT }, + { RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3 }, + { RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT }, + { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3 }, + { RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1 }, + { RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2 }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1 }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2 }, + { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1 }, + { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2 }, + { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3 }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1 }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2 }, + { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1 }, + { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2 }, + { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3 }, + { RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1 }, + { RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2 }, + { RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1 }, + { RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2 }, + { RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3 }, + { RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4 }, + { RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5 }, + { RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8 }, + { RC_ICE_CAVERN_MQ_ENTRANCE_POT, RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT }, + { RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1 }, + { RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2 }, + { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1 }, + { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2 }, + { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3 }, + { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4 }, + { RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1 }, + { RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2 }, + { RC_ICE_CAVERN_MQ_COMPASS_POT_1, RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1 }, + { RC_ICE_CAVERN_MQ_COMPASS_POT_2, RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3 }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4 }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3 }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4 }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5 }, + { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3 }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4 }, + { RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2 }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1 }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2 }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3 }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4 }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5 }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1 }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2 }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3 }, + { RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1 }, + { RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2 }, + { RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3 }, + { RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4 }, + { RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5 }, + { RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1 }, + { RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2 }, + { RC_WATER_TEMPLE_MQ_RIVER_POT_1, RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1 }, + { RC_WATER_TEMPLE_MQ_RIVER_POT_2, RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2 }, + { RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1 }, + { RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2 }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1 }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2 }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1 }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2 }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3 }, + { RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1 }, + { RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2 }, + { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1 }, + { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2 }, + { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3 }, + { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4 }, + { RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT }, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1 }, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2 }, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1 }, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2 }, + // Crates + { + RC_GV_FREESTANDING_POH_CRATE, + RAND_INF_GV_FREESTANDING_POH_CRATE, + }, + { + RC_GV_NEAR_COW_CRATE, + RAND_INF_GV_NEAR_COW_CRATE, + }, + { + RC_GV_CRATE_BRIDGE_1, + RAND_INF_GV_CRATE_BRIDGE_1, + }, + { + RC_GV_CRATE_BRIDGE_2, + RAND_INF_GV_CRATE_BRIDGE_2, + }, + { + RC_GV_CRATE_BRIDGE_3, + RAND_INF_GV_CRATE_BRIDGE_3, + }, + { + RC_GV_CRATE_BRIDGE_4, + RAND_INF_GV_CRATE_BRIDGE_4, + }, + { + RC_GF_ABOVE_JAIL_CRATE, + RAND_INF_GF_ABOVE_JAIL_CRATE, + }, + { + RC_GF_SOUTHMOST_CENTER_CRATE, + RAND_INF_GF_SOUTHMOST_CENTER_CRATE, + }, + { + RC_GF_MID_SOUTH_CENTER_CRATE, + RAND_INF_GF_MID_SOUTH_CENTER_CRATE, + }, + { + RC_GF_MID_NORTH_CENTER_CRATE, + RAND_INF_GF_MID_NORTH_CENTER_CRATE, + }, + { + RR_GF_NORTHMOST_CENTER_CRATE, + RAND_INF_GF_NORTHMOST_CENTER_CRATE, + }, + { + RC_GF_OUTSKIRTS_NE_CRATE, + RAND_INF_GF_OUTSKIRTS_NE_CRATE, + }, + { + RC_GF_OUTSKIRTS_NW_CRATE, + RAND_INF_GF_OUTSKIRTS_NW_CRATE, + }, + { + RC_GF_HBA_RANGE_CRATE_1, + RAND_INF_GF_HBA_RANGE_CRATE_1, + }, + { + RC_GF_HBA_RANGE_CRATE_2, + RAND_INF_GF_HBA_RANGE_CRATE_2, + }, + { + RC_GF_HBA_RANGE_CRATE_3, + RAND_INF_GF_HBA_RANGE_CRATE_3, + }, + { + RC_GF_HBA_RANGE_CRATE_4, + RAND_INF_GF_HBA_RANGE_CRATE_4, + }, + { + RC_GF_HBA_RANGE_CRATE_5, + RAND_INF_GF_HBA_RANGE_CRATE_5, + }, + { + RC_GF_HBA_RANGE_CRATE_6, + RAND_INF_GF_HBA_RANGE_CRATE_6, + }, + { + RC_GF_HBA_RANGE_CRATE_7, + RAND_INF_GF_HBA_RANGE_CRATE_7, + }, + { + RC_GF_HBA_CANOPY_EAST_CRATE, + RAND_INF_GF_HBA_CANOPY_EAST_CRATE, + }, + { + RC_GF_HBA_CANOPY_WEST_CRATE, + RAND_INF_GF_HBA_CANOPY_WEST_CRATE, + }, + { + RC_GF_NORTH_TARGET_EAST_CRATE, + RAND_INF_GF_NORTH_TARGET_EAST_CRATE, + }, + { + RC_GF_NORTH_TARGET_WEST_CRATE, + RAND_INF_GF_NORTH_TARGET_WEST_CRATE, + }, + { + RC_GF_NORTH_TARGET_CHILD_CRATE, + RAND_INF_GF_NORTH_TARGET_CHILD_CRATE, + }, + { + RC_GF_SOUTH_TARGET_EAST_CRATE, + RAND_INF_GF_SOUTH_TARGET_EAST_CRATE, + }, + { + RC_GF_SOUTH_TARGET_WEST_CRATE, + RAND_INF_GF_SOUTH_TARGET_WEST_CRATE, + }, + { + RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE, + RAND_INF_TH_NEAR_KITCHEN_LEFTMOST_CRATE, + }, + { + RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE, + RAND_INF_TH_NEAR_KITCHEN_MID_LEFT_CRATE, + }, + { + RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, + RAND_INF_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, + }, + { + RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, + RAND_INF_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, + }, + { + RC_TH_KITCHEN_CRATE, + RAND_INF_TH_KITCHEN_CRATE, + }, + { + RC_TH_BREAK_HALLWAY_OUTER_CRATE, + RAND_INF_TH_BREAK_HALLWAY_OUTER_CRATE, + }, + { + RC_TH_BREAK_HALLWAY_INNER_CRATE, + RAND_INF_TH_BREAK_HALLWAY_INNER_CRATE, + }, + { + RC_TH_BREAK_ROOM_RIGHT_CRATE, + RAND_INF_TH_BREAK_ROOM_RIGHT_CRATE, + }, + { + RC_TH_BREAK_ROOM_LEFT_CRATE, + RAND_INF_TH_BREAK_ROOM_LEFT_CRATE, + }, + { + RC_TH_1_TORCH_CELL_CRATE, + RAND_INF_TH_1_TORCH_CELL_CRATE, + }, + { + RC_TH_DEAD_END_CELL_CRATE, + RAND_INF_TH_DEAD_END_CELL_CRATE, + }, + { + RC_TH_DOUBLE_CELL_LEFT_CRATE, + RAND_INF_TH_DOUBLE_CELL_LEFT_CRATE, + }, + { + RC_TH_DOUBLE_CELL_RIGHT_CRATE, + RAND_INF_TH_DOUBLE_CELL_RIGHT_CRATE, + }, + { + RC_HW_BEFORE_QUICKSAND_CRATE, + RAND_INF_HW_BEFORE_QUICKSAND_CRATE, + }, + { + RC_HW_AFTER_QUICKSAND_CRATE_1, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_1, + }, + { + RC_HW_AFTER_QUICKSAND_CRATE_2, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_2, + }, + { + RC_HW_AFTER_QUICKSAND_CRATE_3, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_3, + }, + { + RC_HW_NEAR_COLOSSUS_CRATE, + RAND_INF_HW_NEAR_COLOSSUS_CRATE, + }, + { + RC_MK_NEAR_BAZAAR_CRATE_1, + RAND_INF_MK_NEAR_BAZAAR_CRATE_1, + }, + { + RC_MK_NEAR_BAZAAR_CRATE_2, + RAND_INF_MK_NEAR_BAZAAR_CRATE_2, + }, + { + RC_MK_SHOOTING_GALLERY_CRATE_1, + RAND_INF_MK_SHOOTING_GALLERY_CRATE_1, + }, + { + RC_MK_SHOOTING_GALLERY_CRATE_2, + RAND_INF_MK_SHOOTING_GALLERY_CRATE_2, + }, + { + RC_MK_LOST_DOG_HOUSE_CRATE, + RAND_INF_MK_LOST_DOG_HOUSE_CRATE, + }, + { + RC_MK_GUARD_HOUSE_CRATE_1, + RAND_INF_MK_GUARD_HOUSE_CRATE_1, + }, + { + RC_MK_GUARD_HOUSE_CRATE_2, + RAND_INF_MK_GUARD_HOUSE_CRATE_2, + }, + { + RC_MK_GUARD_HOUSE_CRATE_3, + RAND_INF_MK_GUARD_HOUSE_CRATE_3, + }, + { + RC_MK_GUARD_HOUSE_CRATE_4, + RAND_INF_MK_GUARD_HOUSE_CRATE_4, + }, + { + RC_MK_GUARD_HOUSE_CRATE_5, + RAND_INF_MK_GUARD_HOUSE_CRATE_5, + }, + { + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, + }, + { + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, + }, + { + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, + }, + { + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, + }, + { + RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, + RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE, + }, + { + RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, + RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, + }, + { + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, + }, + { + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, + }, + { + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, + }, + { + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, + }, + { + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1, + }, + { + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2, + }, + { + RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, + RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, + }, + { + RC_KAK_NEAR_GY_CHILD_CRATE, + RAND_INF_KAK_NEAR_GY_CHILD_CRATE, + }, + { + RC_KAK_NEAR_WINDMILL_CHILD_CRATE, + RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE, + }, + { + RC_KAK_NEAR_FENCE_CHILD_CRATE, + RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE, + }, + { + RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, + }, + { + RC_KAK_NEAR_BAZAAR_CHILD_CRATE, + RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE, + }, + { + RC_GRAVEYARD_CRATE, + RAND_INF_GRAVEYARD_CRATE, + }, + { + RC_GC_MAZE_CRATE, + RAND_INF_GC_MAZE_CRATE, + }, + { + RC_DMC_CRATE, + RAND_INF_DMC_CRATE, + }, + { + RC_LLR_NEAR_TREE_CRATE, + RAND_INF_LLR_NEAR_TREE_CRATE, + }, + { + RC_LH_LAB_CRATE, + RAND_INF_LH_LAB_CRATE, + }, + + { + RC_DEKU_TREE_MQ_LOBBY_CRATE, + RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE, + }, + { + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, + }, + { + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, + }, + { + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, + }, + { + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, + }, + { + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, + }, + { + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, + }, + { + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, + }, + { + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, + }, + { + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, + }, + { + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, + }, + { + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, + }, + { + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, + }, + { + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, + }, + { + RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, + }, + + { + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, + RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, + }, + { + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, + RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, + }, + { + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, + }, + { + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, + }, + { + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, + }, + { + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, + }, + + { + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, + RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, + }, + { + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, + RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, + }, + { + RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1, + RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1, + }, + { + RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2, + RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2, + }, + { + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, + }, + { + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, + }, + { + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, + }, + { + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, + }, + { + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, + }, + { + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, + }, + { + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, + }, + { + RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, + }, + { + RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, + RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, + }, }; BeehiveIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) { @@ -1577,9 +3286,10 @@ Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); RandomizerCheck specialRc = RC_UNKNOWN_CHECK; // TODO: Migrate these special cases into table, or at least document why they are special - switch(sceneNum) { + switch (sceneNum) { case SCENE_TREASURE_BOX_SHOP: { - if ((actorId == ACTOR_EN_BOX && actorParams == 20170) || (actorId == ACTOR_ITEM_ETCETERA && actorParams == 2572)) { + if ((actorId == ACTOR_EN_BOX && actorParams == 20170) || + (actorId == ACTOR_ITEM_ETCETERA && actorParams == 2572)) { specialRc = RC_MARKET_TREASURE_CHEST_GAME_REWARD; } @@ -1626,11 +3336,21 @@ Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, case SCENE_HOUSE_OF_SKULLTULA: if (actorId == ACTOR_EN_SSH) { switch (actorParams) { // actor params are used to differentiate between textboxes - case 1: specialRc = RC_KAK_10_GOLD_SKULLTULA_REWARD; break; - case 2: specialRc = RC_KAK_20_GOLD_SKULLTULA_REWARD; break; - case 3: specialRc = RC_KAK_30_GOLD_SKULLTULA_REWARD; break; - case 4: specialRc = RC_KAK_40_GOLD_SKULLTULA_REWARD; break; - case 5: specialRc = RC_KAK_50_GOLD_SKULLTULA_REWARD; break; + case 1: + specialRc = RC_KAK_10_GOLD_SKULLTULA_REWARD; + break; + case 2: + specialRc = RC_KAK_20_GOLD_SKULLTULA_REWARD; + break; + case 3: + specialRc = RC_KAK_30_GOLD_SKULLTULA_REWARD; + break; + case 4: + specialRc = RC_KAK_40_GOLD_SKULLTULA_REWARD; + break; + case 5: + specialRc = RC_KAK_50_GOLD_SKULLTULA_REWARD; + break; } } break; @@ -1688,11 +3408,10 @@ Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, auto range = Rando::StaticData::CheckFromActorMultimap.equal_range(std::make_tuple(actorId, sceneNum, actorParams)); for (auto it = range.first; it != range.second; ++it) { - if ( - Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_BOTH || - (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_VANILLA && !ResourceMgr_IsGameMasterQuest()) || - (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_MQ && ResourceMgr_IsGameMasterQuest()) - ) { + if (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_BOTH || + (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_VANILLA && + !ResourceMgr_IsGameMasterQuest()) || + (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_MQ && ResourceMgr_IsGameMasterQuest())) { return Rando::StaticData::GetLocation(it->second); } } @@ -1710,7 +3429,8 @@ ScrubIdentity Randomizer::IdentifyScrub(s32 sceneNum, s32 actorParams, s32 respa scrubIdentity.isShuffled = false; // Scrubs that are 0x06 are loaded as 0x03 when child, switching from selling arrows to seeds - if (actorParams == 0x06) actorParams = 0x03; + if (actorParams == 0x06) + actorParams = 0x03; if (sceneNum == SCENE_GROTTOS) { actorParams = TWO_ACTOR_PARAMS(actorParams, respawnData); @@ -1724,11 +3444,14 @@ ScrubIdentity Randomizer::IdentifyScrub(s32 sceneNum, s32 actorParams, s32 respa scrubIdentity.getItemId = (GetItemID)Rando::StaticData::RetrieveItem(location->GetVanillaItem()).GetItemID(); scrubIdentity.isShuffled = GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_ALL; - if (location->GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO || location->GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || location->GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE) { + if (location->GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO || + location->GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || + location->GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE) { scrubIdentity.isShuffled = GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) != RO_SCRUBS_OFF; } - scrubIdentity.itemPrice = OTRGlobals::Instance->gRandoContext->GetItemLocation(scrubIdentity.randomizerCheck)->GetPrice(); + scrubIdentity.itemPrice = + OTRGlobals::Instance->gRandoContext->GetItemLocation(scrubIdentity.randomizerCheck)->GetPrice(); } return scrubIdentity; @@ -1747,9 +3470,11 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, u8 slotIndex) { return shopItemIdentity; } - Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_GIRLA, + Rando::Location* location = GetCheckObjectFromActor( + ACTOR_EN_GIRLA, // Bazaar (SHOP1) scene is reused, so if entering from Kak use debug scene to identify - (sceneNum == SCENE_BAZAAR && gSaveContext.entranceIndex == ENTR_BAZAAR_0) ? SCENE_TEST01 : sceneNum, slotIndex - 1); + (sceneNum == SCENE_BAZAAR && gSaveContext.entranceIndex == ENTR_BAZAAR_0) ? SCENE_TEST01 : sceneNum, + slotIndex - 1); if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { shopItemIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; @@ -1762,7 +3487,8 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, u8 slotIndex) { shopItemIdentity.enGirlAShopItem = randomizerGetToEnGirlShopItem[randoGet]; } - shopItemIdentity.itemPrice = OTRGlobals::Instance->gRandoContext->GetItemLocation(shopItemIdentity.randomizerCheck)->GetPrice(); + shopItemIdentity.itemPrice = + OTRGlobals::Instance->gRandoContext->GetItemLocation(shopItemIdentity.randomizerCheck)->GetPrice(); } return shopItemIdentity; @@ -1807,7 +3533,6 @@ PotIdentity Randomizer::IdentifyPot(s32 sceneNum, s32 posX, s32 posZ) { if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { LUSLOG_WARN("IdentifyPot did not receive a valid RC value (%d).", location->GetRandomizerCheck()); - assert(false); } else { potIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; potIdentity.randomizerCheck = location->GetRandomizerCheck(); @@ -1837,11 +3562,129 @@ FishIdentity Randomizer::IdentifyFish(s32 sceneNum, s32 actorParams) { return fishIdentity; } +GrassIdentity Randomizer::IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge) { + struct GrassIdentity grassIdentity; + + grassIdentity.randomizerInf = RAND_INF_MAX; + grassIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + if (sceneNum == SCENE_GROTTOS) { + respawnData = TWO_ACTOR_PARAMS(posX, respawnData); + } else { + // We'll just pretend it's always daytime for our market bushes. + if (sceneNum == SCENE_MARKET_NIGHT) { + sceneNum = SCENE_MARKET_DAY; + + /* + The two bushes by the tree are not in the same spot + between night and day. We'll assume the coordinates + of the daytime bushes so that we can count them as + the same locations. + */ + if (posX == -74) { + posX = -106; + posZ = 277; + } + if (posX == -87) { + posX = -131; + posZ = 225; + } + } + + /* + Same as with Market. ZR has a bush slightly off pos + between Child and Adult. This is to merge them into + a single location. + */ + if (sceneNum == SCENE_ZORAS_RIVER) { + if (posX == 233) { + posX = 231; + posZ = -1478; + } + } + + // The two bushes behind the sign in KF should be separate + // locations between Child and Adult. + if (sceneNum == SCENE_KOKIRI_FOREST && linkAge == 0) { + if (posX == -498 || posX == -523) { + posZ = 0xFF; + } + } + + respawnData = TWO_ACTOR_PARAMS(posX, posZ); + } + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_KUSA, sceneNum, respawnData); + + if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + grassIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + grassIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return grassIdentity; +} + +CrateIdentity Randomizer::IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ) { + struct CrateIdentity crateIdentity; + uint32_t crateSceneNum = sceneNum; + + // pretend night is day to align crates in market and align GF child/adult crates + if (sceneNum == SCENE_MARKET_NIGHT) { + crateSceneNum = SCENE_MARKET_DAY; + } else if (sceneNum == SCENE_GERUDOS_FORTRESS && gPlayState->linkAgeOnLoad == 1 && posX == 310) { + if (posZ == -1830) { + posZ = -1842; + } else if (posZ == -1770) { + posZ = -1782; + } + } + + crateIdentity.randomizerInf = RAND_INF_MAX; + crateIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_OBJ_KIBAKO2, crateSceneNum, actorParams); + + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifyCrate did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + assert(false); + } else { + crateIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + crateIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return crateIdentity; +} + +SmallCrateIdentity Randomizer::IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ) { + struct SmallCrateIdentity smallCrateIdentity; + uint32_t smallCrateSceneNum = sceneNum; + + smallCrateIdentity.randomizerInf = RAND_INF_MAX; + smallCrateIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_OBJ_KIBAKO, smallCrateSceneNum, actorParams); + + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifyCrate did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + assert(false); + } else { + smallCrateIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + smallCrateIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return smallCrateIdentity; +} + u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get(); } -GetItemEntry Randomizer::GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability) { +GetItemEntry Randomizer::GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, + bool checkObtainability) { return Rando::Context::GetInstance()->GetFinalGIEntry(randomizerCheck, checkObtainability); } @@ -1853,13 +3696,14 @@ RandomizerInf Randomizer::GetRandomizerInfFromCheck(RandomizerCheck rc) { auto rcIt = rcToRandomizerInf.find(rc); if (rcIt == rcToRandomizerInf.end()) return RAND_INF_MAX; - + return rcIt->second; } RandomizerCheck Randomizer::GetCheckFromRandomizerInf(RandomizerInf randomizerInf) { for (auto const& [key, value] : rcToRandomizerInf) { - if (value == randomizerInf) return key; + if (value == randomizerInf) + return key; } return RC_UNKNOWN_CHECK; @@ -1871,10 +3715,9 @@ void GenerateRandomizerImgui(std::string seed = "") { CVarSetInteger(CVAR_GENERAL("RandoGenerating"), 1); CVarSave(); auto ctx = Rando::Context::GetInstance(); - //RANDOTODO proper UI for selecting if a spoiler loaded should be used for settings - Rando::Settings::GetInstance()->SetAllFromCVar(); + // RANDOTODO proper UI for selecting if a spoiler loaded should be used for settings Rando::Settings::GetInstance()->SetAllToContext(); - + // todo: this efficently when we build out cvar array support std::set excludedLocations; std::stringstream excludedLocationStringStream(CVarGetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), "")); @@ -1884,14 +3727,13 @@ void GenerateRandomizerImgui(std::string seed = "") { } // todo: better way to sort out linking tricks rather than name - + std::set enabledTricks; std::stringstream enabledTrickStringStream(CVarGetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), "")); std::string enabledTrickString; while (getline(enabledTrickStringStream, enabledTrickString, ',')) { enabledTricks.insert((RandomizerTrick)std::stoi(enabledTrickString)); } - // Update the visibilitiy before removing conflicting excludes (in case the locations tab wasn't viewed) RandomizerCheckObjects::UpdateImGuiVisibility(); @@ -1924,67 +3766,76 @@ bool GenerateRandomizer(std::string seed /*= ""*/) { return false; } +static bool locationsTabOpen = false; +static bool tricksTabOpen = false; + void RandomizerSettingsWindow::DrawElement() { auto ctx = Rando::Context::GetInstance(); if (generated) { generated = 0; randoThread.join(); } - bool disableEditingRandoSettings = CVarGetInteger(CVAR_GENERAL("RandoGenerating"), 0) || CVarGetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0); - if (disableEditingRandoSettings) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } + bool generating = CVarGetInteger(CVAR_GENERAL("RandoGenerating"), 0); + bool disableEditingRandoSettings = generating || CVarGetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0); - ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - DrawPresetSelector(PRESET_TYPE_RANDOMIZER); - ImGui::EndDisabled(); + DrawPresetSelector({ PRESET_SECTION_RANDOMIZER }, "Randomizer", generating); - UIWidgets::Spacer(0); - UIWidgets::EnhancementCheckbox("Manual seed entry", CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), false, ""); + // UIWidgets::Spacer(0); + UIWidgets::CVarCheckbox("Manual seed entry", CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), 0)) { - ImGui::Text("Seed"); - ImGui::InputText("##RandomizerSeed", seedString, MAX_SEED_STRING_SIZE, ImGuiInputTextFlags_CallbackCharFilter, UIWidgets::TextFilters::FilterAlphaNum); - UIWidgets::Tooltip( - "Characters from a-z, A-Z, and 0-9 are supported.\n" - "Character limit is 1023, after which the seed will be truncated.\n" - ); + UIWidgets::PushStyleInput(THEME_COLOR); + ImGui::InputText("##RandomizerSeed", seedString, MAX_SEED_STRING_SIZE, ImGuiInputTextFlags_CallbackCharFilter, + UIWidgets::TextFilters::FilterAlphaNum); + UIWidgets::Tooltip("Characters from a-z, A-Z, and 0-9 are supported.\n" + "Character limit is 1023, after which the seed will be truncated.\n"); ImGui::SameLine(); - if (ImGui::Button("New Seed")) { + if (UIWidgets::Button( + ICON_FA_RANDOM, + UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Color(THEME_COLOR) + .Padding(ImVec2(10.f, 6.f)) + .Tooltip("Creates a new random seed value to be used when generating a randomizer"))) { SohUtils::CopyStringToCharArray(seedString, std::to_string(rand() & 0xFFFFFFFF), MAX_SEED_STRING_SIZE); } - UIWidgets::Tooltip("Creates a new random seed value to be used when generating a randomizer"); ImGui::SameLine(); - if (ImGui::Button("Clear Seed")) { + if (UIWidgets::Button(ICON_FA_ERASER, UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Color(THEME_COLOR) + .Padding(ImVec2(10.f, 6.f)))) { memset(seedString, 0, MAX_SEED_STRING_SIZE); } + if (strnlen(seedString, MAX_SEED_STRING_SIZE) == 0) { + ImGui::SameLine(17.0f); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "Leave blank for random seed"); + } + UIWidgets::PopStyleInput(); } UIWidgets::Spacer(0); - ImGui::BeginDisabled((CVarGetInteger(CVAR_RANDOMIZER_SETTING("DontGenerateSpoiler"), 0) && gSaveContext.gameMode != GAMEMODE_FILE_SELECT) || - GameInteractor::IsSaveLoaded()); - if (ImGui::Button("Generate Randomizer")) { + UIWidgets::ButtonOptions options = UIWidgets::ButtonOptions().Size(ImVec2(250.f, 0.f)).Color(THEME_COLOR); + options.Disabled((gSaveContext.gameMode != GAMEMODE_FILE_SELECT) || GameInteractor::IsSaveLoaded()); + if (options.disabled) { + options.DisabledTooltip("Must be on File Select to generate a randomizer seed."); + } + if (UIWidgets::Button("Generate Randomizer", options)) { ctx->SetSpoilerLoaded(false); GenerateRandomizer(CVarGetInteger(CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), 0) ? seedString : ""); } - ImGui::EndDisabled(); - UIWidgets::Spacer(0); + ImGui::SameLine(); if (!CVarGetInteger(CVAR_RANDOMIZER_SETTING("DontGenerateSpoiler"), 0)) { std::string spoilerfilepath = CVarGetString(CVAR_GENERAL("SpoilerLog"), ""); ImGui::Text("Spoiler File: %s", spoilerfilepath.c_str()); } - // RANDOTODO settings presets - // std::string presetfilepath = CVarGetString(CVAR_RANDOMIZER_SETTING("LoadedPreset"), ""); - // ImGui::Text("Settings File: %s", presetfilepath.c_str()); - - UIWidgets::PaddedSeparator(); - - ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + UIWidgets::Separator(true, true, 0.f, 0.f); ImGuiWindow* window = ImGui::GetCurrentWindow(); static ImVec2 cellPadding(8.0f, 8.0f); + UIWidgets::PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("Randomizer Settings", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { if (ImGui::BeginTabItem("World")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); @@ -1995,10 +3846,10 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::EndTabItem(); } - ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); if (ImGui::BeginTabItem("Items")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); - ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); + ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == + RO_LOGIC_VANILLA); if (mSettings->GetOptionGroup(RSG_ITEMS_IMGUI_TABLE).RenderImGui()) { mNeedsUpdate = true; } @@ -2006,28 +3857,30 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::PopStyleVar(1); ImGui::EndTabItem(); } - ImGui::EndDisabled(); - ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); if (ImGui::BeginTabItem("Gameplay")) { + ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == + RO_LOGIC_VANILLA); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); if (mSettings->GetOptionGroup(RSG_GAMEPLAY_IMGUI_TABLE).RenderImGui()) { mNeedsUpdate = true; } + ImGui::EndDisabled(); ImGui::PopStyleVar(1); ImGui::EndTabItem(); } - ImGui::EndDisabled(); - ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); - static bool locationsTabOpen = false; if (ImGui::BeginTabItem("Locations")) { + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0) || disableEditingRandoSettings || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == + RO_LOGIC_VANILLA); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); if (!locationsTabOpen) { locationsTabOpen = true; RandomizerCheckObjects::UpdateImGuiVisibility(); // todo: this efficently when we build out cvar array support - std::stringstream excludedLocationStringStream(CVarGetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), "")); + std::stringstream excludedLocationStringStream( + CVarGetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), "")); std::string excludedLocationString; excludedLocations.clear(); while (getline(excludedLocationStringStream, excludedLocationString, ',')) { @@ -2048,7 +3901,9 @@ void RandomizerSettingsWindow::DrawElement() { window->DC.CurrLineTextBaseOffset = 0.0f; static ImGuiTextFilter locationSearch; + UIWidgets::PushStyleInput(THEME_COLOR); locationSearch.Draw(); + UIWidgets::PopStyleInput(); ImGui::BeginChild("ChildIncludedLocations", ImVec2(0, -8)); for (auto& [rcArea, locations] : RandomizerCheckObjects::GetAllRCObjectsByArea()) { @@ -2067,8 +3922,9 @@ void RandomizerSettingsWindow::DrawElement() { if (ImGui::TreeNode(RandomizerCheckObjects::GetRCAreaName(rcArea).c_str())) { for (auto& location : locations) { if (ctx->GetItemLocation(location)->IsVisible() && !excludedLocations.count(location) && - locationSearch.PassFilter(Rando::StaticData::GetLocation(location)->GetName().c_str())) { - + locationSearch.PassFilter( + Rando::StaticData::GetLocation(location)->GetName().c_str())) { + UIWidgets::PushStyleButton(THEME_COLOR, ImVec2(7.f, 5.f)); if (ImGui::ArrowButton(std::to_string(location).c_str(), ImGuiDir_Right)) { excludedLocations.insert(location); // todo: this efficently when we build out cvar array support @@ -2077,9 +3933,14 @@ void RandomizerSettingsWindow::DrawElement() { excludedLocationString += std::to_string(excludedLocationIt); excludedLocationString += ","; } - CVarSetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), excludedLocationString.c_str()); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + CVarSetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), + excludedLocationString.c_str()); + Ship::Context::GetInstance() + ->GetWindow() + ->GetGui() + ->SaveConsoleVariablesNextFrame(); } + UIWidgets::PopStyleButton(); ImGui::SameLine(); ImGui::Text("%s", Rando::StaticData::GetLocation(location)->GetShortName().c_str()); } @@ -2110,6 +3971,7 @@ void RandomizerSettingsWindow::DrawElement() { for (auto& location : locations) { auto elfound = excludedLocations.find(location); if (ctx->GetItemLocation(location)->IsVisible() && elfound != excludedLocations.end()) { + UIWidgets::PushStyleButton(THEME_COLOR, ImVec2(7.f, 5.f)); if (ImGui::ArrowButton(std::to_string(location).c_str(), ImGuiDir_Left)) { excludedLocations.erase(elfound); // todo: this efficently when we build out cvar array support @@ -2121,10 +3983,15 @@ void RandomizerSettingsWindow::DrawElement() { if (excludedLocationString == "") { CVarClear(CVAR_RANDOMIZER_SETTING("ExcludedLocations")); } else { - CVarSetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), excludedLocationString.c_str()); + CVarSetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), + excludedLocationString.c_str()); } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + Ship::Context::GetInstance() + ->GetWindow() + ->GetGui() + ->SaveConsoleVariablesNextFrame(); } + UIWidgets::PopStyleButton(); ImGui::SameLine(); ImGui::Text("%s", Rando::StaticData::GetLocation(location)->GetShortName().c_str()); } @@ -2139,24 +4006,24 @@ void RandomizerSettingsWindow::DrawElement() { } ImGui::PopStyleVar(1); ImGui::EndTabItem(); + ImGui::EndDisabled(); } else { locationsTabOpen = false; } - ImGui::EndDisabled(); - static bool tricksTabOpen = false; if (ImGui::BeginTabItem("Tricks/Glitches")) { if (!tricksTabOpen) { tricksTabOpen = true; - //RandomizerTricks::UpdateImGuiVisibility(); - // todo: this efficently when we build out cvar array support + // RandomizerTricks::UpdateImGuiVisibility(); + // todo: this efficently when we build out cvar array support std::stringstream enabledTrickStringStream(CVarGetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), "")); std::string enabledTrickString; enabledTricks.clear(); while (getline(enabledTrickStringStream, enabledTrickString, ',')) { enabledTricks.insert((RandomizerTrick)std::stoi(enabledTrickString)); } - std::stringstream enabledGlitchStringStream(CVarGetString(CVAR_RANDOMIZER_SETTING("EnabledGlitches"), "")); + std::stringstream enabledGlitchStringStream( + CVarGetString(CVAR_RANDOMIZER_SETTING("EnabledGlitches"), "")); std::string enabledGlitchString; enabledGlitches.clear(); while (getline(enabledGlitchStringStream, enabledGlitchString, ',')) { @@ -2182,100 +4049,104 @@ void RandomizerSettingsWindow::DrawElement() { } if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA) { ImGui::SameLine(); - ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "Heads up! This will disable all rando settings except for entrance shuffle and starter items"); + ImGui::TextColored( + ImVec4(1.0f, 0.0f, 0.0f, 1.0f), + "Heads up! This will disable all rando settings except for entrance shuffle and starter items"); } ImGui::PopItemWidth(); ImGui::EndTable(); } - ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0) || disableEditingRandoSettings || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == + RO_LOGIC_VANILLA); // Tricks - static std::unordered_map areaTreeDisabled { - {RA_NONE, true}, - {RA_KOKIRI_FOREST, true}, - {RA_THE_LOST_WOODS, true}, - {RA_SACRED_FOREST_MEADOW, true}, - {RA_HYRULE_FIELD, true}, - {RA_LAKE_HYLIA, true}, - {RA_GERUDO_VALLEY, true}, - {RA_GERUDO_FORTRESS, true}, - {RA_HAUNTED_WASTELAND, true}, - {RA_DESERT_COLOSSUS, true}, - {RA_THE_MARKET, true}, - {RA_HYRULE_CASTLE, true}, - {RA_KAKARIKO_VILLAGE, true}, - {RA_THE_GRAVEYARD, true}, - {RA_DEATH_MOUNTAIN_TRAIL, true}, - {RA_GORON_CITY, true}, - {RA_DEATH_MOUNTAIN_CRATER, true}, - {RA_ZORAS_RIVER, true}, - {RA_ZORAS_DOMAIN, true}, - {RA_ZORAS_FOUNTAIN, true}, - {RA_LON_LON_RANCH, true}, - {RA_DEKU_TREE, true}, - {RA_DODONGOS_CAVERN, true}, - {RA_JABU_JABUS_BELLY, true}, - {RA_FOREST_TEMPLE, true}, - {RA_FIRE_TEMPLE, true}, - {RA_WATER_TEMPLE, true}, - {RA_SPIRIT_TEMPLE, true}, - {RA_SHADOW_TEMPLE, true}, - {RA_BOTTOM_OF_THE_WELL, true}, - {RA_ICE_CAVERN, true}, - {RA_GERUDO_TRAINING_GROUND, true}, - {RA_GANONS_CASTLE, true} + static std::unordered_map areaTreeDisabled{ + { RA_NONE, true }, + { RA_KOKIRI_FOREST, true }, + { RA_THE_LOST_WOODS, true }, + { RA_SACRED_FOREST_MEADOW, true }, + { RA_HYRULE_FIELD, true }, + { RA_LAKE_HYLIA, true }, + { RA_GERUDO_VALLEY, true }, + { RA_GERUDO_FORTRESS, true }, + { RA_HAUNTED_WASTELAND, true }, + { RA_DESERT_COLOSSUS, true }, + { RA_THE_MARKET, true }, + { RA_HYRULE_CASTLE, true }, + { RA_KAKARIKO_VILLAGE, true }, + { RA_THE_GRAVEYARD, true }, + { RA_DEATH_MOUNTAIN_TRAIL, true }, + { RA_GORON_CITY, true }, + { RA_DEATH_MOUNTAIN_CRATER, true }, + { RA_ZORAS_RIVER, true }, + { RA_ZORAS_DOMAIN, true }, + { RA_ZORAS_FOUNTAIN, true }, + { RA_LON_LON_RANCH, true }, + { RA_DEKU_TREE, true }, + { RA_DODONGOS_CAVERN, true }, + { RA_JABU_JABUS_BELLY, true }, + { RA_FOREST_TEMPLE, true }, + { RA_FIRE_TEMPLE, true }, + { RA_WATER_TEMPLE, true }, + { RA_SPIRIT_TEMPLE, true }, + { RA_SHADOW_TEMPLE, true }, + { RA_BOTTOM_OF_THE_WELL, true }, + { RA_ICE_CAVERN, true }, + { RA_GERUDO_TRAINING_GROUND, true }, + { RA_GANONS_CASTLE, true }, }; - static std::unordered_map areaTreeEnabled { - {RA_NONE, true}, - {RA_KOKIRI_FOREST, true}, - {RA_THE_LOST_WOODS, true}, - {RA_SACRED_FOREST_MEADOW, true}, - {RA_HYRULE_FIELD, true}, - {RA_LAKE_HYLIA, true}, - {RA_GERUDO_VALLEY, true}, - {RA_GERUDO_FORTRESS, true}, - {RA_HAUNTED_WASTELAND, true}, - {RA_DESERT_COLOSSUS, true}, - {RA_THE_MARKET, true}, - {RA_HYRULE_CASTLE, true}, - {RA_KAKARIKO_VILLAGE, true}, - {RA_THE_GRAVEYARD, true}, - {RA_DEATH_MOUNTAIN_TRAIL, true}, - {RA_GORON_CITY, true}, - {RA_DEATH_MOUNTAIN_CRATER, true}, - {RA_ZORAS_RIVER, true}, - {RA_ZORAS_DOMAIN, true}, - {RA_ZORAS_FOUNTAIN, true}, - {RA_LON_LON_RANCH, true}, - {RA_DEKU_TREE, true}, - {RA_DODONGOS_CAVERN, true}, - {RA_JABU_JABUS_BELLY, true}, - {RA_FOREST_TEMPLE, true}, - {RA_FIRE_TEMPLE, true}, - {RA_WATER_TEMPLE, true}, - {RA_SPIRIT_TEMPLE, true}, - {RA_SHADOW_TEMPLE, true}, - {RA_BOTTOM_OF_THE_WELL, true}, - {RA_ICE_CAVERN, true}, - {RA_GERUDO_TRAINING_GROUND, true}, - {RA_GANONS_CASTLE, true} + static std::unordered_map areaTreeEnabled{ + { RA_NONE, true }, + { RA_KOKIRI_FOREST, true }, + { RA_THE_LOST_WOODS, true }, + { RA_SACRED_FOREST_MEADOW, true }, + { RA_HYRULE_FIELD, true }, + { RA_LAKE_HYLIA, true }, + { RA_GERUDO_VALLEY, true }, + { RA_GERUDO_FORTRESS, true }, + { RA_HAUNTED_WASTELAND, true }, + { RA_DESERT_COLOSSUS, true }, + { RA_THE_MARKET, true }, + { RA_HYRULE_CASTLE, true }, + { RA_KAKARIKO_VILLAGE, true }, + { RA_THE_GRAVEYARD, true }, + { RA_DEATH_MOUNTAIN_TRAIL, true }, + { RA_GORON_CITY, true }, + { RA_DEATH_MOUNTAIN_CRATER, true }, + { RA_ZORAS_RIVER, true }, + { RA_ZORAS_DOMAIN, true }, + { RA_ZORAS_FOUNTAIN, true }, + { RA_LON_LON_RANCH, true }, + { RA_DEKU_TREE, true }, + { RA_DODONGOS_CAVERN, true }, + { RA_JABU_JABUS_BELLY, true }, + { RA_FOREST_TEMPLE, true }, + { RA_FIRE_TEMPLE, true }, + { RA_WATER_TEMPLE, true }, + { RA_SPIRIT_TEMPLE, true }, + { RA_SHADOW_TEMPLE, true }, + { RA_BOTTOM_OF_THE_WELL, true }, + { RA_ICE_CAVERN, true }, + { RA_GERUDO_TRAINING_GROUND, true }, + { RA_GANONS_CASTLE, true }, }; - static std::map showTag { - { Rando::Tricks::Tag::NOVICE, true }, - { Rando::Tricks::Tag::INTERMEDIATE, true }, - { Rando::Tricks::Tag::ADVANCED, true }, - { Rando::Tricks::Tag::EXPERT, true }, - { Rando::Tricks::Tag::EXTREME, true }, - { Rando::Tricks::Tag::EXPERIMENTAL, true }, - //{ Rando::Tricks::Tag::GLITCH, false }, + static std::map showTag{ + { Rando::Tricks::Tag::NOVICE, true }, { Rando::Tricks::Tag::INTERMEDIATE, true }, + { Rando::Tricks::Tag::ADVANCED, true }, { Rando::Tricks::Tag::EXPERT, true }, + { Rando::Tricks::Tag::EXTREME, true }, { Rando::Tricks::Tag::EXPERIMENTAL, true }, + { Rando::Tricks::Tag::GLITCH, false }, }; static ImGuiTextFilter trickSearch; + UIWidgets::PushStyleInput(THEME_COLOR); trickSearch.Draw("Filter (inc,-exc)", 490.0f); + UIWidgets::PopStyleInput(); if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) != RO_LOGIC_NO_LOGIC) { ImGui::SameLine(); - if (ImGui::Button("Disable All")) { + if (UIWidgets::Button("Disable All", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(250.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { auto etfound = enabledTricks.find(static_cast(i)); if (etfound != enabledTricks.end()) { @@ -2291,7 +4162,8 @@ void RandomizerSettingsWindow::DrawElement() { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } ImGui::SameLine(); - if (ImGui::Button("Enable All")) { + if (UIWidgets::Button("Enable All", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(250.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { if (!enabledTricks.count(static_cast(i))) { enabledTricks.insert(static_cast(i)); @@ -2306,7 +4178,9 @@ void RandomizerSettingsWindow::DrawElement() { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } - if (ImGui::BeginTable("trickTags", showTag.size(), ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders)) { + if (ImGui::BeginTable("trickTags", static_cast(showTag.size()), + ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | + ImGuiTableFlags_Borders)) { for (auto [rtTag, isShown] : showTag) { ImGui::TableNextColumn(); if (isShown) { @@ -2334,19 +4208,22 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; - if (ImGui::Button("Collapse All##disabled")) { + if (UIWidgets::Button("Collapse All##disabled", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeDisabled[static_cast(i)] = false; } } ImGui::SameLine(); - if (ImGui::Button("Open All##disabled")) { + if (UIWidgets::Button("Open All##disabled", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeDisabled[static_cast(i)] = true; } } ImGui::SameLine(); - if (ImGui::Button("Enable Visible")) { + if (UIWidgets::Button("Enable Visible", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { auto option = mSettings->GetTrickOption(static_cast(i)); if (!enabledTricks.count(static_cast(i)) && @@ -2365,7 +4242,8 @@ void RandomizerSettingsWindow::DrawElement() { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - ImGui::BeginChild("ChildTricksDisabled", ImVec2(0, -8), false, ImGuiWindowFlags_HorizontalScrollbar); + ImGui::BeginChild("ChildTricksDisabled", ImVec2(0, -8), false, + ImGuiWindowFlags_HorizontalScrollbar); for (auto [area, trickIds] : mSettings->mTricksByArea) { bool hasTricks = false; @@ -2378,15 +4256,22 @@ void RandomizerSettingsWindow::DrawElement() { } } if (hasTricks) { - ImGui::TreeNodeSetOpen(ImGui::GetID((Rando::Tricks::GetAreaName(area) + "##disabled").c_str()), areaTreeDisabled[area]); + ImGui::TreeNodeSetOpen( + ImGui::GetID((Rando::Tricks::GetAreaName(area) + "##disabled").c_str()), + areaTreeDisabled[area]); ImGui::SetNextItemOpen(true, ImGuiCond_Once); if (ImGui::TreeNode((Rando::Tricks::GetAreaName(area) + "##disabled").c_str())) { for (auto rt : trickIds) { auto option = mSettings->GetTrickOption(rt); if (!option.IsHidden() && trickSearch.PassFilter(option.GetName().c_str()) && - !enabledTricks.count(rt) && Rando::Tricks::CheckTags(showTag, option.GetTags())) { - ImGui::TreeNodeSetOpen(ImGui::GetID((Rando::Tricks::GetAreaName(option.GetArea()) + "##disabled").c_str()), areaTreeDisabled[option.GetArea()]); + !enabledTricks.count(rt) && + Rando::Tricks::CheckTags(showTag, option.GetTags())) { + ImGui::TreeNodeSetOpen( + ImGui::GetID( + (Rando::Tricks::GetAreaName(option.GetArea()) + "##disabled").c_str()), + areaTreeDisabled[option.GetArea()]); ImGui::SetNextItemOpen(true, ImGuiCond_Once); + UIWidgets::PushStyleButton(THEME_COLOR, ImVec2(7.f, 5.f)); if (ImGui::ArrowButton(std::to_string(rt).c_str(), ImGuiDir_Right)) { enabledTricks.insert(rt); std::string enabledTrickString = ""; @@ -2394,13 +4279,18 @@ void RandomizerSettingsWindow::DrawElement() { enabledTrickString += std::to_string(enabledTrickIt); enabledTrickString += ","; } - CVarSetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), enabledTrickString.c_str()); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + CVarSetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), + enabledTrickString.c_str()); + Ship::Context::GetInstance() + ->GetWindow() + ->GetGui() + ->SaveConsoleVariablesNextFrame(); } - Rando::Tricks::DrawTagChips(option.GetTags()); + UIWidgets::PopStyleButton(); + Rando::Tricks::DrawTagChips(option.GetTags(), option.GetName()); ImGui::SameLine(); ImGui::Text("%s", option.GetName().c_str()); - UIWidgets::InsertHelpHoverText(option.GetDescription().c_str()); + UIWidgets::Tooltip(option.GetDescription().c_str()); } } areaTreeDisabled[area] = true; @@ -2416,24 +4306,26 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; - if (ImGui::Button("Collapse All##enabled")) { + if (UIWidgets::Button("Collapse All##enabled", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeEnabled[static_cast(i)] = false; } } ImGui::SameLine(); - if (ImGui::Button("Open All##enabled")) { + if (UIWidgets::Button("Open All##enabled", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeEnabled[static_cast(i)] = true; } } ImGui::SameLine(); - if (ImGui::Button("Disable Visible")) { + if (UIWidgets::Button("Disable Visible", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { auto option = mSettings->GetTrickOption(static_cast(i)); if (enabledTricks.count(static_cast(i)) && - trickSearch.PassFilter(option.GetName().c_str()) && - areaTreeEnabled[option.GetArea()] && + trickSearch.PassFilter(option.GetName().c_str()) && areaTreeEnabled[option.GetArea()] && Rando::Tricks::CheckTags(showTag, option.GetTags())) { enabledTricks.erase(static_cast(i)); } @@ -2464,33 +4356,45 @@ void RandomizerSettingsWindow::DrawElement() { } } if (hasTricks) { - ImGui::TreeNodeSetOpen(ImGui::GetID((Rando::Tricks::GetAreaName(area) + "##enabled").c_str()), areaTreeEnabled[area]); + ImGui::TreeNodeSetOpen( + ImGui::GetID((Rando::Tricks::GetAreaName(area) + "##enabled").c_str()), + areaTreeEnabled[area]); ImGui::SetNextItemOpen(true, ImGuiCond_Once); if (ImGui::TreeNode((Rando::Tricks::GetAreaName(area) + "##enabled").c_str())) { for (auto rt : trickIds) { auto option = mSettings->GetTrickOption(rt); if (!option.IsHidden() && trickSearch.PassFilter(option.GetName().c_str()) && - enabledTricks.count(rt) && Rando::Tricks::CheckTags(showTag, option.GetTags())) { - ImGui::TreeNodeSetOpen(ImGui::GetID((Rando::Tricks::GetAreaName(option.GetArea()) + "##enabled").c_str()), areaTreeEnabled[option.GetArea()]); + enabledTricks.count(rt) && + Rando::Tricks::CheckTags(showTag, option.GetTags())) { + ImGui::TreeNodeSetOpen( + ImGui::GetID( + (Rando::Tricks::GetAreaName(option.GetArea()) + "##enabled").c_str()), + areaTreeEnabled[option.GetArea()]); ImGui::SetNextItemOpen(true, ImGuiCond_Once); + UIWidgets::PushStyleButton(THEME_COLOR, ImVec2(7.f, 5.f)); if (ImGui::ArrowButton(std::to_string(rt).c_str(), ImGuiDir_Left)) { enabledTricks.erase(rt); std::string enabledTrickString = ""; for (auto enabledTrickIt : enabledTricks) { enabledTrickString += std::to_string(enabledTrickIt); enabledTrickString += ","; + } + if (enabledTrickString == "") { + CVarClear(CVAR_RANDOMIZER_SETTING("EnabledTricks")); + } else { + CVarSetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), + enabledTrickString.c_str()); + } + Ship::Context::GetInstance() + ->GetWindow() + ->GetGui() + ->SaveConsoleVariablesNextFrame(); } - if (enabledTrickString == "") { - CVarClear(CVAR_RANDOMIZER_SETTING("EnabledTricks")); - } else { - CVarSetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), enabledTrickString.c_str()); - } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - Rando::Tricks::DrawTagChips(option.GetTags()); - ImGui::SameLine(); - ImGui::Text("%s", option.GetName().c_str()); - UIWidgets::InsertHelpHoverText(option.GetDescription().c_str()); + UIWidgets::PopStyleButton(); + Rando::Tricks::DrawTagChips(option.GetTags(), option.GetName()); + ImGui::SameLine(); + ImGui::Text("%s", option.GetName().c_str()); + UIWidgets::Tooltip(option.GetDescription().c_str()); } } areaTreeEnabled[area] = true; @@ -2532,17 +4436,20 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::EndTabBar(); } + UIWidgets::PopStyleTabs(); +} - ImGui::EndDisabled(); - - if (disableEditingRandoSettings) { - UIWidgets::ReEnableComponent(""); - } +void RandomizerSettingsWindow::SetNeedsUpdate() { + mNeedsUpdate = true; } void RandomizerSettingsWindow::UpdateElement() { if (mNeedsUpdate) { + RandomizerCheckObjects::UpdateImGuiVisibility(); mSettings->UpdateOptionProperties(); + locationsTabOpen = false; + tricksTabOpen = false; + mNeedsUpdate = false; } } @@ -2551,41 +4458,49 @@ CustomMessage Randomizer::GetSheikMessage(s16 scene, u16 originalTextId) { CustomMessage messageEntry; switch (scene) { case SCENE_TEMPLE_OF_TIME: - if (ctx->GetOption(RSK_OOT_HINT) && !ctx->GetItemLocation(RC_SONG_FROM_OCARINA_OF_TIME)->HasObtained()){ + if (ctx->GetOption(RSK_OOT_HINT) && !ctx->GetItemLocation(RC_SONG_FROM_OCARINA_OF_TIME)->HasObtained()) { messageEntry = ctx->GetHint(RH_OOT_HINT)->GetHintMessage(MF_RAW); } else if (!CHECK_DUNGEON_ITEM(DUNGEON_KEY_BOSS, SCENE_GANONS_TOWER)) { messageEntry = CustomMessage( - "@, meet me at %gGanon's Castle%w once you obtain the %rkey to his lair%w.", - "@, wir treffen uns bei %gGanons Schloß%w, sobald Du den %rSchlüssel zu seinem Verlies%w hast.", - "Retrouve-moi au %gChâteau de Ganon%w une fois que tu auras obtenu la %rclé de son repaire%w."); + "@, meet me at %gGanon's Castle%w once you obtain the %rkey to his lair%w.", + "@, wir treffen uns bei %gGanons Schloß%w, sobald Du den %rSchlüssel zu seinem Verlies%w hast.", + "Retrouve-moi au %gChâteau de Ganon%w une fois que tu auras obtenu la %rclé de son repaire%w."); } else { - messageEntry = CustomMessage( - "The time has come. Prepare yourself.", - "Die Zeit ist gekommen.&Mach Dich bereit.", - "Le moment est venu @.&Tu ferais bien de te préparer."); + messageEntry = + CustomMessage("The time has come. Prepare yourself.", "Die Zeit ist gekommen.&Mach Dich bereit.", + "Le moment est venu @.&Tu ferais bien de te préparer."); } break; case SCENE_INSIDE_GANONS_CASTLE: if (ctx->GetOption(RSK_SHEIK_LA_HINT) && INV_CONTENT(ITEM_ARROW_LIGHT) != ITEM_ARROW_LIGHT) { messageEntry = ctx->GetHint(RH_SHEIK_HINT)->GetHintMessage(MF_RAW); - } else if (!(CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) && INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT && - CUR_CAPACITY(UPG_QUIVER) >= 30 && gSaveContext.isMagicAcquired)) { - messageEntry = CustomMessage("You are still ill-equipped to face %rGanondorf%w." - "^Seek out the %cMaster Sword%w, %rsomething to hold your arrows%w, and %gmagic%w to summon the %ylight%w.", + } else if (!(CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) && + INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT && CUR_CAPACITY(UPG_QUIVER) >= 30 && + gSaveContext.isMagicAcquired)) { + messageEntry = CustomMessage( + "You are still ill-equipped to face %rGanondorf%w." + "^Seek out the %cMaster Sword%w, %rsomething to hold your arrows%w, and %gmagic%w to summon the " + "%ylight%w.", "Du bist noch nicht gewappnet um Dich %rGanondorf%w stellen zu können.^" - "Begib Dich auf die Suche nach dem %cMaster-Schwert%w, %retwas um Deinen Pfeilen einen Sinn zu geben%w,^sowie %gdie Magie%w, um das %yLicht%w herauf beschwören zu können.", + "Begib Dich auf die Suche nach dem %cMaster-Schwert%w, %retwas um Deinen Pfeilen einen Sinn zu " + "geben%w,^sowie %gdie Magie%w, um das %yLicht%w heraufzubeschwören.", "@, tu n'es toujours pas prêt à affronter %rGanondorf%w.^" - "Cherche l'%cÉpée de Légende%w, %rquelque chose pour ranger tes flèches%w et de la %gmagie%w pour invoquer la %ylumière%w."); - } else if (!Flags_GetEventChkInf(EVENTCHKINF_DISPELLED_GANONS_TOWER_BARRIER) && !ctx->GetOption(RSK_TRIAL_COUNT).Is(0)){ + "Cherche l'%cÉpée de Légende%w, %rquelque chose pour ranger tes flèches%w et de la %gmagie%w pour " + "invoquer la %ylumière%w."); + } else if (!Flags_GetEventChkInf(EVENTCHKINF_DISPELLED_GANONS_TOWER_BARRIER) && + !ctx->GetOption(RSK_TRIAL_COUNT).Is(0)) { messageEntry = CustomMessage( - "You may have what you need to defeat %rthe Evil King%w, but the %cbarrier%w still stands.^Complete the remaining %gtrials%w to destroy it.", - "Du magst das haben, was Du brauchst um %rden bösen König%w zu besiegen, aber die %cBarriere%w steht noch.^Absolviere die verbleibenden %gPrüfungen%w um sie zu zerstören.", - "@, tu as peut-être ce qu'il te faut pour vaincre %rle Malin%w, mais les barrières sont toujours actives.^Termine les épreuves restantes pour les détruire."); + "You may have what you need to defeat %rthe Evil King%w, but the %cbarrier%w still " + "stands.^Complete the remaining %gtrials%w to destroy it.", + "Du magst haben, was Du brauchst um %rden Großmeister des Bösen%w zu besiegen, doch die " + "%cBarriere%w " + "steht noch.^Breche die verbleibenden %gSiegel%w um sie zu zerstören.", + "@, tu as peut-être ce qu'il te faut pour vaincre %rle Malin%w, mais les barrières sont toujours " + "actives.^Termine les épreuves restantes pour les détruire."); } else { - messageEntry = CustomMessage( - "If you're ready, then proceed.^Good luck.", - "Wenn Du bereit bist, so schreite&voran.^Viel Glück.", - "Si tu es prêt, tu peux y aller.^Bonne chance."); + messageEntry = CustomMessage("If you're ready, then proceed.^Good luck.", + "Wenn Du bereit bist, so schreite&voran.^Viel Glück.", + "Si tu es prêt, tu peux y aller.^Bonne chance."); } break; } @@ -2596,25 +4511,24 @@ CustomMessage Randomizer::GetSheikMessage(s16 scene, u16 originalTextId) { CustomMessage Randomizer::GetFishingPondOwnerMessage(u16 originalTextId) { auto ctx = Rando::Context::GetInstance(); CustomMessage messageEntry = CustomMessage( - "Sorry, but the pond is closed.&I've lost my good %rfishing pole%w...&Can't go fishing without it!", - "Entschuldigung, aber der Teich ist zu.&Ich habe meine gute %rAngelrute%w verloren.&Ohne kann ich nicht fischen!", - "Désolé, mais l'étang est fermé.&J'ai perdu ma bonne %rCanne à Pêche%w...&Impossible de pêcher sans elle!" - ); + "Sorry, but the pond is closed.&I've lost my good %rfishing pole%w...&Can't go fishing without it!", + "Entschuldigung, aber der Teich hat&geschloßen. Ich habe meine gute &%rAngelrute%w verloren.&Ohne kann ich " + "nicht fischen!^", + "Désolé, mais l'étang est fermé.&J'ai perdu ma bonne %rCanne à Pêche%w...&Impossible de pêcher sans elle!"); - if (Rando::Context::GetInstance()->GetOption(RSK_FISHING_POLE_HINT)) { + if (GetRandoSettingValue(RSK_FISHING_POLE_HINT)) { messageEntry = messageEntry + CustomMessage(ctx->GetHint(RH_FISHING_POLE)->GetHintMessage()); } // if the fishing pond guy doesnt remember me i will cry :( if (originalTextId == TEXT_FISHING_POND_START_MET) { - messageEntry = CustomMessage( - "Hey, mister! I remember you!&It's been a long time!^", - "Hallo, mein Herr! Ich erinnere mich an Sie!&Lang ist's her!", - "Hé, monsieur! Je me souviens de toi!&Ça fait longtemps!" - ) + messageEntry; + messageEntry = CustomMessage("Hey, mister! I remember you!&It's been a long time!^", + "Hallo, mein Herr! Ich erinnere mich an Sie!&Lang ist's her!", + "Hé, monsieur! Je me souviens de toi!&Ça fait longtemps!") + + messageEntry; } - messageEntry.Format(); //RANDOTODO why is this needed when it's not elsewhere.... + messageEntry.Format(); // RANDOTODO why is this needed when it's not elsewhere.... return messageEntry; } @@ -2631,24 +4545,27 @@ CustomMessage Randomizer::GetMerchantMessage(RandomizerCheck rc, TextIDs textId, } else if (shopItemGet == RG_ICE_TRAP) { shopItemGet = ctx->overrides[rc].LooksLike(); shopItemName = CustomMessage(ctx->overrides[rc].GetTrickName()); - } else { - auto shopItem = Rando::StaticData::RetrieveItem(shopItemGet); - shopItemName = {shopItem.GetName()}; - } - - if (freeTextId != TEXT_NONE && shopItemPrice == 0) { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, freeTextId, MF_RAW); } else { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, textId, MF_RAW); + auto shopItem = Rando::StaticData::RetrieveItem(shopItemGet); + shopItemName = { shopItem.GetName() }; } - messageEntry.InsertNames({shopItemName, {std::to_string(shopItemPrice)}}); + if (freeTextId != TEXT_NONE && shopItemPrice == 0) { + messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, freeTextId, MF_RAW); + } else { + messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, textId, MF_RAW); + } + + messageEntry.InsertNames({ shopItemName, { std::to_string(shopItemPrice) } }); messageEntry.AutoFormat(); return messageEntry; } CustomMessage Randomizer::GetMapGetItemMessageWithHint(GetItemEntry itemEntry) { - CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, itemEntry.getItemId); + CustomMessage messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, itemEntry.getItemId); int sceneNum; switch (itemEntry.getItemId) { case RG_DEKU_TREE_MAP: @@ -2685,8 +4602,7 @@ CustomMessage Randomizer::GetMapGetItemMessageWithHint(GetItemEntry itemEntry) { if (GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_NONE || (GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SET_NUMBER && - GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12) - ) { + GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12)) { messageEntry.Replace("[[typeHint]]", ""); } else if (ResourceMgr_IsSceneMasterQuest(sceneNum)) { messageEntry.Replace("[[typeHint]]", Rando::StaticData::hintTextTable[RHT_DUNGEON_MASTERFUL].GetHintMessage()); @@ -2694,14 +4610,15 @@ CustomMessage Randomizer::GetMapGetItemMessageWithHint(GetItemEntry itemEntry) { messageEntry.Replace("[[typeHint]]", Rando::StaticData::hintTextTable[RHT_DUNGEON_ORDINARY].GetHintMessage()); } + // BUG: the icon is not in the message yet so are not accounted for, so overflows are possible + messageEntry.AutoFormat(); return messageEntry; } -template -void CreateGetItemMessages(const std::array* messageEntries) { +template void CreateGetItemMessages(const std::array& messageEntries) { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::getItemMessageTableID); - for (const GetItemMessage& messageEntry : *messageEntries) { + for (const GetItemMessage& messageEntry : messageEntries) { customMessageManager->CreateGetItemMessage( Randomizer::getItemMessageTableID, messageEntry.giid, messageEntry.iid, CustomMessage(messageEntry.english, messageEntry.german, messageEntry.french, TEXTBOX_TYPE_BLUE, @@ -2731,17 +4648,15 @@ void CreateRupeeMessages() { } customMessageManager->CreateMessage( Randomizer::rupeeMessageTableID, rupee, - CustomMessage( - "You found" + rupeeText + " !", - "Du hast" + rupeeText + " gefunden!", - "Vous obtenez" + rupeeText + " !", TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM)); + CustomMessage("You found" + rupeeText + " !", "Du hast" + rupeeText + " gefunden!", + "Vous obtenez" + rupeeText + " !", TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM)); } } CustomMessage Randomizer::GetRupeeMessage(u16 rupeeTextId) { - CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId, MF_AUTO_FORMAT); - messageEntry.Replace("[[rupee]]", CustomMessage(RandomElement(englishRupeeNames), - RandomElement(germanRupeeNames), + CustomMessage messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId, MF_AUTO_FORMAT); + messageEntry.Replace("[[rupee]]", CustomMessage(RandomElement(englishRupeeNames), RandomElement(germanRupeeNames), RandomElement(frenchRupeeNames))); return messageEntry; } @@ -2751,27 +4666,33 @@ void CreateTriforcePieceMessages() { { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. It's a start!", "Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es ist ein&Anfang!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. C'est un début!" }, + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à " + "trouver. C'est un début!" }, { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Progress!", "Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es geht voran!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. Ça avance!" }, + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à " + "trouver. Ça avance!" }, { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Over half-way&there!", - "Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Schon&über die Hälfte!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. Il en reste un&peu moins que la moitié!" }, + "Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Schon&über die " + "Hälfte!", + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à " + "trouver. Il en reste un&peu moins que la moitié!" }, { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Almost done!", "Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Fast&geschafft!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. C'est presque&terminé!" }, + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à " + "trouver. C'est presque&terminé!" }, { "You completed the %yTriforce of&Courage%w! %gGG%w!", "Das %yTriforce des Mutes%w! Du hast&alle Splitter gefunden. %gGut gemacht%w!", "Vous avez complété la %yTriforce&du Courage%w! %gFélicitations%w!" }, { "You found a spare %yTriforce Piece%w!&You only needed %c[[required]]%w, but you have %g[[current]]%w!", - "Ein übriger %yTriforce-Splitter%w! Du&hast nun %g[[current]]%w von %c[[required]]%w nötigen gefunden.", - "Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c[[required]]%w, mais vous en avez %g[[current]]%w en&tout!" }, + "Noch ein %yTriforce-Splitter%w! Du&brauchtest nur %c[[required]]%w, hast jetzt aber %g[[current]]%w!", + "Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c[[required]]%w, mais " + "vous en avez %g[[current]]%w en&tout!" }, }; CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::triforcePieceMessageTableID); @@ -2832,13 +4753,13 @@ void CreateNaviRandoMessages() { "mouvants%c?" }, { "%cYou can reach the back of %wImpa's&House %cby jumping from the&unfinished house with a %rcucco%c!", - "%cDu kannst den Balkon von %wImpas&Haus %cerreichen indem Du von&der Baustelle aus mit einem " + "%cDu kannst den Balkon von %wImpas&Haus %cerreichen, indem Du von&der Baustelle aus mit einem " "%rHuhn&%cspringst!", "%cTu peux atteindre l'arrière de la&%wMaison d'Impa %cen sautant depuis la&maison en construction avec " "une&%rcocotte%c!" }, { "%cThe %ySpirit Trial %cin %pGanon's Castle&%chas a %whidden chest %csomewhere.&Did you already know that?", - "%cDie %yGeister-Prüfung %cin %pGanons&Schloß %chat irgendwo eine&%wversteckte Kiste%c. Weißt Du schon&wo?", + "%cDas %yGeister-Siegel %cin %pGanons&Schloß %chat irgendwo eine&%wversteckte Kiste%c. Wußtest Du&das schon?", "%cL'%yÉpreuve de l'Esprit%c dans le %pChâteau&de Ganon %ca un coffre caché quelque&part. Je suppose que tu " "le savais&déjà?" }, @@ -2857,7 +4778,7 @@ void CreateNaviRandoMessages() { { "%cYou might end up with an %wextra&key %cfor the %bWater Temple %cor the&%rFire Temple%c. It's for your " "safety!", "%cVielleicht verbleibt Dir im&%bWassertempel %coder %rFeuertempel %cein&%wzusätzlicher Schlüssel%c. " - "Dies&ist zu Deiner Sicherheit!", + "&Nur zu Deiner Sicherheit!", "%cIl se peut que tu aies une %wPetite&Clé %cen trop dans le %bTemple de l'Eau&%cou le %rTemple du Feu%c. " "C'est pour ta&propre sécurité!" }, @@ -2873,7 +4794,8 @@ void CreateNaviRandoMessages() { "%cMême un adulte ne peut pas pousser&de grands blocs sans un petit %wgain&de force%c!" }, { "%cI've heard that %rFlare Dancer&%cis weak to the %wMaster Sword%c!&Have you tried it?", - "%cIch habe gehört, daß der&%rFlammenderwisch %ceine Schwäche für&das %wMaster-Schwert %caufweist. Hast Du&es " + "%cIch habe gehört, daß der&%rFlammenderwisch %ceine Schwäche für&das %wMaster-Schwert %caufweist. Hast " + "Du&es " "schon einmal versucht einzusetzen?", "%cJ'ai entendu dire que les %rDanse-&Flammes %csont faîbles face à l'%wÉpée de&Légende%c! Est-ce que tu as " "essayé?" }, @@ -2884,25 +4806,27 @@ void CreateNaviRandoMessages() { "%wjarre&%cà la figure?" }, { "%cI hear the patch of %wsoft soil&%cin %bZora's River %cis the only one&that isn't home to a %rspider%c!", - "%cIch habe gehört, daß die Stelle&%wfeuchten Bodens %cim %bZora-Fluß %cals&einzige keine %rSkulltula " + "%cIch habe gehört, daß das&%wErdloch%c am %bZora-Fluß, %cals&einziges keine %rSkulltula " "%cbeherbergt.", "%cJ'ai entendu dire que la %wterre meuble&%cqui se trouve à la %bRivière Zora %cest&la seule qui ne " "contienne pas&d'%raraignée%c." }, { "%cThe people of Hyrule sometimes&have %witems %cfor you, but they won't&like it if you're %wwearing a " "mask%c!", - "%cDie Bewohner Hyrules haben manchmal&%wGegenstände %cfür Dich, aber sie mögen&es nicht, wenn Du %wMasken " + "%cDie Bewohner Hyrules haben manchmal&%wGegenstände %cfür Dich, doch sie mögen&es nicht, wenn Du %wMasken " "trägst%c!", "%cIl se peut que les habitants d'Hyrule&aient des %wobjets %cpour toi. Par contre,&ils risquent de ne pas " "trop apprécier&le fait que tu %wportes un masque%c!" }, { "%cIf you get trapped somewhere, you&might have to %wsave your game %cand&%wreset%c!", - "%cSolltest Du irgendwo eingeschlossen&sein, mußt Du vielleicht Dein %wSpiel&speichern %cund %wneu starten%c!", + "%cSolltest Du irgendwo eingeschloßen&sein, mußt Du vielleicht Dein %wSpiel&speichern %cund %wneu " + "starten%c!", "%cSi tu es coincé quelque part, tu&devrais %wsauvegarder ta partie %cet&faire un %wreset%c!" }, { "%cSheik will meet you in a %rburning&village %conce you have %gForest%c,&%rFire%c, and %bWater " "%cMedallions!", - "%cShiek wird Dich in einem %rbrennenden&Dorf %ctreffen, sobald Du das Amulett&des %gWaldes%c, %rFeuers %cund " + "%cShiek wird Dich in einem %rbrennenden&Dorf %ctreffen, sobald Du das Amulett&des %gWaldes%c, %rFeuers " + "%cund " "%bWassers&%cbesitzt.", "%cSheik t'attendra dans un %rvillage&en feu %clorsque tu auras récupéré&les médaillons de la %gForêt%c, du " "%rFeu&%cet de l'%bEau%c!" }, @@ -2917,9 +4841,7 @@ void CreateNaviRandoMessages() { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::NaviRandoMessageTableID); for (unsigned int i = 0; i <= (NUM_NAVI_MESSAGES - 1); i++) { - customMessageManager->CreateMessage( - Randomizer::NaviRandoMessageTableID, i, - NaviMessages[i]); + customMessageManager->CreateMessage(Randomizer::NaviRandoMessageTableID, i, NaviMessages[i]); } } @@ -2969,7 +4891,7 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Would you like #ice# with that?", "You have obtained the #Ice# Medallion!", "Quick, do a #Zora# impression!", - "One item #on the rocks#!",//would be better if it could display the name of the item + "One item #on the rocks#!", // would be better if it could display the name of the item "How much does a polar bear weigh?&Enough to break the #ice#.", "You got Din's #Ice#!", "You got Nayru's #Cold#!", @@ -3032,12 +4954,13 @@ CustomMessage Randomizer::GetIceTrapMessage() { "STOP!&You violated the #Thaw#!", "I wanted to give you a treasure, but it looks like you got #cold feet#.", "You told me you wanted to deliver #just ice# to Ganondorf!", - "You got the triforce!&This ancient artifact of divine power can grant any- wait, no, sorry, it's just an ice trap. My bad.", + "You got the triforce!&This ancient artifact of divine power can grant any- wait, no, sorry, it's just an ice " + "trap. My bad.", "Time to #cool off#!", "The #Ice Cavern# sends its regards.", "Loading item, please #wait#...", "Mash A+B to not #die#.", - "Sorry, your item is in another location.", //would be better if it could have the name of the item + "Sorry, your item is in another location.", // would be better if it could have the name of the item "You only wish this was %gGreg%w.", "Do you want to drink a hot chocolate?", "The #cold# never bothered me anyway.", @@ -3058,7 +4981,8 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Remember, there may be some momentary #discomfort#.", "In a perfect world #ice traps# like me would not exist, but this is not a perfect world.", "Gee, it sure is #cold# around here.", - "You tested the item with your #ice detector#, it beeped.", //would be better if it could have the name of the item + "You tested the item with your #ice detector#, it beeped.", // would be better if it could have the name of the + // item "You have found the way of the zero. The #sub-zero#.", "Mweep... mweep... mweep...", "Scum, #freezebag#! I mean #freeze#, scumbag!", @@ -3077,29 +5001,32 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Hydration break! Hey, who #froze# my water?", "Oops, wrong #item model#.", "Whoops! You have to put the item #in your inventory#.", - "You dropped the item, shattering it into #shards of ice#!", //would be better if it could have the name of the item + "You dropped the item, shattering it into #shards of ice#!", // would be better if it could have the name of the + // item "Is this... golden age Simpsons?&BECAUSE I'M ABOUT TO #CHOKE A CHILD#.", "You are the weakest @, #goodbye#!", "Ugh... Why did we even randomize #this item#?", "The #Frost Moon# is rising...", - "According to all known laws of physics and biology, there is no way that @ should be able to survive #getting fully encased in ice#. The cells in @'s body would all die by the time they #unthaw#. Of course, this is a video game, so @ survives anyway... #Probably#.", + "According to all known laws of physics and biology, there is no way that @ should be able to survive #getting " + "fully encased in ice#. The cells in @'s body would all die by the time they #unthaw#. Of course, this is a " + "video game, so @ survives anyway... #Probably#.", "Okay, so stop me if you've heard this one - a gamer and a bottle of #liquid nitrogen# walk into a milk bar...", "Lástima, es una #trampa de hielo#...&&Nobody expects the Spanish #ice trap#!", "Gee, it sure is #BURR#ing around here.", "Navi? Oh! I thought she was called #Névé#!", "It's fine, @ knew this was a #trap#, they're just using it to take damage intentionally to manipulate RNG.", - "Unfortunately, the item has #stopped#.", //would be better if it could have the name of the item - "This item is #not available# in your country.", //would be better if it could have the name of the item + "Unfortunately, the item has #stopped#.", // would be better if it could have the name of the item + "This item is #not available# in your country.", // would be better if it could have the name of the item "#Ice# try. #;)#", "D'oh, I #missed#!", "Where is my #super suit#?", "#Titanic's revenge#.", }; - static const char* const germanIceTrapMessages[23] = { + static const char* const germanIceTrapMessages[104] = { "Du bist ein #DUMMKOPF#!", "Du bist eine #Frostbeule#!", - "#DUMMKOPF#!", + "#NARR#!", "Du wurdest #eiskalt# erwischt!", "Es läuft Dir #eiskalt# den Rücken hinunter, @.", "Bleib #cool#, @.", @@ -3112,7 +5039,7 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Bewahre einen #kühlen#! Kopf.", "Ganondorf setzt #Eisstrahl# ein. Das ist sehr effektiv!", "Ein Lächeln ist der beste Weg, um das #Eis# zu brechen!", - "#Eiskalt# lässt du meine Seele erfrier'n.", + "#Eiskalt# lässt Du meine Seele erfrier'n.", "Die #Titanic# hätte Angst vor Dir, @.", "Oh nein!", "Was die Dinosaurier getötet hat?&Die #Eiszeit#!", @@ -3120,6 +5047,87 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Never gonna #give you up#. Never gonna #let you down#. Never gonna run around and #desert you#.", "Danke #@#! Aber der Gegenstand ist in einem anderem Schloß!", "Kalt. Kalt. Kälter. #EISKALT#!", + "Von wegen #Belohnung#!", + "Ganon lacht dich aus.", + "Zelda wartet... aber nicht auf Dich!", + "Hyrule braucht Dich... aber nicht so!", + "Master-Schmerz statt Master-Schwert.", + "Das passiert wenn man alles looten möchte!", + "Ein kleiner Vorgeschmack auf Ganons Kühlschrank.", + "Ich hoffe, Du hast gespeichert.", + "Dein Gesicht, als Du die Truhe geöffnet hast... unbezahlbar.", + "Tut mir leid, aber das Item befindet sich in einer anderen Truhe.", + "Noch 5 solcher Truhen und Du bist abgehärtet.", + "Keine sorge. Ich bin genau so enttäuscht wie Du.", + "Epona läuft gerade ohne Dich los.", + "Wow! Ein echtes Nichts!", + "Du bist sowas von bereit für den Endboss. Nicht!", + "Loot? Nur für Gewinner!", + "Pure Enttäuschung.", + "RNG meint es nicht gut mit dir...", + "Link.exe hat ein Problem erkannt. Spiel wird heruntergefahren.", + "Die Truhe war leer, dein Verstand ebenso.", + "Hier für Dich, lecker #Eis#.", + "Das ist kein Item - das ist Karma.", + "Und wieder hat Dich 'ne Kiste besiegt.", + "Rauru lacht Dich aus.", + "Saria hat sich gerade entfreundet.", + "Prinzessin Ruto hat die Verlobung aufgelöst.", + "Kein Seed, kein Ärger!", + "Diese Truhe wurde Ihnen präsentiert von: ABSICHT!", + "Nicht heute.", + "Nächster halt, #Frosthausen#!", + "Genau so nützlich wie Navi im Bosskampf.", + "Zelda? Die kennt Dich nicht.", + "Zufall? Nein. Absicht!", + "Karma.exe erfolgreich ausgeführt.", + "Manchmal gewinnt man, aber Du gehörst nicht dazu.", + "#Eiskalt# versagt.", + "Tingle lacht Dich aus.", + "Du hörst Ganondorf dir folgendes zuflüstern.. \"Danke fürs Öffnen, aber das war mein #Müll#!\"", + "Navi: 'Hey, hör zu! Da ist... absolut #nichts# drin.", + "Truhe geöffnet, Hoffnung zerstört. Willkommen in Hyrule.", + "Die Truhe enthält: 100% pure #Enttäuschung#.", + "Na? Wieder zu viel von Malons #Mentos# genascht?", + "Du wurdest #eiskalt# beim Öffnen der Truhe erwischt.", + "Grats, Du hast Ganons alten #Eiswürfelvorrat# gefunden.", + "Die Truhe ist kälter als #Zoras Reich#... und genauso leer.", + "#Eis#? Klar, das ist der #kalte# Hauch der Enttäuschung!", + "Die Truhe ist so leer, sogar der #Yeti# aus Twilight Princess lacht.", + "Die Truhe enthält: 100% #gefrorene# Hoffnungslosigkeit.", + "Du hast eine Truhe geöffnet und den #Kälterekord# in Hyrule gebrochen.", + "Du hast TM16 erhalten: #Eissturm#!", + "Controller Disconnect, jetzt bist Du #gefreezed#.", + "Noch drei solcher Truhen, und dein Spielstand wird gelöscht.", + "Gengar setzt Schlecker ein! Du bist vollständig #paralysiert#!", + "Mumbo Jumbo verwandelt Dich in einen #Eisblock#. Haste jetzt 'nen coolen Look.", + "Willkommen in Donkey Kong Country: Tropical #Freeze#!", + "Gratuliere! Du hast das Spiel #gefreezed#.", + "Triforce des Mutes und trotzdem bekommst Du kalte Füße.", + "Fortschritt #eingefroren#. Bitte blasen Sie in die Cartridge.", + "Du bist nicht soft-locked. Du bist #frost-locked#.", + "Ein #frostiger# Wind weht durch die Truhe... leer, als hätte Kirby den ganzen Inhalt eingesaugt.", + "Ein #eisiger# Hauch weht dir entgegen.... Doch die Truhe bleibt #kalt# und leer.", + "Die Truhe ist von #Frost# versiegelt... drinnen nichts als eine #kalte#, #frostige# Enttäuschung!", + "#Frost# knistert bedrohlich in der Truhe - kein Schatz, nur ein #eisiger# Hohn!", + "Diese Falle zu finden ist so #frostig# wie Fangen spielen mit Chill Penguin.", + "#Eis# kann funkeln, was kannst Du?", + "Niete, selbst die Prinzessin ist enttäuscht.", + "Herzteil? Nein, #Eiskalt#!", + "Ratet mal wer wieder zu gierig war? Richtig... DU!", + "Ganondorf bedankt sich persönlich für deine Inkompetenz.", + "Der Spind von Davy Jones!", + "Herzog Onkled lacht Dich aus.", + "GEWINNER!", + "vERLIERER!", + "Drücke B, Unten und Select um zu überleben.", + "#Chill# mal jetzt.", + "Hier halt mal eben.", + "Sony lacht Dich aus", + "Dieses Item ist nicht in deinem Land verfügbar.", + "Es ist wichtig, die #Kühltruhe# mal für einen Tag auszuschalten.", + "#Kacknoob#!", + "Insert Rupee to continue...", }; static const char* const frenchIceTrapMessages[83] = { @@ -3148,12 +5156,13 @@ CustomMessage Randomizer::GetIceTrapMessage() { "J'espère que ça ne te fait ni chaud, ni #froid#.", "Je voulais t'offrir un trésor, mais il semble que tu aies eu #froid aux pieds#", "Tu m'as dit que tu voulais livrer #de la glace# à Ganondorf!", - "Tu as obtenu la Triforce!&Cet ancien artefact divin peut exaucer n'importe quel... ah non, désolé, c'est juste un piège de glace.", + "Tu as obtenu la Triforce!&Cet ancien artefact divin peut exaucer n'importe quel... ah non, désolé, c'est " + "juste un piège de glace.", "Il est temps de #te rafraîchir#!", "La #Caverne Polaire# te passe le bonjour.", "Chargement de l'objet, veuillez #patienter#...", "Martèle A+B pour ne pas #mourir#.", - "Désolé, ton objet est à un autre endroit.", //would be better if it could have the name of the item + "Désolé, ton objet est à un autre endroit.", // would be better if it could have the name of the item "Tu espérais que ce soit %gGreg%w.", "Tu veux boire un chocolat chaud?", "Le #froid# ne m'a jamais dérangé, de toute façon.", @@ -3172,9 +5181,11 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Commence à marteler.", "Cet objet va #s'autodétruire# dans 5 secondes...", "Souviens-toi, il pourrait y avoir un léger #inconfort#.", - "Dans un monde parfait, les #pièges de glace# comme moi n'existeraient pas, mais ce n'est pas un monde parfait.", + "Dans un monde parfait, les #pièges de glace# comme moi n'existeraient pas, mais ce n'est pas un monde " + "parfait.", "Mon dieu qu'il fait #froid# ici.", - "Tu as testé l'objet avec ton #détecteur de glace#, il a bipé.", //would be better if it could have the name of the item + "Tu as testé l'objet avec ton #détecteur de glace#, il a bipé.", // would be better if it could have the name of + // the item "Tu as découvert le chemin du zéro. Le #sub-zéro#.", "Mweep... mweep... mweep...", "Gelé, #sac à glace#! Je veux dire #gèle-toi#, racaille!", @@ -3193,16 +5204,21 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Pause hydratation ! Hé, qui a #gelé# mon eau?", "Oups, mauvais #modèle d'objet#.", "Oups! Tu dois mettre l'objet #dans ton inventaire#.", - "Tu as fait tomber l'objet, le brisant en #éclats de glace#!", //would be better if it could have the name of the item + "Tu as fait tomber l'objet, le brisant en #éclats de glace#!", // would be better if it could have the name of + // the item "Tu es le maillon faible @, #au revoir#!", "Ugh... Pourquoi avons-nous même randomisé #cet objet#?", "La #Lune de Givre# se lève...", - "Selon toutes les lois connues de la physique et de la biologie, @ ne devrait pas survivre à #être complètement enfermé dans la glace#. Les cellules de @ mourraient avant qu'elles ne #dégèlent#. Mais c'est un jeu vidéo, alors @ survit... #Probablement#.", - "OK, arrête-moi si tu l'as déjà entendue - un joueur et une bouteille de #nitrogène liquide# entrent dans un bar à lait...", + "Selon toutes les lois connues de la physique et de la biologie, @ ne devrait pas survivre à #être " + "complètement enfermé dans la glace#. Les cellules de @ mourraient avant qu'elles ne #dégèlent#. Mais c'est un " + "jeu vidéo, alors @ survit... #Probablement#.", + "OK, arrête-moi si tu l'as déjà entendue - un joueur et une bouteille de #nitrogène liquide# entrent dans un " + "bar à lait...", "Lástima, c'est un #piège de glace#...&&Personne ne s'attend à un #piège de glace espagnol#!", "Mon dieu qu'il fait #GLAGLA# ici.", - "C'est bon, @ savait que c'était un #piège#, il l'utilise juste pour prendre des dégâts intentionnellement et manipuler la RNG.", - "Cet objet n'est #pas disponible# dans votre pays.", //would be better if it could have the name of the item + "C'est bon, @ savait que c'était un #piège#, il l'utilise juste pour prendre des dégâts intentionnellement et " + "manipuler la RNG.", + "Cet objet n'est #pas disponible# dans votre pays.", // would be better if it could have the name of the item "#Bonne# tentative. #;)#", "Où est mon #Super Costume#?", "#La revanche du Titanic#.", @@ -3213,17 +5229,11 @@ CustomMessage Randomizer::GetIceTrapMessage() { if (CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { msg = CustomMessage( /*english*/ "This year for Christmas, all you get is #COAL#!", - /*german*/ "This year for Christmas, all you get is #COAL#!", - /*french*/ "Pour Noël, cette année, tu n'auras que du #CHARBON#! %rJoyeux Noël%w!", - { QM_BLUE } - ); + /*german*/ "Dieses Jahr gibt es nur #KOHLE# zu Weihnachten!", + /*french*/ "Pour Noël, cette année, tu n'auras que du #CHARBON#! %rJoyeux Noël%w!", { QM_BLUE }); } else { - msg = CustomMessage( - RandomElement(englishIceTrapMessages), - RandomElement(germanIceTrapMessages), - RandomElement(frenchIceTrapMessages), - { QM_BLUE, QM_BLUE, QM_BLUE } - ); + msg = CustomMessage(RandomElement(englishIceTrapMessages), RandomElement(germanIceTrapMessages), + RandomElement(frenchIceTrapMessages), { QM_BLUE, QM_BLUE, QM_BLUE }); } msg.AutoFormat(); @@ -3238,7 +5248,7 @@ static int goronIDs[9] = { TEXT_FIRE_TEMPLE_GORON_OWE_YOU_BIG_TIME, TEXT_FIRE_TEMPLE_GORON_OCARINA_SECRET, TEXT_FIRE_TEMPLE_GORON_PILLAR_SECRET, TEXT_FIRE_TEMPLE_GORON_HIDDEN_DOOR_SECRET, - TEXT_FIRE_TEMPLE_GORON_SOUNDS_DIFFERENT_SECRET}; + TEXT_FIRE_TEMPLE_GORON_SOUNDS_DIFFERENT_SECRET }; void CreateFireTempleGoronMessages() { CustomMessage FireTempleGoronMessages[NUM_GORON_MESSAGES] = { @@ -3310,7 +5320,7 @@ void CreateFireTempleGoronMessages() { }, { "I dunno why I was thrown in here,&truth be told.&I'm just a %g\"PR\"%w person.", - "Wat weiß'n ich, wieso ich hier&eingepfercht wurd. Ich mach&doch nur %g\"Pull&Requests\"%w.", + "Wat weiß'n ich, wieso ich hier&eingepfercht wurd. Ich mach&doch nur %g\"Pull Requests\"%w.", "Je ne sais pas comment on m'a jeté&ici. Il faut croire que je dors comme&une pierre.", }, }; @@ -3333,459 +5343,389 @@ CustomMessage Randomizer::GetGoronMessage(u16 index) { void Randomizer::CreateCustomMessages() { // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // with GIMESSAGE(getItemID, itemID, english, german, french). - const std::array getItemMessages = {{ - GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON, - "You found %gGreg%w!", - "%gGreg%w! Du hast ihn wirklich gefunden!", - "Félicitation! Vous avez trouvé %gGreg%w!"), - GIMESSAGE(RG_MASTER_SWORD, ITEM_SWORD_MASTER, - "You found the %gMaster Sword%w!", - "Du erhältst das %gMaster-Schwert%w!", - "Vous obtenez %gl'Épée de Légende%w!"), - GIMESSAGE(RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, - "You got a %rBottle with Blue &Fire%w! Use it to melt Red Ice!", - "Du erhältst eine %rFlasche mit&blauem Feuer%w! Nutze es um&%rRotes Eis%w zu schmelzen!", + const std::array getItemMessages = { { + GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON, "You found %gGreg%w!", "%gGreg%w! Du hast ihn&wirklich gefunden!", + "Félicitation! Vous avez trouvé %gGreg%w!"), + GIMESSAGE(RG_MASTER_SWORD, ITEM_SWORD_MASTER, "You found the %gMaster Sword%w!", + "Du erhältst das %gMaster-Schwert%w!", "Vous obtenez %gl'Épée de Légende%w!"), + GIMESSAGE( + RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, "You got a %rBottle with Blue &Fire%w! Use it to melt Red Ice!", + "Du erhältst eine %rFlasche mit&blauem Feuer%w! Nutze es um&%rRotes Eis%w zu schmelzen!", "Vous obtenez une %rBouteille avec&une Flamme Bleue%w! Utilisez-la&pour faire fondre la %rGlace&Rouge%w!"), - GIMESSAGE(RG_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE, - "You got a %rBig Poe in a Bottle%w!&Sell it to the Ghost Shop!", - "Du hast einen %rNachtschwärmer%w&in einer Flasche gefangen!&Gehe zum %rGespenstermarkt%w&und verkaufe ihn!", - "Vous obtenez une %rBouteille avec&une Âme%w! Vendez-la au Marchand&d'Âme"), - GIMESSAGE(RG_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE, - "You got a %rBottle of Blue Potion%w!&Drink it to replenish your&%ghealth%w and %bmagic%w!", - "Du erhältst ein %rBlaues Elixier%w!&Nutze es, um Deine %rMagie- und&Energieleiste%w komplett&aufzufüllen!", - "Vous obtenez une %rBouteille avec&une Potion Bleue%w! Buvez-la pour&restaurer votre %rénergie vitale%w&ainsi que votre %gmagie%w!"), + GIMESSAGE(RG_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE, "You got a %rBig Poe in a Bottle%w!&Sell it to the Ghost Shop!", + "Du hast einen %rNachtschwärmer%w&in einer Flasche gefangen!&Gehe zum %rGespenstermarkt%w&und " + "verkaufe ihn!", + "Vous obtenez une %rBouteille avec&une Âme%w! Vendez-la au Marchand&d'Âme"), + GIMESSAGE( + RG_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE, + "You got a %rBottle of Blue Potion%w!&Drink it to replenish your&%ghealth%w and %bmagic%w!", + "Du erhältst ein %rBlaues Elixier%w!&Nutze es, um Deine %rMagie- und&Energieleiste%w komplett&aufzufüllen!", + "Vous obtenez une %rBouteille avec&une Potion Bleue%w! Buvez-la pour&restaurer votre %rénergie " + "vitale%w&ainsi que votre %gmagie%w!"), GIMESSAGE(RG_BOTTLE_WITH_FISH, ITEM_FISH, - "You got a %rFish in a Bottle%w!&It looks fresh and delicious!&They say Jabu-Jabu loves them!", - "Du hast jetzt einen %rFisch in&einer Flasche%w! Er sieht richtig&frisch aus! Man sagt,&Lord Jabu-Jabu liebt Fische!", - "Vous obtenez une %rBouteille avec&un Poisson%w! Il a l'air délicieux!&Il paraîtrait que %bJabu-Jabu %wen&serait friand!"), - GIMESSAGE(RG_BOTTLE_WITH_BUGS, ITEM_BUG, - "You got a %rBug in a Bottle%w!&They love to burrow in&dirt holes!", - "Du hast jetzt %rKäfer in einer&Flasche&%w!&Sie graben gerne&in Erdlöchern.", - "Vous obtenez une %rBouteille avec&des Insectes%w! Ils adorent creuser&dans la terre meuble!"), - GIMESSAGE(RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY, - "You got a %rFairy in a Bottle%w!&Use it wisely!", - "Du hast jetzt eine %rFee in einer&Flasche%w! Nutze sie weise!", - "Vous obtenez une %rBouteille avec&une Fée%w! Faites-en bon usage!"), - GIMESSAGE(RG_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, + "You got a %rFish in a Bottle%w!&It looks fresh and delicious!&They say Jabu-Jabu loves them!", + "Du hast jetzt einen %rFisch in&einer Flasche%w! Er sieht richtig&frisch aus! Man sagt,&Lord " + "Jabu-Jabu liebt Fische!", + "Vous obtenez une %rBouteille avec&un Poisson%w! Il a l'air délicieux!&Il paraîtrait que %bJabu-Jabu " + "%wen&serait friand!"), + GIMESSAGE(RG_BOTTLE_WITH_BUGS, ITEM_BUG, "You got a %rBug in a Bottle%w!&They love to burrow in&dirt holes!", + "Du hast jetzt %rKäfer in einer&Flasche%w! Sie graben gerne&in Erdlöchern.", + "Vous obtenez une %rBouteille avec&des Insectes%w! Ils adorent creuser&dans la terre meuble!"), + GIMESSAGE(RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY, "You got a %rFairy in a Bottle%w!&Use it wisely!", + "Du hast jetzt eine %rFee in einer&Flasche%w! Nutze sie weise!", + "Vous obtenez une %rBouteille avec&une Fée%w! Faites-en bon usage!"), + GIMESSAGE( + RG_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, "You got a %rBottle of Red Potion%w!&Drink it to replenish your&%ghealth%w!", - "Du erhältst ein %rRotes Elixier%w!&Nutze es, um Deine %rEnergieleiste&%weinmalig komplett aufzufüllen!", + "Du erhältst ein %rRotes Elixier%w!&Nutze es, um Deine %rEnergieleiste&%weinmalig komplett aufzufüllen!", "Vous obtenez une %rBouteille avec&une Potion Rouge%w! Buvez-la pour&restaurer votre %rénergie vitale%w!"), - GIMESSAGE(RG_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN, + GIMESSAGE( + RG_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN, "You got a %rBottle of Green Potion%w!&Drink it to replenish your&%bmagic%w!", - "Du erhältst ein %rGrünes Elixier%w!&Nutze es, um Deine %bMagieleiste&%weinmalig komplett aufzufüllen!", + "Du erhältst ein %rGrünes Elixier%w!&Nutze es, um Deine %bMagieleiste&%weinmalig komplett aufzufüllen!", "Vous obtenez une %rBouteille avec&une Potion Verte%w! Buvez-la pour&restaurer votre %gmagie%w!"), GIMESSAGE(RG_BOTTLE_WITH_POE, ITEM_POE, - "You got a %rPoe in a Bottle%w!&That creepy Ghost Shop might&be interested in this...", - "Du hast jetzt ein %rIrrlicht in einer&Flasche%w! Der %rGespenstermarkt%w&interessiert sich für vielleicht&dafür...", - "Vous obtenez une %rBouteille avec&un Esprit%w! Ça intéresserait&peut-être le vendeur d'Âme "), + "You got a %rPoe in a Bottle%w!&That creepy Ghost Shop might&be interested in this...", + "Du hast jetzt ein %rIrrlicht in einer&Flasche%w! Der %rGespenstermarkt%w&interessiert sich " + "vielleicht&dafür...", + "Vous obtenez une %rBouteille avec&un Esprit%w! Ça intéresserait&peut-être le vendeur d'Âme "), - GIMESSAGE(RG_GERUDO_FORTRESS_SMALL_KEY, ITEM_KEY_SMALL, - "You found a %yThieves Hideout &%wSmall Key!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %yDiebesversteck%w!", - "Vous obtenez une %rPetite Clé %w&du %yRepaire des Voleurs%w!"), - GIMESSAGE(RG_FOREST_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, - "You found a %gForest Temple &%wSmall Key!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %gWaldtempel%w!", - "Vous obtenez une %rPetite Clé %w&du %gTemple de la Forêt%w!"), - GIMESSAGE(RG_FIRE_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, - "You found a %rFire Temple &%wSmall Key!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %rFeuertempel%w!", - "Vous obtenez une %rPetite Clé %w&du %rTemple du Feu%w!"), - GIMESSAGE(RG_WATER_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, - "You found a %bWater Temple &%wSmall Key!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %bWassertempel%w!", - "Vous obtenez une %rPetite Clé %w&du %bTemple de l'Eau%w!"), - GIMESSAGE(RG_SPIRIT_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, - "You found a %ySpirit Temple &%wSmall Key!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %yGeistertempel%w!", - "Vous obtenez une %rPetite Clé %w&du %yTemple de l'Esprit%w!"), - GIMESSAGE(RG_SHADOW_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, - "You found a %pShadow Temple &%wSmall Key!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %pSchattentempel%w!", - "Vous obtenez une %rPetite Clé %w&du %pTemple de l'Ombre%w!"), - GIMESSAGE(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, ITEM_KEY_SMALL, - "You found a %pBottom of the &Well %wSmall Key!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %pGrund des Brunnens%w!", - "Vous obtenez une %rPetite Clé %w&du %pPuits%w!"), + GIMESSAGE(RG_GERUDO_FORTRESS_SMALL_KEY, ITEM_KEY_SMALL, "You found a %yThieves Hideout &%wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w des %yDiebesverstecks%w!", + "Vous obtenez une %rPetite Clé %w&du %yRepaire des Voleurs%w!"), + GIMESSAGE(RG_FOREST_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %gForest Temple &%wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w des %gWaldtempels%w!", + "Vous obtenez une %rPetite Clé %w&du %gTemple de la Forêt%w!"), + GIMESSAGE(RG_FIRE_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %rFire Temple &%wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w des %rFeuertempels%w!", + "Vous obtenez une %rPetite Clé %w&du %rTemple du Feu%w!"), + GIMESSAGE(RG_WATER_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %bWater Temple &%wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w des %bWassertempels%w!", + "Vous obtenez une %rPetite Clé %w&du %bTemple de l'Eau%w!"), + GIMESSAGE(RG_SPIRIT_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %ySpirit Temple &%wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w des %yGeistertempels%w!", + "Vous obtenez une %rPetite Clé %w&du %yTemple de l'Esprit%w!"), + GIMESSAGE(RG_SHADOW_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %pShadow Temple &%wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w des %pSchattentempels%w!", + "Vous obtenez une %rPetite Clé %w&du %pTemple de l'Ombre%w!"), + GIMESSAGE(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, ITEM_KEY_SMALL, "You found a %pBottom of the &Well %wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w vom %pGrund des Brunnens%w!", + "Vous obtenez une %rPetite Clé %w&du %pPuits%w!"), GIMESSAGE(RG_GERUDO_TRAINING_GROUND_SMALL_KEY, ITEM_KEY_SMALL, - "You found a %yGerudo Training &Grounds %wSmall Key!", - "Du erhältst einen %rkleinen&Schlüssel%w für die %yGerudo-Trainingsarena%w!", - "Vous obtenez une %rPetite Clé %w&du %yGymnase Gerudo%w!"), - GIMESSAGE(RG_GANONS_CASTLE_SMALL_KEY, ITEM_KEY_SMALL, - "You found a %rGanon's Castle &%wSmall Key!", - "Du erhältst einen %rkleinen&Schlüssel%w für %rGanons Schloß%w!", - "Vous obtenez une %rPetite Clé %w&du %rChâteau de Ganon%w!"), - GIMESSAGE(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gGuard House%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus der Wachen%w!", - "Vous obtenez une %rPetite Clé %w&de la %gMaison des Gardes%w!"), - GIMESSAGE(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gMarket Bazaar%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar des Marktes%w!", - "Vous obtenez une %rPetite Clé %w&du %gMarché%w!"), - GIMESSAGE(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gMarket Potion Shop%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden des Marktes%w!", - "Vous obtenez une %rPetite Clé %w&du %gMarché%w!"), - GIMESSAGE(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gMask Shop%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %gMaskenladen%w!", - "Vous obtenez une %rPetite Clé %w&du %gMagasin de Masques%w!"), + "You found a %yGerudo Training &Ground %wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w der %yGerudo-Trainingsarena%w!", + "Vous obtenez une %rPetite Clé %w&du %yGymnase Gerudo%w!"), + GIMESSAGE(RG_GANONS_CASTLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %rGanon's Castle &%wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w von %rGanons Schloß%w!", + "Vous obtenez une %rPetite Clé %w&du %rChâteau de Ganon%w!"), + GIMESSAGE(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gGuard House%w!", + "Du erhältst den %rSchlüssel%w&zum %gWachhaus%w!", + "Vous obtenez la %rClé %wde la&%gMaison des Gardes%w!"), + GIMESSAGE(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, "You found the key to the&%gMarket Bazaar%w!", + "Du erhältst den %rSchlüssel%w&zum %gBasar des Marktes%w!", + "Vous obtenez la %rClé %wdu %gBazar&de la Place du Marché%w!"), + GIMESSAGE(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gMarket Potion Shop%w!", + "Du erhältst den %rSchlüssel%w&zum %gMagie-Laden des Marktes%w!", + "Vous obtenez la %rClé %wdu&%gMagasin de Potions de la&Place du Marché%w!"), + GIMESSAGE(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gMask Shop%w!", + "Du erhältst den %rSchlüssel%w&zum %gMaskenhändler%w!", + "Vous obtenez la %rClé %wde la&%gFoire aux Masques%w!"), GIMESSAGE(RG_MARKET_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gMarket Shooting Gallery%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude des Marktes%w!", - "Vous obtenez une %rPetite Clé %w&du %gStand de Tir%w!"), - GIMESSAGE(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gBombchu Bowling Alley%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für die %gMinenbowlingbahn%w!", - "Vous obtenez une %rPetite Clé %w&du %gBowling Bombchu%w!"), + "You found the key to the&%gMarket Shooting Gallery%w!", + "Du erhältst den %rSchlüssel%w&zur %gSchießbude des Marktes%w!", + "Vous obtenez la %rClé %wdu %gStand de&Tir de la Place du Marché%w!"), + GIMESSAGE(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBombchu Bowling Alley%w!", + "Du erhältst den %rSchlüssel%w&zur %gMinenbowlingbahn%w!", + "Vous obtenez la %rClé %wdu %gBowling&Teigneux%w!"), GIMESSAGE(RG_TREASURE_CHEST_GAME_BUILDING_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gTreasure Chest Game Building%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Schatzkisten-Pokers%w!", - "Vous obtenez une %rPetite Clé %w&du %gJeu de la Chasse au Trésor%w!"), - GIMESSAGE(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gBombchu Shop%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %gKrabbelminenladen%w!", - "Vous obtenez une %rPetite Clé %w&du %gMagasin de Bombchu%w!"), - GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, - "You found the key to&%gRichard's House%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Richard%w!", - "Vous obtenez une %rPetite Clé %w&de la %gMaison de Richard%w!"), - GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, - "You found the key to&%gRichard's House%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Richard%w!", - "Vous obtenez une %rPetite Clé %w&de la %gMaison de Richard%w!"), - GIMESSAGE(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, - "You found the key to&the %gAlley House%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus in der Gasse%w!", - "Vous obtenez une %rPetite Clé %w&de la %gMaison de la Ruelle%w!"), - GIMESSAGE(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gKakariko Bazaar%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar von Kakariko%w!", - "Vous obtenez une %rPetite Clé %w&du %gMarché de Cocorico%w!"), - GIMESSAGE(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gKakariko Potion Shop%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden von Kakariko%w!", - "Vous obtenez une %rPetite Clé %w&du %gMagasin de Potions de Cocorico%w!"), - GIMESSAGE(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gBoss's House%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Chefs%w!", - "Vous obtenez une %rPetite Clé %w&de la %gMaison du Boss%w!"), - GIMESSAGE(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, - "You found the key to&%gGranny's Potion Shop%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für %gAsas Hexenladen%w!", - "Vous obtenez une %rPetite Clé %w&du %gMagasin de Potions de Grand-mère%w!"), - GIMESSAGE(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gSkulltula House%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %gSkulltula-Haus%w!", - "Vous obtenez une %rPetite Clé %w&de la %gMaison des Skulltulas%w!"), - GIMESSAGE(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, - "You found the key to&%gImpa's House%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Impa%w!", - "Vous obtenez une %rPetite Clé %w&de la %gMaison d'Impa%w!"), - GIMESSAGE(RG_WINDMILL_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gWindmill%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für die %gWindmühle%w!", - "Vous obtenez une %rPetite Clé %w&du %gMoulin à Vent%w!"), + "You found the key to the&%gTreasure Chest Game Building%w!", + "Du erhältst den %rSchlüssel%w&zum %gHaus der Truhenlotterie%w!", + "Vous obtenez la %rClé %wdu %gJeu de la&Chasse au Trésor%w!"), + GIMESSAGE(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBombchu Shop%w!", + "Du erhältst den %rSchlüssel%w&zum %gKrabbelminenladen%w!", + "Vous obtenez la %rClé %wdu %gMagasin&de Missiles%w!"), + GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&%gRichard's House%w!", + "Du erhältst den %rSchlüssel%w&zu %gRichards Haus%w!", + "Vous obtenez la %rClé %wde la %gMaison&de Kiki%w!"), + GIMESSAGE(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&the %gAlley House%w!", + "Du erhältst den %rSchlüssel%w&zum %gHaus in der Gasse%w!", + "Vous obtenez la %rClé %wde la %gMaison&de la Ruelle%w!"), + GIMESSAGE(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, "You found the key to the&%gKakariko Bazaar%w!", + "Du erhältst den %rSchlüssel%w&zum %gBasar von Kakariko%w!", + "Vous obtenez la %rClé %wdu %gBazar&de Cocorico%w!"), + GIMESSAGE(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gKakariko Potion Shop%w!", + "Du erhältst den %rSchlüssel%w&zum %gMagie-Laden von Kakariko%w!", + "Vous obtenez la %rClé %wdu %gMagasin de&Potions de Cocorico%w!"), + GIMESSAGE(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBoss's House%w!", + "Du erhältst den %rSchlüssel%w&zum %gHaus des Chefs%w!", + "Vous obtenez la %rClé %wde la %gMaison&du Chef des Ouvriers%w!"), + GIMESSAGE(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to&%gGranny's Potion Shop%w!", + "Du erhältst den %rSchlüssel%w&zu %gAsas Hexenladen%w!", + "Vous obtenez la %rClé %wde&l'%gApothicaire%w!"), + GIMESSAGE(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gSkulltula House%w!", + "Du erhältst den %rSchlüssel%w&zum %gSkulltula-Haus%w!", + "Vous obtenez la %rClé %wde la %gMaison&des Araignées%w!"), + GIMESSAGE(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&%gImpa's House%w!", + "Du erhältst den %rSchlüssel%w&zu %gImpas Haus%w!", + "Vous obtenez la %rClé %wde la %gMaison&d'Impa%w!"), + GIMESSAGE(RG_WINDMILL_KEY, ITEM_KEY_SMALL, "You found the key to the&%gWindmill%w!", + "Du erhältst den %rSchlüssel%w&zur %gWindmühle%w!", "Vous obtenez la %rClé %w du %gMoulin%w!"), GIMESSAGE(RG_KAK_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gKakariko Shooting Gallery%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude von Kakariko%w!", - "Vous obtenez une %rPetite Clé %w&du %gStand de Tir de Cocorico%w!"), - GIMESSAGE(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, - "You found the key to&%gDampe's Hut%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für die %gHütte von Boris%w!", - "Vous obtenez une %rPetite Clé %w&du %gChalet de Dampe%w!"), - GIMESSAGE(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, - "You found the key to&%gTalon's House%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Talon%w!", - "Vous obtenez une %rPetite Clé %w&de la %gMaison de Talon%w!"), - GIMESSAGE(RG_STABLES_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gStables%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für die %gStälle%w!", - "Vous obtenez une %rPetite Clé %w&des %gÉcuries%w!"), - GIMESSAGE(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gBack Tower%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %ghinteren Turm%w!", - "Vous obtenez une %rPetite Clé %w&du %gTour Arrière%w!"), - GIMESSAGE(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gHylia Laboratory%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %gHylia-Labor%w!", - "Vous obtenez une %rPetite Clé %w&du %gLaboratoire d'Hylia%w!"), - GIMESSAGE(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gFishing Hole%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %gFischweiher%w!", - "Vous obtenez une %rPetite Clé %w&du %gTrou de Pêche%w!"), + "You found the key to the&%gKakariko Shooting Gallery%w!", + "Du erhältst den %rSchlüssel%w&zur %gSchießbude von Kakariko%w!", + "Vous obtenez la %rClé %w du %gStand de&Tir de Cocorico%w!"), + GIMESSAGE(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, "You found the key to&%gDampe's Hut%w!", + "Du erhältst den %rSchlüssel%w&zur %gHütte des Totengräbers%w!", + "Vous obtenez la %rClé %wde la %gCabane&d'Igor%w!"), + GIMESSAGE(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&%gTalon's House%w!", + "Du erhältst den %rSchlüssel%w&zu %gTalons Haus%w!", + "Vous obtenez la %rClé %wde la %gMaison&de Talon%w!"), + GIMESSAGE(RG_STABLES_KEY, ITEM_KEY_SMALL, "You found the key to the&%gStables%w!", + "Du erhältst den %rSchlüssel%w&zu den %gStällen%w!", "Vous obtenez la %rClé %wdes %gÉcuries%w!"), + GIMESSAGE(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBack Tower%w!", + "Du erhältst den %rSchlüssel%w&zum %gLon Lon-Turm%w!", "Vous obtenez la %rClé %wdu %gSilo%w!"), + GIMESSAGE(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, "You found the key to the&%gHylia Laboratory%w!", + "Du erhältst den %rSchlüssel%w&zum %gHylia-Labor%w!", + "Vous obtenez la %rClé %wdu %gLaboratoire&du Lac Hylia%w!"), + GIMESSAGE(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gPond%w!", + "Du erhältst den %rSchlüssel%w&zum %gFischweiher%w!", "Vous obtenez la %rClé %wde l'%gÉtang%w!"), - GIMESSAGE(RG_GERUDO_FORTRESS_KEY_RING, ITEM_KEY_SMALL, - "You found a %yThieves Hideout &%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für das %yDiebesversteck%w!", - "Vous obtenez un trousseau de&clés du %yRepaire des Voleurs%w!"), - GIMESSAGE(RG_FOREST_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %gForest Temple &%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %gWaldtempel%w!", - "Vous obtenez un trousseau de&clés du %gTemple de la Forêt%w!"), - GIMESSAGE(RG_FIRE_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %rFire Temple &%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %rFeuertempel%w!", - "Vous obtenez un trousseau de&clés du %rTemple du Feu%w!"), - GIMESSAGE(RG_WATER_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %bWater Temple &%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %bWassertempel%w!", - "Vous obtenez un trousseau de&clés du %bTemple de l'Eau%w!"), - GIMESSAGE(RG_SPIRIT_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %ySpirit Temple &%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %yGeistertempel%w!", - "Vous obtenez un trousseau de&clés du %yTemple de l'Esprit%w!"), - GIMESSAGE(RG_SHADOW_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %pShadow Temple &%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %pSchattentempel%w!", - "Vous obtenez un trousseau de&clés du %pTemple de l'Ombre%w!"), - GIMESSAGE(RG_BOTTOM_OF_THE_WELL_KEY_RING, ITEM_KEY_SMALL, - "You found a %pBottom of the &Well %wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %pGrund des Brunnens%w!", - "Vous obtenez un trousseau de&clés du %pPuits%w!"), - GIMESSAGE(RG_GERUDO_TRAINING_GROUND_KEY_RING, ITEM_KEY_SMALL, - "You found a %yGerudo Training &Grounds %wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für die %yGerudo-Trainingsarena%w!", - "Vous obtenez un trousseau de&clés du %yGymnase Gerudo%w!"), - GIMESSAGE(RG_GANONS_CASTLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %rGanon's Castle &%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für %rGanons Schloß%w!", - "Vous obtenez un trousseau de&clés du %rChâteau de Ganon%w!"), - GIMESSAGE(RG_TREASURE_GAME_KEY_RING, ITEM_KEY_SMALL, - "You found a %rTreasure Chest Game &%wKeyring!", - "!!!", - "!!!"), + GIMESSAGE(RG_GERUDO_FORTRESS_KEY_RING, ITEM_KEY_SMALL, "You found a %yThieves Hideout&%wKeyring!", + "Du erhältst das %rSchlüsselbund%w&des %yDiebesverstecks%w!", + "Vous obtenez le trousseau de&clés du %yRepaire des Voleurs%w!"), + GIMESSAGE(RG_FOREST_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %gForest Temple&%wKeyring!", + "Du erhältst das %rSchlüsselbund%w&des %gWaldtempels%w!", + "Vous obtenez le trousseau de&clés du %gTemple de la Forêt%w!"), + GIMESSAGE(RG_FIRE_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %rFire Temple&%wKeyring!", + "Du erhältst das %rSchlüsselbund%w&des %rFeuertempels%w!", + "Vous obtenez le trousseau de&clés du %rTemple du Feu%w!"), + GIMESSAGE(RG_WATER_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %bWater Temple&%wKeyring!", + "Du erhältst das %rSchlüsselbund%w&des %bWassertempels%w!", + "Vous obtenez le trousseau de&clés du %bTemple de l'Eau%w!"), + GIMESSAGE(RG_SPIRIT_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %ySpirit Temple&%wKeyring!", + "Du erhältst das %rSchlüsselbund%w&des %yGeistertempels%w!", + "Vous obtenez le trousseau de&clés du %yTemple de l'Esprit%w!"), + GIMESSAGE(RG_SHADOW_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %pShadow Temple&%wKeyring!", + "Du erhältst das %rSchlüsselbund%w&des %pSchattentempels%w!", + "Vous obtenez le trousseau de&clés du %pTemple de l'Ombre%w!"), + GIMESSAGE(RG_BOTTOM_OF_THE_WELL_KEY_RING, ITEM_KEY_SMALL, "You found a %pBottom of the&Well %wKeyring!", + "Du erhältst das %rSchlüsselbund%w&vom %pGrund des Brunnens%w!", + "Vous obtenez le trousseau de&clés du %pPuits%w!"), + GIMESSAGE(RG_GERUDO_TRAINING_GROUND_KEY_RING, ITEM_KEY_SMALL, "You found a %yGerudo Training&Ground %wKeyring!", + "Du erhältst das %rSchlüsselbund%w&der %yGerudo-Trainingsarena%w!", + "Vous obtenez le trousseau de&clés du %yGymnase Gerudo%w!"), + GIMESSAGE(RG_GANONS_CASTLE_KEY_RING, ITEM_KEY_SMALL, "You found a %rGanon's Castle&%wKeyring!", + "Du erhältst das %rSchlüsselbund%w&von %rGanons Schloß%w!", + "Vous obtenez le trousseau de&clés du %rChâteau de Ganon%w!"), + GIMESSAGE(RG_TREASURE_GAME_KEY_RING, ITEM_KEY_SMALL, "You found a %rTreasure Chest Game&%wKeyring!", + "Du erhältst das %rSchlüsselbund%w&der %rTruhenlotterie&%w!", + "Vous obtenez le trousseau de&clés du %rJeu de la Chasse au Trésor%w!"), - GIMESSAGE(RG_FOREST_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %gForest Temple &%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für den %gWaldtempel%w!", - "Vous obtenez la %rClé d'or %wdu&%gTemple de la Forêt%w!"), - GIMESSAGE(RG_FIRE_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %rFire Temple &%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für den %rFeuertempel%w!", - "Vous obtenez la %rClé d'or %wdu&%rTemple du Feu%w!"), - GIMESSAGE(RG_WATER_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %bWater Temple &%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für den %bWassertempel%w!", - "Vous obtenez la %rClé d'or %wdu&%bTemple de l'Eau%w!"), - GIMESSAGE(RG_SPIRIT_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %ySpirit Temple &%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für den %yGeistertempel%w!", - "Vous obtenez la %rClé d'or %wdu&%yTemple de l'Esprit%w!"), - GIMESSAGE(RG_SHADOW_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %pShadow Temple &%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für den %pSchattentempel%w!", - "Vous obtenez la %rClé d'or %wdu&%pTemple de l'Ombre%w!"), - GIMESSAGE(RG_GANONS_CASTLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %rGanon's Castle &%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für %rGanons Schloß%w!", - "Vous obtenez la %rClé d'or %wdu&%rChâteau de Ganon%w!"), + GIMESSAGE(RG_FOREST_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %gForest Temple&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&des %gWaldtempels%w!", + "Vous obtenez la %rClé d'or %wdu&%gTemple de la Forêt%w!"), + GIMESSAGE(RG_FIRE_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %rFire Temple&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&des %rFeuertempels%w!", + "Vous obtenez la %rClé d'or %wdu&%rTemple du Feu%w!"), + GIMESSAGE(RG_WATER_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %bWater Temple&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&des %bWassertempels%w!", + "Vous obtenez la %rClé d'or %wdu&%bTemple de l'Eau%w!"), + GIMESSAGE(RG_SPIRIT_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %ySpirit Temple&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&des %yGeistertempels%w!", + "Vous obtenez la %rClé d'or %wdu&%yTemple de l'Esprit%w!"), + GIMESSAGE(RG_SHADOW_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %pShadow Temple&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&des %pSchattentempels%w!", + "Vous obtenez la %rClé d'or %wdu&%pTemple de l'Ombre%w!"), + GIMESSAGE(RG_GANONS_CASTLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %rGanon's Castle&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&von %rGanons Schloß%w!", + "Vous obtenez la %rClé d'or %wdu&%rChâteau de Ganon%w!"), - GIMESSAGE(RG_DEKU_TREE_MAP, ITEM_DUNGEON_MAP, - "You found the %gDeku Tree &%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%gDeku-Baum%w![[typeHint]]", - "Vous obtenez la %rCarte %wde&l'%gArbre Mojo%w![[typeHint]]"), - GIMESSAGE(RG_DODONGOS_CAVERN_MAP, ITEM_DUNGEON_MAP, - "You found the %rDodongo's Cavern &%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für&%rDodongos Höhle%w![[typeHint]]", - "Vous obtenez la %rCarte %wde la&%rCaverne Dodongo%w![[typeHint]]"), - GIMESSAGE(RG_JABU_JABUS_BELLY_MAP, ITEM_DUNGEON_MAP, - "You found the %bJabu Jabu's Belly &%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für&%bJabu-Jabus Bauch%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%bVentre de Jabu-Jabu%w![[typeHint]]"), - GIMESSAGE(RG_FOREST_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %gForest Temple &%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%gWaldtempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%gTemple de la Forêt%w![[typeHint]]"), - GIMESSAGE(RG_FIRE_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %rFire Temple &%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%rFeuertempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%rTemple du Feu%w![[typeHint]]"), - GIMESSAGE(RG_WATER_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %bWater Temple &%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%bWassertempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%bTemple de l'Eau%w![[typeHint]]"), - GIMESSAGE(RG_SPIRIT_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %ySpirit Temple &%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%yGeistertempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%yTemple de l'Esprit%w![[typeHint]]"), - GIMESSAGE(RG_SHADOW_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %pShadow Temple &%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%pSchattentempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%pTemple de l'Ombre%w![[typeHint]]"), - GIMESSAGE(RG_BOTTOM_OF_THE_WELL_MAP, ITEM_DUNGEON_MAP, - "You found the %pBottom of the &Well %wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%pGrund des Brunnens%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%pPuits%w![[typeHint]]"), - GIMESSAGE(RG_ICE_CAVERN_MAP, ITEM_DUNGEON_MAP, - "You found the %cIce Cavern &%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für die&%cEishöhle%w![[typeHint]]", - "Vous obtenez la %rCarte %wde &la %cCaverne Polaire%w![[typeHint]]"), + GIMESSAGE(RG_DEKU_TREE_MAP, ITEM_DUNGEON_MAP, "You found the %gDeku Tree&%wMap![[typeHint]]", + "Du erhältst die %rLabyrinth-&Karte%w des %gDeku-Baumes%w![[typeHint]]", + "Vous obtenez la %rCarte %wde&l'%gArbre Mojo%w![[typeHint]]"), + GIMESSAGE(RG_DODONGOS_CAVERN_MAP, ITEM_DUNGEON_MAP, "You found the %rDodongo's Cavern&%wMap![[typeHint]]", + "Du erhältst die %rLabyrinth-&Karte%w von %rDodongos Höhle%w![[typeHint]]", + "Vous obtenez la %rCarte %wde la&%rCaverne Dodongo%w![[typeHint]]"), + GIMESSAGE(RG_JABU_JABUS_BELLY_MAP, ITEM_DUNGEON_MAP, "You found the %bJabu Jabu's Belly&%wMap![[typeHint]]", + "Du erhältst die %rLabyrinth-&Karte%w von %bJabu-Jabus Bauch%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%bVentre de Jabu-Jabu%w![[typeHint]]"), + GIMESSAGE(RG_FOREST_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %gForest Temple&%wMap![[typeHint]]", + "Du erhältst die %rLabyrinth-&Karte%w des %gWaldtempels%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%gTemple de la Forêt%w![[typeHint]]"), + GIMESSAGE(RG_FIRE_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %rFire Temple&%wMap![[typeHint]]", + "Du erhältst die %rLabyrinth-&Karte%w des %rFeuertempels%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%rTemple du Feu%w![[typeHint]]"), + GIMESSAGE(RG_WATER_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %bWater Temple&%wMap![[typeHint]]", + "Du erhältst die %rLabyrinth-&Karte%w des %bWassertempels%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%bTemple de l'Eau%w![[typeHint]]"), + GIMESSAGE(RG_SPIRIT_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %ySpirit Temple&%wMap![[typeHint]]", + "Du erhältst die %rLabyrinth-&Karte%w des %yGeistertempels%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%yTemple de l'Esprit%w![[typeHint]]"), + GIMESSAGE(RG_SHADOW_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %pShadow Temple&%wMap![[typeHint]]", + "Du erhältst die %rLabyrinth-&Karte%w des %pSchattentempels%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%pTemple de l'Ombre%w![[typeHint]]"), + GIMESSAGE(RG_BOTTOM_OF_THE_WELL_MAP, ITEM_DUNGEON_MAP, "You found the %pBottom of the&Well %wMap![[typeHint]]", + "Du erhältst die %rLabyrinth-&Karte%w vom %pGrund des Brunnens%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%pPuits%w![[typeHint]]"), + GIMESSAGE(RG_ICE_CAVERN_MAP, ITEM_DUNGEON_MAP, "You found the %cIce Cavern&%wMap![[typeHint]]", + "Du erhältst die %rLabyrinth-&Karte%w der %cEishöhle%w![[typeHint]]", + "Vous obtenez la %rCarte %wde&la %cCaverne Polaire%w![[typeHint]]"), - GIMESSAGE(RG_DEKU_TREE_COMPASS, ITEM_COMPASS, - "You found the %gDeku Tree &%wCompass!", - "Du erhältst den %rKompaß%w für den&%gDeku-Baum%w!", - "Vous obtenez la %rBoussole %wde&l'%gArbre Mojo%w!"), - GIMESSAGE(RG_DODONGOS_CAVERN_COMPASS, ITEM_COMPASS, - "You found the %rDodongo's Cavern &%wCompass!", - "Du erhältst den %rKompaß%w für&%rDodongos Höhle%w!", - "Vous obtenez la %rBoussole %wde la&%rCaverne Dodongo%w!"), - GIMESSAGE(RG_JABU_JABUS_BELLY_COMPASS, ITEM_COMPASS, - "You found the %bJabu Jabu's Belly &%wCompass!", - "Du erhältst den %rKompaß%w für den&%bJabu-Jabus Bauch%w!", - "Vous obtenez la %rBoussole %wdu &%bVentre de Jabu-Jabu%w!"), - GIMESSAGE(RG_FOREST_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %gForest Temple &%wCompass!", - "Du erhältst den %rKompaß%w für den&%gWaldtempel%w!", - "Vous obtenez la %rBoussole %wdu &%gTemple de la Forêt%w!"), - GIMESSAGE(RG_FIRE_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %rFire Temple &%wCompass!", - "Du erhältst den %rKompaß%w für den&%rFeuertempel%w!", - "Vous obtenez la %rBoussole %wdu &%rTemple du Feu%w!"), - GIMESSAGE(RG_WATER_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %bWater Temple &%wCompass!", - "Du erhältst den %rKompaß%w für den&%bWassertempel%w!", - "Vous obtenez la %rBoussole %wdu &%bTemple de l'Eau%w!"), - GIMESSAGE(RG_SPIRIT_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %ySpirit Temple &%wCompass!", - "Du erhältst den %rKompaß%w für den&%yGeistertempel%w!", - "Vous obtenez la %rBoussole %wdu &%yTemple de l'Esprit%w!"), - GIMESSAGE(RG_SHADOW_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %pShadow Temple &%wCompass!", - "Du erhältst den %rKompaß%w für den&%pSchattentempel%w!", - "Vous obtenez la %rBoussole %wdu &%pTemple de l'Ombre%w!"), - GIMESSAGE(RG_BOTTOM_OF_THE_WELL_COMPASS, ITEM_COMPASS, - "You found the %pBottom of the &Well %wCompass!", - "Du erhältst den %rKompaß%w für den&%pGrund des Brunnens%w!", - "Vous obtenez la %rBoussole %wdu &%pPuits%w!"), - GIMESSAGE(RG_ICE_CAVERN_COMPASS, ITEM_COMPASS, - "You found the %cIce Cavern &%wCompass!", - "Du erhältst den %rKompaß%w für die&%cEishöhle%w!", - "Vous obtenez la %rBoussole %wde &la %cCaverne Polaire%w!"), + GIMESSAGE(RG_DEKU_TREE_COMPASS, ITEM_COMPASS, "You found the %gDeku Tree&%wCompass!", + "Du erhältst den %rKompaß%w des&%gDeku-Baumes%w!", + "Vous obtenez la %rBoussole %wde&l'%gArbre Mojo%w!"), + GIMESSAGE(RG_DODONGOS_CAVERN_COMPASS, ITEM_COMPASS, "You found the %rDodongo's Cavern&%wCompass!", + "Du erhältst den %rKompaß%w von&%rDodongos Höhle%w!", + "Vous obtenez la %rBoussole %wde la&%rCaverne Dodongo%w!"), + GIMESSAGE(RG_JABU_JABUS_BELLY_COMPASS, ITEM_COMPASS, "You found the %bJabu Jabu's Belly&%wCompass!", + "Du erhältst den %rKompaß%w von&%bJabu-Jabus Bauch%w!", + "Vous obtenez la %rBoussole %wdu&%bVentre de Jabu-Jabu%w!"), + GIMESSAGE(RG_FOREST_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %gForest Temple&%wCompass!", + "Du erhältst den %rKompaß%w des&%gWaldtempels%w!", + "Vous obtenez la %rBoussole %wdu&%gTemple de la Forêt%w!"), + GIMESSAGE(RG_FIRE_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %rFire Temple&%wCompass!", + "Du erhältst den %rKompaß%w des&%rFeuertempels%w!", + "Vous obtenez la %rBoussole %wdu&%rTemple du Feu%w!"), + GIMESSAGE(RG_WATER_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %bWater Temple&%wCompass!", + "Du erhältst den %rKompaß%w des&%bWassertempels%w!", + "Vous obtenez la %rBoussole %wdu&%bTemple de l'Eau%w!"), + GIMESSAGE(RG_SPIRIT_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %ySpirit Temple&%wCompass!", + "Du erhältst den %rKompaß%w des&%yGeistertempels%w!", + "Vous obtenez la %rBoussole %wdu&%yTemple de l'Esprit%w!"), + GIMESSAGE(RG_SHADOW_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %pShadow Temple&%wCompass!", + "Du erhältst den %rKompaß%w des&%pSchattentempels%w!", + "Vous obtenez la %rBoussole %wdu&%pTemple de l'Ombre%w!"), + GIMESSAGE(RG_BOTTOM_OF_THE_WELL_COMPASS, ITEM_COMPASS, "You found the %pBottom of the&Well %wCompass!", + "Du erhältst den %rKompaß%w vom&%pGrund des Brunnens%w!", + "Vous obtenez la %rBoussole %wdu&%pPuits%w!"), + GIMESSAGE(RG_ICE_CAVERN_COMPASS, ITEM_COMPASS, "You found the %cIce Cavern&%wCompass!", + "Du erhältst den %rKompaß%w der&%cEishöhle%w!", + "Vous obtenez la %rBoussole %wde&la %cCaverne Polaire%w!"), GIMESSAGE(RG_MAGIC_BEAN_PACK, ITEM_BEAN, - "You got a %rPack of Magic Beans%w!&Find a suitable spot for a garden&and plant them. Then, wait for&something fun to happen!", - "Du erhältst eine %rPackung&Wundererbsen%w! Suche nach einer&Stelle um sie einzupflanzen.&Warte ab, was passiert!", - "Vous obtenez un %rPaquet de&Haricots Magiques%w! Trouvez&un endroit approprié pour un&jardin et plantez-les.^Attendez ensuite que quelque&chose d'amusant se produise!"), + "You got a %rPack of Magic Beans%w!&Find a suitable spot for a garden&and plant them. Then, wait " + "for&something fun to happen!", + "Du erhältst eine %rPackung&Wundererbsen%w! Suche nach einer&Stelle um sie einzupflanzen.&Warte ab, " + "was passiert!", + "Vous obtenez un %rPaquet de&Haricots Magiques%w! Trouvez&un endroit approprié pour un&jardin et " + "plantez-les.^Attendez ensuite que quelque&chose d'amusant se produise!"), GIMESSAGE(RG_TYCOON_WALLET, ITEM_WALLET_GIANT, - "You got a %rTycoon's Wallet%w!&It's gigantic! Now you can carry&up to %y999 rupees%w!", - "Du erhältst die %rGoldene&Geldbörse%w! Die größte aller&Geldbörsen! Jetzt kannst Du bis&zu %y999 Rubine%w mit Dir führen!", - "Vous obtenez la %rBourse de Magnat%w!&Elle peut contenir jusqu'à %y999 rubis%w!&C'est gigantesque!"), + "You got a %rTycoon's Wallet%w!&It's gigantic! Now you can carry&up to %y999 rupees%w!", + "Du erhältst die %rGoldene&Geldbörse%w! Die größte aller&Geldbörsen! Jetzt kannst Du bis&zu %y999 " + "Rubine%w mit Dir führen!", + "Vous obtenez la %rBourse de Magnat%w!&Elle peut contenir jusqu'à %y999 rubis%w!&C'est gigantesque!"), GIMESSAGE(RG_CHILD_WALLET, ITEM_WALLET_ADULT, - "You got a %rChild's Wallet%w!&Now you can carry&up to %y99 rupees%w!", - "Du erhältst die %rKindergeldbörse%w!&Jetzt kannst Du bis&zu %y99 Rubine%w mit Dir führen!", - "Vous obtenez la %rPetite Bourse%w!&Elle peut contenir jusqu'à %y99 rubis%w!"), + "You got a %rChild's Wallet%w!&Now you can carry&up to %y99 rupees%w!", + "Du erhältst die %rKindergeldbörse%w!&Jetzt kannst Du bis&zu %y99 Rubine%w mit Dir führen!", + "Vous obtenez la %rPetite Bourse%w!&Elle peut contenir jusqu'à %y99 rubis%w!"), - GIMESSAGE_NO_GERMAN(RG_GOHMA_SOUL, ITEM_BIG_POE, - "You found the soul for %gGohma%w!", - "Vous obtenez l'âme de %gGohma%w!"), - GIMESSAGE_NO_GERMAN(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, - "You found the soul for %rKing&Dodongo%w!", - "Vous obtenez l'âme du %rRoi Dodongo%w!"), - GIMESSAGE_NO_GERMAN(RG_BARINADE_SOUL, ITEM_BIG_POE, - "You found the soul for %bBarinade%w!", - "Vous obtenez l'âme de %bBarinade%w!"), - GIMESSAGE_NO_GERMAN(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, - "You found the soul for %gPhantom&Ganon%w!", - "Vous obtenez l'âme de %gGanon Spectral%w!"), - GIMESSAGE_NO_GERMAN(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, - "You found the soul for %rVolvagia%w!", - "Vous obtenez l'âme de %rVulcania%w!"), - GIMESSAGE_NO_GERMAN(RG_MORPHA_SOUL, ITEM_BIG_POE, - "You found the soul for %bMorpha%w!", - "Vous obtenez l'âme de %bMorpha%w!"), - GIMESSAGE_NO_GERMAN(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, - "You found the soul for %pBongo&Bongo%w!", - "Vous obtenez l'âme de %pBongo Bongo%w!"), - GIMESSAGE_NO_GERMAN(RG_TWINROVA_SOUL, ITEM_BIG_POE, - "You found the soul for %yTwinrova%w!", - "Vous obtenez l'âme du %yDuo Maléfique%w!"), - GIMESSAGE_NO_GERMAN(RG_GANON_SOUL, ITEM_BIG_POE, - "You found the soul for %cGanon%w!", - "Vous obtenez l'âme de %cGanon%w!"), + GIMESSAGE(RG_GOHMA_SOUL, ITEM_BIG_POE, "You found the soul for %gGohma%w!", + "Du hast die Seele von&%gGohma%w gefunden!", "Vous obtenez l'âme de %gGohma%w!"), + GIMESSAGE(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, "You found the soul for %rKing&Dodongo%w!", + "Du hast die Seele von&%rKönig Dodongo%w gefunden!", "Vous obtenez l'âme du %rRoi Dodongo%w!"), + GIMESSAGE(RG_BARINADE_SOUL, ITEM_BIG_POE, "You found the soul for %bBarinade%w!", + "Du hast die Seele von&%bBarinade%w gefunden!", "Vous obtenez l'âme de %bBarinade%w!"), + GIMESSAGE(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %gPhantom&Ganon%w!", + "Du hast die Seele von&%gPhantom-Ganon%w gefunden!", "Vous obtenez l'âme de %gGanon&Spectral%w!"), + GIMESSAGE(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, "You found the soul for %rVolvagia%w!", + "Du hast die Seele von&%rVolvagia%w gefunden!", "Vous obtenez l'âme de %rVolcania%w!"), + GIMESSAGE(RG_MORPHA_SOUL, ITEM_BIG_POE, "You found the soul for %bMorpha%w!", + "Du hast die Seele von&%bMorpha%w gefunden!", "Vous obtenez l'âme de %bMorpha%w!"), + GIMESSAGE(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, "You found the soul for %pBongo&Bongo%w!", + "Du hast die Seele von&%pBongo Bongo%w gefunden!", "Vous obtenez l'âme de %pBongo&Bongo%w!"), + GIMESSAGE(RG_TWINROVA_SOUL, ITEM_BIG_POE, "You found the soul for %yTwinrova%w!", + "Du hast die Seele von&%yTwinrova%w gefunden!", "Vous obtenez l'âme du %yDuo&Maléfique%w!"), + GIMESSAGE(RG_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %cGanon%w!", + "Du hast die Seele von&%cGanon%w gefunden!", "Vous obtenez l'âme de %cGanon%w!"), GIMESSAGE(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, - "You got the %b\x9f%r button for the&Ocarina%w! You can now use it&while playing songs!", - "Der %b\x9f%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous trouvez la %rtouche %b\x9f%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "You got the %b\x9f%r button for the&Ocarina%w! You can now use it&while playing songs!", + "Der %b\x9f%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", + "Vous obtenez la %rtouche %b\x9f%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en " + "jouez!"), GIMESSAGE(RG_OCARINA_C_LEFT_BUTTON, ITEM_OCARINA_TIME, - "You got the %y\xa7%r button for the&Ocarina%w! You can now use it&while playing songs!", - "Der %y\xa7%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous trouvez la %rtouche %y\xa7%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "You got the %y\xa7%r button for the&Ocarina%w! You can now use it&while playing songs!", + "Der %y\xa7%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", + "Vous obtenez la %rtouche %y\xa7%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en " + "jouez!"), GIMESSAGE(RG_OCARINA_C_RIGHT_BUTTON, ITEM_OCARINA_TIME, - "You got the %y\xa8%r button for the&Ocarina%w! You can now use it&while playing songs!", - "Der %y\xa8%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous trouvez la %rtouche %y\xa8%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "You got the %y\xa8%r button for the&Ocarina%w! You can now use it&while playing songs!", + "Der %y\xa8%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", + "Vous obtenez la %rtouche %y\xa8%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en " + "jouez!"), GIMESSAGE(RG_OCARINA_C_UP_BUTTON, ITEM_OCARINA_TIME, - "You got the %y\xa5%r button for the&Ocarina%w! You can now use it&while playing songs!", - "Der %y\xa5%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous trouvez la %rtouche %y\xa5%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "You got the %y\xa5%r button for the&Ocarina%w! You can now use it&while playing songs!", + "Der %y\xa5%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", + "Vous obtenez la %rtouche %y\xa5%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en " + "jouez!"), GIMESSAGE(RG_OCARINA_C_DOWN_BUTTON, ITEM_OCARINA_TIME, - "You got the %y\xa6%r button for the&Ocarina%w! You can now use it&while playing songs!", - "Der %y\xa6%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous trouvez la %rtouche %y\xa6%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), - - GIMESSAGE_NO_GERMAN(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, - "You got the %rBronze Scale%w!&The power of buoyancy is yours!", - "Vous avez obtenu l'%rÉcaille de Bronze%w!&Le pouvoir de la flottabilité est à vous!"), - GIMESSAGE_NO_GERMAN(RG_FISHING_POLE, ITEM_FISHING_POLE, - "You found a lost %rFishing Pole%w!&Time to hit the pond!", - "Vous avez trouvé une %rCanne à pêche%w perdue!&Il est temps d'aller à l'étang!"), - GIMESSAGE_NO_GERMAN(RG_BOMBCHU_BAG, ITEM_BOMBCHU, - "You found the %rBombchu Bag%w!", - "!!!"), - GIMESSAGE_NO_GERMAN(RG_BOMB_BAG_INF, ITEM_BOMB_BAG_40, - "You got an %rInfinite Bomb Bag%w!&Now you have %yinfinite bombs%w!", - "Vous avez obtenu un %rSac à bombes à l'infini%w!&Vous avez maintenant des %ybombes à l'infini%w!"), - GIMESSAGE_NO_GERMAN(RG_QUIVER_INF, ITEM_QUIVER_50, - "You got an %rInfinite Quiver%w!&Now you have %yinfinite arrows%w!", - "Vous avez obtenu un %rCarquois à l'infini%w!&Vous avez maintenant des %yflèches à l'infini%w!"), - GIMESSAGE_NO_GERMAN(RG_BULLET_BAG_INF, ITEM_BULLET_BAG_50, - "You got an %rInfinite Bullet Bag%w!&Now you have %yinfinite&slingshot seeds%w!", - "Vous avez obtenu un %rSac de Graine à l'infini%w!&Vous avez maintenant des %ygraines de lance-pierres à l'infini%w!"), - GIMESSAGE_NO_GERMAN(RG_STICK_UPGRADE_INF, ITEM_STICK, - "You now have %yinfinite%w %rDeku Sticks%w!", - "Vous avez maintenant des %yBâtons Mojo à l'infini%w!"), - GIMESSAGE_NO_GERMAN(RG_NUT_UPGRADE_INF, ITEM_NUT, - "You now have %yinfinite%w %rDeku Nuts%w!", - "Vous avez maintenant des %yNoix Mojo à l'infini%w!"), - GIMESSAGE_NO_GERMAN(RG_MAGIC_INF, ITEM_MAGIC_LARGE, - "You now have %yinfinite%w %rMagic%w!", - "Vous avez maintenant de la %ymagie à l'infini%w!"), - GIMESSAGE_NO_GERMAN(RG_BOMBCHU_INF, ITEM_BOMBCHU, - "You now have %yinfinite%w %rBombchus%w!", - "Vous avez maintenant des %Missiles Teigneux à l'infini%w!"), - GIMESSAGE_NO_GERMAN(RG_WALLET_INF, ITEM_WALLET_GIANT, - "You now have %yinfinite%w %rmoney%w!", - "Vous avez maintenant de l'%yargent à l'infini%w!"), - GIMESSAGE_NO_GERMAN(RG_SKELETON_KEY, ITEM_KEY_SMALL, - "You found the %rSkeleton Key%w!", - "Vous avez trouvé la %rClé Squelette%w!"), - GIMESSAGE_NO_GERMAN(RG_DEKU_STICK_BAG, ITEM_STICK, - "You found the %rDeku Stick Bag%w!&You can now hold deku sticks!", - "Vous avez trouvé le %rSac de Bâtons Mojo%w!&Vous pouvez maintenant porter des Bâtons Mojo!"), - GIMESSAGE_NO_GERMAN(RG_DEKU_NUT_BAG, ITEM_NUT, - "You found the %rDeku Nut Bag%w!&You can now hold deku nuts!", - "Vous avez trouvé le %rSac de Noix Mojo%w!&Vous pouvez maintenant porter des Noix Mojo!"), - }}; - CreateGetItemMessages(&getItemMessages); + "You got the %y\xa6%r button for the&Ocarina%w! You can now use it&while playing songs!", + "Der %y\xa6%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", + "Vous obtenez la %rtouche %y\xa6%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en " + "jouez!"), + + GIMESSAGE(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, "You got the %rBronze Scale%w!&The power of buoyancy is yours!", + "Du hast die %rBronzene Schuppe%w&erhalten! Die Fähigkeit zu&Schwimmen ist nun dein!", + "Vous obtenez l'%rÉcaille de Bronze%w!&Le pouvoir de la flottabilité est&à vous!"), + GIMESSAGE(RG_FISHING_POLE, ITEM_FISHING_POLE, "You found a lost %rFishing Pole%w!&Time to hit the pond!", + "Du hast eine verlorene %rAngelrute%w&gefunden!&Zeit, im Teich&zu angeln!", + "Vous obtenez une %rCanne à pêche%w&perdue!&Il est temps d'aller à %gl'étang%w!"), + GIMESSAGE(RG_BOMBCHU_BAG, ITEM_BOMBCHU, "You found the %rBombchu Bag%w!", + "Du hast die %rKrabbelminentasche%w&gefunden!", "Vous obtenez un %rSac de Missiles&Teigneux%w!"), + GIMESSAGE( + RG_BOMB_BAG_INF, ITEM_BOMB_BAG_40, "You got an %rInfinite Bomb Bag%w!&Now you have %yinfinite bombs%w!", + "Du hast die %rUnendliche Bombentasche%w&gefunden! Nun hast Du &%yunendlich viele Bomben%w!", + "Vous obtenez un %rSac de Bombes&sans fond%w!&Vous avez maintenant des %ybombes&en quantité illimitée%w!"), + GIMESSAGE(RG_QUIVER_INF, ITEM_QUIVER_50, "You got an %rInfinite Quiver%w!&Now you have %yinfinite arrows%w!", + "Du hast den %rUnendlichen Köcher%w&gefunden! Nun hast Du &%yunendlich viele Pfeile%w!", + "Vous obtenez un %rCarquois Infini%w!&Vous avez maintenant des %yflèches&de manière illimitée%w!"), + GIMESSAGE(RG_BULLET_BAG_INF, ITEM_BULLET_BAG_50, + "You got an %rInfinite Bullet Bag%w!&Now you have %yinfinite&slingshot seeds%w!", + "Du hast die %rUnendliche Munitionstasche%w&gefunden! Nun hast Du &%yunendlich viele Deku-Kerne%w!", + "Vous obtenez un %rSac de Graines&sans fond%w!&Vous avez maintenant des %ygraines&de lance-pierres à " + "l'infini%w!"), + GIMESSAGE(RG_STICK_UPGRADE_INF, ITEM_STICK, "You now have %yinfinite%w %rDeku Sticks%w!", + "Du hast nun %yrunendlich viele%w %rDeku-Stäbe%w!", + "Vous avez maintenant des %yBâtons&Mojo de manière illimitée%w!"), + GIMESSAGE(RG_NUT_UPGRADE_INF, ITEM_NUT, "You now have %yinfinite%w %rDeku Nuts%w!", + "Du hast nun %yunendlich viele%w %rDeku-Nüsse%w!", + "Vous avez maintenant des %yNoix&Mojo de manière illimitée%w!"), + GIMESSAGE(RG_MAGIC_INF, ITEM_MAGIC_LARGE, "You now have %yinfinite%w %rMagic%w!", + "Du hast nun %yunendlich viel%w %rMagische Kraft%w!", + "Vous avez maintenant une quantité&de %ymagie illimitée%w!"), + GIMESSAGE(RG_BOMBCHU_INF, ITEM_BOMBCHU, "You now have %yinfinite%w %rBombchus%w!", + "Du hast nun %yunendlich viele%w %rKrabbelminen%w!", + "Vous avez maintenant des %yMissiles&Teigneux en quantité illimités%w!"), + GIMESSAGE(RG_WALLET_INF, ITEM_WALLET_GIANT, "You now have %yinfinite%w %rmoney%w!", + "Du hast nun %yunendlich viele%w %rRubine%w!", + "Vous avez maintenant des %yRubis en& quantité illimitée%w!"), + GIMESSAGE(RG_SKELETON_KEY, ITEM_KEY_SMALL, "You found the %rSkeleton Key%w!", + "Du hast den %rSkelettschlüssel%w gefunden!", "Vous avez trouvé la %rClé Squelette%w!"), + GIMESSAGE(RG_DEKU_STICK_BAG, ITEM_STICK, "You found the %rDeku Stick Bag%w!&You can now hold Deku Sticks!", + "Du hast eine %rDeku-Stab-Tasche%w&gefunden! Nun kannst Du &%yDeku-Stäbe%w verwenden!", + "Vous avez trouvé le %rSac de Bâtons&Mojo%w!&Vous pouvez maintenant porter des&Bâtons Mojo!"), + GIMESSAGE(RG_DEKU_NUT_BAG, ITEM_NUT, "You found the %rDeku Nut Bag%w!&You can now hold Deku Nuts!", + "Du hast eine %rDeku-Nuß-Tasche%w&gefunden! Nun kannst Du &%yDeku-Nüsse%w verwenden!", + "Vous avez trouvé le %rSac de Noix& Mojo%w!&Vous pouvez maintenant porter des&Noix Mojo!"), + } }; + CreateGetItemMessages(getItemMessages); CreateRupeeMessages(); CreateTriforcePieceMessages(); CreateNaviRandoMessages(); CreateFireTempleGoronMessages(); } -class ExtendedVanillaTableInvalidItemIdException: public std::exception { - private: +class ExtendedVanillaTableInvalidItemIdException : public std::exception { + private: s16 itemID; - public: - ExtendedVanillaTableInvalidItemIdException(s16 itemID): itemID(itemID) {} - std::string what() { + public: + ExtendedVanillaTableInvalidItemIdException(s16 itemID) : itemID(itemID) { + } + std::string what() { return itemID + " is not a valid ItemID for the extendedVanillaGetItemTable. If you are adding a new" - "item, try adding it to randoGetItemTable instead."; - } + "item, try adding it to randoGetItemTable instead."; + } }; void RandomizerSettingsWindow::InitElement() { @@ -3799,7 +5739,7 @@ void RandomizerSettingsWindow::InitElement() { // (special cases for rando items) void Randomizer_GameplayStats_SetTimestamp(uint16_t item) { - u32 time = GAMEPLAYSTAT_TOTAL_TIME; + u32 time = static_cast(GAMEPLAYSTAT_TOTAL_TIME); // Have items in Link's pocket shown as being obtained at 0.1 seconds if (time == 0) { @@ -3837,36 +5777,38 @@ extern "C" u8 Return_Item_Entry(GetItemEntry itemEntry, u8 returnItem); // used for items that only set a rand inf when obtained std::map randomizerGetToRandInf = { - { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }, - { RG_BRONZE_SCALE, RAND_INF_CAN_SWIM }, - { RG_QUIVER_INF, RAND_INF_HAS_INFINITE_QUIVER }, - { RG_BOMB_BAG_INF, RAND_INF_HAS_INFINITE_BOMB_BAG }, - { RG_BULLET_BAG_INF, RAND_INF_HAS_INFINITE_BULLET_BAG }, - { RG_STICK_UPGRADE_INF, RAND_INF_HAS_INFINITE_STICK_UPGRADE }, - { RG_NUT_UPGRADE_INF, RAND_INF_HAS_INFINITE_NUT_UPGRADE }, - { RG_MAGIC_INF, RAND_INF_HAS_INFINITE_MAGIC_METER }, - { RG_BOMBCHU_INF, RAND_INF_HAS_INFINITE_BOMBCHUS }, - { RG_WALLET_INF, RAND_INF_HAS_INFINITE_MONEY }, - { RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY }, - { RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A }, - { RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP }, - { RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN }, - { RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT }, + { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }, + { RG_BRONZE_SCALE, RAND_INF_CAN_SWIM }, + { RG_QUIVER_INF, RAND_INF_HAS_INFINITE_QUIVER }, + { RG_BOMB_BAG_INF, RAND_INF_HAS_INFINITE_BOMB_BAG }, + { RG_BULLET_BAG_INF, RAND_INF_HAS_INFINITE_BULLET_BAG }, + { RG_STICK_UPGRADE_INF, RAND_INF_HAS_INFINITE_STICK_UPGRADE }, + { RG_NUT_UPGRADE_INF, RAND_INF_HAS_INFINITE_NUT_UPGRADE }, + { RG_MAGIC_INF, RAND_INF_HAS_INFINITE_MAGIC_METER }, + { RG_BOMBCHU_INF, RAND_INF_HAS_INFINITE_BOMBCHUS }, + { RG_WALLET_INF, RAND_INF_HAS_INFINITE_MONEY }, + { RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY }, + { RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A }, + { RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP }, + { RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN }, + { RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT }, { RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT }, - { RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL }, - { RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL }, - { RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL }, - { RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL }, - { RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL }, - { RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL }, - { RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL }, - { RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL }, - { RG_GANON_SOUL, RAND_INF_GANON_SOUL }, + { RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL }, + { RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL }, + { RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL }, + { RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL }, + { RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL }, + { RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL }, + { RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL }, + { RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL }, + { RG_GANON_SOUL, RAND_INF_GANON_SOUL }, }; extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { if (giEntry.modIndex != MOD_RANDOMIZER) { - LUSLOG_WARN("Randomizer_Item_Give was called with a GetItemEntry with a mod index different from MOD_RANDOMIZER (%d)", giEntry.modIndex); + LUSLOG_WARN( + "Randomizer_Item_Give was called with a GetItemEntry with a mod index different from MOD_RANDOMIZER (%d)", + giEntry.modIndex); assert(false); return -1; } @@ -3876,13 +5818,13 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { // Gameplay stats: Update the time the item was obtained Randomizer_GameplayStats_SetTimestamp(item); - //if it's an item that just sets a randomizerInf, set it + // if it's an item that just sets a randomizerInf, set it if (randomizerGetToRandInf.find(item) != randomizerGetToRandInf.end()) { Flags_SetRandomizerInf(randomizerGetToRandInf.find(item)->second); return Return_Item_Entry(giEntry, RG_NONE); } - //bottle items + // bottle items if (item >= RG_BOTTLE_WITH_RED_POTION && item <= RG_BOTTLE_WITH_BIG_POE) { for (u16 i = 0; i < 4; i++) { if (gSaveContext.inventory.items[SLOT_BOTTLE_1 + i] == ITEM_NONE) { @@ -3925,14 +5867,12 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { } } - //dungeon items - if ( - (item >= RG_FOREST_TEMPLE_SMALL_KEY && item <= RG_GANONS_CASTLE_SMALL_KEY) || + // dungeon items + if ((item >= RG_FOREST_TEMPLE_SMALL_KEY && item <= RG_GANONS_CASTLE_SMALL_KEY) || (item >= RG_FOREST_TEMPLE_KEY_RING && item <= RG_GANONS_CASTLE_KEY_RING) || (item >= RG_FOREST_TEMPLE_BOSS_KEY && item <= RG_GANONS_CASTLE_BOSS_KEY) || (item >= RG_DEKU_TREE_MAP && item <= RG_ICE_CAVERN_MAP) || - (item >= RG_DEKU_TREE_COMPASS && item <= RG_ICE_CAVERN_COMPASS) - ) { + (item >= RG_DEKU_TREE_COMPASS && item <= RG_ICE_CAVERN_COMPASS)) { u16 mapIndex = gSaveContext.mapIndex; u8 numOfKeysOnKeyring = 0; switch (item) { @@ -4049,7 +5989,8 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { gSaveContext.inventory.dungeonItems[mapIndex] |= bitmask; return Return_Item_Entry(giEntry, RG_NONE); } else if (item >= RG_GUARD_HOUSE_KEY && item <= RG_FISHING_HOLE_KEY) { - Flags_SetRandomizerInf((RandomizerInf)((int)RAND_INF_GUARD_HOUSE_UNLOCKED + ((item - RG_GUARD_HOUSE_KEY) * 2) + 1)); + Flags_SetRandomizerInf( + (RandomizerInf)((int)RAND_INF_GUARD_HOUSE_UNLOCKED + ((item - RG_GUARD_HOUSE_KEY) * 2) + 1)); return Return_Item_Entry(giEntry, RG_NONE); } @@ -4094,15 +6035,17 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { case RG_GREG_RUPEE: Rupees_ChangeBy(1); Flags_SetRandomizerInf(RAND_INF_GREG_FOUND); - gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_FOUND_GREG] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_FOUND_GREG] = static_cast(GAMEPLAYSTAT_TOTAL_TIME); break; case RG_TRIFORCE_PIECE: gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected++; GameInteractor_SetTriforceHuntPieceGiven(true); // Teleport to credits when goal is reached. - if (gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected == (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1)) { - gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_TRIFORCE_COMPLETED] = GAMEPLAYSTAT_TOTAL_TIME; + if (gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected == + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1)) { + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_TRIFORCE_COMPLETED] = + static_cast(GAMEPLAYSTAT_TOTAL_TIME); gSaveContext.ship.stats.gameComplete = 1; Flags_SetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY); Play_PerformSave(play); @@ -4135,12 +6078,12 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { case RG_DEKU_STICK_BAG: Inventory_ChangeUpgrade(UPG_STICKS, 1); INV_CONTENT(ITEM_STICK) = ITEM_STICK; - AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS); + AMMO(ITEM_STICK) = static_cast(CUR_CAPACITY(UPG_STICKS)); break; case RG_DEKU_NUT_BAG: Inventory_ChangeUpgrade(UPG_NUTS, 1); INV_CONTENT(ITEM_NUT) = ITEM_NUT; - AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS); + AMMO(ITEM_NUT) = static_cast(CUR_CAPACITY(UPG_NUTS)); break; default: LUSLOG_WARN("Randomizer_Item_Give didn't have behaviour specified for getItemId=%d", item); diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 76bde6a4fb..78f48b01c9 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -54,13 +54,19 @@ class Randomizer { CowIdentity IdentifyCow(s32 sceneNum, s32 posX, s32 posZ); PotIdentity IdentifyPot(s32 sceneNum, s32 posX, s32 posZ); FishIdentity IdentifyFish(s32 sceneNum, s32 actorParams); - GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true); - GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, bool checkObtainability = true); + GrassIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge); + CrateIdentity IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ); + SmallCrateIdentity IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ); + GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, + bool checkObtainability = true); + GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, + bool checkObtainability = true); ItemObtainability GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck); ItemObtainability GetItemObtainabilityFromRandomizerGet(RandomizerGet randomizerCheck); CustomMessage GetSheikMessage(s16 scene, u16 originalTextId); CustomMessage GetFishingPondOwnerMessage(u16 originalTextId); - CustomMessage GetMerchantMessage(RandomizerCheck rc, TextIDs textId, TextIDs freeTextId = TEXT_NONE, bool mysterious = false); + CustomMessage GetMerchantMessage(RandomizerCheck rc, TextIDs textId, TextIDs freeTextId = TEXT_NONE, + bool mysterious = false); RandomizerCheck GetCheckFromActor(s16 actorId, s16 sceneNum, s16 actorParams); CustomMessage GetGoronMessage(u16 index); CustomMessage GetMapGetItemMessageWithHint(GetItemEntry itemEntry); @@ -79,4 +85,3 @@ bool GenerateRandomizer(std::string seed = ""); #ifdef __cplusplus } #endif - diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 155b31db12..8295eb6cda 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -2,7 +2,6 @@ #include #include "z64item.h" -#include "randomizer_inf.h" #define MAX_TRICK_NAME_SIZE 50 @@ -13,11 +12,11 @@ // which doesn't exist yet. typedef enum { MOD_NONE, - MOD_RANDOMIZER + MOD_RANDOMIZER, } ModIndex; typedef enum { TABLE_VANILLA = MOD_NONE, - TABLE_RANDOMIZER = MOD_RANDOMIZER + TABLE_RANDOMIZER = MOD_RANDOMIZER, } TableIndex; typedef struct { @@ -184,10 +183,10 @@ typedef enum { LOGIC_GREG, LOGIC_PIECE_OF_HEART, LOGIC_HEART_CONTAINER, - LOGIC_NUTS, + LOGIC_BUY_NUTS, LOGIC_BUY_ARROW, LOGIC_BUY_BOMB, - LOGIC_STICKS, + LOGIC_BUY_STICKS, LOGIC_FISH_ACCESS, LOGIC_BUY_MAGIC_POTION, LOGIC_BUY_BOMBCHUS, @@ -209,11 +208,20 @@ typedef enum { LOGIC_OCARINA_C_UP_BUTTON, LOGIC_OCARINA_C_DOWN_BUTTON, LOGIC_OCARINA_C_LEFT_BUTTON, - LOGIC_OCARINA_C_RIGHT_BUTTON, + LOGIC_OCARINA_C_RIGHT_BUTTON, LOGIC_TRIFORCE_PIECES, LOGIC_MAX } LogicVal; +#define DEFINE_RAND_INF(enum) enum, + +typedef enum { +#include "randomizer_inf.h" + RAND_INF_MAX, +} RandomizerInf; + +#undef DEFINE_RAND_INF + typedef enum { RA_NONE, RA_LINKS_POCKET, @@ -288,12 +296,16 @@ typedef enum { RCTYPE_SONG_LOCATION, // Song locations RCTYPE_BOSS_HEART_OR_OTHER_REWARD, // Boss heart container or lesser dungeon rewards (lens, ice arrow) RCTYPE_POT, // Pots + RCTYPE_CRATE, // Crates + RCTYPE_NLCRATE, // NL Crates + RCTYPE_SMALL_CRATE, // Small crates RCTYPE_DUNGEON_REWARD, // Dungeon rewards (blue warps) RCTYPE_OCARINA, // Ocarina locations RCTYPE_BEEHIVE, // Beehives RCTYPE_FISH, // Fishes RCTYPE_FREESTANDING, // Freestanding rupees and hearts RCTYPE_FAIRY, // Fairies + RCTYPE_GRASS, // Grass } RandomizerCheckType; typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest; @@ -390,6 +402,8 @@ typedef enum { RR_HF_NEAR_KAK_GROTTO, RR_HF_TEKTITE_GROTTO, RR_LAKE_HYLIA, + RR_LH_FROM_SHORTCUT, + RR_LH_FROM_WATER_TEMPLE, RR_LH_FISHING_ISLAND, RR_LH_OWL_FLIGHT, RR_LH_LAB, @@ -404,9 +418,34 @@ typedef enum { RR_GV_FORTRESS_SIDE, RR_GV_CARPENTER_TENT, RR_GV_STORMS_GROTTO, - RR_GERUDO_FORTRESS, + RR_GF_OUTSKIRTS, + RR_GF_NEAR_GROTTO, + RR_GF_OUTSIDE_GTG, + RR_GF_ABOVE_GTG, + RR_GF_BOTTOM_OF_LOWER_VINES, + RR_GF_TOP_OF_LOWER_VINES, + RR_GF_NEAR_GS, + RR_GF_SLOPED_ROOF, + RR_GF_BOTTOM_OF_UPPER_VINES, + RR_GF_TOP_OF_UPPER_VINES, + RR_GF_NEAR_CHEST, + RR_GF_LONG_ROOF, + RR_GF_BELOW_GS, + RR_GF_BELOW_CHEST, + RR_GF_HBA_RANGE, + RR_GF_ABOVE_JAIL, + RR_GF_JAIL_WINDOW, RR_GF_OUTSIDE_GATE, RR_GF_STORMS_GROTTO, + RR_TH_1_TORCH_CELL, + RR_TH_DOUBLE_CELL, + RR_TH_DEAD_END_CELL, + RR_TH_STEEP_SLOPE_CELL, + RR_TH_KITCHEN_CORRIDOR, + RR_TH_KITCHEN_MAIN, + RR_TH_KITCHEN_TOP, + RR_TH_BREAK_ROOM, + RR_TH_BREAK_ROOM_CORRIDOR, RR_WASTELAND_NEAR_FORTRESS, RR_HAUNTED_WASTELAND, RR_WASTELAND_NEAR_COLOSSUS, @@ -495,6 +534,7 @@ typedef enum { RR_DMC_DISTANT_PLATFORM, RR_ZR_FRONT, RR_ZORAS_RIVER, + RR_ZR_FROM_SHORTCUT, RR_ZR_BEHIND_WATERFALL, RR_ZR_OPEN_GROTTO, RR_ZR_FAIRY_GROTTO, @@ -505,6 +545,12 @@ typedef enum { RR_ZD_SHOP, RR_ZD_STORMS_GROTTO, RR_ZORAS_FOUNTAIN, + RR_ZF_ICEBERGS, + RR_ZF_LAKEBED, + RR_ZF_LEDGE, + RR_ZF_HIDDEN_CAVE, + RR_ZF_HIDDEN_LEDGE, + RR_ZF_ROCK, RR_ZF_GREAT_FAIRY_FOUNTAIN, RR_LON_LON_RANCH, RR_LLR_TALONS_HOUSE, @@ -556,6 +602,7 @@ typedef enum { RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, RR_DEKU_TREE_BOSS_ENTRYWAY, + RR_DEKU_TREE_BOSS_EXIT, RR_DEKU_TREE_BOSS_ROOM, RR_DODONGOS_CAVERN_BEGINNING, @@ -603,7 +650,9 @@ typedef enum { RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE, RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE, + RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, + RR_DODONGOS_CAVERN_BOSS_EXIT, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_JABU_JABUS_BELLY_BEGINNING, @@ -632,6 +681,7 @@ typedef enum { RR_JABU_JABUS_BELLY_MQ_EAST_ROOM, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, + RR_JABU_JABUS_BELLY_BOSS_EXIT, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_FOREST_TEMPLE_FIRST_ROOM, @@ -988,7 +1038,6 @@ typedef enum { RR_GANONS_CASTLE_SHADOW_TRIAL, RR_GANONS_CASTLE_SPIRIT_TRIAL, RR_GANONS_CASTLE_LIGHT_TRIAL, - RR_GANONS_CASTLE_TOWER, RR_GANONS_CASTLE_MQ_LOBBY, RR_GANONS_CASTLE_MQ_MAIN, @@ -1017,6 +1066,7 @@ typedef enum { RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_BACK, RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_FINAL_ROOM, + RR_GANONS_TOWER_ENTRYWAY, RR_GANONS_TOWER_FLOOR_1, RR_GANONS_TOWER_FLOOR_2, RR_GANONS_TOWER_FLOOR_3, @@ -1368,13 +1418,13 @@ typedef enum { RC_GF_CHEST, RC_GF_HBA_1000_POINTS, RC_GF_HBA_1500_POINTS, - RC_GF_GERUDO_MEMBERSHIP_CARD, - RC_GF_NORTH_F1_CARPENTER, - RC_GF_NORTH_F2_CARPENTER, - RC_GF_SOUTH_F1_CARPENTER, - RC_GF_SOUTH_F2_CARPENTER, + RC_TH_FREED_CARPENTERS, + RC_TH_1_TORCH_CARPENTER, + RC_TH_DEAD_END_CARPENTER, + RC_TH_DOUBLE_CELL_CARPENTER, + RC_TH_STEEP_SLOPE_CARPENTER, RC_GF_GS_TOP_FLOOR, - RC_GF_GS_ARCHERY_RANGE, + RC_GF_HBA_RANGE_GS, RC_HIDEOUT_JAIL_GUARD_1_TORCH, RC_HIDEOUT_JAIL_GUARD_2_TORCHES, RC_HIDEOUT_JAIL_GUARD_3_TORCHES, @@ -1792,22 +1842,22 @@ typedef enum { RC_KF_TWINS_HOUSE_POT_2, RC_KF_BROTHERS_HOUSE_POT_1, RC_KF_BROTHERS_HOUSE_POT_2, - RC_GF_BREAK_ROOM_POT_1, - RC_GF_BREAK_ROOM_POT_2, - RC_GF_KITCHEN_POT_1, - RC_GF_KITCHEN_POT_2, - RC_GF_NORTH_F1_CARPENTER_POT_1, - RC_GF_NORTH_F1_CARPENTER_POT_2, - RC_GF_NORTH_F1_CARPENTER_POT_3, - RC_GF_NORTH_F2_CARPENTER_POT_1, - RC_GF_NORTH_F2_CARPENTER_POT_2, - RC_GF_SOUTH_F1_CARPENTER_POT_1, - RC_GF_SOUTH_F1_CARPENTER_POT_2, - RC_GF_SOUTH_F1_CARPENTER_POT_3, - RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, - RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, - RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, - RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, + RC_TH_BREAK_ROOM_FRONT_POT, + RC_TH_BREAK_ROOM_BACK_POT, + RC_TH_KITCHEN_POT_1, + RC_TH_KITCHEN_POT_2, + RC_TH_1_TORCH_CELL_RIGHT_POT, + RC_TH_1_TORCH_CELL_MID_POT, + RC_TH_1_TORCH_CELL_LEFT_POT, + RC_TH_STEEP_SLOPE_RIGHT_POT, + RC_TH_STEEP_SLOPE_LEFT_POT, + RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, + RC_TH_NEAR_DOUBLE_CELL_MID_POT, + RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, + RC_TH_RIGHTMOST_JAILED_POT, + RC_TH_RIGHT_MIDDLE_JAILED_POT, + RC_TH_LEFT_MIDDLE_JAILED_POT, + RC_TH_LEFTMOST_JAILED_POT, RC_WASTELAND_NEAR_GS_POT_1, RC_WASTELAND_NEAR_GS_POT_2, RC_WASTELAND_NEAR_GS_POT_3, @@ -2333,6 +2383,268 @@ typedef enum { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, // End Pots + // Overworld Crates + RC_GV_FREESTANDING_POH_CRATE, + RC_GV_NEAR_COW_CRATE, + RC_GV_CRATE_BRIDGE_1, + RC_GV_CRATE_BRIDGE_2, + RC_GV_CRATE_BRIDGE_3, + RC_GV_CRATE_BRIDGE_4, + RC_GF_ABOVE_JAIL_CRATE, + RC_GF_SOUTHMOST_CENTER_CRATE, + RC_GF_MID_SOUTH_CENTER_CRATE, + RC_GF_MID_NORTH_CENTER_CRATE, + RR_GF_NORTHMOST_CENTER_CRATE, + RC_GF_OUTSKIRTS_NE_CRATE, + RC_GF_OUTSKIRTS_NW_CRATE, + RC_GF_HBA_RANGE_CRATE_1, + RC_GF_HBA_RANGE_CRATE_2, + RC_GF_HBA_RANGE_CRATE_3, + RC_GF_HBA_RANGE_CRATE_4, + RC_GF_HBA_RANGE_CRATE_5, + RC_GF_HBA_RANGE_CRATE_6, + RC_GF_HBA_RANGE_CRATE_7, + RC_GF_HBA_CANOPY_EAST_CRATE, + RC_GF_HBA_CANOPY_WEST_CRATE, + RC_GF_NORTH_TARGET_EAST_CRATE, + RC_GF_NORTH_TARGET_WEST_CRATE, + RC_GF_NORTH_TARGET_CHILD_CRATE, + RC_GF_SOUTH_TARGET_EAST_CRATE, + RC_GF_SOUTH_TARGET_WEST_CRATE, + RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE, + RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE, + RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, + RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, + RC_TH_KITCHEN_CRATE, + RC_TH_BREAK_HALLWAY_OUTER_CRATE, + RC_TH_BREAK_HALLWAY_INNER_CRATE, + RC_TH_BREAK_ROOM_RIGHT_CRATE, + RC_TH_BREAK_ROOM_LEFT_CRATE, + RC_TH_1_TORCH_CELL_CRATE, + RC_TH_DEAD_END_CELL_CRATE, + RC_TH_DOUBLE_CELL_LEFT_CRATE, + RC_TH_DOUBLE_CELL_RIGHT_CRATE, + RC_HW_BEFORE_QUICKSAND_CRATE, + RC_HW_AFTER_QUICKSAND_CRATE_1, + RC_HW_AFTER_QUICKSAND_CRATE_2, + RC_HW_AFTER_QUICKSAND_CRATE_3, + RC_HW_NEAR_COLOSSUS_CRATE, + RC_MK_NEAR_BAZAAR_CRATE_1, + RC_MK_NEAR_BAZAAR_CRATE_2, + RC_MK_SHOOTING_GALLERY_CRATE_1, + RC_MK_SHOOTING_GALLERY_CRATE_2, + RC_MK_LOST_DOG_HOUSE_CRATE, + RC_MK_GUARD_HOUSE_CRATE_1, + RC_MK_GUARD_HOUSE_CRATE_2, + RC_MK_GUARD_HOUSE_CRATE_3, + RC_MK_GUARD_HOUSE_CRATE_4, + RC_MK_GUARD_HOUSE_CRATE_5, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, + RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, + RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, + RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, + RC_KAK_NEAR_GY_CHILD_CRATE, + RC_KAK_NEAR_WINDMILL_CHILD_CRATE, + RC_KAK_NEAR_FENCE_CHILD_CRATE, + RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, + RC_KAK_NEAR_BAZAAR_CHILD_CRATE, + RC_GRAVEYARD_CRATE, + RC_GC_MAZE_CRATE, + RC_DMC_CRATE, + RC_LLR_NEAR_TREE_CRATE, + RC_LH_LAB_CRATE, + + // MQ Dungeon Crates + RC_DEKU_TREE_MQ_LOBBY_CRATE, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, + RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, + RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, + + // Dungeon Small Crates + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, + + // MQ Dungeon Small Crates + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, + RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1, + RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, + RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, + RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, + // End Crates + RC_PIERRE, RC_DELIVER_RUTOS_LETTER, RC_MASTER_SWORD_PEDESTAL, @@ -2825,7 +3137,7 @@ typedef enum { RC_DMT_FLAG_SUN_FAIRY, RC_DMT_COW_GROTTO_STORMS_FAIRY, RC_LW_SHORTCUT_STORMS_FAIRY, - RC_GF_KITCHEN_SUN_FAIRY, + RC_TH_KITCHEN_SUN_FAIRY, RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, @@ -2848,15 +3160,368 @@ typedef enum { RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + + // Overworld Grass + RC_KF_CHILD_GRASS_1, + RC_KF_CHILD_GRASS_2, + RC_KF_CHILD_GRASS_3, + RC_KF_CHILD_GRASS_4, + RC_KF_CHILD_GRASS_5, + RC_KF_CHILD_GRASS_6, + RC_KF_CHILD_GRASS_7, + RC_KF_CHILD_GRASS_8, + RC_KF_CHILD_GRASS_9, + RC_KF_CHILD_GRASS_10, + RC_KF_CHILD_GRASS_11, + RC_KF_CHILD_GRASS_12, + RC_KF_CHILD_GRASS_MAZE_1, + RC_KF_CHILD_GRASS_MAZE_2, + RC_KF_CHILD_GRASS_MAZE_3, + RC_KF_ADULT_GRASS_1, + RC_KF_ADULT_GRASS_2, + RC_KF_ADULT_GRASS_3, + RC_KF_ADULT_GRASS_4, + RC_KF_ADULT_GRASS_5, + RC_KF_ADULT_GRASS_6, + RC_KF_ADULT_GRASS_7, + RC_KF_ADULT_GRASS_8, + RC_KF_ADULT_GRASS_9, + RC_KF_ADULT_GRASS_10, + RC_KF_ADULT_GRASS_11, + RC_KF_ADULT_GRASS_12, + RC_KF_ADULT_GRASS_13, + RC_KF_ADULT_GRASS_14, + RC_KF_ADULT_GRASS_15, + RC_KF_ADULT_GRASS_16, + RC_KF_ADULT_GRASS_17, + RC_KF_ADULT_GRASS_18, + RC_KF_ADULT_GRASS_19, + RC_KF_ADULT_GRASS_20, + RC_LW_GRASS_1, + RC_LW_GRASS_2, + RC_LW_GRASS_3, + RC_LW_GRASS_4, + RC_LW_GRASS_5, + RC_LW_GRASS_6, + RC_LW_GRASS_7, + RC_LW_GRASS_8, + RC_LW_GRASS_9, + RC_MARKET_GRASS_1, + RC_MARKET_GRASS_2, + RC_MARKET_GRASS_3, + RC_MARKET_GRASS_4, + RC_MARKET_GRASS_5, + RC_MARKET_GRASS_6, + RC_MARKET_GRASS_7, + RC_MARKET_GRASS_8, + RC_HC_GRASS_1, + RC_HC_GRASS_2, + RC_KAK_GRASS_1, + RC_KAK_GRASS_2, + RC_KAK_GRASS_3, + RC_KAK_GRASS_4, + RC_KAK_GRASS_5, + RC_KAK_GRASS_6, + RC_KAK_GRASS_7, + RC_KAK_GRASS_8, + RC_GY_GRASS_1, + RC_GY_GRASS_2, + RC_GY_GRASS_3, + RC_GY_GRASS_4, + RC_GY_GRASS_5, + RC_GY_GRASS_6, + RC_GY_GRASS_7, + RC_GY_GRASS_8, + RC_GY_GRASS_9, + RC_GY_GRASS_10, + RC_GY_GRASS_11, + RC_GY_GRASS_12, + RC_LH_GRASS_1, + RC_LH_GRASS_2, + RC_LH_GRASS_3, + RC_LH_GRASS_4, + RC_LH_GRASS_5, + RC_LH_GRASS_6, + RC_LH_GRASS_7, + RC_LH_GRASS_8, + RC_LH_GRASS_9, + RC_LH_GRASS_10, + RC_LH_GRASS_11, + RC_LH_GRASS_12, + RC_LH_GRASS_13, + RC_LH_GRASS_14, + RC_LH_GRASS_15, + RC_LH_GRASS_16, + RC_LH_GRASS_17, + RC_LH_GRASS_18, + RC_LH_GRASS_19, + RC_LH_GRASS_20, + RC_LH_GRASS_21, + RC_LH_GRASS_22, + RC_LH_GRASS_23, + RC_LH_GRASS_24, + RC_LH_GRASS_25, + RC_LH_GRASS_26, + RC_LH_GRASS_27, + RC_LH_GRASS_28, + RC_LH_GRASS_29, + RC_LH_GRASS_30, + RC_LH_GRASS_31, + RC_LH_GRASS_32, + RC_LH_GRASS_33, + RC_LH_GRASS_34, + RC_LH_GRASS_35, + RC_LH_GRASS_36, + RC_LH_CHILD_GRASS_1, + RC_LH_CHILD_GRASS_2, + RC_LH_CHILD_GRASS_3, + RC_LH_CHILD_GRASS_4, + RC_LH_WARP_PAD_GRASS_1, + RC_LH_WARP_PAD_GRASS_2, + RC_HF_NEAR_KF_GRASS_1, + RC_HF_NEAR_KF_GRASS_2, + RC_HF_NEAR_KF_GRASS_3, + RC_HF_NEAR_KF_GRASS_4, + RC_HF_NEAR_KF_GRASS_5, + RC_HF_NEAR_KF_GRASS_6, + RC_HF_NEAR_KF_GRASS_7, + RC_HF_NEAR_KF_GRASS_8, + RC_HF_NEAR_KF_GRASS_9, + RC_HF_NEAR_KF_GRASS_10, + RC_HF_NEAR_KF_GRASS_11, + RC_HF_NEAR_KF_GRASS_12, + RC_HF_NEAR_MARKET_GRASS_1, + RC_HF_NEAR_MARKET_GRASS_2, + RC_HF_NEAR_MARKET_GRASS_3, + RC_HF_NEAR_MARKET_GRASS_4, + RC_HF_NEAR_MARKET_GRASS_5, + RC_HF_NEAR_MARKET_GRASS_6, + RC_HF_NEAR_MARKET_GRASS_7, + RC_HF_NEAR_MARKET_GRASS_8, + RC_HF_NEAR_MARKET_GRASS_9, + RC_HF_NEAR_MARKET_GRASS_10, + RC_HF_NEAR_MARKET_GRASS_11, + RC_HF_NEAR_MARKET_GRASS_12, + RC_HF_SOUTH_GRASS_1, + RC_HF_SOUTH_GRASS_2, + RC_HF_SOUTH_GRASS_3, + RC_HF_SOUTH_GRASS_4, + RC_HF_SOUTH_GRASS_5, + RC_HF_SOUTH_GRASS_6, + RC_HF_SOUTH_GRASS_7, + RC_HF_SOUTH_GRASS_8, + RC_HF_SOUTH_GRASS_9, + RC_HF_SOUTH_GRASS_10, + RC_HF_SOUTH_GRASS_11, + RC_HF_SOUTH_GRASS_12, + RC_HF_CENTRAL_GRASS_1, + RC_HF_CENTRAL_GRASS_2, + RC_HF_CENTRAL_GRASS_3, + RC_HF_CENTRAL_GRASS_4, + RC_HF_CENTRAL_GRASS_5, + RC_HF_CENTRAL_GRASS_6, + RC_HF_CENTRAL_GRASS_7, + RC_HF_CENTRAL_GRASS_8, + RC_HF_CENTRAL_GRASS_9, + RC_HF_CENTRAL_GRASS_10, + RC_HF_CENTRAL_GRASS_11, + RC_HF_CENTRAL_GRASS_12, + RC_ZR_GRASS_1, + RC_ZR_GRASS_2, + RC_ZR_GRASS_3, + RC_ZR_GRASS_4, + RC_ZR_GRASS_5, + RC_ZR_GRASS_6, + RC_ZR_GRASS_7, + RC_ZR_GRASS_8, + RC_ZR_GRASS_9, + RC_ZR_GRASS_10, + RC_ZR_GRASS_11, + RC_ZR_GRASS_12, + RC_ZR_NEAR_FREESTANDING_POH_GRASS, + // Grotto Grass + RC_KF_STORMS_GROTTO_GRASS_1, + RC_KF_STORMS_GROTTO_GRASS_2, + RC_KF_STORMS_GROTTO_GRASS_3, + RC_KF_STORMS_GROTTO_GRASS_4, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, + RC_HF_NEAR_MARKET_GROTTO_GRASS_1, + RC_HF_NEAR_MARKET_GROTTO_GRASS_2, + RC_HF_NEAR_MARKET_GROTTO_GRASS_3, + RC_HF_NEAR_MARKET_GROTTO_GRASS_4, + RC_HF_OPEN_GROTTO_GRASS_1, + RC_HF_OPEN_GROTTO_GRASS_2, + RC_HF_OPEN_GROTTO_GRASS_3, + RC_HF_OPEN_GROTTO_GRASS_4, + RC_HF_SOUTHEAST_GROTTO_GRASS_1, + RC_HF_SOUTHEAST_GROTTO_GRASS_2, + RC_HF_SOUTHEAST_GROTTO_GRASS_3, + RC_HF_SOUTHEAST_GROTTO_GRASS_4, + RC_HF_COW_GROTTO_GRASS_1, + RC_HF_COW_GROTTO_GRASS_2, + RC_KAK_OPEN_GROTTO_GRASS_1, + RC_KAK_OPEN_GROTTO_GRASS_2, + RC_KAK_OPEN_GROTTO_GRASS_3, + RC_KAK_OPEN_GROTTO_GRASS_4, + RC_DMT_STORMS_GROTTO_GRASS_1, + RC_DMT_STORMS_GROTTO_GRASS_2, + RC_DMT_STORMS_GROTTO_GRASS_3, + RC_DMT_STORMS_GROTTO_GRASS_4, + RC_DMT_COW_GROTTO_GRASS_1, + RC_DMT_COW_GROTTO_GRASS_2, + RC_DMC_UPPER_GROTTO_GRASS_1, + RC_DMC_UPPER_GROTTO_GRASS_2, + RC_DMC_UPPER_GROTTO_GRASS_3, + RC_DMC_UPPER_GROTTO_GRASS_4, + RC_ZR_OPEN_GROTTO_GRASS_1, + RC_ZR_OPEN_GROTTO_GRASS_2, + RC_ZR_OPEN_GROTTO_GRASS_3, + RC_ZR_OPEN_GROTTO_GRASS_4, + // Dungeon Grass + RC_DEKU_TREE_LOBBY_GRASS_1, + RC_DEKU_TREE_LOBBY_GRASS_2, + RC_DEKU_TREE_LOBBY_GRASS_3, + RC_DEKU_TREE_LOBBY_GRASS_4, + RC_DEKU_TREE_LOBBY_GRASS_5, + RC_DEKU_TREE_SLINGSHOT_GRASS_1, + RC_DEKU_TREE_SLINGSHOT_GRASS_2, + RC_DEKU_TREE_SLINGSHOT_GRASS_3, + RC_DEKU_TREE_SLINGSHOT_GRASS_4, + RC_DEKU_TREE_COMPASS_GRASS_1, + RC_DEKU_TREE_COMPASS_GRASS_2, + RC_DEKU_TREE_BASEMENT_GRASS_1, + RC_DEKU_TREE_BASEMENT_GRASS_2, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, + RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, + RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, + RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, + RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, + RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, + RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, + RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, + RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, + RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, + RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, + RC_DODONGOS_CAVERN_BLADE_GRASS, + RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, + RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, + RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, + RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, + RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, + // MQ Dungeon Grass + RC_DEKU_TREE_MQ_LOBBY_GRASS_1, + RC_DEKU_TREE_MQ_LOBBY_GRASS_2, + RC_DEKU_TREE_MQ_LOBBY_GRASS_3, + RC_DEKU_TREE_MQ_LOBBY_GRASS_4, + RC_DEKU_TREE_MQ_LOBBY_GRASS_5, + RC_DEKU_TREE_MQ_LOBBY_GRASS_6, + RC_DEKU_TREE_MQ_LOBBY_GRASS_7, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, + RC_DEKU_TREE_MQ_COMPASS_GRASS_1, + RC_DEKU_TREE_MQ_COMPASS_GRASS_2, + RC_DEKU_TREE_MQ_COMPASS_GRASS_3, + RC_DEKU_TREE_MQ_COMPASS_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, + RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, + RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, + RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, + RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, + RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, + RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, + RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, + RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, + RC_JABU_JABUS_BELLY_MQ_JIGGLIES_GRASS, + RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, + RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, + // Shared Dungeon Grass + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, + // End Grass + RC_MAX } RandomizerCheck; -// Randomizer tricks and glitches (beta) based on knowledge of what is achievable in Ship of Harkinian randomizer, excludes Item manipulation (e.g. RBA/GIM/SRM) and Wrong Warping and Ganon BK Skip -// TODO Fill and alphabetize (area based tricks must have area in name and come alphetized after general tricks) +// Randomizer tricks and glitches (beta) based on knowledge of what is achievable in Ship of Harkinian randomizer, +// excludes Item manipulation (e.g. RBA/GIM/SRM) and Wrong Warping and Ganon BK Skip +// TODO Fill and alphabetize (area based tricks must have area in name and come alphetized after general tricks) // TODO test commented out tricks to see if consistent with console on SoH // TODO add area specific tricks typedef enum { - RT_VISIBLE_COLLISION, // -- general tricks + RT_VISIBLE_COLLISION, // -- general tricks RT_GROTTOS_WITHOUT_AGONY, RT_FEWER_TUNIC_REQUIREMENTS, RT_RUSTED_SWITCHES, @@ -2866,15 +3531,17 @@ typedef enum { RT_HOVER_BOOST_SIMPLE, RT_BOMBCHU_BEEHIVES, RT_BLUE_FIRE_MUD_WALLS, - RT_KF_ADULT_GS, // -- location tricks + RT_OPEN_UNDERWATER_CHEST, + RT_KF_ADULT_GS, // -- location tricks RT_LW_BRIDGE, RT_LW_MIDO_BACKFLIP, RT_LW_GS_BEAN, RT_HC_STORMS_GS, + RT_HF_BIG_POE_WITHOUT_EPONA, RT_KAK_MAN_ON_ROOF, RT_KAK_TOWER_GS, RT_KAK_ADULT_WINDMILL_POH, - RT_KAK_CHILD_WINDMILL_POH, + RT_KAK_CHILD_WINDMILL_POH, RT_KAK_ROOFTOP_GS, RT_GY_POH, RT_GY_CHILD_DAMPE_RACE_POH, @@ -2909,7 +3576,7 @@ typedef enum { RT_LH_LAB_DIVING, RT_LH_WATER_HOOKSHOT, RT_GV_CRATE_HOVERS, - RT_GF_KITCHEN, + RT_PASS_GUARDS_WITH_NOTHING, RT_GF_JUMP, RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON, RT_HW_BUNNY_CROSSING, @@ -2925,14 +3592,16 @@ typedef enum { RT_DEKU_MQ_LOG, RT_DC_SCARECROW_GS, RT_DC_VINES_GS, - RT_DC_STAIRCASE, + RT_DC_STAIRS_WITH_BOW, RT_DC_SLINGSHOT_SKIP, RT_DC_SCRUB_ROOM, RT_DC_JUMP, RT_DC_HAMMER_FLOOR, + RT_DC_MQ_STAIRS_WITH_ONLY_STRENGTH, RT_DC_MQ_CHILD_BOMBS, RT_DC_MQ_CHILD_EYES, RT_DC_MQ_ADULT_EYES, + RT_DC_DODONGO_CHU, RT_JABU_ALCOVE_JUMP_DIVE, RT_JABU_BOSS_HOVER, RT_JABU_NEAR_BOSS_RANGED, @@ -2988,6 +3657,7 @@ typedef enum { RT_WATER_CHILD_DRAGON, RT_WATER_MQ_CENTRAL_PILLAR, RT_WATER_MQ_LOCKED_GS, + RT_WATER_MORPHA_WITHOUT_HOOKSHOT, RT_LENS_SHADOW, RT_LENS_SHADOW_PLATFORM, RT_LENS_BONGO, @@ -3026,14 +3696,14 @@ typedef enum { RT_GTG_FAKE_WALL, RT_LENS_GTG_MQ, RT_GTG_MQ_WITH_HOOKSHOT, - RT_GTG_MQ_WIHTOUT_HOOKSHOT, + RT_GTG_MQ_WITHOUT_HOOKSHOT, RT_LENS_GANON, RT_GANON_SPIRIT_TRIAL_HOOKSHOT, RT_LENS_GANON_MQ, RT_GANON_MQ_FIRE_TRIAL, RT_GANON_MQ_SHADOW_TRIAL, RT_GANON_MQ_LIGHT_TRIAL, - //RT_ROCS_FEATHER --if implemented with main branch + // RT_ROCS_FEATHER --if implemented with main branch RT_FOREST_TEMPLE_BK_SKIP, RT_FIRE_TEMPLE_BK_SKIP, RT_WATER_TEMPLE_BK_SKIP, @@ -3072,6 +3742,8 @@ typedef enum { RT_MEGASIDEHOP_BOMB, RT_MEGASIDEHOP_BOMBCHU, RT_NAVI_DIVE, + RT_BOTTOM_OF_THE_WELL_NAVI_DIVE, + RT_LOST_WOOD_NAVI_DIVE, RT_OCARINA_ITEMS, RT_OCARINA_ITEMS_BOMB, RT_OCARINA_ITEMS_ESS, @@ -3088,11 +3760,11 @@ typedef enum { RT_WEIRDSHOT, RT_WEIRDSHOT_CHU, RT_WEIRDSHOT_ENEMY, - //RT_FW_VOID_WARP_FAST_TEXT, --untested tricks: - //RT_ACTION_SWAP, - //RT_ACTOR_GLITCH, - //RT_ADULT_TRADE_TTG, - RT_TOT_DOT_SKIP_SWORDLESS, //AREA SPECIFIC GLITCHES + // RT_FW_VOID_WARP_FAST_TEXT, --untested tricks: + // RT_ACTION_SWAP, + // RT_ACTOR_GLITCH, + // RT_ADULT_TRADE_TTG, + RT_TOT_DOT_SKIP_SWORDLESS, // AREA SPECIFIC GLITCHES RT_TOT_DOT_SKIP_SWORD, RT_LLR_STEAL_EPONA, RT_KF_POKEY_SKIP, @@ -3108,7 +3780,7 @@ typedef enum { RT_ZF_JABU_ADULT_HOVERBOOT_BOMB, RT_FOREST_TEMPLE_FOUR_POE_SKIP, RT_FOREST_TEMPLE_JUNGLE_JUMP, - //RT_DARUNIA_CUTSCENE, + // RT_DARUNIA_CUTSCENE, RT_BOTTOM_OF_THE_WELL_SKULL_PUSH, RT_GANONS_CASTLE_BARRIER_SKIP_HOVER, RT_GANONS_CASTLE_GOLD_GAUNTLET_SKIP, @@ -3368,6 +4040,8 @@ typedef enum { RG_HOOKSHOT, RG_LONGSHOT, RG_SCARECROW, + + // Overworld keys RG_GUARD_HOUSE_KEY, RG_MARKET_BAZAAR_KEY, RG_MARKET_POTION_SHOP_KEY, @@ -3855,11 +4529,11 @@ typedef enum { RHT_GF_CHEST, RHT_GF_HBA_1000_POINTS, RHT_GF_HBA_1500_POINTS, - RHT_GF_GERUDO_MEMBERSHIP_CARD, - RHT_GF_NORTH_F1_CARPENTER, - RHT_GF_NORTH_F2_CARPENTER, - RHT_GF_SOUTH_F1_CARPENTER, - RHT_GF_SOUTH_F2_CARPENTER, + RHT_TH_FREED_CARPENTERS, + RHT_TH_1_TORCH_CARPENTER, + RHT_TH_DEAD_END_CARPENTER, + RHT_TH_DOUBLE_CELL_CARPENTER, + RHT_TH_STEEP_SLOPE_CARPENTER, RHT_GF_GS_TOP_FLOOR, RHT_GF_GS_ARCHERY_RANGE, RHT_HIDEOUT_JAIL_GUARD_1_TORCH, @@ -4742,7 +5416,22 @@ typedef enum { RHT_MASK_SHOP_HINT, // Shuffle Pots RHT_POT_KOKIRI_FOREST, - RHT_POT_GERUDO_FORTRESS, + RHT_TH_BREAK_ROOM_FRONT_POT, + RHT_TH_BREAK_ROOM_BACK_POT, + RHT_TH_KITCHEN_POT_1, + RHT_TH_KITCHEN_POT_2, + RHT_TH_1_TORCH_CELL_RIGHT_POT, + RHT_TH_1_TORCH_CELL_MID_POT, + RHT_TH_1_TORCH_CELL_LEFT_POT, + RHT_TH_STEEP_SLOPE_RIGHT_POT, + RHT_TH_STEEP_SLOPE_LEFT_POT, + RHT_TH_NEAR_DOUBLE_CELL_RIGHT_POT, + RHT_TH_NEAR_DOUBLE_CELL_MID_POT, + RHT_TH_NEAR_DOUBLE_CELL_LEFT_POT, + RHT_TH_RIGHTMOST_JAILED_POT, + RHT_TH_RIGHT_MIDDLE_JAILED_POT, + RHT_TH_LEFT_MIDDLE_JAILED_POT, + RHT_TH_LEFTMOST_JAILED_POT, RHT_POT_WASTELAND, RHT_POT_MARKET, RHT_POT_KAKARIKO, @@ -4765,6 +5454,29 @@ typedef enum { RHT_POT_GANONS_CASTLE, RHT_POT_BOTTOM_OF_THE_WELL, RHT_POT_ICE_CAVERN, + // Shuffle Crates + RHT_CRATE_GERUDO_VALLEY, + RHT_CRATE_GERUDOS_FORTRESS, + RHT_CRATE_THIEVES_HIDEOUT, + RHT_CRATE_WASTELAND, + RHT_CRATE_MARKET, + RHT_CRATE_DOG_LADY_HOUSE, + RHT_CRATE_MARKET_GUARD_HOUSE, + RHT_CRATE_KAKARIKO_VILLAGE, + RHT_CRATE_GRAVEYARD, + RHT_CRATE_GORON_CITY, + RHT_CRATE_DEATH_MOUNTAIN_CRATER, + RHT_CRATE_LON_LON_RANCH, + RHT_CRATE_LAKESIDE_LABORATORY, + RHT_CRATE_DEKU_TREE, + RHT_CRATE_DODONGOS_CAVERN, + RHT_CRATE_JABU_JABU, + RHT_CRATE_FOREST_TEMPLE, + RHT_CRATE_FIRE_TEMPLE, + RHT_CRATE_WATER_TEMPLE, + RHT_CRATE_SPIRIT_TEMPLE, + RHT_CRATE_SHADOW_TEMPLE, + RHT_CRATE_GERUDO_TRAINING_GROUND, // Ganon Line RHT_GANON_JOKE01, RHT_GANON_JOKE02, @@ -4909,7 +5621,7 @@ typedef enum { RHT_DMT_FLAG_SUN_FAIRY, RHT_DMT_COW_GROTTO_STORMS_FAIRY, RHT_LW_SHORTCUT_STORMS_FAIRY, - RHT_GF_KITCHEN_SUN_FAIRY, + RHT_TH_KITCHEN_SUN_FAIRY, RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, @@ -4929,11 +5641,25 @@ typedef enum { RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + // GRASS + RHT_KF_GRASS, + RHT_LW_GRASS, + RHT_MARKET_GRASS, + RHT_HC_GRASS, + RHT_KAK_GRASS, + RHT_GY_GRASS, + RHT_LH_GRASS, + RHT_HF_GRASS, + RHT_ZR_GRASS, + RHT_GROTTO_GRASS, + RHT_DEKU_TREE_GRASS, + RHT_DODONGOS_CAVERN_GRASS, + RHT_BOTTOM_OF_THE_WELL_GRASS, + RHT_JABU_JABUS_BELLY_GRASS, // MAX - RHT_MAX + RHT_MAX, } RandomizerHintTextKey; - typedef struct { RandomizerGet rgID; RandomizerGet fakeRgID; @@ -5042,16 +5768,16 @@ typedef enum { RSK_STARTING_KOKIRI_SWORD, RSK_STARTING_MASTER_SWORD, RSK_STARTING_ZELDAS_LULLABY, - RSK_STARTING_EPONAS_SONG, - RSK_STARTING_SARIAS_SONG, + RSK_STARTING_EPONAS_SONG, + RSK_STARTING_SARIAS_SONG, RSK_STARTING_SUNS_SONG, RSK_STARTING_SONG_OF_TIME, RSK_STARTING_SONG_OF_STORMS, - RSK_STARTING_MINUET_OF_FOREST, + RSK_STARTING_MINUET_OF_FOREST, RSK_STARTING_BOLERO_OF_FIRE, RSK_STARTING_SERENADE_OF_WATER, - RSK_STARTING_REQUIEM_OF_SPIRIT, - RSK_STARTING_NOCTURNE_OF_SHADOW, + RSK_STARTING_REQUIEM_OF_SPIRIT, + RSK_STARTING_NOCTURNE_OF_SHADOW, RSK_STARTING_PRELUDE_OF_LIGHT, RSK_SHUFFLE_KOKIRI_SWORD, RSK_SHUFFLE_MASTER_SWORD, @@ -5088,6 +5814,7 @@ typedef enum { RSK_SHUFFLE_WEIRD_EGG, RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD, RSK_SHUFFLE_POTS, + RSK_SHUFFLE_CRATES, RSK_SHUFFLE_FROG_SONG_RUPEES, RSK_ITEM_POOL, RSK_ICE_TRAPS, @@ -5130,7 +5857,6 @@ typedef enum { RSK_STARTING_NUTS, RSK_FULL_WALLETS, RSK_SHUFFLE_CHEST_MINIGAME, - RSK_CUCCO_COUNT, RSK_BIG_POE_COUNT, RSK_SKIP_EPONA_RACE, RSK_COMPLETE_MASK_QUEST, @@ -5221,11 +5947,12 @@ typedef enum { RSK_SHUFFLE_FREESTANDING, RSK_SHUFFLE_FAIRIES, RSK_LOCK_OVERWORLD_DOORS, + RSK_SHUFFLE_GRASS, RSK_MAX } RandomizerSettingKey; -//Generic Settings (any binary option can use this) -// off/on +// Generic Settings (any binary option can use this) +// off/on typedef enum { RO_GENERIC_OFF, RO_GENERIC_ON, @@ -5243,54 +5970,54 @@ typedef enum { RO_GENERIC_SKIP, } RandoOptionGenericSkip; -//Closed Forest settings (On, Deku Only, Off) +// Closed Forest settings (On, Deku Only, Off) typedef enum { RO_CLOSED_FOREST_ON, RO_CLOSED_FOREST_DEKU_ONLY, RO_CLOSED_FOREST_OFF, } RandoOptionForest; -//Door of Time settings (closed, song only, open) +// Door of Time settings (closed, song only, open) typedef enum { RO_DOOROFTIME_CLOSED, RO_DOOROFTIME_SONGONLY, RO_DOOROFTIME_OPEN, } RandoOptionDoorOfTime; -//Zora's Fountain settings (closed, closed as child, open) +// Zora's Fountain settings (closed, closed as child, open) typedef enum { RO_ZF_CLOSED, RO_ZF_CLOSED_CHILD, RO_ZF_OPEN, } RandoOptionZorasFountain; -//Sleeping Waterfall settings (closed, open) +// Sleeping Waterfall settings (closed, open) typedef enum { RO_WATERFALL_CLOSED, RO_WATERFALL_OPEN, } RandoOptionSleepingWaterfall; -//Starting Age settings (child, adult, random) +// Starting Age settings (child, adult, random) typedef enum { RO_AGE_CHILD, RO_AGE_ADULT, RO_AGE_RANDOM, } RandoOptionStartingAge; -//Fortress Carpenters settings (normal, fast, free) +// Fortress Carpenters settings (normal, fast, free) typedef enum { RO_GF_CARPENTERS_NORMAL, RO_GF_CARPENTERS_FAST, RO_GF_CARPENTERS_FREE, } RandoOptionGerudoFortress; -//Kakariko Gate settings (closed/open) +// Kakariko Gate settings (closed/open) typedef enum { RO_KAK_GATE_CLOSED, RO_KAK_GATE_OPEN, } RandoOptionKakarikoGate; -//Rainbow Bridge settings (vanilla, always open, stones, medallions, dungeon rewards, dungeons, tokens) +// Rainbow Bridge settings (vanilla, always open, stones, medallions, dungeon rewards, dungeons, tokens) typedef enum { RO_BRIDGE_VANILLA = 0, RO_BRIDGE_ALWAYS_OPEN, @@ -5309,14 +6036,14 @@ typedef enum { RO_BRIDGE_WILDCARD_REWARD, } RandoOptionBridgeRewards; -//Shopsanity settings (off, specific count, random) +// Shopsanity settings (off, specific count, random) typedef enum { RO_SHOPSANITY_OFF, RO_SHOPSANITY_SPECIFIC_COUNT, RO_SHOPSANITY_RANDOM, } RandoOptionShopsanity; -//Shopsanity count settings (0-7 items) +// Shopsanity count settings (0-7 items) typedef enum { RO_SHOPSANITY_COUNT_ZERO_ITEMS, RO_SHOPSANITY_COUNT_ONE_ITEM, @@ -5329,27 +6056,27 @@ typedef enum { RO_SHOPSANITY_COUNT_EIGHT_ITEMS, } RandoOptionShopsanityCount; -//Shopsanity price ranges +// Shopsanity price ranges typedef enum { RO_PRICE_VANILLA, - RO_PRICE_CHEAP_BALANCED, //Balanced random from 0-95, favoring lower numbers - RO_PRICE_BALANCED, //Random from 0-300, favoring lower numbers + RO_PRICE_CHEAP_BALANCED, // Balanced random from 0-95, favoring lower numbers + RO_PRICE_BALANCED, // Random from 0-300, favoring lower numbers RO_PRICE_FIXED, RO_PRICE_RANGE, RO_PRICE_SET_BY_WALLET, } RandoOptionPrices; -//Scrubsanity settings (off, affordable, expensive, random) +// Scrubsanity settings (off, affordable, expensive, random) typedef enum { RO_SCRUBS_OFF, RO_SCRUBS_ONE_TIME_ONLY, RO_SCRUBS_ALL, } RandoOptionScrubsanity; -//Ammo drop settings (on, "on+bombchu", off) +// Ammo drop settings (on, "on+bombchu", off) typedef enum { RO_AMMO_DROPS_OFF, - //RO_AMMO_DROPS_ON_PLUS_BOMBCHU, + // RO_AMMO_DROPS_ON_PLUS_BOMBCHU, RO_AMMO_DROPS_ON, } RandoOptionAmmoDrops; @@ -5359,7 +6086,7 @@ typedef enum { RO_BOSS_SOULS_ON_PLUS_GANON, } RandoOptionBossSouls; -//Fishsanity settings (off, loach only, pond only, grottos only, both) +// Fishsanity settings (off, loach only, pond only, grottos only, both) typedef enum { RO_FISHSANITY_OFF, RO_FISHSANITY_HYRULE_LOACH, @@ -5368,15 +6095,15 @@ typedef enum { RO_FISHSANITY_BOTH } RandoOptionsFishsanity; -//Infinite Upgrades settings (off, progressive, condensed progressive) +// Infinite Upgrades settings (off, progressive, condensed progressive) typedef enum { RO_INF_UPGRADES_OFF, RO_INF_UPGRADES_PROGRESSIVE, RO_INF_UPGRADES_CONDENSED_PROGRESSIVE, } RandoOptionInfiniteUpgrades; -//Any Dungeon Item (start with, vanilla, own dungeon, any dungeon, -//overworld, anywhere) +// Any Dungeon Item (start with, vanilla, own dungeon, any dungeon, +// overworld, anywhere) typedef enum { RO_DUNGEON_ITEM_LOC_STARTWITH, RO_DUNGEON_ITEM_LOC_VANILLA, @@ -5386,7 +6113,7 @@ typedef enum { RO_DUNGEON_ITEM_LOC_ANYWHERE, } RandoOptionDungeonItemLocation; -//Dungeon reward settings +// Dungeon reward settings typedef enum { RO_DUNGEON_REWARDS_VANILLA, RO_DUNGEON_REWARDS_END_OF_DUNGEON, @@ -5395,7 +6122,7 @@ typedef enum { RO_DUNGEON_REWARDS_ANYWHERE, } RandoOptionDungeonRewards; -//Keyring Settings +// Keyring Settings typedef enum { RO_KEYRINGS_OFF, RO_KEYRINGS_RANDOM, @@ -5409,8 +6136,8 @@ typedef enum { RO_KEYRING_FOR_DUNGEON_ON, } RandoOptionKeyringForDungeon; -//Ganon's Boss Key Settings (vanilla, own dungeon, start with, -//overworld, anywhere, 100 GS reward) +// Ganon's Boss Key Settings (vanilla, own dungeon, start with, +// overworld, anywhere, 100 GS reward) typedef enum { RO_GANON_BOSS_KEY_VANILLA, RO_GANON_BOSS_KEY_OWN_DUNGEON, @@ -5425,7 +6152,6 @@ typedef enum { RO_GANON_BOSS_KEY_LACS_DUNGEONS, RO_GANON_BOSS_KEY_LACS_TOKENS, RO_GANON_BOSS_KEY_KAK_TOKENS, - RO_GANON_BOSS_KEY_TRIFORCE_HUNT, } RandoOptionGanonsBossKey; typedef enum { @@ -5444,42 +6170,43 @@ typedef enum { RO_LACS_WILDCARD_REWARD, } RandoOptionLACSRewards; -//Ganon's Trials +// Ganon's Trials typedef enum { RO_GANONS_TRIALS_SKIP, RO_GANONS_TRIALS_SET_NUMBER, RO_GANONS_TRIALS_RANDOM_NUMBER, } RandoOptionGanonsTrials; -//Shuffle Dungeon Entrance Settings (Off, on, plus ganon) +// Shuffle Dungeon Entrance Settings (Off, on, plus ganon) typedef enum { RO_DUNGEON_ENTRANCE_SHUFFLE_OFF, RO_DUNGEON_ENTRANCE_SHUFFLE_ON, RO_DUNGEON_ENTRANCE_SHUFFLE_ON_PLUS_GANON, } RandoOptionDungeonEntranceShuffle; -//Shuffle Boss Room Entrance Settings (Off, Age Restricted, Full) +// Shuffle Boss Room Entrance Settings (Off, Age Restricted, Full) typedef enum { RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF, RO_BOSS_ROOM_ENTRANCE_SHUFFLE_AGE_RESTRICTED, RO_BOSS_ROOM_ENTRANCE_SHUFFLE_FULL, } RandoOptionBossRoomEntranceShuffle; -//Shuffle Interior Entrance Settings (Off, simple, all) +// Shuffle Interior Entrance Settings (Off, simple, all) typedef enum { RO_INTERIOR_ENTRANCE_SHUFFLE_OFF, RO_INTERIOR_ENTRANCE_SHUFFLE_SIMPLE, RO_INTERIOR_ENTRANCE_SHUFFLE_ALL, } RandoOptionInteriorEntranceShuffle; -//Song shuffle Settings (Song locations, Dungeon rewards, anywhere) +// Song shuffle Settings (Song locations, Dungeon rewards, anywhere) typedef enum { + RO_SONG_SHUFFLE_OFF, RO_SONG_SHUFFLE_SONG_LOCATIONS, RO_SONG_SHUFFLE_DUNGEON_REWARDS, RO_SONG_SHUFFLE_ANYWHERE, } RandoOptionSongShuffle; -//Shuffle Merchants Settings (Off, Beans Only, All but Beans, All) +// Shuffle Merchants Settings (Off, Beans Only, All but Beans, All) typedef enum { RO_SHUFFLE_MERCHANTS_OFF, RO_SHUFFLE_MERCHANTS_BEANS_ONLY, @@ -5487,14 +6214,14 @@ typedef enum { RO_SHUFFLE_MERCHANTS_ALL } RandoOptionShuffleMerchants; -//Starting Ocarina Settings (off, fairy) +// Starting Ocarina Settings (off, fairy) typedef enum { RO_STARTING_OCARINA_OFF, RO_STARTING_OCARINA_FAIRY, RO_STARTING_OCARINA_TIME, } RandoOptionStartingOcarina; -//Item Pool Settings +// Item Pool Settings typedef enum { RO_ITEM_POOL_PLENTIFUL, RO_ITEM_POOL_BALANCED, @@ -5502,7 +6229,7 @@ typedef enum { RO_ITEM_POOL_MINIMAL, } RandoOptionItemPool; -//Ice Trap Settings +// Ice Trap Settings typedef enum { RO_ICE_TRAPS_OFF, RO_ICE_TRAPS_NORMAL, @@ -5511,8 +6238,8 @@ typedef enum { RO_ICE_TRAPS_ONSLAUGHT, } RandoOptionIceTraps; -//Gossip Stone Hint Settings (no hints, needs nothing, -//needs mask of truth, needs stone of agony) +// Gossip Stone Hint Settings (no hints, needs nothing, +// needs mask of truth, needs stone of agony) typedef enum { RO_GOSSIP_STONES_NONE, RO_GOSSIP_STONES_NEED_NOTHING, @@ -5520,14 +6247,14 @@ typedef enum { RO_GOSSIP_STONES_NEED_STONE, } RandoOptionGossipStones; -//Hint Clarity Settings (obscure, ambiguous, clear) +// Hint Clarity Settings (obscure, ambiguous, clear) typedef enum { RO_HINT_CLARITY_OBSCURE, RO_HINT_CLARITY_AMBIGUOUS, RO_HINT_CLARITY_CLEAR, } RandoOptionHintClarity; -//Hint Distribution Settings (useless, balanced, strong, very strong) +// Hint Distribution Settings (useless, balanced, strong, very strong) typedef enum { RO_HINT_DIST_USELESS, RO_HINT_DIST_BALANCED, @@ -5535,8 +6262,8 @@ typedef enum { RO_HINT_DIST_VERY_STRONG, } RandoOptionHintDistribution; -//Gerudo Fortress Key Settings (vanilla, any dungeon, overworld, -//anywhere) +// Gerudo Fortress Key Settings (vanilla, any dungeon, overworld, +// anywhere) typedef enum { RO_GERUDO_KEYS_VANILLA, RO_GERUDO_KEYS_ANY_DUNGEON, @@ -5544,7 +6271,7 @@ typedef enum { RO_GERUDO_KEYS_ANYWHERE, } RandoOptionGerudoKeys; -//Tokensanity settings (off, dungeons, overworld, all) +// Tokensanity settings (off, dungeons, overworld, all) typedef enum { RO_TOKENSANITY_OFF, RO_TOKENSANITY_DUNGEONS, @@ -5552,7 +6279,7 @@ typedef enum { RO_TOKENSANITY_ALL, } RandoOptionTokensanity; -//Freestanding Hearts/Rupees settings (off, dungeons, overworld, all) +// Freestanding Hearts/Rupees settings (off, dungeons, overworld, all) typedef enum { RO_SHUFFLE_FREESTANDING_OFF, RO_SHUFFLE_FREESTANDING_DUNGEONS, @@ -5568,7 +6295,23 @@ typedef enum { RO_SHUFFLE_POTS_ALL, } RandoOptionShufflePots; -//Link's Pocket Settings (dungeon reward, advancement, anything, nothing) +// Shuffle Grass settings (off, dungeons, overworld, all) +typedef enum { + RO_SHUFFLE_GRASS_OFF, + RO_SHUFFLE_GRASS_DUNGEONS, + RO_SHUFFLE_GRASS_OVERWORLD, + RO_SHUFFLE_GRASS_ALL, +} RandoOptionShuffleGrass; + +// Shuffle Crates settings (off, dungeons, overworld, all) +typedef enum { + RO_SHUFFLE_CRATES_OFF, + RO_SHUFFLE_CRATES_DUNGEONS, + RO_SHUFFLE_CRATES_OVERWORLD, + RO_SHUFFLE_CRATES_ALL, +} RandoOptionShuffleCrates; + +// Link's Pocket Settings (dungeon reward, advancement, anything, nothing) typedef enum { RO_LINKS_POCKET_DUNGEON_REWARD, RO_LINKS_POCKET_ADVANCEMENT, @@ -5663,14 +6406,34 @@ typedef struct FishIdentity { RandomizerCheck randomizerCheck; } FishIdentity; +typedef struct FairyIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} FairyIdentity; + +typedef struct GrassIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} GrassIdentity; + +typedef struct CrateIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} CrateIdentity; + +typedef struct SmallCrateIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} SmallCrateIdentity; + typedef enum { TRACKER_WINDOW_FLOATING, - TRACKER_WINDOW_WINDOW + TRACKER_WINDOW_WINDOW, } TrackerWindowType; typedef enum { TRACKER_DISPLAY_ALWAYS, - TRACKER_DISPLAY_COMBO_BUTTON + TRACKER_DISPLAY_COMBO_BUTTON, } TrackerDisplayType; typedef enum { @@ -5731,6 +6494,8 @@ typedef enum { RE_STINGER, RE_BIG_OCTO, RE_GERUDO_WARRIOR, + RE_GERUDO_GUARD, + RE_BREAK_ROOM_GUARD, RE_GIBDO, RE_GOHMA, RE_KING_DODONGO, @@ -5753,13 +6518,13 @@ typedef enum { RE_OCTOROK, } RandomizerEnemy; -//RANDOTODO compare child long jumpslash range with adult short +// RANDOTODO compare child long jumpslash range with adult short typedef enum { ED_CLOSE, - //hammer or kokiri sword + // hammer or kokiri sword ED_SHORT_JUMPSLASH, ED_MASTER_SWORD_JUMPSLASH, - //sticks or BGS + // sticks or BGS ED_LONG_JUMPSLASH, ED_BOMB_THROW, ED_BOOMERANG, @@ -5773,7 +6538,7 @@ typedef enum { WL_MID, WL_HIGH, WL_LOW_OR_MID, - WL_HIGH_OR_MID + WL_HIGH_OR_MID, } RandoWaterLevel; #define ENTRANCE_GROTTO_LOAD_START 0x0700 diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index b8d435fd8d..da05ee5081 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -113,23 +113,20 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { (location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) && (location.GetQuest() == RCQUEST_BOTH || location.GetQuest() == RCQUEST_MQ && - ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) == RO_MQ_DUNGEONS_SET_NUMBER && + ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) == + RO_MQ_DUNGEONS_SET_NUMBER && (CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeonCount"), 12) > 0) || // at least one MQ dungeon - CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) == RO_MQ_DUNGEONS_RANDOM_NUMBER)) || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) == + RO_MQ_DUNGEONS_RANDOM_NUMBER)) || location.GetQuest() == RCQUEST_VANILLA && - (CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) != RO_MQ_DUNGEONS_SET_NUMBER || + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) != + RO_MQ_DUNGEONS_SET_NUMBER || CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeonCount"), 12) < 12) // at least one vanilla dungeon ) && - ( - location.GetRCType() != RCTYPE_SHOP || - !( - ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF) || - ( - ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_SPECIFIC_COUNT) && - ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_ZERO_ITEMS) - ) - ) - ) && + (location.GetRCType() != RCTYPE_SHOP || + !(ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF) || + (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_SPECIFIC_COUNT) && + ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_ZERO_ITEMS)))) && (location.GetRCType() != RCTYPE_SCRUB || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), RO_SCRUBS_OFF) != RO_SCRUBS_OFF || location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO || @@ -137,10 +134,13 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE) && // The 3 scrubs that are always randomized (location.GetRCType() != RCTYPE_MERCHANT || - CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_OFF) != RO_SHUFFLE_MERCHANTS_OFF) && + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_OFF) != + RO_SHUFFLE_MERCHANTS_OFF) && (location.GetRCType() != RCTYPE_SONG_LOCATION || - CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_SONG_LOCATIONS) != - RO_SONG_SHUFFLE_SONG_LOCATIONS) && // song locations + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_SONG_LOCATIONS) != + RO_SONG_SHUFFLE_SONG_LOCATIONS && + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_SONG_LOCATIONS) != + RO_SONG_SHUFFLE_OFF)) && // song locations ((location.GetRCType() != RCTYPE_BOSS_HEART_OR_OTHER_REWARD && location.GetRandomizerCheck() != RC_SONG_FROM_IMPA && location.GetRandomizerCheck() != RC_SHEIK_IN_ICE_CAVERN) || @@ -152,27 +152,45 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { (location.GetRCType() != RCTYPE_OCARINA || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), RO_GENERIC_NO)) && // ocarina locations (location.GetRandomizerCheck() != RC_HC_ZELDAS_LETTER) && // don't show until we support shuffling letter - (location.GetRCType() != RCTYPE_GOSSIP_STONE) && // don't show gossip stones (maybe gossipsanity will be a thing eventually?) - (location.GetRCType() != RCTYPE_STATIC_HINT) && // don't show static hints + (location.GetRCType() != + RCTYPE_GOSSIP_STONE) && // don't show gossip stones (maybe gossipsanity will be a thing eventually?) + (location.GetRCType() != RCTYPE_STATIC_HINT) && // don't show static hints (location.GetRCType() != RCTYPE_LINKS_POCKET) && // links pocket can be set to nothing if needed (location.GetRCType() != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them (location.GetRCType() != RCTYPE_SKULL_TOKEN || (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF) == RO_TOKENSANITY_ALL) || - ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF) == RO_TOKENSANITY_OVERWORLD) && + ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF) == + RO_TOKENSANITY_OVERWORLD) && RandomizerCheckObjects::AreaIsOverworld(location.GetArea())) || - ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF) == RO_TOKENSANITY_DUNGEONS) && + ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF) == + RO_TOKENSANITY_DUNGEONS) && RandomizerCheckObjects::AreaIsDungeon(location.GetArea()))) && (location.GetRCType() != RCTYPE_FREESTANDING || - (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == RO_SHUFFLE_FREESTANDING_ALL) || - ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == RO_SHUFFLE_FREESTANDING_OVERWORLD) && + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == + RO_SHUFFLE_FREESTANDING_ALL) || + ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == + RO_SHUFFLE_FREESTANDING_OVERWORLD) && RandomizerCheckObjects::AreaIsOverworld(location.GetArea())) || - ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == RO_SHUFFLE_FREESTANDING_DUNGEONS) && + ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == + RO_SHUFFLE_FREESTANDING_DUNGEONS) && RandomizerCheckObjects::AreaIsDungeon(location.GetArea()))) && - (location.GetRCType() != RCTYPE_BEEHIVE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), RO_GENERIC_NO)) && - (location.GetRCType() != RCTYPE_COW || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_NO)) && - (location.GetRCType() != RCTYPE_POT || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_GENERIC_NO)) && - (location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && + (location.GetRCType() != RCTYPE_BEEHIVE || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_COW || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_POT || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_GRASS || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrass"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_CRATE || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_NLCRATE || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_SMALL_CRATE || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_FISH || + ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && (location.GetRCType() != RCTYPE_ADULT_TRADE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), RO_GENERIC_NO)) && (location.GetRandomizerCheck() != RC_KF_KOKIRI_SWORD_CHEST || @@ -191,7 +209,8 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { CVarGetInteger(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && (location.GetRCType() != RCTYPE_SMALL_KEY || - CVarGetInteger(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && + CVarGetInteger(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != + RO_DUNGEON_ITEM_LOC_VANILLA) && (location.GetRCType() != RCTYPE_BOSS_KEY || CVarGetInteger(CVAR_RANDOMIZER_SETTING("BossKeysanity"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && @@ -214,18 +233,23 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { (location.GetRandomizerCheck() != RC_KAK_100_GOLD_SKULLTULA_REWARD || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_VANILLA) != RO_GANON_BOSS_KEY_KAK_TOKENS) && // 100 skull reward ganon boss key - (location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_GF_GERUDO_MEMBERSHIP_CARD || - (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == RO_GF_CARPENTERS_FREE && - location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_GF_GERUDO_MEMBERSHIP_CARD) || - (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == RO_GF_CARPENTERS_FAST && - ((location.GetRandomizerCheck() == RC_GF_GERUDO_MEMBERSHIP_CARD && + (location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_TH_FREED_CARPENTERS || + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == + RO_GF_CARPENTERS_FREE && + location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_TH_FREED_CARPENTERS) || + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == + RO_GF_CARPENTERS_FAST && + ((location.GetRandomizerCheck() == RC_TH_FREED_CARPENTERS && CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), RO_GENERIC_NO) == RO_GENERIC_YES) || - (location.GetRandomizerCheck() == RC_GF_NORTH_F1_CARPENTER && - CVarGetInteger(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_VANILLA) != RO_GERUDO_KEYS_VANILLA))) || - (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == RO_GF_CARPENTERS_NORMAL && - ((location.GetRandomizerCheck() == RC_GF_GERUDO_MEMBERSHIP_CARD && + (location.GetRandomizerCheck() == RC_TH_1_TORCH_CARPENTER && + CVarGetInteger(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_VANILLA) != + RO_GERUDO_KEYS_VANILLA))) || + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == + RO_GF_CARPENTERS_NORMAL && + ((location.GetRandomizerCheck() == RC_TH_FREED_CARPENTERS && CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), RO_GENERIC_NO) == RO_GENERIC_YES) || (location.GetRCType() == RCTYPE_GF_KEY && - CVarGetInteger(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_VANILLA) != RO_GERUDO_KEYS_VANILLA))))); + CVarGetInteger(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_VANILLA) != + RO_GERUDO_KEYS_VANILLA))))); } } diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h index 6ab5b8314a..7a7e605bba 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h @@ -7,11 +7,11 @@ #include namespace RandomizerCheckObjects { - bool AreaIsDungeon(RandomizerCheckArea area); - bool AreaIsOverworld(RandomizerCheckArea area); - std::string GetRCAreaName(RandomizerCheckArea area); - std::map> GetAllRCObjectsByArea(); - std::map GetAllRCAreaBySceneID(); - RandomizerCheckArea GetRCAreaBySceneID(SceneID sceneId); - void UpdateImGuiVisibility(); -} +bool AreaIsDungeon(RandomizerCheckArea area); +bool AreaIsOverworld(RandomizerCheckArea area); +std::string GetRCAreaName(RandomizerCheckArea area); +std::map> GetAllRCObjectsByArea(); +std::map GetAllRCAreaBySceneID(); +RandomizerCheckArea GetRCAreaBySceneID(SceneID sceneId); +void UpdateImGuiVisibility(); +} // namespace RandomizerCheckObjects diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index e3b07b672b..d460c6daf6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -7,10 +7,15 @@ #include "soh/SaveManager.h" #include "soh/ResourceManagerHelpers.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "dungeon.h" +#include "entrance.h" #include "location_access.h" +#include "3drando/fill.hpp" +#include "soh/Enhancements/debugger/performanceTimer.h" #include +#include #include #include #include @@ -46,6 +51,7 @@ bool showBeans; bool showScrubs; bool showMajorScrubs; bool showMerchants; +bool showSongs; bool showBeehives; bool showCows; bool showOverworldFreestanding; @@ -58,6 +64,10 @@ bool showWeirdEgg; bool showGerudoCard; bool showOverworldPots; bool showDungeonPots; +bool showOverworldGrass; +bool showDungeonGrass; +bool showOverworldCrates; +bool showDungeonCrates; bool showFrogSongRupees; bool showFairies; bool showStartingMapsCompasses; @@ -79,30 +89,36 @@ bool fishsanityAgeSplit; bool initialized; bool doAreaScroll; bool previousShowHidden = false; -bool hideShopUnshuffledChecks = true; +bool hideShopUnshuffledChecks = false; bool alwaysShowGS = false; -std::map startingShopItem = { { SCENE_KOKIRI_SHOP, RC_KF_SHOP_ITEM_1 }, - { SCENE_BAZAAR, RC_MARKET_BAZAAR_ITEM_1 }, - { SCENE_POTION_SHOP_MARKET, RC_MARKET_POTION_SHOP_ITEM_1 }, - { SCENE_BOMBCHU_SHOP, RC_MARKET_BOMBCHU_SHOP_ITEM_1 }, - { SCENE_POTION_SHOP_KAKARIKO, RC_KAK_POTION_SHOP_ITEM_1 }, - { SCENE_ZORA_SHOP, RC_ZD_SHOP_ITEM_1 }, - { SCENE_GORON_SHOP, RC_GC_SHOP_ITEM_1 } }; +static bool presetLoaded = false; +static ImVec2 presetPos; +static ImVec2 presetSize; + +std::map startingShopItem = { + { SCENE_KOKIRI_SHOP, RC_KF_SHOP_ITEM_1 }, + { SCENE_BAZAAR, RC_MARKET_BAZAAR_ITEM_1 }, + { SCENE_POTION_SHOP_MARKET, RC_MARKET_POTION_SHOP_ITEM_1 }, + { SCENE_BOMBCHU_SHOP, RC_MARKET_BOMBCHU_SHOP_ITEM_1 }, + { SCENE_POTION_SHOP_KAKARIKO, RC_KAK_POTION_SHOP_ITEM_1 }, + { SCENE_ZORA_SHOP, RC_ZD_SHOP_ITEM_1 }, + { SCENE_GORON_SHOP, RC_GC_SHOP_ITEM_1 }, +}; std::map DungeonRCAreasBySceneID = { - {SCENE_DEKU_TREE, RCAREA_DEKU_TREE}, - {SCENE_DODONGOS_CAVERN, RCAREA_DODONGOS_CAVERN}, - {SCENE_JABU_JABU, RCAREA_JABU_JABUS_BELLY}, - {SCENE_FOREST_TEMPLE, RCAREA_FOREST_TEMPLE}, - {SCENE_FIRE_TEMPLE, RCAREA_FIRE_TEMPLE}, - {SCENE_WATER_TEMPLE, RCAREA_WATER_TEMPLE}, - {SCENE_SHADOW_TEMPLE, RCAREA_SHADOW_TEMPLE}, - {SCENE_SPIRIT_TEMPLE, RCAREA_SPIRIT_TEMPLE}, - {SCENE_BOTTOM_OF_THE_WELL, RCAREA_BOTTOM_OF_THE_WELL}, - {SCENE_ICE_CAVERN, RCAREA_ICE_CAVERN}, - {SCENE_GERUDO_TRAINING_GROUND, RCAREA_GERUDO_TRAINING_GROUND}, - {SCENE_INSIDE_GANONS_CASTLE, RCAREA_GANONS_CASTLE}, + { SCENE_DEKU_TREE, RCAREA_DEKU_TREE }, + { SCENE_DODONGOS_CAVERN, RCAREA_DODONGOS_CAVERN }, + { SCENE_JABU_JABU, RCAREA_JABU_JABUS_BELLY }, + { SCENE_FOREST_TEMPLE, RCAREA_FOREST_TEMPLE }, + { SCENE_FIRE_TEMPLE, RCAREA_FIRE_TEMPLE }, + { SCENE_WATER_TEMPLE, RCAREA_WATER_TEMPLE }, + { SCENE_SHADOW_TEMPLE, RCAREA_SHADOW_TEMPLE }, + { SCENE_SPIRIT_TEMPLE, RCAREA_SPIRIT_TEMPLE }, + { SCENE_BOTTOM_OF_THE_WELL, RCAREA_BOTTOM_OF_THE_WELL }, + { SCENE_ICE_CAVERN, RCAREA_ICE_CAVERN }, + { SCENE_GERUDO_TRAINING_GROUND, RCAREA_GERUDO_TRAINING_GROUND }, + { SCENE_INSIDE_GANONS_CASTLE, RCAREA_GANONS_CASTLE }, }; // Dungeon entrances with obvious visual differences between MQ and vanilla qualifying as spoiling on sight @@ -119,19 +135,21 @@ std::vector spoilingEntrances = { ENTR_SHADOW_TEMPLE_BOSS_DOOR, ENTR_ICE_CAVERN_ENTRANCE, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE, - ENTR_INSIDE_GANONS_CASTLE_ENTRANCE + ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, }; std::map> checksByArea; bool areasFullyChecked[RCAREA_INVALID]; u32 areasSpoiled = 0; bool showVOrMQ; -s8 areaChecksGotten[RCAREA_INVALID]; //| "Kokiri Forest (4/9)" -s8 areaCheckTotals[RCAREA_INVALID]; +s16 areaChecksGotten[RCAREA_INVALID]; //| "Kokiri Forest (4/9)" +s16 areaChecksAvailable[RCAREA_INVALID]; +s16 areaCheckTotals[RCAREA_INVALID]; uint16_t totalChecks = 0; +uint16_t totalChecksAvailable = 0; uint16_t totalChecksGotten = 0; bool optCollapseAll; // A bool that will collapse all checks once -bool optExpandAll; // A bool that will expand all checks once +bool optExpandAll; // A bool that will expand all checks once RandomizerCheck lastLocationChecked = RC_UNKNOWN_CHECK; RandomizerCheckArea previousArea = RCAREA_INVALID; RandomizerCheckArea currentArea = RCAREA_INVALID; @@ -161,62 +179,78 @@ bool hideCollected = false; bool showHidden = true; bool mystery = false; bool showLogicTooltip = false; +bool enableAvailableChecks = false; +bool onlyShowAvailable = false; SceneID DungeonSceneLookupByArea(RandomizerCheckArea area) { switch (area) { - case RCAREA_DEKU_TREE: return SCENE_DEKU_TREE; - case RCAREA_DODONGOS_CAVERN: return SCENE_DODONGOS_CAVERN; - case RCAREA_JABU_JABUS_BELLY: return SCENE_JABU_JABU; - case RCAREA_FOREST_TEMPLE: return SCENE_FOREST_TEMPLE; - case RCAREA_FIRE_TEMPLE: return SCENE_FIRE_TEMPLE; - case RCAREA_WATER_TEMPLE: return SCENE_WATER_TEMPLE; - case RCAREA_SPIRIT_TEMPLE: return SCENE_SPIRIT_TEMPLE; - case RCAREA_SHADOW_TEMPLE: return SCENE_SHADOW_TEMPLE; - case RCAREA_BOTTOM_OF_THE_WELL: return SCENE_BOTTOM_OF_THE_WELL; - case RCAREA_ICE_CAVERN: return SCENE_ICE_CAVERN; - case RCAREA_GERUDO_TRAINING_GROUND: return SCENE_GERUDO_TRAINING_GROUND; - case RCAREA_GANONS_CASTLE: return SCENE_INSIDE_GANONS_CASTLE; - default: return SCENE_ID_MAX; + case RCAREA_DEKU_TREE: + return SCENE_DEKU_TREE; + case RCAREA_DODONGOS_CAVERN: + return SCENE_DODONGOS_CAVERN; + case RCAREA_JABU_JABUS_BELLY: + return SCENE_JABU_JABU; + case RCAREA_FOREST_TEMPLE: + return SCENE_FOREST_TEMPLE; + case RCAREA_FIRE_TEMPLE: + return SCENE_FIRE_TEMPLE; + case RCAREA_WATER_TEMPLE: + return SCENE_WATER_TEMPLE; + case RCAREA_SPIRIT_TEMPLE: + return SCENE_SPIRIT_TEMPLE; + case RCAREA_SHADOW_TEMPLE: + return SCENE_SHADOW_TEMPLE; + case RCAREA_BOTTOM_OF_THE_WELL: + return SCENE_BOTTOM_OF_THE_WELL; + case RCAREA_ICE_CAVERN: + return SCENE_ICE_CAVERN; + case RCAREA_GERUDO_TRAINING_GROUND: + return SCENE_GERUDO_TRAINING_GROUND; + case RCAREA_GANONS_CASTLE: + return SCENE_INSIDE_GANONS_CASTLE; + default: + return SCENE_ID_MAX; } } -Color_RGBA8 Color_Bg_Default = { 0, 0, 0, 255 }; // Black -Color_RGBA8 Color_Main_Default = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Area_Incomplete_Extra_Default = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Area_Complete_Extra_Default = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Unchecked_Extra_Default = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Skipped_Main_Default = { 160, 160, 160, 255 }; // Grey -Color_RGBA8 Color_Skipped_Extra_Default = { 160, 160, 160, 255 }; // Grey -Color_RGBA8 Color_Seen_Extra_Default = { 255, 255, 255, 255 }; // TODO -Color_RGBA8 Color_Hinted_Extra_Default = { 255, 255, 255, 255 }; // TODO -Color_RGBA8 Color_Collected_Extra_Default = { 242, 101, 34, 255 }; // Orange -Color_RGBA8 Color_Scummed_Extra_Default = { 0, 174, 239, 255 }; // Blue -Color_RGBA8 Color_Saved_Extra_Default = { 0, 185, 0, 255 }; // Green +Color_RGBA8 Color_Bg_Default = { 0, 0, 0, 255 }; // Black +Color_RGBA8 Color_Main_Default = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Area_Incomplete_Extra_Default = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Area_Complete_Extra_Default = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Unchecked_Extra_Default = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Skipped_Main_Default = { 160, 160, 160, 255 }; // Grey +Color_RGBA8 Color_Skipped_Extra_Default = { 160, 160, 160, 255 }; // Grey +Color_RGBA8 Color_Seen_Extra_Default = { 255, 255, 255, 255 }; // TODO +Color_RGBA8 Color_Hinted_Extra_Default = { 255, 255, 255, 255 }; // TODO +Color_RGBA8 Color_Collected_Extra_Default = { 242, 101, 34, 255 }; // Orange +Color_RGBA8 Color_Scummed_Extra_Default = { 0, 174, 239, 255 }; // Blue +Color_RGBA8 Color_Saved_Extra_Default = { 0, 185, 0, 255 }; // Green Color_RGBA8 Color_Background = { 0, 0, 0, 255 }; -Color_RGBA8 Color_Area_Incomplete_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Area_Incomplete_Main = { 255, 255, 255, 255 }; // White Color_RGBA8 Color_Area_Incomplete_Extra = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Area_Complete_Main = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Area_Complete_Extra = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Unchecked_Main = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Unchecked_Extra = { 255, 255, 255, 255 }; // Useless -Color_RGBA8 Color_Skipped_Main = { 160, 160, 160, 255 }; // Grey -Color_RGBA8 Color_Skipped_Extra = { 160, 160, 160, 255 }; // Grey -Color_RGBA8 Color_Seen_Main = { 255, 255, 255, 255 }; // TODO -Color_RGBA8 Color_Seen_Extra = { 160, 160, 160, 255 }; // TODO -Color_RGBA8 Color_Hinted_Main = { 255, 255, 255, 255 }; // TODO -Color_RGBA8 Color_Hinted_Extra = { 255, 255, 255, 255 }; // TODO -Color_RGBA8 Color_Collected_Main = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Collected_Extra = { 242, 101, 34, 255 }; // Orange -Color_RGBA8 Color_Scummed_Main = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Scummed_Extra = { 0, 174, 239, 255 }; // Blue -Color_RGBA8 Color_Saved_Main = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Saved_Extra = { 0, 185, 0, 255 }; // Green +Color_RGBA8 Color_Area_Complete_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Area_Complete_Extra = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Unchecked_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Unchecked_Extra = { 255, 255, 255, 255 }; // Useless +Color_RGBA8 Color_Skipped_Main = { 160, 160, 160, 255 }; // Grey +Color_RGBA8 Color_Skipped_Extra = { 160, 160, 160, 255 }; // Grey +Color_RGBA8 Color_Seen_Main = { 255, 255, 255, 255 }; // TODO +Color_RGBA8 Color_Seen_Extra = { 160, 160, 160, 255 }; // TODO +Color_RGBA8 Color_Hinted_Main = { 255, 255, 255, 255 }; // TODO +Color_RGBA8 Color_Hinted_Extra = { 255, 255, 255, 255 }; // TODO +Color_RGBA8 Color_Collected_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Collected_Extra = { 242, 101, 34, 255 }; // Orange +Color_RGBA8 Color_Scummed_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Scummed_Extra = { 0, 174, 239, 255 }; // Blue +Color_RGBA8 Color_Saved_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Saved_Extra = { 0, 185, 0, 255 }; // Green std::vector buttons = { BTN_A, BTN_B, BTN_CUP, BTN_CDOWN, BTN_CLEFT, BTN_CRIGHT, BTN_L, BTN_Z, BTN_R, BTN_START, BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT }; static ImGuiTextFilter checkSearch; +static bool recalculateAvailable = false; std::array filterAreasHidden = { 0 }; std::array filterChecksHidden = { 0 }; @@ -230,10 +264,12 @@ void TrySetAreas() { void CalculateTotals() { totalChecks = 0; + totalChecksAvailable = 0; totalChecksGotten = 0; for (uint8_t i = 0; i < RCAREA_INVALID; i++) { totalChecks += areaCheckTotals[i]; + totalChecksAvailable += areaChecksAvailable[i]; totalChecksGotten += areaChecksGotten[i]; } } @@ -246,23 +282,45 @@ uint16_t GetTotalChecksGotten() { return totalChecksGotten; } +bool IsCheckHidden(RandomizerCheck rc) { + Rando::ItemLocation* itemLocation = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); + RandomizerCheckStatus status = itemLocation->GetCheckStatus(); + bool available = itemLocation->IsAvailable(); + bool skipped = itemLocation->GetIsSkipped(); + bool obtained = itemLocation->HasObtained(); + bool seen = status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED; + bool scummed = status == RCSHOW_SCUMMED; + bool unchecked = status == RCSHOW_UNCHECKED; + + return !showHidden && + ((skipped && hideSkipped) || (seen && hideSeen) || (scummed && hideScummed) || (unchecked && hideUnchecked)); +} + void RecalculateAreaTotals(RandomizerCheckArea rcArea) { areaChecksGotten[rcArea] = 0; + areaChecksAvailable[rcArea] = 0; areaCheckTotals[rcArea] = 0; for (auto rc : checksByArea.at(rcArea)) { if (!IsVisibleInCheckTracker(rc)) { continue; } areaCheckTotals[rcArea]++; - if (OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->GetIsSkipped() || OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->HasObtained()) { + + Rando::ItemLocation* itemLoc = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); + + if (itemLoc->GetIsSkipped() || itemLoc->HasObtained()) { areaChecksGotten[rcArea]++; } + + if (itemLoc->IsAvailable() && !IsCheckHidden(rc)) { + areaChecksAvailable[rcArea]++; + } } CalculateTotals(); } std::map MapRGtoRandomizerCheckArea = { - { RG_DEKU_TREE_MAP, RCAREA_DEKU_TREE}, + { RG_DEKU_TREE_MAP, RCAREA_DEKU_TREE }, { RG_DODONGOS_CAVERN_MAP, RCAREA_DODONGOS_CAVERN }, { RG_JABU_JABUS_BELLY_MAP, RCAREA_JABU_JABUS_BELLY }, { RG_FOREST_TEMPLE_MAP, RCAREA_FOREST_TEMPLE }, @@ -303,6 +361,7 @@ void SetCheckCollected(RandomizerCheck rc) { if (IsVisibleInCheckTracker(rc)) { if (!OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->GetIsSkipped()) { areaChecksGotten[loc->GetArea()]++; + areaChecksAvailable[loc->GetArea()]--; } else { OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(false); } @@ -364,33 +423,19 @@ bool IsAreaScene(SceneID sceneNum) { } RandomizerCheckArea AreaFromEntranceGroup[] = { - RCAREA_INVALID, - RCAREA_KOKIRI_FOREST, - RCAREA_LOST_WOODS, - RCAREA_SACRED_FOREST_MEADOW, - RCAREA_KAKARIKO_VILLAGE, - RCAREA_GRAVEYARD, - RCAREA_DEATH_MOUNTAIN_TRAIL, - RCAREA_DEATH_MOUNTAIN_CRATER, - RCAREA_GORON_CITY, - RCAREA_ZORAS_RIVER, - RCAREA_ZORAS_DOMAIN, - RCAREA_ZORAS_FOUNTAIN, - RCAREA_HYRULE_FIELD, - RCAREA_LON_LON_RANCH, - RCAREA_LAKE_HYLIA, - RCAREA_GERUDO_VALLEY, - RCAREA_GERUDO_FORTRESS, - RCAREA_WASTELAND, - RCAREA_DESERT_COLOSSUS, - RCAREA_MARKET, + RCAREA_INVALID, RCAREA_KOKIRI_FOREST, RCAREA_LOST_WOODS, RCAREA_SACRED_FOREST_MEADOW, + RCAREA_KAKARIKO_VILLAGE, RCAREA_GRAVEYARD, RCAREA_DEATH_MOUNTAIN_TRAIL, RCAREA_DEATH_MOUNTAIN_CRATER, + RCAREA_GORON_CITY, RCAREA_ZORAS_RIVER, RCAREA_ZORAS_DOMAIN, RCAREA_ZORAS_FOUNTAIN, + RCAREA_HYRULE_FIELD, RCAREA_LON_LON_RANCH, RCAREA_LAKE_HYLIA, RCAREA_GERUDO_VALLEY, + RCAREA_GERUDO_FORTRESS, RCAREA_WASTELAND, RCAREA_DESERT_COLOSSUS, RCAREA_MARKET, RCAREA_HYRULE_CASTLE, }; RandomizerCheckArea GetCheckArea() { auto scene = static_cast(gPlayState->sceneNum); bool grottoScene = (scene == SCENE_GROTTOS || scene == SCENE_FAIRYS_FOUNTAIN); - const EntranceData* ent = GetEntranceData(grottoScene ? ENTRANCE_GROTTO_EXIT_START + GetCurrentGrottoId() : gSaveContext.entranceIndex); + const EntranceData* ent = + GetEntranceData(grottoScene ? ENTRANCE_GROTTO_EXIT_START + GetCurrentGrottoId() : gSaveContext.entranceIndex); RandomizerCheckArea area = RCAREA_INVALID; if (ent != nullptr && !IsAreaScene(scene) && ent->type != ENTRANCE_TYPE_DUNGEON) { if (ent->source == "Desert Colossus" || ent->destination == "Desert Colossus") { @@ -400,7 +445,8 @@ RandomizerCheckArea GetCheckArea() { } } if (area == RCAREA_INVALID) { - if (grottoScene && (GetCurrentGrottoId() == -1) && (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) == RO_GENERIC_OFF)) { + if (grottoScene && (GetCurrentGrottoId() == -1) && + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) == RO_GENERIC_OFF)) { area = previousArea; } else { area = RandomizerCheckObjects::GetRCAreaBySceneID(scene); @@ -413,16 +459,24 @@ bool vector_contains_scene(std::vector vec, const int16_t scene) { return std::any_of(vec.begin(), vec.end(), [&](const auto& x) { return x == scene; }); } -std::vector skipScenes = {SCENE_GANON_BOSS, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, SCENE_GANON_BOSS, SCENE_INSIDE_GANONS_CASTLE_COLLAPSE, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR}; +std::vector skipScenes = { + SCENE_GANON_BOSS, + SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, + SCENE_GANON_BOSS, + SCENE_INSIDE_GANONS_CASTLE_COLLAPSE, + SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, +}; void ClearAreaChecksAndTotals() { for (auto& [rcArea, vec] : checksByArea) { vec.clear(); areaChecksGotten[rcArea] = 0; + areaChecksAvailable[rcArea] = 0; areaCheckTotals[rcArea] = 0; } totalChecks = 0; totalChecksGotten = 0; + totalChecksAvailable = 0; } void SetShopSeen(uint32_t sceneNum, bool prices) { @@ -464,6 +518,9 @@ void CheckTrackerLoadGame(int32_t fileNum) { if (loc->GetCheckStatus() == RCSHOW_SAVED || loc->GetIsSkipped()) { areaChecksGotten[entry2->GetArea()]++; } + if (loc->IsAvailable()) { + areaChecksAvailable[entry2->GetArea()]++; + } } if (areaChecksGotten[entry2->GetArea()] != 0 || RandomizerCheckObjects::AreaIsOverworld(entry2->GetArea()) || @@ -472,7 +529,8 @@ void CheckTrackerLoadGame(int32_t fileNum) { } // Create check name overrides for child pond fish if age split is disabled - if (fishsanityMode != RO_FISHSANITY_OFF && fishsanityMode != RO_FISHSANITY_OVERWORLD && entry.GetRCType() == RCTYPE_FISH && entry.GetScene() == SCENE_FISHING_POND && + if (fishsanityMode != RO_FISHSANITY_OFF && fishsanityMode != RO_FISHSANITY_OVERWORLD && + entry.GetRCType() == RCTYPE_FISH && entry.GetScene() == SCENE_FISHING_POND && entry.GetActorParams() != 116 && !fishsanityAgeSplit) { if (entry.GetShortName().starts_with("Child")) { checkNameOverrides[rc] = entry.GetShortName().substr(6); @@ -480,15 +538,25 @@ void CheckTrackerLoadGame(int32_t fileNum) { } } for (int i = RCAREA_KOKIRI_FOREST; i < RCAREA_INVALID; i++) { - if (!IsAreaSpoiled(static_cast(i)) && (RandomizerCheckObjects::AreaIsOverworld(static_cast(i)) || !IS_RANDO || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_NONE || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SELECTION || - (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SET_NUMBER && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12))) { + if (!IsAreaSpoiled(static_cast(i)) && + (RandomizerCheckObjects::AreaIsOverworld(static_cast(i)) || !IS_RANDO || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_NONE || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == + RO_MQ_DUNGEONS_SELECTION && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue( + static_cast(RSK_MQ_DEKU_TREE + (i - RCAREA_DEKU_TREE))) != RO_MQ_SET_RANDOM) || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_SET) == RO_GENERIC_ON && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue( + static_cast(RSK_MQ_DEKU_TREE + (i - RCAREA_DEKU_TREE))) != RO_MQ_SET_RANDOM) || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == + RO_MQ_DUNGEONS_SET_NUMBER && + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12 || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 0)))) { SetAreaSpoiled(static_cast(i)); } } - if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING && IS_RANDO) { + if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING && + IS_RANDO) { uint8_t startingAge = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SELECTED_STARTING_AGE).Get(); RandomizerCheckArea startingArea; switch (startingAge) { @@ -508,13 +576,23 @@ void CheckTrackerLoadGame(int32_t fileNum) { areaCheckTotals[startingArea]++; } - showVOrMQ = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_RANDOM_NUMBER || - (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SET_NUMBER && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) < 12)); + showVOrMQ = + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == + RO_MQ_DUNGEONS_RANDOM_NUMBER || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SET_NUMBER && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) < 12)); initialized = true; UpdateAllOrdering(); UpdateInventoryChecks(); UpdateFilters(); + + RegionTable_Init(); + + if (Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_ENTRANCES).Get()) { + Rando::Context::GetInstance()->GetEntranceShuffler()->ApplyEntranceOverrides(); + } + + RecalculateAvailableChecks(); } void CheckTrackerShopSlotChange(uint8_t cursorSlot, int16_t basePrice) { @@ -530,6 +608,7 @@ void CheckTrackerShopSlotChange(uint8_t cursorSlot, int16_t basePrice) { if (status == RCSHOW_SEEN) { OTRGlobals::Instance->gRandoContext->GetItemLocation(slot)->SetCheckStatus(RCSHOW_IDENTIFIED); SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); + RecalculateAvailableChecks(); } } @@ -551,7 +630,9 @@ void CheckTrackerTransition(uint32_t sceneNum) { SetShopSeen(sceneNum, false); break; } - if (!IsAreaSpoiled(currentArea) && (RandomizerCheckObjects::AreaIsOverworld(currentArea) || std::find(spoilingEntrances.begin(), spoilingEntrances.end(), gPlayState->nextEntranceIndex) != spoilingEntrances.end())) { + if (!IsAreaSpoiled(currentArea) && (RandomizerCheckObjects::AreaIsOverworld(currentArea) || + std::find(spoilingEntrances.begin(), spoilingEntrances.end(), + gPlayState->nextEntranceIndex) != spoilingEntrances.end())) { SetAreaSpoiled(currentArea); } } @@ -566,7 +647,7 @@ void CheckTrackerItemReceive(GetItemEntry giEntry) { if (giEntry.itemId == ITEM_SHIELD_DEKU) { SetCheckCollected(RC_KF_SHOP_ITEM_1); return; - }else if (giEntry.itemId == ITEM_KOKIRI_EMERALD) { + } else if (giEntry.itemId == ITEM_KOKIRI_EMERALD) { SetCheckCollected(RC_QUEEN_GOHMA); return; } else if (giEntry.itemId == ITEM_GORON_RUBY) { @@ -605,34 +686,34 @@ void CheckTrackerItemReceive(GetItemEntry giEntry) { } else if (giEntry.itemId == ITEM_BRACELET) { SetCheckCollected(RC_GC_DARUNIAS_JOY); return; - }/* else if (giEntry.itemId == ITEM_SONG_SUN) { - SetCheckCollected(RC_SONG_FROM_ROYAL_FAMILYS_TOMB); - return; - } else if (giEntry.itemId == ITEM_SONG_TIME) { - SetCheckCollected(RC_SONG_FROM_OCARINA_OF_TIME); - return; - } else if (giEntry.itemId == ITEM_SONG_STORMS) { - SetCheckCollected(RC_SONG_FROM_WINDMILL); - return; - } else if (giEntry.itemId == ITEM_SONG_MINUET) { - SetCheckCollected(RC_SHEIK_IN_FOREST); - return; - } else if (giEntry.itemId == ITEM_SONG_BOLERO) { - SetCheckCollected(RC_SHEIK_IN_CRATER); - return; - } else if (giEntry.itemId == ITEM_SONG_SERENADE) { - SetCheckCollected(RC_SHEIK_IN_ICE_CAVERN); - return; - } else if (giEntry.itemId == ITEM_SONG_NOCTURNE) { - SetCheckCollected(RC_SHEIK_IN_KAKARIKO); - return; - } else if (giEntry.itemId == ITEM_SONG_REQUIEM) { - SetCheckCollected(RC_SHEIK_AT_COLOSSUS); - return; - } else if (giEntry.itemId == ITEM_SONG_PRELUDE) { - SetCheckCollected(RC_SHEIK_AT_TEMPLE); - return; - }*/ + } /* else if (giEntry.itemId == ITEM_SONG_SUN) { + SetCheckCollected(RC_SONG_FROM_ROYAL_FAMILYS_TOMB); + return; + } else if (giEntry.itemId == ITEM_SONG_TIME) { + SetCheckCollected(RC_SONG_FROM_OCARINA_OF_TIME); + return; + } else if (giEntry.itemId == ITEM_SONG_STORMS) { + SetCheckCollected(RC_SONG_FROM_WINDMILL); + return; + } else if (giEntry.itemId == ITEM_SONG_MINUET) { + SetCheckCollected(RC_SHEIK_IN_FOREST); + return; + } else if (giEntry.itemId == ITEM_SONG_BOLERO) { + SetCheckCollected(RC_SHEIK_IN_CRATER); + return; + } else if (giEntry.itemId == ITEM_SONG_SERENADE) { + SetCheckCollected(RC_SHEIK_IN_ICE_CAVERN); + return; + } else if (giEntry.itemId == ITEM_SONG_NOCTURNE) { + SetCheckCollected(RC_SHEIK_IN_KAKARIKO); + return; + } else if (giEntry.itemId == ITEM_SONG_REQUIEM) { + SetCheckCollected(RC_SHEIK_AT_COLOSSUS); + return; + } else if (giEntry.itemId == ITEM_SONG_PRELUDE) { + SetCheckCollected(RC_SHEIK_AT_TEMPLE); + return; + }*/ } } @@ -644,7 +725,8 @@ void CheckTrackerSceneFlagSet(int16_t sceneNum, int16_t flagType, int32_t flag) if (flagType != FLAG_SCENE_TREASURE && flagType != FLAG_SCENE_COLLECTIBLE) { return; } - if (sceneNum == SCENE_GRAVEYARD && flag == 0x19 && flagType == FLAG_SCENE_COLLECTIBLE) { // Gravedigging tour special case + if (sceneNum == SCENE_GRAVEYARD && flag == 0x19 && + flagType == FLAG_SCENE_COLLECTIBLE) { // Gravedigging tour special case SetCheckCollected(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR); return; } @@ -652,7 +734,9 @@ void CheckTrackerSceneFlagSet(int16_t sceneNum, int16_t flagType, int32_t flag) if (!IsVisibleInCheckTracker(loc.GetRandomizerCheck())) { continue; } - SpoilerCollectionCheckType checkMatchType = flagType == FLAG_SCENE_TREASURE ? SpoilerCollectionCheckType::SPOILER_CHK_CHEST : SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE; + SpoilerCollectionCheckType checkMatchType = flagType == FLAG_SCENE_TREASURE + ? SpoilerCollectionCheckType::SPOILER_CHK_CHEST + : SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE; Rando::SpoilerCollectionCheck scCheck = loc.GetCollectionCheck(); if (scCheck.scene == sceneNum && scCheck.flag == flag && scCheck.type == checkMatchType) { SetCheckCollected(loc.GetRandomizerCheck()); @@ -673,9 +757,9 @@ void CheckTrackerFlagSet(int16_t flagType, int32_t flag) { break; case FLAG_EVENT_CHECK_INF: if ((flag == EVENTCHKINF_CARPENTERS_FREE(0) || flag == EVENTCHKINF_CARPENTERS_FREE(1) || - flag == EVENTCHKINF_CARPENTERS_FREE(2) || flag == EVENTCHKINF_CARPENTERS_FREE(3)) - && GET_EVENTCHKINF_CARPENTERS_FREE_ALL()) { - SetCheckCollected(RC_GF_GERUDO_MEMBERSHIP_CARD); + flag == EVENTCHKINF_CARPENTERS_FREE(2) || flag == EVENTCHKINF_CARPENTERS_FREE(3)) && + GET_EVENTCHKINF_CARPENTERS_FREE_ALL()) { + SetCheckCollected(RC_TH_FREED_CARPENTERS); return; } checkMatchType = SpoilerCollectionCheckType::SPOILER_CHK_EVENT_CHK_INF; @@ -732,16 +816,18 @@ void CheckTrackerFlagSet(int16_t flagType, int32_t flag) { for (auto& loc : Rando::StaticData::GetLocationTable()) { if ((!IS_RANDO && ((loc.GetQuest() == RCQUEST_MQ && !IS_MASTER_QUEST) || (loc.GetQuest() == RCQUEST_VANILLA && IS_MASTER_QUEST))) || - (IS_RANDO && !(OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene()) == nullptr) && - ((OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene())->IsMQ() && - loc.GetQuest() == RCQUEST_VANILLA) || - OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene())->IsVanilla() && - loc.GetQuest() == RCQUEST_MQ))) { + (IS_RANDO && + !(OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene()) == nullptr) && + ((OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene())->IsMQ() && + loc.GetQuest() == RCQUEST_VANILLA) || + OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene())->IsVanilla() && + loc.GetQuest() == RCQUEST_MQ))) { continue; } Rando::SpoilerCollectionCheck scCheck = loc.GetCollectionCheck(); SpoilerCollectionCheckType scCheckType = scCheck.type; - if (checkMatchType == SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF && scCheckType == SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF) { + if (checkMatchType == SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF && + scCheckType == SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF) { if (flag == OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(loc.GetRandomizerCheck())) { SetCheckCollected(loc.GetRandomizerCheck()); return; @@ -774,15 +860,15 @@ void SaveTrackerData(SaveContext* saveContext, int sectionID, bool fullSave) { } SaveManager::Instance->SaveArray("checkStatus", checkCount.size(), [&](size_t i) { RandomizerCheck check = checkCount.at(i); - RandomizerCheckStatus savedStatus = OTRGlobals::Instance->gRandoContext->GetItemLocation(check)->GetCheckStatus(); + RandomizerCheckStatus savedStatus = + OTRGlobals::Instance->gRandoContext->GetItemLocation(check)->GetCheckStatus(); bool isSkipped = OTRGlobals::Instance->gRandoContext->GetItemLocation(check)->GetIsSkipped(); if (savedStatus == RCSHOW_COLLECTED) { if (fullSave) { OTRGlobals::Instance->gRandoContext->GetItemLocation(check)->SetCheckStatus(RCSHOW_SAVED); savedStatus = RCSHOW_SAVED; updateOrdering = true; - } - else { + } else { savedStatus = RCSHOW_SCUMMED; } } @@ -791,7 +877,7 @@ void SaveTrackerData(SaveContext* saveContext, int sectionID, bool fullSave) { SaveManager::Instance->SaveData("randomizerCheck", check); SaveManager::Instance->SaveData("status", savedStatus); SaveManager::Instance->SaveData("skipped", isSkipped); - }); + }); } }); SaveManager::Instance->SaveData("areasSpoiled", areasSpoiled); @@ -803,6 +889,9 @@ void SaveTrackerData(SaveContext* saveContext, int sectionID, bool fullSave) { void SaveFile(SaveContext* saveContext, int sectionID, bool fullSave) { SaveTrackerData(saveContext, sectionID, fullSave); + if (fullSave) { + recalculateAvailable = true; + } } void LoadFile() { @@ -816,8 +905,8 @@ void LoadFile() { SaveManager::Instance->LoadData("skipped", skipped, false); OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetCheckStatus(status); OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(skipped); - }); }); + }); SaveManager::Instance->LoadData("areasSpoiled", areasSpoiled, (uint32_t)0); UpdateAllOrdering(); UpdateAllAreas(); @@ -844,30 +933,74 @@ void SetAreaSpoiled(RandomizerCheckArea rcArea) { } void CheckTrackerWindow::DrawElement() { + Color_Background = CVarGetColor(CVAR_TRACKER_CHECK("BgColor.Value"), Color_Bg_Default); + Color_Area_Incomplete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor.Value"), Color_Main_Default); + Color_Area_Incomplete_Extra = + CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor.Value"), Color_Area_Incomplete_Extra_Default); + Color_Area_Complete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor.Value"), Color_Main_Default); + Color_Area_Complete_Extra = + CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor.Value"), Color_Area_Complete_Extra_Default); + Color_Unchecked_Main = CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.MainColor.Value"), Color_Main_Default); + Color_Unchecked_Extra = + CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.ExtraColor.Value"), Color_Unchecked_Extra_Default); + Color_Skipped_Main = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.MainColor.Value"), Color_Main_Default); + Color_Skipped_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.ExtraColor.Value"), Color_Skipped_Extra_Default); + Color_Seen_Main = CVarGetColor(CVAR_TRACKER_CHECK("Seen.MainColor.Value"), Color_Main_Default); + Color_Seen_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Seen.ExtraColor.Value"), Color_Seen_Extra_Default); + Color_Hinted_Main = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.MainColor.Value"), Color_Main_Default); + Color_Hinted_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.ExtraColor.Value"), Color_Hinted_Extra_Default); + Color_Collected_Main = CVarGetColor(CVAR_TRACKER_CHECK("Collected.MainColor.Value"), Color_Main_Default); + Color_Collected_Extra = + CVarGetColor(CVAR_TRACKER_CHECK("Collected.ExtraColor.Value"), Color_Collected_Extra_Default); + Color_Scummed_Main = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.MainColor.Value"), Color_Main_Default); + Color_Scummed_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.ExtraColor.Value"), Color_Scummed_Extra_Default); + Color_Saved_Main = CVarGetColor(CVAR_TRACKER_CHECK("Saved.MainColor.Value"), Color_Main_Default); + Color_Saved_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Saved.ExtraColor.Value"), Color_Saved_Extra_Default); + hideUnchecked = CVarGetInteger(CVAR_TRACKER_CHECK("Unchecked.Hide"), 0); + hideScummed = CVarGetInteger(CVAR_TRACKER_CHECK("Scummed.Hide"), 0); + hideSeen = CVarGetInteger(CVAR_TRACKER_CHECK("Seen.Hide"), 0); + hideSkipped = CVarGetInteger(CVAR_TRACKER_CHECK("Skipped.Hide"), 0); + hideSaved = CVarGetInteger(CVAR_TRACKER_CHECK("Saved.Hide"), 0); + hideCollected = CVarGetInteger(CVAR_TRACKER_CHECK("Collected.Hide"), 0); + showHidden = CVarGetInteger(CVAR_TRACKER_CHECK("ShowHidden"), 0); + mystery = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0); + showLogicTooltip = CVarGetInteger(CVAR_TRACKER_CHECK("ShowLogic"), 0); + enableAvailableChecks = CVarGetInteger(CVAR_TRACKER_CHECK("EnableAvailableChecks"), 0); + onlyShowAvailable = CVarGetInteger(CVAR_TRACKER_CHECK("OnlyShowAvailable"), 0); + + hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 0); + alwaysShowGS = CVarGetInteger(CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), 0); if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { - if (CVarGetInteger(CVAR_TRACKER_CHECK("ShowOnlyPaused"), 0) && (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) { + if (CVarGetInteger(CVAR_TRACKER_CHECK("ShowOnlyPaused"), 0) && + (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) { return; } if (CVarGetInteger(CVAR_TRACKER_CHECK("DisplayType"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) { int comboButton1Mask = buttons[CVarGetInteger(CVAR_TRACKER_CHECK("ComboButton1"), TRACKER_COMBO_BUTTON_L)]; int comboButton2Mask = buttons[CVarGetInteger(CVAR_TRACKER_CHECK("ComboButton2"), TRACKER_COMBO_BUTTON_R)]; - OSContPad* trackerButtonsPressed = std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); + OSContPad* trackerButtonsPressed = + std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); bool comboButtonsHeld = trackerButtonsPressed != nullptr && - trackerButtonsPressed[0].button & comboButton1Mask && - trackerButtonsPressed[0].button & comboButton2Mask; + trackerButtonsPressed[0].button & comboButton1Mask && + trackerButtonsPressed[0].button & comboButton2Mask; if (!comboButtonsHeld) { return; } } } - ImGui::SetNextWindowSize(ImVec2(400, 540), ImGuiCond_FirstUseEver); - + if (presetLoaded) { + ImGui::SetNextWindowSize(presetSize); + ImGui::SetNextWindowPos(presetPos); + presetLoaded = false; + } else { + ImGui::SetNextWindowSize(ImVec2(400, 540), ImGuiCond_FirstUseEver); + } BeginFloatWindows("Check Tracker", mIsVisible, ImGuiWindowFlags_NoScrollbar); if (!GameInteractor::IsSaveLoaded() || !initialized) { - ImGui::Text("Waiting for file load..."); //TODO Language + ImGui::Text("Waiting for file load..."); // TODO Language EndFloatWindows(); return; } @@ -877,7 +1010,7 @@ void CheckTrackerWindow::DrawElement() { sceneId = (SceneID)gPlayState->sceneNum; } - //Quick Options + // Quick Options #ifdef __WIIU__ float headerHeight = 40.0f; #else @@ -892,38 +1025,63 @@ void CheckTrackerWindow::DrawElement() { ImGui::TableNextRow(0, headerHeight); ImGui::TableNextColumn(); - UIWidgets::EnhancementCheckbox( - "Show Hidden Items", CVAR_TRACKER_CHECK("ShowHidden"), false, - "When active, items will show hidden checks by default when updated to this state."); + if (UIWidgets::CVarCheckbox( + "Show Hidden Items", CVAR_TRACKER_CHECK("ShowHidden"), + UIWidgets::CheckboxOptions( + { { .tooltip = "When active, items will show hidden checks by default when updated to this state." } }) + .Color(THEME_COLOR))) { + doAreaScroll = true; + showHidden = CVarGetInteger(CVAR_TRACKER_CHECK("ShowHidden"), 0); + RecalculateAllAreaTotals(); + } + if (enableAvailableChecks) { + if (UIWidgets::CVarCheckbox( + "Only Show Available Checks", CVAR_TRACKER_CHECK("OnlyShowAvailable"), + UIWidgets::CheckboxOptions({ { .tooltip = "When active, unavailable checks will be hidden." } }) + .Color(THEME_COLOR))) { + doAreaScroll = true; + RecalculateAllAreaTotals(); + } + } UIWidgets::PaddedSeparator(); - if (ImGui::Button("Expand All")) { + if (UIWidgets::Button("Expand All", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { optCollapseAll = false; optExpandAll = true; doAreaScroll = true; } ImGui::SameLine(); - if (ImGui::Button("Collapse All")) { + if (UIWidgets::Button("Collapse All", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { optExpandAll = false; optCollapseAll = true; } ImGui::SameLine(); - if (ImGui::Button("Clear")) { + if (UIWidgets::Button("Clear", UIWidgets::ButtonOptions({ { .tooltip = "Clear the search field" } }) + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline))) { checkSearch.Clear(); UpdateFilters(); doAreaScroll = true; } - UIWidgets::Tooltip("Clear the search field"); + UIWidgets::PushStyleCombobox(THEME_COLOR); if (checkSearch.Draw()) { UpdateFilters(); } + UIWidgets::PopStyleCombobox(); + + ImGui::Separator(); + + std::ostringstream totalChecksSS; + totalChecksSS << "Total Checks: "; + if (enableAvailableChecks) { + totalChecksSS << totalChecksAvailable << " Available / "; + } + totalChecksSS << totalChecksGotten << " Checked / " << totalChecks << " Total"; + ImGui::Text(totalChecksSS.str().c_str()); UIWidgets::PaddedSeparator(); - ImGui::Text("Total Checks: %d / %d", totalChecksGotten, totalChecks); - - UIWidgets::PaddedSeparator(); - - //Checks Section Lead-in + // Checks Section Lead-in ImGui::TableNextRow(); ImGui::TableNextColumn(); size = ImGui::GetContentRegionAvail(); @@ -935,7 +1093,7 @@ void CheckTrackerWindow::DrawElement() { ImGui::TableNextRow(); ImGui::TableNextColumn(); - //Prep for loop + // Prep for loop RainbowTick(); bool doDraw = false; bool thisAreaFullyChecked = false; @@ -946,21 +1104,18 @@ void CheckTrackerWindow::DrawElement() { bool doingCollapseOrExpand = optExpandAll || optCollapseAll; bool isThisAreaSpoiled; RandomizerCheckArea lastArea = RCAREA_INVALID; - Color_RGBA8 areaCompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor"), Color_Main_Default); - Color_RGBA8 areaIncompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor"), Color_Main_Default); - Color_RGBA8 extraCompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor"), Color_Area_Complete_Extra_Default); - Color_RGBA8 extraIncompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor"), Color_Area_Incomplete_Extra_Default); Color_RGBA8 mainColor; Color_RGBA8 extraColor; std::string stemp; bool shouldHideFilteredAreas = CVarGetInteger(CVAR_TRACKER_CHECK("HideFilteredAreas"), 1); - + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); for (auto& [rcArea, checks] : checksByArea) { RandomizerCheckArea thisArea = currentArea; thisAreaFullyChecked = (areaChecksGotten[rcArea] == areaCheckTotals[rcArea]); - //Last Area needs to be cleaned up + // Last Area needs to be cleaned up if (lastArea != RCAREA_INVALID && doDraw) { UIWidgets::PaddedSeparator(); } @@ -970,20 +1125,20 @@ void CheckTrackerWindow::DrawElement() { doAreaScroll = true; } if ((shouldHideFilteredAreas && filterAreasHidden[rcArea]) || - (!showHidden && ((hideComplete && thisAreaFullyChecked) || (hideIncomplete && !thisAreaFullyChecked))) - ) { + (!showHidden && ((hideComplete && thisAreaFullyChecked) || (hideIncomplete && !thisAreaFullyChecked))) || + (enableAvailableChecks && onlyShowAvailable && areaChecksAvailable[rcArea] == 0)) { doDraw = false; } else { - //Get the colour for the area + // Get the colour for the area if (thisAreaFullyChecked) { - mainColor = areaCompleteColor; - extraColor = extraCompleteColor; + mainColor = Color_Area_Complete_Main; + extraColor = Color_Area_Complete_Extra; } else { - mainColor = areaIncompleteColor; - extraColor = extraIncompleteColor; + mainColor = Color_Area_Incomplete_Main; + extraColor = Color_Area_Incomplete_Extra; } - //Draw the area + // Draw the area collapseLogic = !thisAreaFullyChecked; if (doingCollapseOrExpand) { if (optExpandAll) { @@ -1009,21 +1164,37 @@ void CheckTrackerWindow::DrawElement() { isThisAreaSpoiled = IsAreaSpoiled(rcArea) || mqSpoilers; if (isThisAreaSpoiled) { - if (showVOrMQ && RandomizerCheckObjects::AreaIsDungeon(rcArea)) { - if (OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(DungeonSceneLookupByArea(rcArea))->IsMQ()) - ImGui::Text("(%d/%d) - MQ", areaChecksGotten[rcArea], areaCheckTotals[rcArea]); - else - ImGui::Text("(%d/%d) - Vanilla", areaChecksGotten[rcArea], areaCheckTotals[rcArea]); - } else { - ImGui::Text("(%d/%d)", areaChecksGotten[rcArea], areaCheckTotals[rcArea]); + std::ostringstream areaTotalsSS; + std::ostringstream areaTotalsTooltipSS; + + areaTotalsSS << "("; + if (enableAvailableChecks) { + areaTotalsSS << static_cast(areaChecksAvailable[rcArea]) << " / "; + areaTotalsTooltipSS << "Available / "; } + areaTotalsSS << static_cast(areaChecksGotten[rcArea]) << " / " + << static_cast(areaCheckTotals[rcArea]) << ")"; + areaTotalsTooltipSS << "Checked / Total"; + + if (showVOrMQ && RandomizerCheckObjects::AreaIsDungeon(rcArea)) { + if (OTRGlobals::Instance->gRandoContext->GetDungeons() + ->GetDungeonFromScene(DungeonSceneLookupByArea(rcArea)) + ->IsMQ()) { + areaTotalsSS << " - MQ"; + } else { + areaTotalsSS << " - Vanilla"; + } + } + + ImGui::Text(areaTotalsSS.str().c_str()); + UIWidgets::Tooltip(areaTotalsTooltipSS.str().c_str()); } else { ImGui::Text("???"); } ImGui::PopStyleColor(); - //Keep areas loaded between transitions + // Keep areas loaded between transitions if (thisArea == rcArea && doAreaScroll) { ImGui::SetScrollHereY(0.0f); doAreaScroll = false; @@ -1039,9 +1210,10 @@ void CheckTrackerWindow::DrawElement() { } } } + ImGui::PopStyleVar(); - ImGui::EndTable(); //Checks Lead-out - ImGui::EndTable(); //Quick Options Lead-out + ImGui::EndTable(); // Checks Lead-out + ImGui::EndTable(); // Quick Options Lead-out EndFloatWindows(); if (doingCollapseOrExpand) { optCollapseAll = false; @@ -1052,7 +1224,7 @@ void CheckTrackerWindow::DrawElement() { bool UpdateFilters() { for (auto& [rcArea, checks] : checksByArea) { filterAreasHidden[rcArea] = !checkSearch.PassFilter(RandomizerCheckObjects::GetRCAreaName(rcArea).c_str()); - for (auto check : checks) { + for (auto check : checks) { if (ShouldShowCheck(check)) { filterAreasHidden[rcArea] = false; filterChecksHidden[check] = false; @@ -1068,21 +1240,22 @@ bool UpdateFilters() { bool ShouldShowCheck(RandomizerCheck check) { auto itemLoc = Rando::Context::GetInstance()->GetItemLocation(check); std::string search = (Rando::StaticData::GetLocation(check)->GetShortName() + " " + - Rando::StaticData::GetLocation(check)->GetName() + " " + - RandomizerCheckObjects::GetRCAreaName(Rando::StaticData::GetLocation(check)->GetArea())); - if (itemLoc->HasObtained() || itemLoc->GetCheckStatus() == RCSHOW_SCUMMED || - (!mystery && (itemLoc->GetCheckStatus() == RCSHOW_IDENTIFIED || itemLoc->GetCheckStatus() == RCSHOW_SEEN) && itemLoc->GetPlacedRandomizerGet() != RG_ICE_TRAP)) { + Rando::StaticData::GetLocation(check)->GetName() + " " + + RandomizerCheckObjects::GetRCAreaName(Rando::StaticData::GetLocation(check)->GetArea())); + if (itemLoc->HasObtained() || itemLoc->GetCheckStatus() == RCSHOW_SCUMMED || + (!mystery && (itemLoc->GetCheckStatus() == RCSHOW_IDENTIFIED || itemLoc->GetCheckStatus() == RCSHOW_SEEN) && + itemLoc->GetPlacedRandomizerGet() != RG_ICE_TRAP)) { search += " " + itemLoc->GetPlacedItemName().GetForLanguage(gSaveContext.language); } else if (itemLoc->GetCheckStatus() == RCSHOW_IDENTIFIED && !mystery) { - search += OTRGlobals::Instance->gRandoContext->overrides[check].GetTrickName().GetForLanguage(gSaveContext.language); + search += + OTRGlobals::Instance->gRandoContext->overrides[check].GetTrickName().GetForLanguage(gSaveContext.language); } else if (itemLoc->GetCheckStatus() == RCSHOW_SEEN && !mystery) { - search += Rando::StaticData::RetrieveItem(OTRGlobals::Instance->gRandoContext->overrides[check].LooksLike()).GetName().GetForLanguage(gSaveContext.language); + search += Rando::StaticData::RetrieveItem(OTRGlobals::Instance->gRandoContext->overrides[check].LooksLike()) + .GetName() + .GetForLanguage(gSaveContext.language); } - return ( - IsVisibleInCheckTracker(check) && - (checkSearch.Filters.Size == 0 || - checkSearch.PassFilter(search.c_str())) - ); + return (IsVisibleInCheckTracker(check) && + (checkSearch.Filters.Size == 0 || checkSearch.PassFilter(search.c_str()))); } // Windowing stuff @@ -1090,8 +1263,7 @@ void BeginFloatWindows(std::string UniqueName, bool& open, ImGuiWindowFlags flag ImGuiWindowFlags windowFlags = flags; if (windowFlags == 0) { - windowFlags |= - ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_NoFocusOnAppearing; + windowFlags |= ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_NoFocusOnAppearing; } if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { @@ -1099,12 +1271,17 @@ void BeginFloatWindows(std::string UniqueName, bool& open, ImGuiWindowFlags flag windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; - if (!CVarGetInteger(CVAR_TRACKER_CHECK("Draggable"), 0)) { + if (!CVarGetInteger(CVAR_TRACKER_CHECK("Draggable"), 1)) { windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; } } - ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(Color_Background.r / 255.0f, Color_Background.g / 255.0f, - Color_Background.b / 255.0f, Color_Background.a / 255.0f)); + auto maybeParent = ImGui::GetCurrentWindow(); + ImGuiWindow* window = ImGui::FindWindowByName(UniqueName.c_str()); + if (window != NULL && window->DockTabIsVisible && window->ParentWindow != NULL && + std::string(window->ParentWindow->Name).compare(0, strlen("Main - Deck"), "Main - Deck") == 0) { + Color_Background.a = 255; + } + ImGui::PushStyleColor(ImGuiCol_WindowBg, VecFromRGBA8(Color_Background)); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); ImGui::Begin(UniqueName.c_str(), &open, windowFlags); @@ -1117,80 +1294,83 @@ void EndFloatWindows() { } void LoadSettings() { - //If in randomzer, then get the setting and check if in general we should be showing the settings - //If in vanilla, _try_ to show items that at least are needed for 100% + // If in randomzer, then get the setting and check if in general we should be showing the settings + // If in vanilla, _try_ to show items that at least are needed for 100% - showShops = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHOPSANITY) != RO_SHOPSANITY_OFF - : false; - showBeans = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_BEANS_ONLY || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL - : true; - showScrubs = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_ALL - : false; - showMajorScrubs = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) != RO_SCRUBS_OFF - : false; - showMerchants = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL - : true; - showBeehives = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BEEHIVES) == RO_GENERIC_YES - : false; - showCows = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_COWS) == RO_GENERIC_YES - : false; - showAdultTrade = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ADULT_TRADE) == RO_GENERIC_YES - : true; - showKokiriSword = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_KOKIRI_SWORD) == RO_GENERIC_YES - : true; - showMasterSword = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) == RO_GENERIC_YES - : true; - showHyruleLoach = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY) == RO_FISHSANITY_HYRULE_LOACH - : false; - showWeirdEgg = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_WEIRD_EGG) == RO_GENERIC_YES - : true; - showGerudoCard = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) == RO_GENERIC_YES - : true; - showFrogSongRupees = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FROG_SONG_RUPEES) == RO_GENERIC_YES - : false; - showFairies = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FAIRIES) == RO_GENERIC_YES - : false; - showStartingMapsCompasses = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MAPANDCOMPASS) != RO_DUNGEON_ITEM_LOC_VANILLA - : false; - showKeysanity = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_KEYSANITY) != RO_DUNGEON_ITEM_LOC_VANILLA - : false; - showBossKeysanity = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BOSS_KEYSANITY) != RO_DUNGEON_ITEM_LOC_VANILLA - : false; - showGerudoFortressKeys = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GERUDO_KEYS) != RO_GERUDO_KEYS_VANILLA - : false; - showGanonBossKey = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GANONS_BOSS_KEY) != RO_GANON_BOSS_KEY_VANILLA - : false; - showOcarinas = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_OCARINA) == RO_GENERIC_YES - : false; - show100SkullReward = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_100_GS_REWARD) == RO_GENERIC_YES - : false; - showLinksPocket = IS_RANDO ? // don't show Link's Pocket if not randomizer, or if rando and pocket is disabled - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING - :false; + showShops = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHOPSANITY) != RO_SHOPSANITY_OFF : false; + showBeans = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == + RO_SHUFFLE_MERCHANTS_BEANS_ONLY || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == + RO_SHUFFLE_MERCHANTS_ALL + : true; + showScrubs = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_ALL : false; + showMajorScrubs = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) != RO_SCRUBS_OFF : false; + showMerchants = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == + RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == + RO_SHUFFLE_MERCHANTS_ALL + : true; + showSongs = IS_RANDO + ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SONGS) != RO_SONG_SHUFFLE_OFF + : false; + showBeehives = IS_RANDO + ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BEEHIVES) == RO_GENERIC_YES + : false; + showCows = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_COWS) == RO_GENERIC_YES : false; + showAdultTrade = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ADULT_TRADE) == RO_GENERIC_YES + : true; + showKokiriSword = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_KOKIRI_SWORD) == RO_GENERIC_YES + : true; + showMasterSword = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) == RO_GENERIC_YES + : true; + showHyruleLoach = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY) == RO_FISHSANITY_HYRULE_LOACH + : false; + showWeirdEgg = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_WEIRD_EGG) == RO_GENERIC_YES + : true; + showGerudoCard = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue( + RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) == RO_GENERIC_YES + : true; + showFrogSongRupees = + IS_RANDO + ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FROG_SONG_RUPEES) == RO_GENERIC_YES + : false; + showFairies = IS_RANDO + ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FAIRIES) == RO_GENERIC_YES + : false; + showStartingMapsCompasses = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue( + RSK_SHUFFLE_MAPANDCOMPASS) != RO_DUNGEON_ITEM_LOC_VANILLA + : false; + showKeysanity = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_KEYSANITY) != RO_DUNGEON_ITEM_LOC_VANILLA + : false; + showBossKeysanity = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BOSS_KEYSANITY) != + RO_DUNGEON_ITEM_LOC_VANILLA + : false; + showGerudoFortressKeys = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GERUDO_KEYS) != RO_GERUDO_KEYS_VANILLA + : false; + showGanonBossKey = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GANONS_BOSS_KEY) != + RO_GANON_BOSS_KEY_VANILLA + : false; + showOcarinas = IS_RANDO + ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_OCARINA) == RO_GENERIC_YES + : false; + show100SkullReward = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_100_GS_REWARD) == RO_GENERIC_YES + : false; + showLinksPocket = + IS_RANDO ? // don't show Link's Pocket if not randomizer, or if rando and pocket is disabled + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING + : false; if (IS_RANDO) { switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TOKENS)) { @@ -1230,11 +1410,53 @@ void LoadSettings() { showDungeonPots = false; break; } + + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_GRASS)) { + case RO_SHUFFLE_GRASS_ALL: + showOverworldGrass = true; + showDungeonGrass = true; + break; + case RO_SHUFFLE_GRASS_OVERWORLD: + showOverworldGrass = true; + showDungeonGrass = false; + break; + case RO_SHUFFLE_GRASS_DUNGEONS: + showOverworldGrass = false; + showDungeonGrass = true; + break; + default: + showOverworldGrass = false; + showDungeonGrass = false; + break; + } + + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_CRATES)) { + case RO_SHUFFLE_CRATES_ALL: + showOverworldCrates = true; + showDungeonCrates = true; + break; + case RO_SHUFFLE_CRATES_OVERWORLD: + showOverworldCrates = true; + showDungeonCrates = false; + break; + case RO_SHUFFLE_CRATES_DUNGEONS: + showOverworldCrates = false; + showDungeonCrates = true; + break; + default: + showOverworldCrates = false; + showDungeonCrates = false; + break; + } } else { // Vanilla showOverworldTokens = true; showDungeonTokens = true; showOverworldPots = false; showDungeonPots = false; + showOverworldGrass = false; + showDungeonGrass = false; + showOverworldCrates = false; + showDungeonCrates = false; } fortressFast = false; @@ -1279,6 +1501,27 @@ void LoadSettings() { showOverworldFreestanding = false; showDungeonFreestanding = true; } + + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GANONS_BOSS_KEY)) { + case RO_GANON_BOSS_KEY_LACS_STONES: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_STONES); + break; + case RO_GANON_BOSS_KEY_LACS_MEDALLIONS: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_MEDALLIONS); + break; + case RO_GANON_BOSS_KEY_LACS_REWARDS: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_REWARDS); + break; + case RO_GANON_BOSS_KEY_LACS_DUNGEONS: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_DUNGEONS); + break; + case RO_GANON_BOSS_KEY_LACS_TOKENS: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_TOKENS); + break; + default: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_VANILLA); + break; + } } bool IsCheckShuffled(RandomizerCheck rc) { @@ -1287,65 +1530,72 @@ bool IsCheckShuffled(RandomizerCheck rc) { auto identity = OTRGlobals::Instance->gRandomizer->IdentifyShopItem(loc->GetScene(), loc->GetActorParams() + 1); } if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) != RO_LOGIC_VANILLA) { - return - (loc->GetArea() != RCAREA_INVALID) && // don't show Invalid locations - (loc->GetRCType() != RCTYPE_GOSSIP_STONE) && //TODO: Don't show hints until tracker supports them - (loc->GetRCType() != RCTYPE_STATIC_HINT) && //TODO: Don't show hints until tracker supports them - (loc->GetRCType() != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them - (rc != RC_HC_ZELDAS_LETTER) && // don't show zeldas letter until we support shuffling it - (rc != RC_LINKS_POCKET || showLinksPocket) && - OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) && - (loc->GetRCType() != RCTYPE_SHOP || - (showShops && OTRGlobals::Instance->gRandomizer->IdentifyShopItem(loc->GetScene(), loc->GetActorParams() + 1).enGirlAShopItem == 50)) && - (rc != RC_TRIFORCE_COMPLETED) && - (rc != RC_GANON) && - (loc->GetRCType() != RCTYPE_SCRUB || - showScrubs || + return (loc->GetArea() != RCAREA_INVALID) && // don't show Invalid locations + (loc->GetRCType() != RCTYPE_GOSSIP_STONE) && // TODO: Don't show hints until tracker supports them + (loc->GetRCType() != RCTYPE_STATIC_HINT) && // TODO: Don't show hints until tracker supports them + (loc->GetRCType() != + RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them + (rc != RC_HC_ZELDAS_LETTER) && // don't show zeldas letter until we support shuffling it + (rc != RC_LINKS_POCKET || showLinksPocket) && + OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) && + (loc->GetRCType() != RCTYPE_SHOP || + (showShops && + OTRGlobals::Instance->gRandomizer->IdentifyShopItem(loc->GetScene(), loc->GetActorParams() + 1) + .enGirlAShopItem == 50)) && + (rc != RC_TRIFORCE_COMPLETED) && (rc != RC_GANON) && + (loc->GetRCType() != RCTYPE_SCRUB || showScrubs || (showMajorScrubs && (rc == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || // The 3 scrubs that are always randomized - rc == RC_HF_DEKU_SCRUB_GROTTO || - rc == RC_LW_DEKU_SCRUB_GROTTO_FRONT)) - ) && - (loc->GetRCType() != RCTYPE_MERCHANT || showMerchants) && - (loc->GetRCType() != RCTYPE_BEEHIVE || showBeehives) && - (loc->GetRCType() != RCTYPE_OCARINA || showOcarinas) && - (loc->GetRCType() != RCTYPE_SKULL_TOKEN || alwaysShowGS || + rc == RC_HF_DEKU_SCRUB_GROTTO || rc == RC_LW_DEKU_SCRUB_GROTTO_FRONT))) && + (loc->GetRCType() != RCTYPE_MERCHANT || showMerchants) && + (loc->GetRCType() != RCTYPE_SONG_LOCATION || showSongs) && + (loc->GetRCType() != RCTYPE_BEEHIVE || showBeehives) && + (loc->GetRCType() != RCTYPE_OCARINA || showOcarinas) && + (loc->GetRCType() != RCTYPE_SKULL_TOKEN || alwaysShowGS || (showOverworldTokens && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || - (showDungeonTokens && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea())) - ) && - (loc->GetRCType() != RCTYPE_POT || + (showDungeonTokens && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_POT || (showOverworldPots && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonPots && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && - (loc->GetRCType() != RCTYPE_COW || showCows) && - (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && - (loc->GetRCType() != RCTYPE_FREESTANDING || + (loc->GetRCType() != RCTYPE_GRASS || + (showOverworldGrass && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonGrass && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_CRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_NLCRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea()) && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) == RO_LOGIC_NO_LOGIC) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_SMALL_CRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_COW || showCows) && + (loc->GetRCType() != RCTYPE_FISH || + OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && + (loc->GetRCType() != RCTYPE_FREESTANDING || (showOverworldFreestanding && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || - (showDungeonFreestanding && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea())) - ) && - (loc->GetRCType() != RCTYPE_ADULT_TRADE || - showAdultTrade || + (showDungeonFreestanding && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_ADULT_TRADE || showAdultTrade || rc == RC_KAK_ANJU_AS_ADULT || // adult trade checks that are always shuffled rc == RC_DMT_TRADE_CLAIM_CHECK // even when shuffle adult trade is off ) && - (rc != RC_KF_KOKIRI_SWORD_CHEST || showKokiriSword) && - (rc != RC_TOT_MASTER_SWORD || showMasterSword) && - (rc != RC_LH_HYRULE_LOACH || showHyruleLoach) && - (rc != RC_ZR_MAGIC_BEAN_SALESMAN || showBeans) && - (rc != RC_HC_MALON_EGG || showWeirdEgg) && - (loc->GetRCType() != RCTYPE_FROG_SONG || showFrogSongRupees) && - ((loc->GetRCType() != RCTYPE_MAP && loc->GetRCType() != RCTYPE_COMPASS) || showStartingMapsCompasses) && - (loc->GetRCType() != RCTYPE_FAIRY || showFairies) && - (loc->GetRCType() != RCTYPE_SMALL_KEY || showKeysanity) && - (loc->GetRCType() != RCTYPE_BOSS_KEY || showBossKeysanity) && - (loc->GetRCType() != RCTYPE_GANON_BOSS_KEY || showGanonBossKey) && - (rc != RC_KAK_100_GOLD_SKULLTULA_REWARD || show100SkullReward) && - (loc->GetRCType() != RCTYPE_GF_KEY && rc != RC_GF_GERUDO_MEMBERSHIP_CARD || - (showGerudoCard && rc == RC_GF_GERUDO_MEMBERSHIP_CARD) || + (rc != RC_KF_KOKIRI_SWORD_CHEST || showKokiriSword) && (rc != RC_TOT_MASTER_SWORD || showMasterSword) && + (rc != RC_LH_HYRULE_LOACH || showHyruleLoach) && (rc != RC_ZR_MAGIC_BEAN_SALESMAN || showBeans) && + (rc != RC_HC_MALON_EGG || showWeirdEgg) && + (loc->GetRCType() != RCTYPE_FROG_SONG || showFrogSongRupees) && + ((loc->GetRCType() != RCTYPE_MAP && loc->GetRCType() != RCTYPE_COMPASS) || showStartingMapsCompasses) && + (loc->GetRCType() != RCTYPE_FAIRY || showFairies) && + (loc->GetRCType() != RCTYPE_SMALL_KEY || showKeysanity) && + (loc->GetRCType() != RCTYPE_BOSS_KEY || showBossKeysanity) && + (loc->GetRCType() != RCTYPE_GANON_BOSS_KEY || showGanonBossKey) && + (rc != RC_KAK_100_GOLD_SKULLTULA_REWARD || show100SkullReward) && + (loc->GetRCType() != RCTYPE_GF_KEY && rc != RC_TH_FREED_CARPENTERS || + (showGerudoCard && rc == RC_TH_FREED_CARPENTERS) || (fortressNormal && showGerudoFortressKeys && loc->GetRCType() == RCTYPE_GF_KEY) || - (fortressFast && showGerudoFortressKeys && rc == RC_GF_NORTH_F1_CARPENTER) - ); - } - else if (loc->IsVanillaCompletion()) { - return (OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) || rc == RC_GIFT_FROM_RAURU) && rc != RC_LINKS_POCKET; + (fortressFast && showGerudoFortressKeys && rc == RC_TH_1_TORCH_CARPENTER)); + } else if (loc->IsVanillaCompletion()) { + return (OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) || rc == RC_GIFT_FROM_RAURU) && + rc != RC_LINKS_POCKET; } return false; } @@ -1353,17 +1603,18 @@ bool IsCheckShuffled(RandomizerCheck rc) { bool IsVisibleInCheckTracker(RandomizerCheck rc) { auto loc = Rando::StaticData::GetLocation(rc); if (IS_RANDO) { - return IsCheckShuffled(rc) || (alwaysShowGS && - loc->GetRCType() == RCTYPE_SKULL_TOKEN && - OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) - ) || (loc->GetRCType() == RCTYPE_SHOP && showShops && !hideShopUnshuffledChecks); + return IsCheckShuffled(rc) || + (alwaysShowGS && loc->GetRCType() == RCTYPE_SKULL_TOKEN && + OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc)) || + (loc->GetRCType() == RCTYPE_SHOP && showShops && !hideShopUnshuffledChecks); } else { - return loc->IsVanillaCompletion() && (!loc->IsDungeon() || (loc->IsDungeon() && loc->GetQuest() == gSaveContext.ship.quest.id)); + return loc->IsVanillaCompletion() && + (!loc->IsDungeon() || (loc->IsDungeon() && loc->GetQuest() == gSaveContext.ship.quest.id)); } } void UpdateInventoryChecks() { - //For all the areas with maps, if you have one, spoil the area + // For all the areas with maps, if you have one, spoil the area for (auto [scene, area] : DungeonRCAreasBySceneID) { if (CHECK_DUNGEON_ITEM(DUNGEON_MAP, scene)) { SetAreaSpoiled(area); @@ -1396,7 +1647,7 @@ void UpdateAllOrdering() { void UpdateOrdering(RandomizerCheckArea rcArea) { // Sort a single area - if(checksByArea.contains(rcArea)) { + if (checksByArea.contains(rcArea)) { std::sort(checksByArea.find(rcArea)->second.begin(), checksByArea.find(rcArea)->second.end(), CompareChecks); } RecalculateAllAreaTotals(); @@ -1462,100 +1713,132 @@ void DrawLocation(RandomizerCheck rc) { Rando::ItemLocation* itemLoc = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); RandomizerCheckStatus status = itemLoc->GetCheckStatus(); bool skipped = itemLoc->GetIsSkipped(); + bool available = itemLoc->IsAvailable(); + + if (enableAvailableChecks && onlyShowAvailable && !available) { + return; + } + if (status == RCSHOW_COLLECTED) { if (!showHidden && hideCollected) { return; } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Collected_Extra_Default + ? Color_Collected_Extra : Color_Collected_Main; - extraColor = Color_Collected_Extra_Default; + extraColor = Color_Collected_Extra; } else if (status == RCSHOW_SAVED) { if (!showHidden && hideSaved) { return; } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Saved_Extra_Default + ? Color_Saved_Extra : Color_Saved_Main; - extraColor = Color_Saved_Extra_Default; + extraColor = Color_Saved_Extra; } else if (skipped) { if (!showHidden && hideSkipped) { return; } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Skipped_Extra_Default + ? Color_Skipped_Extra : Color_Skipped_Main; - extraColor = Color_Skipped_Extra_Default; + extraColor = Color_Skipped_Extra; } else if (status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED) { if (!showHidden && hideSeen) { return; } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Seen_Extra_Default + ? Color_Seen_Extra : Color_Seen_Main; - extraColor = Color_Seen_Extra_Default; + extraColor = Color_Seen_Extra; } else if (status == RCSHOW_SCUMMED) { if (!showHidden && hideScummed) { return; } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Scummed_Extra_Default - : Color_Scummed_Main; - extraColor = Color_Scummed_Extra_Default; + ? Color_Scummed_Extra + : Color_Scummed_Main; + extraColor = Color_Scummed_Extra; } else if (status == RCSHOW_UNCHECKED) { if (!showHidden && hideUnchecked) { return; } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Unchecked_Extra_Default + ? Color_Unchecked_Extra : Color_Unchecked_Main; - extraColor = Color_Unchecked_Extra_Default; + extraColor = Color_Unchecked_Extra; } - //Main Text + // Main Text if (checkNameOverrides.contains(loc->GetRandomizerCheck())) { txt = checkNameOverrides[loc->GetRandomizerCheck()]; } else { txt = loc->GetShortName(); } - + if (lastLocationChecked == loc->GetRandomizerCheck()) { txt = "* " + txt; } // Draw button - for Skipped/Seen/Scummed/Unchecked only - if (status == RCSHOW_UNCHECKED || status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED || status == RCSHOW_SCUMMED || skipped) { - if (UIWidgets::StateButton(std::to_string(rc).c_str(), skipped ? ICON_FA_PLUS : ICON_FA_TIMES)) { + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { 4.0f, 3.0f }); + float sz = ImGui::GetFrameHeight(); + if (status == RCSHOW_UNCHECKED || status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED || + status == RCSHOW_SCUMMED || skipped) { + if (UIWidgets::StateButton(std::to_string(rc).c_str(), skipped ? ICON_FA_PLUS : ICON_FA_TIMES, ImVec2(sz, sz), + UIWidgets::ButtonOptions().Color(THEME_COLOR))) { if (skipped) { OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(false); areaChecksGotten[loc->GetArea()]--; totalChecksGotten--; + if (available) { + areaChecksAvailable[loc->GetArea()]++; + totalChecksAvailable++; + } } else { OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(true); areaChecksGotten[loc->GetArea()]++; totalChecksGotten++; + if (available) { + areaChecksAvailable[loc->GetArea()]--; + totalChecksAvailable--; + } } UpdateOrdering(loc->GetArea()); UpdateInventoryChecks(); SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); } } else { - ImGui::Dummy(ImVec2(20.0f, 10.0f)); + ImGui::Dummy(ImVec2(sz, sz)); } + ImGui::PopStyleVar(); + ImGui::SameLine(); - //Draw - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(mainColor.r / 255.0f, mainColor.g / 255.0f, mainColor.b / 255.0f, mainColor.a / 255.0f)); + // Draw + ImVec4 styleColor(mainColor.r / 255.0f, mainColor.g / 255.0f, mainColor.b / 255.0f, mainColor.a / 255.0f); + if (enableAvailableChecks) { + if (itemLoc->HasObtained()) { + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0, 0, 0, 0)); + } else { + ImGui::PushStyleColor(ImGuiCol_Text, styleColor); + } + ImGui::Text("%s", available ? ICON_FA_UNLOCK : ICON_FA_LOCK); + ImGui::PopStyleColor(); + ImGui::SameLine(); + } + + ImGui::PushStyleColor(ImGuiCol_Text, styleColor); ImGui::Text("%s", txt.c_str()); ImGui::PopStyleColor(); - //Draw the extra info + // Draw the extra info txt = ""; if (status != RCSHOW_UNCHECKED) { @@ -1567,7 +1850,8 @@ void DrawLocation(RandomizerCheck rc) { txt = itemLoc->GetPlacedItem().GetName().GetForLanguage(gSaveContext.language); } else { if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) { - if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER) { + if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER || + gSaveContext.language == LANGUAGE_JPN) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().english; } else if (gSaveContext.language == LANGUAGE_FRA) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().french; @@ -1578,16 +1862,20 @@ void DrawLocation(RandomizerCheck rc) { case RCSHOW_IDENTIFIED: case RCSHOW_SEEN: if (IS_RANDO) { - if (itemLoc->GetPlacedRandomizerGet() == RG_ICE_TRAP && !mystery && !itemLoc->IsAddedToPool()) { + if (itemLoc->GetPlacedRandomizerGet() == RG_ICE_TRAP && !mystery) { if (status == RCSHOW_IDENTIFIED) { - txt = OTRGlobals::Instance->gRandoContext->overrides[rc].GetTrickName().GetForLanguage(gSaveContext.language); + txt = OTRGlobals::Instance->gRandoContext->overrides[rc].GetTrickName().GetForLanguage( + gSaveContext.language); } else { - txt = Rando::StaticData::RetrieveItem(OTRGlobals::Instance->gRandoContext->overrides[rc].LooksLike()).GetName().GetForLanguage(gSaveContext.language); + txt = Rando::StaticData::RetrieveItem( + OTRGlobals::Instance->gRandoContext->overrides[rc].LooksLike()) + .GetName() + .GetForLanguage(gSaveContext.language); } - } else if (!mystery && !itemLoc->IsAddedToPool()) { + } else if (!mystery) { txt = itemLoc->GetPlacedItem().GetName().GetForLanguage(gSaveContext.language); } - if (IsVisibleInCheckTracker(rc) && status == RCSHOW_IDENTIFIED && !mystery && !itemLoc->IsAddedToPool()) { + if (IsVisibleInCheckTracker(rc) && status == RCSHOW_IDENTIFIED && !mystery) { auto price = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->GetPrice(); if (price) { txt += fmt::format(" - {}", price); @@ -1595,35 +1883,37 @@ void DrawLocation(RandomizerCheck rc) { } } else { if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) { - if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER) { + if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER || + gSaveContext.language == LANGUAGE_JPN) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().english; } else if (gSaveContext.language == LANGUAGE_FRA) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().french; } } } - break; + break; } } if (txt == "" && skipped) { txt = "Skipped"; // TODO language } - + if (txt != "") { - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(extraColor.r / 255.0f, extraColor.g / 255.0f, extraColor.b / 255.0f, extraColor.a / 255.0f)); + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(extraColor.r / 255.0f, extraColor.g / 255.0f, extraColor.b / 255.0f, + extraColor.a / 255.0f)); ImGui::SameLine(); ImGui::Text(" (%s)", txt.c_str()); ImGui::PopStyleColor(); } - + if (showLogicTooltip) { for (auto& locationInRegion : areaTable[itemLoc->GetParentRegionKey()].locations) { if (locationInRegion.GetLocation() == rc) { std::string conditionStr = locationInRegion.GetConditionStr(); if (conditionStr != "true") { - UIWidgets::InsertHelpHoverText(conditionStr); + UIWidgets::Tooltip(conditionStr.c_str()); } - return; + break; } } } @@ -1643,19 +1933,19 @@ static std::set rainbowCVars = { int hue = 0; void RainbowTick() { - float freqHue = hue * 2 * M_PI / (360 * CVarGetFloat(CVAR_COSMETIC("RainbowSpeed"), 0.6f)); + float freqHue = hue * 2 * M_PIf / (360 * CVarGetFloat(CVAR_COSMETIC("RainbowSpeed"), 0.6f)); for (auto& cvar : rainbowCVars) { - if (CVarGetInteger((cvar + "RBM").c_str(), 0) == 0) { + if (CVarGetInteger((cvar + ".Rainbow").c_str(), 0) == 0) { continue; } Color_RGBA8 newColor; - newColor.r = sin(freqHue + 0) * 127 + 128; - newColor.g = sin(freqHue + (2 * M_PI / 3)) * 127 + 128; - newColor.b = sin(freqHue + (4 * M_PI / 3)) * 127 + 128; + newColor.r = static_cast(sin(freqHue + 0) * 127) + 128; + newColor.g = static_cast(sin(freqHue + (2 * M_PI / 3)) * 127) + 128; + newColor.b = static_cast(sin(freqHue + (4 * M_PI / 3)) * 127) + 128; newColor.a = 255; - CVarSetColor(cvar.c_str(), newColor); + CVarSetColor((cvar + ".Value").c_str(), newColor); } hue++; @@ -1663,47 +1953,42 @@ void RainbowTick() { } void ImGuiDrawTwoColorPickerSection(const char* text, const char* cvarMainName, const char* cvarExtraName, - Color_RGBA8& main_color, Color_RGBA8& extra_color, Color_RGBA8& main_default_color, - Color_RGBA8& extra_default_color, const char* cvarHideName, const char* tooltip) { + Color_RGBA8& main_color, Color_RGBA8& extra_color, Color_RGBA8& main_default_color, + Color_RGBA8& extra_default_color, const char* cvarHideName, const char* tooltip, + UIWidgets::Colors theme) { Color_RGBA8 cvarMainColor = CVarGetColor(cvarMainName, main_default_color); Color_RGBA8 cvarExtraColor = CVarGetColor(cvarExtraName, extra_default_color); main_color = cvarMainColor; extra_color = cvarExtraColor; + UIWidgets::PushStyleCombobox(theme); if (ImGui::CollapsingHeader(text)) { if (*cvarHideName != '\0') { std::string label = cvarHideName; label += "##Hidden"; ImGui::PushID(label.c_str()); - UIWidgets::EnhancementCheckbox("Hidden", cvarHideName, false, - "When active, checks will hide by default when updated to this state. Can " - "be overriden with the \"Show Hidden Items\" option."); + UIWidgets::CVarCheckbox( + "Hidden", cvarHideName, + UIWidgets::CheckboxOptions( + { { .tooltip = "When active, checks will hide by default when updated to this state. Can " + "be overridden with the \"Show Hidden Items\" option." } }) + .Color(theme)); ImGui::PopID(); } - if (ImGui::BeginTable(text, 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV | ImGuiTableFlags_Hideable)) { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - if (UIWidgets::EnhancementColor("Check", cvarMainName, - ImVec4(main_color.r, main_color.g, main_color.b, main_color.a), - ImVec4(main_default_color.r, main_default_color.g, main_default_color.b, main_default_color.a))) - { - main_color = CVarGetColor(cvarMainName, main_default_color); - }; - ImGui::PopItemWidth(); + std::string mainLabel = "Name##" + std::string(cvarMainName); + if (UIWidgets::CVarColorPicker(mainLabel.c_str(), cvarMainName, main_default_color, false, + UIWidgets::ColorPickerRandomButton | UIWidgets::ColorPickerResetButton | + UIWidgets::ColorPickerRainbowCheck, + theme)) { + main_color = CVarGetColor(cvarMainName, main_default_color); + } - ImGui::TableNextColumn(); - ImGui::AlignTextToFramePadding(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - if (UIWidgets::EnhancementColor("Details", cvarExtraName, - ImVec4(extra_color.r, extra_color.g, extra_color.b, extra_color.a), - ImVec4(extra_default_color.r, extra_default_color.g, extra_default_color.b, extra_default_color.a))) - { - extra_color = CVarGetColor(cvarExtraName, extra_default_color); - } - ImGui::PopItemWidth(); - - ImGui::EndTable(); + std::string extraLabel = "Details##" + std::string(cvarExtraName); + if (UIWidgets::CVarColorPicker(extraLabel.c_str(), cvarExtraName, extra_default_color, false, + UIWidgets::ColorPickerRandomButton | UIWidgets::ColorPickerResetButton | + UIWidgets::ColorPickerRainbowCheck, + theme)) { + extra_color = CVarGetColor(cvarExtraName, extra_default_color); } } if (tooltip != NULL && strlen(tooltip) != 0) { @@ -1711,6 +1996,57 @@ void ImGuiDrawTwoColorPickerSection(const char* text, const char* cvarMainName, ImGui::Text(" ?"); UIWidgets::Tooltip(tooltip); } + UIWidgets::PopStyleCombobox(); +} + +void RecalculateAvailableChecks(RandomizerRegion startingRegion /* = RR_ROOT */) { + if (!enableAvailableChecks) { + return; + } + + ResetPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS); + StartPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS); + + const auto& ctx = Rando::Context::GetInstance(); + + std::vector targetLocations; + targetLocations.reserve(RC_MAX); + for (auto& location : Rando::StaticData::GetLocationTable()) { + RandomizerCheck rc = location.GetRandomizerCheck(); + Rando::ItemLocation* itemLocation = ctx->GetItemLocation(rc); + itemLocation->SetAvailable(false); + if (!itemLocation->HasObtained()) { + targetLocations.emplace_back(rc); + } + } + + std::vector availableChecks = ReachabilitySearch(targetLocations, RG_NONE, true, startingRegion); + for (auto& rc : availableChecks) { + const auto& itemLocation = ctx->GetItemLocation(rc); + itemLocation->SetAvailable(true); + } + + totalChecksAvailable = 0; + for (auto& [rcArea, vec] : checksByArea) { + areaChecksAvailable[rcArea] = 0; + for (auto& rc : vec) { + Rando::ItemLocation* itemLocation = ctx->GetItemLocation(rc); + if (itemLocation->IsAvailable() && IsVisibleInCheckTracker(rc) && !IsCheckHidden(rc)) { + areaChecksAvailable[rcArea]++; + } + } + totalChecksAvailable += areaChecksAvailable[rcArea]; + } + + StopPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS); + SPDLOG_INFO("Recalculate Available Checks Time: {}ms", + GetPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS).count()); +} + +void CheckTracker_LoadFromPreset(nlohmann::json info) { + presetLoaded = true; + presetPos = { info["pos"]["x"], info["pos"]["y"] }; + presetSize = { info["size"]["width"], info["size"]["height"] }; } void CheckTrackerWindow::Draw() { @@ -1722,72 +2058,167 @@ void CheckTrackerWindow::Draw() { SyncVisibilityConsoleVariable(); } -static const char* windowType[] = { "Floating", "Window" }; -static const char* displayType[] = { "Always", "Combo Button Hold" }; -static const char* buttonStrings[] = { "A Button", "B Button", "C-Up", "C-Down", "C-Left", "C-Right", "L Button", - "Z Button", "R Button", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }; +static std::unordered_map windowType = { { TRACKER_WINDOW_FLOATING, "Floating" }, + { TRACKER_WINDOW_WINDOW, "Window" } }; +static std::unordered_map displayType = { { 0, "Always" }, { 1, "Combo Button Hold" } }; +static std::unordered_map buttonStrings = { + { TRACKER_COMBO_BUTTON_A, "A Button" }, { TRACKER_COMBO_BUTTON_B, "B Button" }, + { TRACKER_COMBO_BUTTON_C_UP, "C-Up" }, { TRACKER_COMBO_BUTTON_C_DOWN, "C-Down" }, + { TRACKER_COMBO_BUTTON_C_LEFT, "C-Left" }, { TRACKER_COMBO_BUTTON_C_RIGHT, "C-Right" }, + { TRACKER_COMBO_BUTTON_L, "L Button" }, { TRACKER_COMBO_BUTTON_Z, "Z Button" }, + { TRACKER_COMBO_BUTTON_R, "R Button" }, { TRACKER_COMBO_BUTTON_START, "Start" }, + { TRACKER_COMBO_BUTTON_D_UP, "D-Up" }, { TRACKER_COMBO_BUTTON_D_DOWN, "D-Down" }, + { TRACKER_COMBO_BUTTON_D_LEFT, "D-Left" }, { TRACKER_COMBO_BUTTON_D_RIGHT, "D-Right" } +}; void CheckTrackerSettingsWindow::DrawElement() { + if (recalculateAvailable) { + recalculateAvailable = false; + RecalculateAvailableChecks(); + } ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); - ImGui::BeginTable("CheckTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV); - ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Section settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableHeadersRow(); - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - if (UIWidgets::EnhancementColor("BG Color", CVAR_TRACKER_CHECK("BgColor"), - ImVec4(Color_Background.r, Color_Background.g, Color_Background.b, Color_Background.a), - ImVec4(Color_Bg_Default.r, Color_Bg_Default.g, Color_Bg_Default.b, Color_Bg_Default.a), - false, true)) - { - Color_Background = CVarGetColor(CVAR_TRACKER_CHECK("BgColor"), Color_Bg_Default); - } - ImGui::PopItemWidth(); + if (ImGui::BeginTable("CheckTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { + ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Section settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableHeadersRow(); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); + UIWidgets::CVarColorPicker("BG Color", CVAR_TRACKER_CHECK("BgColor"), Color_Bg_Default, true, + UIWidgets::ColorPickerResetButton | UIWidgets::ColorPickerRandomButton, THEME_COLOR); + ImGui::PopItemWidth(); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Window Type", CVAR_TRACKER_CHECK("WindowType"), windowType, TRACKER_WINDOW_WINDOW); - if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { - UIWidgets::EnhancementCheckbox("Enable Dragging", CVAR_TRACKER_CHECK("Draggable")); - UIWidgets::EnhancementCheckbox("Only enable while paused", CVAR_TRACKER_CHECK("ShowOnlyPaused")); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Display Mode", CVAR_TRACKER_CHECK("DisplayType"), displayType, 0); - if (CVarGetInteger(CVAR_TRACKER_CHECK("DisplayType"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) { - UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 1", CVAR_TRACKER_CHECK("ComboButton1"), buttonStrings, TRACKER_COMBO_BUTTON_L); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 2", CVAR_TRACKER_CHECK("ComboButton2"), buttonStrings, TRACKER_COMBO_BUTTON_R); + UIWidgets::CVarCombobox("Window Type", CVAR_TRACKER_CHECK("WindowType"), windowType, + UIWidgets::ComboboxOptions() + .LabelPosition(UIWidgets::LabelPositions::Far) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right) + .Color(THEME_COLOR) + .DefaultIndex(TRACKER_WINDOW_WINDOW)); + + if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { + UIWidgets::CVarCheckbox("Enable Dragging", CVAR_TRACKER_CHECK("Draggable"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Only enable while paused", CVAR_TRACKER_CHECK("ShowOnlyPaused"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarCombobox("Display Mode", CVAR_TRACKER_CHECK("DisplayType"), displayType, + UIWidgets::ComboboxOptions() + .LabelPosition(UIWidgets::LabelPositions::Far) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right) + .Color(THEME_COLOR) + .DefaultIndex(0)); + if (CVarGetInteger(CVAR_TRACKER_CHECK("DisplayType"), TRACKER_DISPLAY_ALWAYS) == + TRACKER_DISPLAY_COMBO_BUTTON) { + UIWidgets::CVarCombobox("Combo Button 1", CVAR_TRACKER_CHECK("ComboButton1"), buttonStrings, + UIWidgets::ComboboxOptions() + .LabelPosition(UIWidgets::LabelPositions::Far) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right) + .Color(THEME_COLOR) + .DefaultIndex(TRACKER_COMBO_BUTTON_L)); + UIWidgets::CVarCombobox("Combo Button 2", CVAR_TRACKER_CHECK("ComboButton2"), buttonStrings, + UIWidgets::ComboboxOptions() + .LabelPosition(UIWidgets::LabelPositions::Far) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right) + .Color(THEME_COLOR) + .DefaultIndex(TRACKER_COMBO_BUTTON_L)); + } } + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + UIWidgets::CVarCheckbox("Vanilla/MQ Dungeon Spoilers", CVAR_TRACKER_CHECK("MQSpoilers"), + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, Vanilla/MQ dungeons will show on the tracker immediately. " + "Otherwise, Vanilla/MQ dungeon locations must be unlocked.") + .Color(THEME_COLOR)); + ImGui::EndDisabled(); + if (UIWidgets::CVarCheckbox( + "Hide unshuffled shop item checks", CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, will prevent the tracker from displaying slots with non-shop-item shuffles.") + .Color(THEME_COLOR))) { + hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 0); + UpdateFilters(); + } + if (UIWidgets::CVarCheckbox( + "Always show gold skulltulas", CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, will show GS locations in the tracker regardless of tokensanity settings.") + .Color(THEME_COLOR))) { + alwaysShowGS = !alwaysShowGS; + UpdateFilters(); + } + UIWidgets::CVarCheckbox("Show Logic", CVAR_TRACKER_CHECK("ShowLogic"), + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, will show a check's logic when hovering over it.") + .Color(THEME_COLOR)); + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + if (UIWidgets::CVarCheckbox("Enable Available Checks", CVAR_TRACKER_CHECK("EnableAvailableChecks"), + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, will show the checks that are available to be collected " + "with your current progress.") + .Color(THEME_COLOR))) { + enableAvailableChecks = CVarGetInteger(CVAR_TRACKER_CHECK("EnableAvailableChecks"), 0); + + if (GameInteractor::IsSaveLoaded(true)) { + RecalculateAvailableChecks(); + } + } + ImGui::EndDisabled(); + + // Filtering settings + UIWidgets::PaddedSeparator(); + UIWidgets::CVarCheckbox( + "Filter Empty Areas", CVAR_TRACKER_CHECK("HideFilteredAreas"), + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, will hide area headers that have no locations matching filter") + .Color(THEME_COLOR) + .DefaultValue(true)); + + ImGui::TableNextColumn(); + + CheckTracker::ImGuiDrawTwoColorPickerSection("Area Incomplete", CVAR_TRACKER_CHECK("AreaIncomplete.MainColor"), + CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor"), + Color_Area_Incomplete_Main, Color_Area_Incomplete_Extra, + Color_Main_Default, Color_Area_Incomplete_Extra_Default, + CVAR_TRACKER_CHECK("AreaIncomplete.Hide"), "", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection("Area Complete", CVAR_TRACKER_CHECK("AreaComplete.MainColor"), + CVAR_TRACKER_CHECK("AreaComplete.ExtraColor"), + Color_Area_Complete_Main, Color_Area_Complete_Extra, + Color_Main_Default, Color_Area_Complete_Extra_Default, + CVAR_TRACKER_CHECK("AreaComplete.Hide"), "", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Unchecked", CVAR_TRACKER_CHECK("Unchecked.MainColor"), CVAR_TRACKER_CHECK("Unchecked.ExtraColor"), + Color_Unchecked_Main, Color_Unchecked_Extra, Color_Main_Default, Color_Unchecked_Extra_Default, + CVAR_TRACKER_CHECK("Unchecked.Hide"), "Checks you have not interacted with at all.", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Skipped", CVAR_TRACKER_CHECK("Skipped.MainColor"), CVAR_TRACKER_CHECK("Skipped.ExtraColor"), + Color_Skipped_Main, Color_Skipped_Extra, Color_Main_Default, Color_Skipped_Extra_Default, + CVAR_TRACKER_CHECK("Skipped.Hide"), "", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Seen", CVAR_TRACKER_CHECK("Seen.MainColor"), CVAR_TRACKER_CHECK("Seen.ExtraColor"), Color_Seen_Main, + Color_Seen_Extra, Color_Main_Default, Color_Seen_Extra_Default, CVAR_TRACKER_CHECK("Seen.Hide"), + "Used for shops. Shows item names for shop slots when walking in, and prices when highlighting them in buy " + "mode.", + THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Scummed", CVAR_TRACKER_CHECK("Scummed.MainColor"), CVAR_TRACKER_CHECK("Scummed.ExtraColor"), + Color_Scummed_Main, Color_Scummed_Extra, Color_Main_Default, Color_Scummed_Extra_Default, + CVAR_TRACKER_CHECK("Scummed.Hide"), + "Checks you collect, but then reload before saving so you no longer have them.", THEME_COLOR); + // CheckTracker::ImGuiDrawTwoColorPickerSection("Hinted (WIP)", CVAR_TRACKER_CHECK("Hinted.MainColor"), + // CVAR_TRACKER_CHECK("Hinted.ExtraColor"), Color_Hinted_Main, Color_Hinted_Extra, + // Color_Main_Default, Color_Hinted_Extra_Default, CVAR_TRACKER_CHECK("Hinted.Hide"), "", + // THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Collected", CVAR_TRACKER_CHECK("Collected.MainColor"), CVAR_TRACKER_CHECK("Collected.ExtraColor"), + Color_Collected_Main, Color_Collected_Extra, Color_Main_Default, Color_Collected_Extra_Default, + CVAR_TRACKER_CHECK("Collected.Hide"), "Checks you have collected without saving or reloading yet.", + THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Saved", CVAR_TRACKER_CHECK("Saved.MainColor"), CVAR_TRACKER_CHECK("Saved.ExtraColor"), Color_Saved_Main, + Color_Saved_Extra, Color_Main_Default, Color_Saved_Extra_Default, CVAR_TRACKER_CHECK("Saved.Hide"), + "Checks that you saved the game while having collected.", THEME_COLOR); + + ImGui::PopStyleVar(1); } - UIWidgets::EnhancementCheckbox("Vanilla/MQ Dungeon Spoilers", CVAR_TRACKER_CHECK("MQSpoilers")); - UIWidgets::Tooltip("If enabled, Vanilla/MQ dungeons will show on the tracker immediately. Otherwise, Vanilla/MQ dungeon locations must be unlocked."); - if (UIWidgets::EnhancementCheckbox("Hide unshuffled shop item checks", CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), false, "", UIWidgets::CheckboxGraphics::Cross, false)) { - hideShopUnshuffledChecks = !hideShopUnshuffledChecks; - UpdateFilters(); - } - UIWidgets::Tooltip("If enabled, will prevent the tracker from displaying slots with non-shop-item shuffles."); - if (UIWidgets::EnhancementCheckbox("Always show gold skulltulas", CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), false, "")) { - alwaysShowGS = !alwaysShowGS; - UpdateFilters(); - } - UIWidgets::Tooltip("If enabled, will show GS locations in the tracker regardless of tokensanity settings."); - UIWidgets::EnhancementCheckbox("Show Logic", "gCheckTrackerOptionShowLogic"); - UIWidgets::Tooltip("If enabled, will show a check's logic when hovering over it."); - - // Filtering settings - UIWidgets::PaddedSeparator(); - UIWidgets::EnhancementCheckbox("Filter Empty Areas", CVAR_TRACKER_CHECK("HideFilteredAreas"), false, "", UIWidgets::CheckboxGraphics::Checkmark, true); - UIWidgets::Tooltip("If enabled, will hide area headers that have no locations matching filter"); - - ImGui::TableNextColumn(); - - CheckTracker::ImGuiDrawTwoColorPickerSection("Area Incomplete", CVAR_TRACKER_CHECK("AreaIncomplete.MainColor"), CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor"), Color_Area_Incomplete_Main, Color_Area_Incomplete_Extra, Color_Main_Default, Color_Area_Incomplete_Extra_Default, CVAR_TRACKER_CHECK("AreaIncomplete.Hide"), ""); - CheckTracker::ImGuiDrawTwoColorPickerSection("Area Complete", CVAR_TRACKER_CHECK("AreaComplete.MainColor"), CVAR_TRACKER_CHECK("AreaComplete.ExtraColor"), Color_Area_Complete_Main, Color_Area_Complete_Extra, Color_Main_Default, Color_Area_Complete_Extra_Default, CVAR_TRACKER_CHECK("AreaComplete.Hide"), ""); - CheckTracker::ImGuiDrawTwoColorPickerSection("Unchecked", CVAR_TRACKER_CHECK("Unchecked.MainColor"), CVAR_TRACKER_CHECK("Unchecked.ExtraColor"), Color_Unchecked_Main, Color_Unchecked_Extra, Color_Main_Default, Color_Unchecked_Extra_Default, CVAR_TRACKER_CHECK("Unchecked.Hide"), "Checks you have not interacted with at all."); - CheckTracker::ImGuiDrawTwoColorPickerSection("Skipped", CVAR_TRACKER_CHECK("Skipped.MainColor"), CVAR_TRACKER_CHECK("Skipped.ExtraColor"), Color_Skipped_Main, Color_Skipped_Extra, Color_Main_Default, Color_Skipped_Extra_Default, CVAR_TRACKER_CHECK("Skipped.Hide"), ""); - CheckTracker::ImGuiDrawTwoColorPickerSection("Seen", CVAR_TRACKER_CHECK("Seen.MainColor"), CVAR_TRACKER_CHECK("Seen.ExtraColor"), Color_Seen_Main, Color_Seen_Extra, Color_Main_Default, Color_Seen_Extra_Default, CVAR_TRACKER_CHECK("Seen.Hide"), "Used for shops. Shows item names for shop slots when walking in, and prices when highlighting them in buy mode."); - CheckTracker::ImGuiDrawTwoColorPickerSection("Scummed", CVAR_TRACKER_CHECK("Scummed.MainColor"), CVAR_TRACKER_CHECK("Scummed.ExtraColor"), Color_Scummed_Main, Color_Scummed_Extra, Color_Main_Default, Color_Scummed_Extra_Default, CVAR_TRACKER_CHECK("Scummed.Hide"), "Checks you collect, but then reload before saving so you no longer have them."); - //CheckTracker::ImGuiDrawTwoColorPickerSection("Hinted (WIP)", CVAR_TRACKER_CHECK("Hinted.MainColor"), CVAR_TRACKER_CHECK("Hinted.ExtraColor"), Color_Hinted_Main, Color_Hinted_Extra, Color_Main_Default, Color_Hinted_Extra_Default, CVAR_TRACKER_CHECK("Hinted.Hide"), ""); - CheckTracker::ImGuiDrawTwoColorPickerSection("Collected", CVAR_TRACKER_CHECK("Collected.MainColor"), CVAR_TRACKER_CHECK("Collected.ExtraColor"), Color_Collected_Main, Color_Collected_Extra, Color_Main_Default, Color_Collected_Extra_Default, CVAR_TRACKER_CHECK("Collected.Hide"), "Checks you have collected without saving or reloading yet."); - CheckTracker::ImGuiDrawTwoColorPickerSection("Saved", CVAR_TRACKER_CHECK("Saved.MainColor"), CVAR_TRACKER_CHECK("Saved.ExtraColor"), Color_Saved_Main, Color_Saved_Extra, Color_Main_Default, Color_Saved_Extra_Default, CVAR_TRACKER_CHECK("Saved.Hide"), "Checks that you saved the game while having collected."); - - ImGui::PopStyleVar(1); ImGui::EndTable(); } @@ -1796,9 +2227,7 @@ void CheckTrackerWindow::InitElement() { sectionId = SaveManager::Instance->AddSaveFunction("trackerData", 1, SaveFile, true, SECTION_PARENT_NONE); SaveManager::Instance->AddLoadFunction("trackerData", 1, LoadFile); GameInteractor::Instance->RegisterGameHook(CheckTrackerLoadGame); - GameInteractor::Instance->RegisterGameHook([](uint32_t fileNum) { - Teardown(); - }); + GameInteractor::Instance->RegisterGameHook([](uint32_t fileNum) { Teardown(); }); GameInteractor::Instance->RegisterGameHook(CheckTrackerItemReceive); GameInteractor::Instance->RegisterGameHook(CheckTrackerTransition); GameInteractor::Instance->RegisterGameHook(CheckTrackerShopSlotChange); @@ -1807,36 +2236,5 @@ void CheckTrackerWindow::InitElement() { } void CheckTrackerWindow::UpdateElement() { - Color_Background = CVarGetColor(CVAR_TRACKER_CHECK("BgColor"), Color_Bg_Default); - Color_Area_Incomplete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor"), Color_Main_Default); - Color_Area_Incomplete_Extra = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor"), Color_Area_Incomplete_Extra_Default); - Color_Area_Complete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor"), Color_Main_Default); - Color_Area_Complete_Extra = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor"), Color_Area_Complete_Extra_Default); - Color_Unchecked_Main = CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.MainColor"), Color_Main_Default); - Color_Unchecked_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.ExtraColor"), Color_Unchecked_Extra_Default); - Color_Skipped_Main = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.MainColor"), Color_Main_Default); - Color_Skipped_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.ExtraColor"), Color_Skipped_Extra_Default); - Color_Seen_Main = CVarGetColor(CVAR_TRACKER_CHECK("Seen.MainColor"), Color_Main_Default); - Color_Seen_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Seen.ExtraColor"), Color_Seen_Extra_Default); - Color_Hinted_Main = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.MainColor"), Color_Main_Default); - Color_Hinted_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.ExtraColor"), Color_Hinted_Extra_Default); - Color_Collected_Main = CVarGetColor(CVAR_TRACKER_CHECK("Collected.MainColor"), Color_Main_Default); - Color_Collected_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Collected.ExtraColor"), Color_Collected_Extra_Default); - Color_Scummed_Main = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.MainColor"), Color_Main_Default); - Color_Scummed_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.ExtraColor"), Color_Scummed_Extra_Default); - Color_Saved_Main = CVarGetColor(CVAR_TRACKER_CHECK("Saved.MainColor"), Color_Main_Default); - Color_Saved_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Saved.ExtraColor"), Color_Saved_Extra_Default); - hideUnchecked = CVarGetInteger(CVAR_TRACKER_CHECK("Unchecked.Hide"), 0); - hideScummed = CVarGetInteger(CVAR_TRACKER_CHECK("Scummed.Hide"), 0); - hideSeen = CVarGetInteger(CVAR_TRACKER_CHECK("Seen.Hide"), 0); - hideSkipped = CVarGetInteger(CVAR_TRACKER_CHECK("Skipped.Hide"), 0); - hideSaved = CVarGetInteger(CVAR_TRACKER_CHECK("Saved.Hide"), 0); - hideCollected = CVarGetInteger(CVAR_TRACKER_CHECK("Collected.Hide"), 0); - showHidden = CVarGetInteger(CVAR_TRACKER_CHECK("ShowHidden"), 0); - mystery = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0); - showLogicTooltip = CVarGetInteger("gCheckTrackerOptionShowLogic", 0); - - hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 1); - alwaysShowGS = CVarGetInteger(CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), 0); } } // namespace CheckTracker diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h index 8519104890..38c38a39b8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h @@ -2,27 +2,28 @@ #include #include "randomizerTypes.h" #include "randomizer_check_objects.h" +#include "soh/SohGui/UIWidgets.hpp" #include namespace CheckTracker { -class CheckTrackerSettingsWindow : public Ship::GuiWindow { +class CheckTrackerSettingsWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; - ~CheckTrackerSettingsWindow() {}; + ~CheckTrackerSettingsWindow(){}; protected: - void InitElement() override {}; + void InitElement() override{}; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; -class CheckTrackerWindow : public Ship::GuiWindow { +class CheckTrackerWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void Draw() override; - ~CheckTrackerWindow() {}; + ~CheckTrackerWindow(){}; protected: void InitElement() override; @@ -30,18 +31,18 @@ class CheckTrackerWindow : public Ship::GuiWindow { void UpdateElement() override; }; -//Converts an index into a Little Endian bitmask, as follows: -//00: 0000000100000000 -//01: 0000001000000000 +// Converts an index into a Little Endian bitmask, as follows: +// 00: 0000000100000000 +// 01: 0000001000000000 //... -//06: 0100000000000000 -//07: 1000000000000000 -//08: 0000000000000001 -//09: 0000000000000010 +// 06: 0100000000000000 +// 07: 1000000000000000 +// 08: 0000000000000001 +// 09: 0000000000000010 //... -//14: 0000000001000000 -//15: 0000000010000000 -//repeat... +// 14: 0000000001000000 +// 15: 0000000010000000 +// repeat... #define INDEX_TO_16BIT_LITTLE_ENDIAN_BITMASK(idx) (0x8000 >> (7 - (idx % 8) + ((idx % 16) / 8) * 8)) void Teardown(); @@ -60,4 +61,6 @@ void UpdateAllOrdering(); void UpdateAllAreas(); void RecalculateAllAreaTotals(); void SpoilAreaFromCheck(RandomizerCheck rc); +void RecalculateAvailableChecks(RandomizerRegion startingRegion = RR_ROOT); +void CheckTracker_LoadFromPreset(nlohmann::json info); } // namespace CheckTracker diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index 3ad26b1f6f..e32223124e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -1,7 +1,8 @@ /* * Much of the code here was borrowed from https://github.com/gamestabled/OoT3D_Randomizer/blob/main/code/src/entrance.c - * It's been adapted for SoH to use our gPlayState vs their gGlobalContext with slightly different named properties, and our enums for some scenes/entrances. - * + * It's been adapted for SoH to use our gPlayState vs their gGlobalContext with slightly different named properties, and + * our enums for some scenes/entrances. + * * Unlike 3DS rando, we need to be able to support the user loading up vanilla and rando saves, so the logic around * modifying the entrance table requires that we save the original table and reset whenever loading a vanilla save. * A modified dynamicExitList is manually included since we can't read it from addressing like 3ds rando. @@ -18,8 +19,8 @@ extern PlayState* gPlayState; -//Overwrite the dynamic exit for the OGC Fairy Fountain to be 0x3E8 instead -//of 0x340 (0x340 will stay as the exit for the HC Fairy Fountain -> Castle Grounds) +// Overwrite the dynamic exit for the OGC Fairy Fountain to be 0x3E8 instead +// of 0x340 (0x340 will stay as the exit for the HC Fairy Fountain -> Castle Grounds) s16 dynamicExitList[] = { ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT, ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT, @@ -34,19 +35,23 @@ s16 dynamicExitList[] = { ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY, ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT, // HC Fairy - ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT + ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT, }; -// Warp Song indices array : 0x53C33C = { ENTR_SACRED_FOREST_MEADOW_WARP_PAD, ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD, ENTR_LAKE_HYLIA_WARP_PAD, ENTR_DESERT_COLOSSUS_WARP_PAD, ENTR_GRAVEYARD_WARP_PAD, ENTR_TEMPLE_OF_TIME_WARP_PAD } +// Warp Song indices array: +// 0x53C33C = { +// ENTR_SACRED_FOREST_MEADOW_WARP_PAD, ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD, ENTR_LAKE_HYLIA_WARP_PAD, +// ENTR_DESERT_COLOSSUS_WARP_PAD, ENTR_GRAVEYARD_WARP_PAD, ENTR_TEMPLE_OF_TIME_WARP_PAD +// } // Owl Flights : 0x492064 and 0x492080 -static s16 entranceOverrideTable[ENTRANCE_TABLE_SIZE] = {0}; +static s16 entranceOverrideTable[ENTRANCE_TABLE_SIZE] = { 0 }; // Boss scenes (normalize boss scene range to 0 on lookup) mapped to save/death warp entrance -static s16 bossSceneSaveDeathWarps[SHUFFLEABLE_BOSS_COUNT] = {0}; -static ActorEntry modifiedLinkActorEntry = {0}; +static s16 bossSceneSaveDeathWarps[SHUFFLEABLE_BOSS_COUNT] = { 0 }; +static ActorEntry modifiedLinkActorEntry = { 0 }; -EntranceInfo originalEntranceTable[ENTRANCE_TABLE_SIZE] = {0}; +EntranceInfo originalEntranceTable[ENTRANCE_TABLE_SIZE] = { 0 }; typedef struct { s16 entryway; @@ -59,6 +64,7 @@ typedef struct { } DungeonEntranceInfo; static DungeonEntranceInfo dungeons[] = { + // clang-format off //entryway exit, boss, reverse, bluewarp, dungeon scene, boss scene { ENTR_DEKU_TREE_ENTRANCE, ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE, ENTR_DEKU_TREE_BOSS_ENTRANCE, ENTR_DEKU_TREE_BOSS_DOOR, ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP, SCENE_DEKU_TREE, SCENE_DEKU_TREE_BOSS }, { ENTR_DODONGOS_CAVERN_ENTRANCE, ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE, ENTR_DODONGOS_CAVERN_BOSS_DOOR, ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP, SCENE_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN_BOSS }, @@ -68,6 +74,8 @@ static DungeonEntranceInfo dungeons[] = { { ENTR_WATER_TEMPLE_ENTRANCE, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, ENTR_WATER_TEMPLE_BOSS_ENTRANCE, ENTR_WATER_TEMPLE_BOSS_DOOR, ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP, SCENE_WATER_TEMPLE, SCENE_WATER_TEMPLE_BOSS }, { ENTR_SPIRIT_TEMPLE_ENTRANCE, ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE, ENTR_SPIRIT_TEMPLE_BOSS_DOOR, ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP, SCENE_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE_BOSS }, { ENTR_SHADOW_TEMPLE_ENTRANCE, ENTR_GRAVEYARD_OUTSIDE_TEMPLE, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE, ENTR_SHADOW_TEMPLE_BOSS_DOOR, ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP, SCENE_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE_BOSS }, + + // clang-format on }; static s8 hasCopiedEntranceTable = 0; @@ -81,16 +89,16 @@ u8 Entrance_EntranceIsNull(EntranceOverride* entranceOverride) { } static void Entrance_SeparateOGCFairyFountainExit(void) { - //Overwrite unused entrance 0x03E8 (ENTR_POTION_SHOP_KAKARIKO_1) with values from 0x0340 (ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT) to use it as the - //exit from OGC Great Fairy Fountain -> Castle Grounds + // Overwrite unused entrance 0x03E8 (ENTR_POTION_SHOP_KAKARIKO_1) with values from 0x0340 + // (ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT) to use it as the exit from OGC Great Fairy Fountain -> Castle Grounds for (size_t i = 0; i < 4; ++i) { gEntranceTable[ENTR_POTION_SHOP_KAKARIKO_1 + i] = gEntranceTable[ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT + i]; } } static void Entrance_SeparateAdultSpawnAndPrelude() { - // Overwrite unused entrance 0x0282 (ENTR_HYRULE_FIELD_10) with values from 0x05F4 (ENTR_TEMPLE_OF_TIME_WARP_PAD) to use it as the - // Adult Spawn index and separate it from Prelude of Light + // Overwrite unused entrance 0x0282 (ENTR_HYRULE_FIELD_10) with values from 0x05F4 (ENTR_TEMPLE_OF_TIME_WARP_PAD) to + // use it as the Adult Spawn index and separate it from Prelude of Light for (size_t i = 0; i < 4; ++i) { gEntranceTable[ENTR_HYRULE_FIELD_10 + i] = gEntranceTable[ENTR_TEMPLE_OF_TIME_WARP_PAD + i]; } @@ -101,10 +109,12 @@ static void Entrance_ReplaceChildTempleWarps() { if (Randomizer_GetSettingValue(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || Randomizer_GetSettingValue(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF) { // Forest Temple - gEntranceTable[ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP] = gEntranceTable[ENTR_SACRED_FOREST_MEADOW_WARP_PAD]; + gEntranceTable[ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP] = + gEntranceTable[ENTR_SACRED_FOREST_MEADOW_WARP_PAD]; gEntranceTable[ENTR_SACRED_FOREST_MEADOW_3_1] = gEntranceTable[ENTR_SACRED_FOREST_MEADOW_2_1]; // Fire Temple - gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP] = gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD]; + gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP] = + gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD]; gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_5_1] = gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_4_1]; // Water Temple gEntranceTable[ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP] = gEntranceTable[ENTR_LAKE_HYLIA_WARP_PAD]; @@ -142,7 +152,8 @@ void Entrance_Init(void) { if (Randomizer_GetSettingValue(RSK_SKIP_CHILD_STEALTH)) { gEntranceTable[ENTR_CASTLE_COURTYARD_GUARDS_DAY_0].scene = SCENE_CASTLE_COURTYARD_ZELDA; gEntranceTable[ENTR_CASTLE_COURTYARD_GUARDS_DAY_0].spawn = 0; - gEntranceTable[ENTR_CASTLE_COURTYARD_GUARDS_DAY_0].field = ENTRANCE_INFO_FIELD(false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE); + gEntranceTable[ENTR_CASTLE_COURTYARD_GUARDS_DAY_0].field = + ENTRANCE_INFO_FIELD(false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE); } // Delete the title card and add a fade in for Hyrule Field from Ocarina of Time cutscene @@ -201,12 +212,12 @@ void Entrance_Init(void) { } // Overwrite grotto related indices - if (originalIndex >= ENTRANCE_GROTTO_EXIT_START) { + if (originalIndex >= ENTRANCE_GROTTO_EXIT_START && originalIndex < ENTRANCE_GROTTO_EXIT_START + NUM_GROTTOS) { Grotto_SetExitOverride(originalIndex, overrideIndex); continue; } - if (originalIndex >= ENTRANCE_GROTTO_LOAD_START && originalIndex < ENTRANCE_GROTTO_EXIT_START) { + if (originalIndex >= ENTRANCE_GROTTO_LOAD_START && originalIndex < ENTRANCE_GROTTO_LOAD_START + NUM_GROTTOS) { Grotto_SetLoadOverride(originalIndex, overrideIndex); continue; } @@ -214,10 +225,10 @@ void Entrance_Init(void) { // Overwrite the indices which we want to shuffle, leaving the rest as they are entranceOverrideTable[originalIndex] = overrideIndex; - //Override both land and water entrances for Hyrule Field -> ZR Front and vice versa - if (originalIndex == ENTR_ZORAS_RIVER_WEST_EXIT) { //Hyrule Field -> ZR Front land entrance + // Override both land and water entrances for Hyrule Field -> ZR Front and vice versa + if (originalIndex == ENTR_ZORAS_RIVER_WEST_EXIT) { // Hyrule Field -> ZR Front land entrance entranceOverrideTable[ENTR_ZORAS_RIVER_3] = overrideIndex; - } else if (originalIndex == ENTR_HYRULE_FIELD_RIVER_EXIT) { //ZR Front -> Hyrule Field land entrance + } else if (originalIndex == ENTR_HYRULE_FIELD_RIVER_EXIT) { // ZR Front -> Hyrule Field land entrance entranceOverrideTable[ENTR_HYRULE_FIELD_14] = overrideIndex; } } @@ -242,7 +253,9 @@ void Entrance_Init(void) { for (s16 i = 0; i < 4; i++) { // Zero out the bit in the field which tells the game to keep playing // background music for all four scene setups at each index - gEntranceTable[override + i].field &= ~ENTRANCE_INFO_CONTINUE_BGM_FLAG; + if (override + i < ENTRANCE_TABLE_SIZE) { + gEntranceTable[override + i].field &= ~ENTRANCE_INFO_CONTINUE_BGM_FLAG; + } } } } @@ -269,7 +282,9 @@ s16 Entrance_PeekNextIndexOverride(int16_t nextEntranceIndex) { s16 Entrance_OverrideNextIndex(s16 nextEntranceIndex) { // Exiting through the crawl space from Hyrule Castle courtyard is the same exit as leaving Ganon's castle // Don't override the entrance if we came from the Castle courtyard (day and night scenes) - if (gPlayState != NULL && (gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_DAY || gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_NIGHT) && + if (gPlayState != NULL && + (gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_DAY || + gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_NIGHT) && nextEntranceIndex == ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT) { return nextEntranceIndex; } @@ -316,37 +331,38 @@ void Entrance_SetGameOverEntrance(void) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF && scene >= SCENE_DEKU_TREE_BOSS && scene <= SCENE_SHADOW_TEMPLE_BOSS) { // Normalize boss scene range to 0 on lookup and handle for grotto entrances - gSaveContext.entranceIndex = Grotto_OverrideSpecialEntrance(bossSceneSaveDeathWarps[scene - SCENE_DEKU_TREE_BOSS]); + gSaveContext.entranceIndex = + Grotto_OverrideSpecialEntrance(bossSceneSaveDeathWarps[scene - SCENE_DEKU_TREE_BOSS]); return; } - //Set the current entrance depending on which entrance the player last came through + // Set the current entrance depending on which entrance the player last came through switch (gSaveContext.entranceIndex) { - case ENTR_DEKU_TREE_BOSS_ENTRANCE : //Deku Tree Boss Room + case ENTR_DEKU_TREE_BOSS_ENTRANCE: // Deku Tree Boss Room gSaveContext.entranceIndex = ENTR_DEKU_TREE_ENTRANCE; return; - case ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE : //Dodongos Cavern Boss Room + case ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE: // Dodongos Cavern Boss Room gSaveContext.entranceIndex = ENTR_DODONGOS_CAVERN_ENTRANCE; return; - case ENTR_JABU_JABU_BOSS_ENTRANCE : //Jabu Jabus Belly Boss Room + case ENTR_JABU_JABU_BOSS_ENTRANCE: // Jabu Jabus Belly Boss Room gSaveContext.entranceIndex = ENTR_JABU_JABU_ENTRANCE; return; - case ENTR_FOREST_TEMPLE_BOSS_ENTRANCE : //Forest Temple Boss Room + case ENTR_FOREST_TEMPLE_BOSS_ENTRANCE: // Forest Temple Boss Room gSaveContext.entranceIndex = ENTR_FOREST_TEMPLE_ENTRANCE; return; - case ENTR_FIRE_TEMPLE_BOSS_ENTRANCE : //Fire Temple Boss Room + case ENTR_FIRE_TEMPLE_BOSS_ENTRANCE: // Fire Temple Boss Room gSaveContext.entranceIndex = ENTR_FIRE_TEMPLE_ENTRANCE; return; - case ENTR_WATER_TEMPLE_BOSS_ENTRANCE : //Water Temple Boss Room + case ENTR_WATER_TEMPLE_BOSS_ENTRANCE: // Water Temple Boss Room gSaveContext.entranceIndex = ENTR_WATER_TEMPLE_ENTRANCE; return; - case ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE : //Spirit Temple Boss Room + case ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE: // Spirit Temple Boss Room gSaveContext.entranceIndex = ENTR_SPIRIT_TEMPLE_ENTRANCE; return; - case ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE : //Shadow Temple Boss Room + case ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE: // Shadow Temple Boss Room gSaveContext.entranceIndex = ENTR_SHADOW_TEMPLE_ENTRANCE; return; - case ENTR_GANONDORF_BOSS_0 : //Ganondorf Boss Room + case ENTR_GANONDORF_BOSS_0: // Ganondorf Boss Room gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb return; } @@ -361,7 +377,8 @@ void Entrance_SetSavewarpEntrance(void) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF && scene >= SCENE_DEKU_TREE_BOSS && scene <= SCENE_SHADOW_TEMPLE_BOSS) { // Normalize boss scene range to 0 on lookup and handle for grotto entrances - gSaveContext.entranceIndex = Grotto_OverrideSpecialEntrance(bossSceneSaveDeathWarps[scene - SCENE_DEKU_TREE_BOSS]); + gSaveContext.entranceIndex = + Grotto_OverrideSpecialEntrance(bossSceneSaveDeathWarps[scene - SCENE_DEKU_TREE_BOSS]); return; } @@ -371,15 +388,15 @@ void Entrance_SetSavewarpEntrance(void) { gSaveContext.entranceIndex = ENTR_DODONGOS_CAVERN_ENTRANCE; } else if (scene == SCENE_JABU_JABU || scene == SCENE_JABU_JABU_BOSS) { gSaveContext.entranceIndex = ENTR_JABU_JABU_ENTRANCE; - } else if (scene == SCENE_FOREST_TEMPLE || scene == SCENE_FOREST_TEMPLE_BOSS) { //Forest Temple Boss Room + } else if (scene == SCENE_FOREST_TEMPLE || scene == SCENE_FOREST_TEMPLE_BOSS) { // Forest Temple Boss Room gSaveContext.entranceIndex = ENTR_FOREST_TEMPLE_ENTRANCE; - } else if (scene == SCENE_FIRE_TEMPLE || scene == SCENE_FIRE_TEMPLE_BOSS) { //Fire Temple Boss Room + } else if (scene == SCENE_FIRE_TEMPLE || scene == SCENE_FIRE_TEMPLE_BOSS) { // Fire Temple Boss Room gSaveContext.entranceIndex = ENTR_FIRE_TEMPLE_ENTRANCE; - } else if (scene == SCENE_WATER_TEMPLE || scene == SCENE_WATER_TEMPLE_BOSS) { //Water Temple Boss Room + } else if (scene == SCENE_WATER_TEMPLE || scene == SCENE_WATER_TEMPLE_BOSS) { // Water Temple Boss Room gSaveContext.entranceIndex = ENTR_WATER_TEMPLE_ENTRANCE; - } else if (scene == SCENE_SPIRIT_TEMPLE || scene == SCENE_SPIRIT_TEMPLE_BOSS) { //Spirit Temple Boss Room + } else if (scene == SCENE_SPIRIT_TEMPLE || scene == SCENE_SPIRIT_TEMPLE_BOSS) { // Spirit Temple Boss Room gSaveContext.entranceIndex = ENTR_SPIRIT_TEMPLE_ENTRANCE; - } else if (scene == SCENE_SHADOW_TEMPLE || scene == SCENE_SHADOW_TEMPLE_BOSS) { //Shadow Temple Boss Room + } else if (scene == SCENE_SHADOW_TEMPLE || scene == SCENE_SHADOW_TEMPLE_BOSS) { // Shadow Temple Boss Room gSaveContext.entranceIndex = ENTR_SHADOW_TEMPLE_ENTRANCE; } else if (scene == SCENE_BOTTOM_OF_THE_WELL) { // BOTW gSaveContext.entranceIndex = ENTR_BOTTOM_OF_THE_WELL_ENTRANCE; @@ -389,24 +406,29 @@ void Entrance_SetSavewarpEntrance(void) { gSaveContext.entranceIndex = ENTR_ICE_CAVERN_ENTRANCE; } else if (scene == SCENE_INSIDE_GANONS_CASTLE) { gSaveContext.entranceIndex = ENTR_INSIDE_GANONS_CASTLE_ENTRANCE; - } else if (scene == SCENE_GANONS_TOWER || scene == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || scene == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || scene == SCENE_GANON_BOSS || scene == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) { - gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb - } else if (scene == SCENE_THIEVES_HIDEOUT) { // Theives hideout + } else if (scene == SCENE_GANONS_TOWER || scene == SCENE_GANONDORF_BOSS || + scene == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || scene == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || + scene == SCENE_GANON_BOSS || scene == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) { + gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb + } else if (scene == SCENE_THIEVES_HIDEOUT) { // Theives hideout gSaveContext.entranceIndex = ENTR_THIEVES_HIDEOUT_0; // Gerudo Fortress -> Thieve's Hideout spawn 0 } else if (scene == SCENE_LINKS_HOUSE && Randomizer_GetSettingValue(RSK_SHUFFLE_INTERIOR_ENTRANCES) != RO_INTERIOR_ENTRANCE_SHUFFLE_ALL) { // Save warping in Link's house keeps the player there if Link's house not shuffled, // otherwise fallback to regular spawns gSaveContext.entranceIndex = ENTR_LINKS_HOUSE_CHILD_SPAWN; - } else if (CVarGetInteger(CVAR_ENHANCEMENT("RememberSaveLocation"), 0) && scene != SCENE_FAIRYS_FOUNTAIN && scene != SCENE_GROTTOS && - gSaveContext.entranceIndex != ENTR_LOAD_OPENING) { + } else if (CVarGetInteger(CVAR_ENHANCEMENT("RememberSaveLocation"), 0) && scene != SCENE_FAIRYS_FOUNTAIN && + scene != SCENE_GROTTOS && gSaveContext.entranceIndex != ENTR_LOAD_OPENING) { // Use the saved entrance value with remember save location, except when in grottos/fairy fountains or if // the entrance index is -1 (new save) return; } else if (LINK_IS_CHILD) { gSaveContext.entranceIndex = Entrance_OverrideNextIndex(ENTR_LINKS_HOUSE_CHILD_SPAWN); // Child Overworld Spawn } else { - gSaveContext.entranceIndex = Entrance_OverrideNextIndex(ENTR_HYRULE_FIELD_10); // Adult Overworld Spawn (Normally 0x5F4 (ENTR_TEMPLE_OF_TIME_WARP_PAD), but 0x282 (ENTR_HYRULE_FIELD_10) has been repurposed to differentiate from Prelude which also uses 0x5F4) + gSaveContext.entranceIndex = Entrance_OverrideNextIndex( + ENTR_HYRULE_FIELD_10); // Adult Overworld Spawn (Normally 0x5F4 (ENTR_TEMPLE_OF_TIME_WARP_PAD), but 0x282 + // (ENTR_HYRULE_FIELD_10) has been repurposed to differentiate from Prelude which + // also uses 0x5F4) } } @@ -464,14 +486,14 @@ void Entrance_OverrideBlueWarp(void) { } switch (gSaveContext.entranceIndex) { - case ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP: // Gohma blue warp - case ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP: // KD blue warp - case ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP: // Barinade blue warp + case ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP: // Gohma blue warp + case ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP: // KD blue warp + case ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP: // Barinade blue warp case ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP: // Phantom Ganon blue warp - case ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP: // Volvagia blue warp - case ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP: // Morpha blue warp - case ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP: // Bongo-Bongo blue warp - case ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP: // Twinrova blue warp + case ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP: // Volvagia blue warp + case ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP: // Morpha blue warp + case ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP: // Bongo-Bongo blue warp + case ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP: // Twinrova blue warp gSaveContext.entranceIndex = Entrance_OverrideNextIndex(gSaveContext.entranceIndex); return; } @@ -481,16 +503,18 @@ void Entrance_EnableFW(void) { Player* player = GET_PLAYER(gPlayState); // Leave restriction in Tower Collapse Interior, Castle Collapse, Treasure Box Shop, Tower Collapse Exterior, // Grottos area, Fishing Pond, Ganon Battle and for states that disable buttons. - if (!false /* farores wind anywhere */ || - gPlayState->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || gPlayState->sceneNum == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || + if (!false /* farores wind anywhere */ || gPlayState->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || + gPlayState->sceneNum == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || (gPlayState->sceneNum == SCENE_TREASURE_BOX_SHOP && !false /* shuffled chest mini game */) || gPlayState->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR || gPlayState->sceneNum == SCENE_GROTTOS || gPlayState->sceneNum == SCENE_FISHING_POND || gPlayState->sceneNum == SCENE_GANON_BOSS || - gSaveContext.eventInf[0] & 0x1 || // Ingo's Minigame state - player->stateFlags1 & (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LADDER | PLAYER_STATE1_ON_HORSE | PLAYER_STATE1_IN_WATER) || // Swimming, riding horse, Down A, hanging from a ledge - player->stateFlags2 & PLAYER_STATE2_CRAWLING // Blank A + gSaveContext.eventInf[0] & 0x1 || // Ingo's Minigame state + player->stateFlags1 & + (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LADDER | PLAYER_STATE1_ON_HORSE | + PLAYER_STATE1_IN_WATER) || // Swimming, riding horse, Down A, hanging from a ledge + player->stateFlags2 & PLAYER_STATE2_CRAWLING // Blank A // Shielding, spinning and getting skull tokens still disable buttons automatically - ) { + ) { return; } @@ -505,8 +529,8 @@ void Entrance_EnableFW(void) { void Entrance_HandleEponaState(void) { s32 entrance = gPlayState->nextEntranceIndex; Player* player = GET_PLAYER(gPlayState); - //If Link is riding Epona but he's about to go through an entrance where she can't spawn, - //unset the Epona flag to avoid Master glitch, and restore temp B. + // If Link is riding Epona but he's about to go through an entrance where she can't spawn, + // unset the Epona flag to avoid Master glitch, and restore temp B. if (Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES) && (player->stateFlags1 & PLAYER_STATE1_ON_HORSE)) { // Allow Master glitch to be performed on the Thieves Hideout entrance if (entrance == Entrance_GetOverride(ENTR_THIEVES_HIDEOUT_4)) { // Gerudo Fortress -> Theives Hideout @@ -514,27 +538,27 @@ void Entrance_HandleEponaState(void) { } static const s16 validEponaEntrances[] = { - ENTR_LAKE_HYLIA_NORTH_EXIT, // Hyrule Field -> Lake Hylia - ENTR_HYRULE_FIELD_FENCE_EXIT, // Lake Hylia -> Hyrule Field - ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, // LH Fishing Hole -> LH Fishing Island - ENTR_LAKE_HYLIA_OUTSIDE_LAB, // LH Lab -> Lake Hylia - ENTR_GERUDO_VALLEY_EAST_EXIT, // Hyrule Field -> Gerudo Valley - ENTR_HYRULE_FIELD_ROCKY_PATH, // Gerudo Valley -> Hyrule Field - ENTR_LON_LON_RANCH_ENTRANCE, // Hyrule Field -> Lon Lon Ranch - ENTR_HYRULE_FIELD_CENTER_EXIT, // Lon Lon Ranch -> Hyrule Field - ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, // Market Entrance -> Hyrule Field - ENTR_HYRULE_FIELD_RIVER_EXIT, // ZR Front -> Hyrule Field - ENTR_HYRULE_FIELD_WOODED_EXIT, // LW Bridge -> Hyrule Field - ENTR_GERUDOS_FORTRESS_EAST_EXIT, // GV Fortress Side -> Gerudo Fortress - ENTR_GERUDO_VALLEY_WEST_EXIT, // Gerudo Fortress -> GV Fortress Side - ENTR_GERUDO_VALLEY_OUTSIDE_TENT, // GV Carpenter Tent -> GV Fortress Side - ENTR_LON_LON_RANCH_OUTSIDE_STABLES, // LLR Stables -> Lon Lon Ranch - ENTR_LON_LON_RANCH_OUTSIDE_TOWER, // LLR Tower -> Lon Lon Ranch - ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, // LLR Talons House -> Lon Lon Ranch - ENTR_HYRULE_FIELD_11, // LLR Southern Fence Jump - ENTR_HYRULE_FIELD_12, // LLR Western Fence Jump - ENTR_HYRULE_FIELD_13, // LLR Eastern Fence Jump - ENTR_HYRULE_FIELD_15, // LLR Front Gate Jump + ENTR_LAKE_HYLIA_NORTH_EXIT, // Hyrule Field -> Lake Hylia + ENTR_HYRULE_FIELD_FENCE_EXIT, // Lake Hylia -> Hyrule Field + ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, // LH Fishing Hole -> LH Fishing Island + ENTR_LAKE_HYLIA_OUTSIDE_LAB, // LH Lab -> Lake Hylia + ENTR_GERUDO_VALLEY_EAST_EXIT, // Hyrule Field -> Gerudo Valley + ENTR_HYRULE_FIELD_ROCKY_PATH, // Gerudo Valley -> Hyrule Field + ENTR_LON_LON_RANCH_ENTRANCE, // Hyrule Field -> Lon Lon Ranch + ENTR_HYRULE_FIELD_CENTER_EXIT, // Lon Lon Ranch -> Hyrule Field + ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, // Market Entrance -> Hyrule Field + ENTR_HYRULE_FIELD_RIVER_EXIT, // ZR Front -> Hyrule Field + ENTR_HYRULE_FIELD_WOODED_EXIT, // LW Bridge -> Hyrule Field + ENTR_GERUDOS_FORTRESS_EAST_EXIT, // GV Fortress Side -> Gerudo Fortress + ENTR_GERUDO_VALLEY_WEST_EXIT, // Gerudo Fortress -> GV Fortress Side + ENTR_GERUDO_VALLEY_OUTSIDE_TENT, // GV Carpenter Tent -> GV Fortress Side + ENTR_LON_LON_RANCH_OUTSIDE_STABLES, // LLR Stables -> Lon Lon Ranch + ENTR_LON_LON_RANCH_OUTSIDE_TOWER, // LLR Tower -> Lon Lon Ranch + ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, // LLR Talons House -> Lon Lon Ranch + ENTR_HYRULE_FIELD_11, // LLR Southern Fence Jump + ENTR_HYRULE_FIELD_12, // LLR Western Fence Jump + ENTR_HYRULE_FIELD_13, // LLR Eastern Fence Jump + ENTR_HYRULE_FIELD_15, // LLR Front Gate Jump // The following indices currently aren't randomized, but we'll list // them in case they ever are. They're all Theives Hideout -> Gerudo Fortress ENTR_GERUDOS_FORTRESS_1, @@ -577,9 +601,9 @@ void Entrance_OverrideWeatherState() { return; } // Lon Lon Ranch (No Epona) - if (!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED)){ // if you don't have Epona + if (!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED)) { // if you don't have Epona switch (gSaveContext.entranceIndex) { - case ENTR_LON_LON_RANCH_ENTRANCE: // Lon Lon Ranch from HF + case ENTR_LON_LON_RANCH_ENTRANCE: // Lon Lon Ranch from HF case ENTR_HYRULE_FIELD_CENTER_EXIT: // Hyrule Field from LLR gWeatherMode = 2; return; @@ -588,14 +612,14 @@ void Entrance_OverrideWeatherState() { // Water Temple if (!Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP)) { // have not beaten Water Temple switch (gSaveContext.entranceIndex) { - case ENTR_ZORAS_RIVER_WATERFALL_EXIT: // Zora River from behind waterfall + case ENTR_ZORAS_RIVER_WATERFALL_EXIT: // Zora River from behind waterfall case ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT: // Zora River from LW water shortcut - case ENTR_LOST_WOODS_UNDERWATER_SHORTCUT: // Lost Woods water shortcut from ZR + case ENTR_LOST_WOODS_UNDERWATER_SHORTCUT: // Lost Woods water shortcut from ZR gWeatherMode = 3; return; } switch (gPlayState->sceneNum) { - case SCENE_ZORAS_DOMAIN: // Zora's Domain + case SCENE_ZORAS_DOMAIN: // Zora's Domain case SCENE_ZORAS_FOUNTAIN: // Zora's Fountain gWeatherMode = 3; return; @@ -603,15 +627,15 @@ void Entrance_OverrideWeatherState() { } // Kakariko Thunderstorm if (((gSaveContext.inventory.questItems & 0x7) == 0x7) && // Have forest, fire, and water medallion - !(gSaveContext.sceneFlags[24].clear & 0x02)) { // have not beaten Bongo Bongo + !(gSaveContext.sceneFlags[24].clear & 0x02)) { // have not beaten Bongo Bongo switch (gPlayState->sceneNum) { case SCENE_KAKARIKO_VILLAGE: // Kakariko - case SCENE_GRAVEYARD: // Graveyard + case SCENE_GRAVEYARD: // Graveyard gPlayState->envCtx.gloomySkyMode = 2; switch (gSaveContext.entranceIndex) { case ENTR_KAKARIKO_VILLAGE_FRONT_GATE: // Kakariko from HF case ENTR_KAKARIKO_VILLAGE_GUARD_GATE: // Kakariko from Death Mountain Trail - case ENTR_GRAVEYARD_OUTSIDE_TEMPLE: // Graveyard from Shadow Temple + case ENTR_GRAVEYARD_OUTSIDE_TEMPLE: // Graveyard from Shadow Temple break; default: gWeatherMode = 5; @@ -620,21 +644,21 @@ void Entrance_OverrideWeatherState() { } } // Death Mountain Cloudy - if (!Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP)) { // have not beaten Fire Temple + if (!Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP)) { // have not beaten Fire Temple if (gPlayState->nextEntranceIndex == ENTR_LOST_WOODS_TUNNEL_SHORTCUT) { // Lost Woods Goron City Shortcut gWeatherMode = 2; return; } switch (gPlayState->sceneNum) { - case SCENE_KAKARIKO_VILLAGE: // Kakariko - case SCENE_GRAVEYARD: // Graveyard - case SCENE_DEATH_MOUNTAIN_TRAIL: // Death Mountain Trail + case SCENE_KAKARIKO_VILLAGE: // Kakariko + case SCENE_GRAVEYARD: // Graveyard + case SCENE_DEATH_MOUNTAIN_TRAIL: // Death Mountain Trail case SCENE_DEATH_MOUNTAIN_CRATER: // Death Mountain Crater if (!gPlayState->envCtx.gloomySkyMode) { gPlayState->envCtx.gloomySkyMode = 1; } switch (gSaveContext.entranceIndex) { - case ENTR_KAKARIKO_VILLAGE_FRONT_GATE: // Kakariko from HF + case ENTR_KAKARIKO_VILLAGE_FRONT_GATE: // Kakariko from HF case ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT: // Kakariko from Graveyard break; default: @@ -646,16 +670,17 @@ void Entrance_OverrideWeatherState() { } // Rectify the "Getting Caught By Gerudo" entrance index if necessary, based on the age and current scene -// In ER, Adult should be placed at the fortress entrance when getting caught in the fortress without a hookshot, instead of being thrown in the valley -// Child should always be thrown in the stream when caught in the valley, and placed at the fortress entrance from valley when caught in the fortress +// In ER, Adult should be placed at the fortress entrance when getting caught in the fortress without a hookshot, +// instead of being thrown in the valley Child should always be thrown in the stream when caught in the valley, and +// placed at the fortress entrance from valley when caught in the fortress void Entrance_OverrideGeurdoGuardCapture(void) { if (LINK_IS_CHILD) { gPlayState->nextEntranceIndex = ENTR_GERUDO_VALLEY_1; // Geurdo Valley thrown out } if ((LINK_IS_CHILD || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES)) && - gPlayState->nextEntranceIndex == ENTR_GERUDO_VALLEY_1) { // Geurdo Valley thrown out - if (gPlayState->sceneNum != SCENE_GERUDO_VALLEY) { // Geurdo Valley + gPlayState->nextEntranceIndex == ENTR_GERUDO_VALLEY_1) { // Geurdo Valley thrown out + if (gPlayState->sceneNum != SCENE_GERUDO_VALLEY) { // Geurdo Valley gPlayState->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_EAST_EXIT; // Gerudo Fortress } } @@ -786,6 +811,7 @@ void Entrance_SetEntranceDiscovered(u16 entranceIndex, u8 isReversedEntrance) { if (idx < SAVEFILE_ENTRANCES_DISCOVERED_IDX_COUNT) { u32 entranceBit = 1 << (entranceIndex - (idx * bitsPerIndex)); gSaveContext.ship.stats.entrancesDiscovered[idx] |= entranceBit; + CheckTracker_RecalculateAvailableChecks(); // Set reverse entrance when not decoupled if (!Randomizer_GetSettingValue(RSK_DECOUPLED_ENTRANCES) && !isReversedEntrance) { diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.h b/soh/soh/Enhancements/randomizer/randomizer_entrance.h index d2c8c79cb0..ca840f3961 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.h +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.h @@ -3,8 +3,8 @@ #include -//Entrance Table Data: https://wiki.cloudmodding.com/oot/Entrance_Table_(Data) -//Accessed June 2021, published content date at the time was 14 March 2020, at 21:47 +// Entrance Table Data: https://wiki.cloudmodding.com/oot/Entrance_Table_(Data) +// Accessed June 2021, published content date at the time was 14 March 2020, at 21:47 #define ENTRANCE_TABLE_SIZE ENTR_MAX @@ -13,12 +13,12 @@ #define SHUFFLEABLE_BOSS_COUNT 8 #define SAVEFILE_ENTRANCES_DISCOVERED_IDX_COUNT 66 // Max entrance rando index is 0x0820, (2080 / 32 == 65) + 1 -#define SAVEFILE_SCENES_DISCOVERED_IDX_COUNT 4 // Max scene ID is 0x6E, (110 / 32 == 3) + 1 +#define SAVEFILE_SCENES_DISCOVERED_IDX_COUNT 4 // Max scene ID is 0x6E, (110 / 32 == 3) + 1 -#define ENTRANCE_INFO_FIELD(continueBgm, displayTitleCard, endTransType, startTransType) \ - (((continueBgm) ? ENTRANCE_INFO_CONTINUE_BGM_FLAG : 0) | \ - ((displayTitleCard) ? ENTRANCE_INFO_DISPLAY_TITLE_CARD_FLAG : 0) | \ - (((endTransType) << ENTRANCE_INFO_END_TRANS_TYPE_SHIFT) & ENTRANCE_INFO_END_TRANS_TYPE_MASK) | \ +#define ENTRANCE_INFO_FIELD(continueBgm, displayTitleCard, endTransType, startTransType) \ + (((continueBgm) ? ENTRANCE_INFO_CONTINUE_BGM_FLAG : 0) | \ + ((displayTitleCard) ? ENTRANCE_INFO_DISPLAY_TITLE_CARD_FLAG : 0) | \ + (((endTransType) << ENTRANCE_INFO_END_TRANS_TYPE_SHIFT) & ENTRANCE_INFO_END_TRANS_TYPE_MASK) | \ (((startTransType) << ENTRANCE_INFO_START_TRANS_TYPE_SHIFT) & ENTRANCE_INFO_START_TRANS_TYPE_MASK)) typedef struct { diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 4c3cb971ec..1a635f58e8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -1,7 +1,7 @@ #include "randomizer_entrance_tracker.h" #include "soh/OTRGlobals.h" #include "soh/cvar_prefixes.h" -#include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include #include @@ -27,18 +27,22 @@ extern PlayState* gPlayState; #define COLOR_GREEN IM_COL32(0, 158, 115, 255) #define COLOR_GRAY IM_COL32(155, 155, 155, 255) -EntranceOverride srcListSortedByArea[ENTRANCE_OVERRIDES_MAX_COUNT] = {0}; -EntranceOverride destListSortedByArea[ENTRANCE_OVERRIDES_MAX_COUNT] = {0}; -EntranceOverride srcListSortedByType[ENTRANCE_OVERRIDES_MAX_COUNT] = {0}; -EntranceOverride destListSortedByType[ENTRANCE_OVERRIDES_MAX_COUNT] = {0}; -EntranceTrackingData gEntranceTrackingData = {0}; +EntranceOverride srcListSortedByArea[ENTRANCE_OVERRIDES_MAX_COUNT] = { 0 }; +EntranceOverride destListSortedByArea[ENTRANCE_OVERRIDES_MAX_COUNT] = { 0 }; +EntranceOverride srcListSortedByType[ENTRANCE_OVERRIDES_MAX_COUNT] = { 0 }; +EntranceOverride destListSortedByType[ENTRANCE_OVERRIDES_MAX_COUNT] = { 0 }; +EntranceTrackingData gEntranceTrackingData = { 0 }; -static const EntranceOverride emptyOverride = {0}; +static const EntranceOverride emptyOverride = { 0 }; static s16 lastEntranceIndex = -1; static s16 currentGrottoId = -1; static s16 lastSceneOrEntranceDetected = -1; +static bool presetLoaded = false; +static ImVec2 presetPos; +static ImVec2 presetSize; + static std::string spoilerEntranceGroupNames[] = { "Spawns/Warp Songs/Owls", "Kokiri Forest", @@ -64,16 +68,13 @@ static std::string spoilerEntranceGroupNames[] = { }; static std::string groupTypeNames[] = { - "One Way", - "Overworld", - "Interior", - "Grotto", - "Dungeon", + "One Way", "Overworld", "Interior", "Grotto", "Dungeon", }; -// Entrance data for the tracker taken from the 3ds rando entrance tracker, and supplemented with scene/spawn info and meta search tags -// ENTR_HYRULE_FIELD_10 and ENTR_POTION_SHOP_KAKARIKO_1 have been repurposed for entrance randomizer +// Entrance data for the tracker taken from the 3ds rando entrance tracker, and supplemented with scene/spawn info and +// meta search tags ENTR_HYRULE_FIELD_10 and ENTR_POTION_SHOP_KAKARIKO_1 have been repurposed for entrance randomizer const EntranceData entranceData[] = { + // clang-format off //index, reverse, scenes (and spawns), source name, destination name, source group, destination group, type, metaTag, oneExit { ENTR_LINKS_HOUSE_CHILD_SPAWN, -1, SINGLE_SCENE_INFO(SCENE_LINKS_HOUSE), "Child Spawn", "Link's House", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, { ENTR_HYRULE_FIELD_10, -1, SINGLE_SCENE_INFO(SCENE_TEMPLE_OF_TIME), "Adult Spawn", "Temple of Time", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, @@ -118,10 +119,10 @@ const EntranceData entranceData[] = { { ENTR_GORON_CITY_TUNNEL_SHORTCUT, ENTR_LOST_WOODS_TUNNEL_SHORTCUT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods Tunnel Shortcut", "Goron City Tunnel Shortcut", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "lw,gc"}, { ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT, ENTR_LOST_WOODS_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods Underwater Shortcut", "Zora's River Underwater Shortcut", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD, "lw"}, { ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT, ENTR_LOST_WOODS_NORTH_EXIT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods North Exit", "Sacred Forest Meadow South Exit", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW Shortcuts Grotto Entry", "LW Tunnel Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW Tunnel Grotto Entry", "LW Tunnel Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest", 1}, { ENTRANCE_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW North Grotto Entry", "LW Scrubs Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw", 1}, { ENTRANCE_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW Meadow Grotto Entry", "Deku Theater", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,mask,stage", 1}, - { ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "LW Tunnel Grotto", "LW Shortcuts Grotto Entry", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "LW Tunnel Grotto", "LW Tunnel Grotto Entry", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest"}, { ENTRANCE_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET), {{ SCENE_GROTTOS, 0x07 }}, "LW Scrubs Grotto", "LW North Grotto Entry", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw"}, { ENTRANCE_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET), {{ SCENE_GROTTOS, 0x0C }}, "Deku Theater", "LW Meadow Grotto Entry", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,mask,stage"}, @@ -129,11 +130,11 @@ const EntranceData entranceData[] = { { ENTR_LOST_WOODS_NORTH_EXIT, ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT, SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "Sacred Forest Meadow South Exit", "Lost Woods North Exit", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, { ENTRANCE_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM Wolfos Grotto Entry", "SFM Wolfos Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "chest", 1}, { ENTRANCE_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM Fairy Grotto Entry", "SFM Fairy Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM Storms Grotto Entry", "SFM Storms Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM Storms Grotto Entry", "SFM Deku Scrub Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, { ENTR_FOREST_TEMPLE_ENTRANCE, ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE, SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "Sacred Forest Meadow Outside Forest Temple", "Forest Temple Entrance", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, { ENTRANCE_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET), {{ SCENE_GROTTOS, 0x08 }}, "SFM Wolfos Grotto", "SFM Wolfos Grotto Entry", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO}, { ENTRANCE_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "SFM Fairy Grotto", "SFM Fairy Grotto Entry", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO}, - { ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "SFM Storms Grotto", "SFM Storms Grotto Entry", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "SFM Deku Scrub Grotto", "SFM Storms Grotto Entry", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs"}, { ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE, ENTR_FOREST_TEMPLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE), "Forest Temple Entrance", "Sacred Forest Meadow Outside Forest Temple", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON}, { ENTR_FOREST_TEMPLE_BOSS_ENTRANCE, ENTR_FOREST_TEMPLE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE), "Forest Temple Boss Door", "Phantom Ganon", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, { ENTR_FOREST_TEMPLE_BOSS_DOOR, ENTR_FOREST_TEMPLE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE_BOSS), "Phantom Ganon", "Forest Temple Boss Door", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, @@ -232,10 +233,10 @@ const EntranceData entranceData[] = { { ENTR_HYRULE_FIELD_RIVER_EXIT, ENTR_ZORAS_RIVER_WEST_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "Zora's River Lower Exit", "Hyrule Field River Exit", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, { ENTR_LOST_WOODS_UNDERWATER_SHORTCUT, ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "Zora's River Underwater Shortcut", "Lost Woods Underwater Shortcut", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, { ENTR_ZORAS_DOMAIN_ENTRANCE, ENTR_ZORAS_RIVER_WATERFALL_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "Zora's River Waterfall Exit", "Zora's Domain Entrance", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD}, - { ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR Rock Circle Grotto Entry", "ZR Storms Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR Rock Circle Grotto Entry", "ZR Deku SCrub Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, { ENTRANCE_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR Raised Boulder Grotto Entry", "ZR Fairy Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "", 1}, { ENTRANCE_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR Raised Open Grotto Entry", "ZR Open Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "ZR Storms Grotto", "ZR Rock Circle Grotto Entry", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "ZR Deku Scrub Grotto", "ZR Rock Circle Grotto Entry", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs"}, { ENTRANCE_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "ZR Fairy Grotto", "ZR Raised Boulder Grotto Entry", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO}, { ENTRANCE_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "ZR Open Grotto", "ZR Raised Open Grotto Entry", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "chest"}, @@ -244,9 +245,9 @@ const EntranceData entranceData[] = { { ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT, ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain Underwater Shortcut", "Lake Hylia Underwater Shortcut", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "lh"}, { ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT, ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain Behind King Zora", "Zora's Fountain Tunnel Exit", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_OVERWORLD}, { ENTR_ZORA_SHOP_0, ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "ZD Shop Entry", "Zora Shop", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "ZD Island Grotto Entry", "ZD Storms Grotto", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "ZD Island Grotto Entry", "ZD Fairy Grotto", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy", 1}, { ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP, ENTR_ZORA_SHOP_0, SINGLE_SCENE_INFO(SCENE_ZORA_SHOP), "Zora Shop", "ZD Shop Entry", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_INTERIOR}, - { ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "ZD Storms Grotto", "ZD Island Grotto Entry", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "ZD Fairy Grotto", "ZD Island Grotto Entry", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy"}, // Zora's Fountain { ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT, ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "Zora's Fountain Tunnel Exit", "Zora's Domain Behind King Zora", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD}, @@ -269,7 +270,7 @@ const EntranceData entranceData[] = { { ENTR_LAKE_HYLIA_NORTH_EXIT, ENTR_HYRULE_FIELD_FENCE_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Fence Exit", "Lake Hylia North Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "hf,lh"}, { ENTR_GERUDO_VALLEY_EAST_EXIT, ENTR_HYRULE_FIELD_ROCKY_PATH, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Rocky Path", "Gerudo Valley East Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "hf"}, { ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Near Market Boulder Grotto Entry", "HF Near Market Boulder Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Near Stairs Tree Grotto Entry", "HF Near Stairs Tree Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Stone Bridge Tree Grotto Entry", "HF Stone Bridge Tree Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider", 1}, { ENTRANCE_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Northwest Tree Grotto Entry", "HF Tektite Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "water", 1}, { ENTRANCE_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Northwest Boulder Grotto Entry", "HF Fairy Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "", 1}, { ENTRANCE_GROTTO_LOAD(GROTTO_HF_COW_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_COW_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF West Rock Circle Grotto Entry", "HF Cow Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "webbed", 1}, @@ -277,7 +278,7 @@ const EntranceData entranceData[] = { { ENTRANCE_GROTTO_LOAD(GROTTO_HF_INSIDE_FENCE_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_INSIDE_FENCE_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Fenced Grotto Entry", "HF Fenced Scrub Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, { ENTRANCE_GROTTO_LOAD(GROTTO_HF_SOUTHEAST_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_SOUTHEAST_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Southeast Boulder Grotto Entry", "HF Southeast Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, { ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "HF Near Market Boulder Grotto", "HF Near Market Boulder Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO}, - { ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET), {{ SCENE_GROTTOS, 0x01 }}, "HF Near Stairs Tree Grotto", "HF Near Stairs Tree Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET), {{ SCENE_GROTTOS, 0x01 }}, "HF Stone Bridge Tree Grotto", "HF Stone Bridge Tree Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider"}, { ENTRANCE_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET), {{ SCENE_GROTTOS, 0x0B }}, "HF Tektite Grotto", "HF Northwest Tree Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "water"}, { ENTRANCE_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "HF Fairy Grotto", "HF Northwest Boulder Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO}, { ENTRANCE_GROTTO_EXIT(GROTTO_HF_COW_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_COW_OFFSET), {{ SCENE_GROTTOS, 0x05 }}, "HF Cow Grotto", "HF West Rock Circle Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "webbed"}, @@ -290,22 +291,22 @@ const EntranceData entranceData[] = { { ENTR_LON_LON_BUILDINGS_TALONS_HOUSE, ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Talon's House Entry", "Talon's House", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "llr", 1}, { ENTR_STABLE_0, ENTR_LON_LON_RANCH_OUTSIDE_STABLES, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Stables Entry", "LLR Stables", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow", 1}, { ENTR_LON_LON_BUILDINGS_TOWER, ENTR_LON_LON_RANCH_OUTSIDE_TOWER, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Tower Entry", "LLR Tower", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET), SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Grotto Entry", "LLR Scrubs Grotto", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET), SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Grotto Entry", "LLR Deku Scrub Grotto", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, { ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, ENTR_LON_LON_BUILDINGS_TALONS_HOUSE, {{ SCENE_LON_LON_BUILDINGS, 0x00 }}, "Talon's House", "LLR Talon's House Entry", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "llr"}, { ENTR_LON_LON_RANCH_OUTSIDE_STABLES, ENTR_STABLE_0, SINGLE_SCENE_INFO(SCENE_STABLE), "LLR Stables", "LLR Stables Entry", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow"}, { ENTR_LON_LON_RANCH_OUTSIDE_TOWER, ENTR_LON_LON_BUILDINGS_TOWER, {{ SCENE_LON_LON_BUILDINGS, 0x01 }}, "LLR Tower", "LLR Tower Entry", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "LLR Scrubs Grotto", "LLR Grotto Entry", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "LLR Deku Scrub Grotto", "LLR Grotto Entry", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs"}, // Lake Hylia { ENTR_HYRULE_FIELD_FENCE_EXIT, ENTR_LAKE_HYLIA_NORTH_EXIT, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia North Exit", "Hyrule Field Fence Exit", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "lh"}, { ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT, ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia Underwater Shortcut", "Zora's Domain Underwater Shortcut", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD, "lh"}, { ENTR_LAKESIDE_LABORATORY_0, ENTR_LAKE_HYLIA_OUTSIDE_LAB, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Lab Entry", "LH Lab", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh", 1}, { ENTR_FISHING_POND_0, ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Fishing Pond Entry", "Fishing Pond", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET), SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Grave Grotto Entry", "LH Grotto", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET), SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Grave Grotto Entry", "LH Deku Scrub Grotto", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, { ENTR_WATER_TEMPLE_ENTRANCE, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia Outside Temple", "Water Temple Entrance", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, { ENTR_LAKE_HYLIA_OUTSIDE_LAB, ENTR_LAKESIDE_LABORATORY_0, SINGLE_SCENE_INFO(SCENE_LAKESIDE_LABORATORY), "LH Lab", "LH Lab Entry", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh"}, { ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, ENTR_FISHING_POND_0, SINGLE_SCENE_INFO(SCENE_FISHING_POND), "Fishing Pond", "LH Fishing Pond Entry", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "LH Grotto", "LH Grave Grotto Entry", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "lh,scrubs"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "LH Deku Scrub Grotto", "LH Grave Grotto Entry", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "lh,scrubs"}, { ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, ENTR_WATER_TEMPLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE), "Water Temple Entrance", "Lake Hylia Outside Temple", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh"}, { ENTR_WATER_TEMPLE_BOSS_ENTRANCE, ENTR_WATER_TEMPLE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE), "Water Temple Boss Door", "Morpha", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, { ENTR_WATER_TEMPLE_BOSS_DOOR, ENTR_WATER_TEMPLE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE_BOSS), "Morpha", "Water Temple Boss Door", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, @@ -317,15 +318,15 @@ const EntranceData entranceData[] = { { ENTR_LAKE_HYLIA_RIVER_EXIT, -1, SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "Gerudo Valley River Exit", "Lake Hylia River Exit", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "lh"}, { ENTR_CARPENTERS_TENT_0, ENTR_GERUDO_VALLEY_OUTSIDE_TENT, SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV Carpenters' Tent Entry", "Carpenters' Tent", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_INTERIOR, "", 1}, { ENTRANCE_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV Silver Rock Grotto Entry", "GV Octorok Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV Behind Tent Grotto Entry", "GV Storms Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV Behind Tent Grotto Entry", "GV Deku Scrub Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, { ENTR_GERUDO_VALLEY_OUTSIDE_TENT, ENTR_CARPENTERS_TENT_0, SINGLE_SCENE_INFO(SCENE_CARPENTERS_TENT), "Carpenters' Tent", "GV Carpenters' Tent Entry", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_INTERIOR}, { ENTRANCE_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET), {{ SCENE_GROTTOS, 0x06 }}, "GV Octorok Grotto", "GV Silver Rock Grotto Entry", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO}, - { ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "GV Storms Grotto", "GV Behind Tent Grotto Entry", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "GV Deku Scrub Grotto", "GV Behind Tent Grotto Entry", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs"}, { ENTR_GERUDO_VALLEY_WEST_EXIT, ENTR_GERUDOS_FORTRESS_EAST_EXIT, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Gerudo Fortress East Exit", "Gerudo Valley West Exit", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, ""}, { ENTR_HAUNTED_WASTELAND_EAST_EXIT, ENTR_GERUDOS_FORTRESS_GATE_EXIT, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Gerudo Fortress Gate Exit", "Haunted Wasteland East Exit", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, ""}, - { ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "GF Storms Grotto Entry", "GF Storms Grotto", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "GF Storms Grotto Entry", "GF Fairy Grotto", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_GROTTO, "", 1}, { ENTR_GERUDO_TRAINING_GROUND_ENTRANCE, ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "GF Outside Training Ground", "Gerudo Training Ground Entrance", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON, "gtg", 1}, - { ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "GF Storms Grotto", "GF Storms Grotto Entry", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_GROTTO, ""}, + { ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "GF Fairy Grotto", "GF Storms Grotto Entry", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_GROTTO, ""}, { ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE, SINGLE_SCENE_INFO(SCENE_GERUDO_TRAINING_GROUND), "Gerudo Training Ground Entrance", "GF Outside Training Ground", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON, "gtg"}, // The Wasteland @@ -333,42 +334,42 @@ const EntranceData entranceData[] = { { ENTR_DESERT_COLOSSUS_EAST_EXIT, ENTR_HAUNTED_WASTELAND_WEST_EXIT, SINGLE_SCENE_INFO(SCENE_HAUNTED_WASTELAND), "Haunted Wasteland West Exit", "Desert Colossus East Exit", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "dc,hw"}, { ENTR_HAUNTED_WASTELAND_WEST_EXIT, ENTR_DESERT_COLOSSUS_EAST_EXIT, SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Desert Colossus East Exit", "Haunted Wasteland West Exit", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "dc,hw"}, { ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS, ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT, SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Colossus Great Fairy Entry", "Colossus Great Fairy Fountain", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_INTERIOR, "dc", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET), SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Colossus Grotto Entry", "Colossus Grotto", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_GROTTO, "dc,scrubs", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET), SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Colossus Grotto Entry", "Colossus Deku Scrub Grotto", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_GROTTO, "dc,scrubs", 1}, { ENTR_SPIRIT_TEMPLE_ENTRANCE, ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Colossus Outside Temple", "Spirit Temple Entrance", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_DUNGEON, "dc", 1}, { ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0x02 }}, "Colossus Great Fairy Fountain", "Colossus Great Fairy Entry", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_INTERIOR, "dc"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "Colossus Grotto", "Colossus Grotto Entry", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_GROTTO, "dc,scrubs"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "Colossus Deku Scrub Grotto", "Colossus Grotto Entry", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_GROTTO, "dc,scrubs"}, { ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, ENTR_SPIRIT_TEMPLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE), "Spirit Temple Entrance", "Colossus Outside Temple", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_DUNGEON, "dc"}, { ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE, ENTR_SPIRIT_TEMPLE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE), "Spirit Temple Boss Door", "Twinrova", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_DUNGEON, "", 1}, { ENTR_SPIRIT_TEMPLE_BOSS_DOOR, ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE_BOSS), "Twinrova", "Spirit Temple Boss Door", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_DUNGEON, "", 1}, { ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE_BOSS), "Twinrova Blue Warp", "Spirit Temple Blue Warp", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, // Market - { ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance South Exit", "Hyrule Field Drawbridge Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { ENTR_MARKET_SOUTH_EXIT, ENTR_MARKET_ENTRANCE_NORTH_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance North Exit", "Market South Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_MARKET_GUARD_HOUSE_0, ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "MK Entrance Guard House Entry", "Guard House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe", 1}, - { ENTR_MARKET_ENTRANCE_NORTH_EXIT, ENTR_MARKET_SOUTH_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market South Exit", "Market Entrance North Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_CASTLE_GROUNDS_SOUTH_EXIT, ENTR_MARKET_DAY_CASTLE_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market Castle Exit", "Castle Grounds South Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_OVERWORLD, "outside ganon's castle"}, - { ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT, ENTR_MARKET_DAY_TEMPLE_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market Temple Exit", "Outside Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_SHOOTING_GALLERY_1, ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Shooting Gallery Entry", "MK Shooting Gallery", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "child", 1}, - { ENTR_BOMBCHU_BOWLING_ALLEY_0, ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Bombchu Bowling Entry", "Bombchu Bowling", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_TREASURE_BOX_SHOP_0, ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Treasure Chest Game Entry", "Treasure Chest Game", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Man-in-Green House Entry", "Man-in-Green's House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_HAPPY_MASK_SHOP_0, ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Mask Shop Entry", "Mask Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_BAZAAR_1, ENTR_MARKET_DAY_OUTSIDE_BAZAAR, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Bazaar Entry", "MK Bazaar", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop", 1}, - { ENTR_POTION_SHOP_MARKET_0, ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Potion Shop Entry", "MK Potion Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_BOMBCHU_SHOP_1, ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Bombchu Shop Entry", "Bombchu Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE, ENTR_MARKET_GUARD_HOUSE_0, {{ SCENE_MARKET_GUARD_HOUSE }}, "Guard House", "MK Entrance Guard House Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe"}, - { ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_1, {{ SCENE_SHOOTING_GALLERY, 0x01 }}, "MK Shooting Gallery", "MK Shooting Gallery Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING, ENTR_BOMBCHU_BOWLING_ALLEY_0, SINGLE_SCENE_INFO(SCENE_BOMBCHU_BOWLING_ALLEY), "Bombchu Bowling", "MK Bombchu Bowling Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP, ENTR_TREASURE_BOX_SHOP_0, SINGLE_SCENE_INFO(SCENE_TREASURE_BOX_SHOP), "Treasure Chest Game", "MK Treasure Chest Game Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE, SINGLE_SCENE_INFO(SCENE_BACK_ALLEY_HOUSE), "Man-in-Green's House", "MK Man-in-Green House Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP, ENTR_HAPPY_MASK_SHOP_0, SINGLE_SCENE_INFO(SCENE_HAPPY_MASK_SHOP), "Mask Shop", "MK Mask Shop Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_MARKET_DAY_OUTSIDE_BAZAAR, ENTR_BAZAAR_1, {{ SCENE_BAZAAR, 0x01 }}, "MK Bazaar", "MK Bazaar Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop"}, - { ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP, ENTR_POTION_SHOP_MARKET_0, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_MARKET), "MK Potion Shop", "MK Potion Shop Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP, ENTR_BOMBCHU_SHOP_1, SINGLE_SCENE_INFO(SCENE_BOMBCHU_SHOP), "Bombchu Shop", "MK Bombchu Shop Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_MARKET_DAY_TEMPLE_EXIT, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT, {SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS)}, "Outside Temple of Time", "Market Temple Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "tot"}, - { ENTR_TEMPLE_OF_TIME_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE, {SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS)}, "Outside Temple of Time", "Temple of Time Entrance", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot", 1}, - { ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE, ENTR_TEMPLE_OF_TIME_ENTRANCE, SINGLE_SCENE_INFO(SCENE_TEMPLE_OF_TIME), "Temple of Time Entrance", "Outside Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot"}, + { ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance South Exit", "Hyrule Field Drawbridge Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_MARKET_SOUTH_EXIT, ENTR_MARKET_ENTRANCE_NORTH_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance North Exit", "Market South Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_MARKET_GUARD_HOUSE_0, ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "MK Entrance Guard House Entry", "Guard House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe", 1}, + { ENTR_MARKET_ENTRANCE_NORTH_EXIT, ENTR_MARKET_SOUTH_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market South Exit", "Market Entrance North Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_CASTLE_GROUNDS_SOUTH_EXIT, ENTR_MARKET_DAY_CASTLE_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market Castle Exit", "Castle Grounds South Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_OVERWORLD, "outside ganon's castle"}, + { ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT, ENTR_MARKET_DAY_TEMPLE_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market Temple Exit", "ToT Courtyard Gossip Stones Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_SHOOTING_GALLERY_1, ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Shooting Gallery Entry", "MK Shooting Gallery", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "child", 1}, + { ENTR_BOMBCHU_BOWLING_ALLEY_0, ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Bombchu Bowling Entry", "Bombchu Bowling", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_TREASURE_BOX_SHOP_0, ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Treasure Chest Game Entry", "Treasure Chest Game", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Man-in-Green House Entry", "Man-in-Green's House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_HAPPY_MASK_SHOP_0, ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Mask Shop Entry", "Mask Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_BAZAAR_1, ENTR_MARKET_DAY_OUTSIDE_BAZAAR, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Bazaar Entry", "MK Bazaar", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop", 1}, + { ENTR_POTION_SHOP_MARKET_0, ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Potion Shop Entry", "MK Potion Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_BOMBCHU_SHOP_1, ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Bombchu Shop Entry", "Bombchu Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE, ENTR_MARKET_GUARD_HOUSE_0, {{ SCENE_MARKET_GUARD_HOUSE }}, "Guard House", "MK Entrance Guard House Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe"}, + { ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_1, {{ SCENE_SHOOTING_GALLERY, 0x01 }}, "MK Shooting Gallery", "MK Shooting Gallery Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING, ENTR_BOMBCHU_BOWLING_ALLEY_0, SINGLE_SCENE_INFO(SCENE_BOMBCHU_BOWLING_ALLEY), "Bombchu Bowling", "MK Bombchu Bowling Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP, ENTR_TREASURE_BOX_SHOP_0, SINGLE_SCENE_INFO(SCENE_TREASURE_BOX_SHOP), "Treasure Chest Game", "MK Treasure Chest Game Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE, SINGLE_SCENE_INFO(SCENE_BACK_ALLEY_HOUSE), "Man-in-Green's House", "MK Man-in-Green House Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP, ENTR_HAPPY_MASK_SHOP_0, SINGLE_SCENE_INFO(SCENE_HAPPY_MASK_SHOP), "Mask Shop", "MK Mask Shop Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_OUTSIDE_BAZAAR, ENTR_BAZAAR_1, {{ SCENE_BAZAAR, 0x01 }}, "MK Bazaar", "MK Bazaar Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop"}, + { ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP, ENTR_POTION_SHOP_MARKET_0, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_MARKET), "MK Potion Shop", "MK Potion Shop Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP, ENTR_BOMBCHU_SHOP_1, SINGLE_SCENE_INFO(SCENE_BOMBCHU_SHOP), "Bombchu Shop", "MK Bombchu Shop Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_TEMPLE_EXIT, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT, {SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS)}, "ToT Courtyard Gossip Stones Exit", "Market Temple Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "tot"}, + { ENTR_TEMPLE_OF_TIME_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE, {SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS)}, "ToT Courtyard Temple Entry", "Temple of Time Entrance", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot", 1}, + { ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE, ENTR_TEMPLE_OF_TIME_ENTRANCE, SINGLE_SCENE_INFO(SCENE_TEMPLE_OF_TIME), "Temple of Time Entrance", "ToT Courtyard Temple Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot"}, // Hyrule Castle { ENTR_MARKET_DAY_CASTLE_EXIT, ENTR_CASTLE_GROUNDS_SOUTH_EXIT, {SCENE_NO_SPAWN(SCENE_HYRULE_CASTLE), SCENE_NO_SPAWN(SCENE_OUTSIDE_GANONS_CASTLE)}, "Castle Grounds South Exit", "Market Castle Exit", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "outside ganon's castle"}, @@ -380,10 +381,12 @@ const EntranceData entranceData[] = { { ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, SINGLE_SCENE_INFO(SCENE_OUTSIDE_GANONS_CASTLE), "OGC Rainbow Bridge Exit", "Inside Ganon's Castle Entrance", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc", 1}, { ENTR_POTION_SHOP_KAKARIKO_1, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0x02 }}, "OGC Great Fairy Fountain", "OGC Behind Pillar", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "outside ganon's castle"}, { ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_INSIDE_GANONS_CASTLE), "Inside Ganon's Castle Entrance", "OGC Rainbow Bridge Exit", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc"} + + // clang-format on }; // Check if Link is in the area and return that scene/entrance for tracking -s8 LinkIsInArea(const EntranceData* entrance) { +int16_t LinkIsInArea(const EntranceData* entrance) { bool result = false; if (gPlayState == nullptr) { @@ -424,10 +427,12 @@ bool IsEntranceDiscovered(s16 index) { bool isDiscovered = Entrance_GetIsEntranceDiscovered(index); if (!isDiscovered) { // If the pair included one of the hyrule field <-> zora's river entrances, - // the randomizer will have also overriden the water-based entrances, so check those too - if ((index == ENTR_ZORAS_RIVER_WEST_EXIT && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_3)) || (index == ENTR_ZORAS_RIVER_3 && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_WEST_EXIT))) { + // the randomizer will have also overridden the water-based entrances, so check those too + if ((index == ENTR_ZORAS_RIVER_WEST_EXIT && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_3)) || + (index == ENTR_ZORAS_RIVER_3 && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_WEST_EXIT))) { isDiscovered = true; - } else if ((index == ENTR_HYRULE_FIELD_RIVER_EXIT && Entrance_GetIsEntranceDiscovered(ENTR_HYRULE_FIELD_14)) || (index == ENTR_HYRULE_FIELD_14 && Entrance_GetIsEntranceDiscovered(ENTR_HYRULE_FIELD_RIVER_EXIT))) { + } else if ((index == ENTR_HYRULE_FIELD_RIVER_EXIT && Entrance_GetIsEntranceDiscovered(ENTR_HYRULE_FIELD_14)) || + (index == ENTR_HYRULE_FIELD_14 && Entrance_GetIsEntranceDiscovered(ENTR_HYRULE_FIELD_RIVER_EXIT))) { isDiscovered = true; } } @@ -444,16 +449,24 @@ const EntranceData* GetEntranceData(s16 index) { return nullptr; } -// Used for verifying the names on both sides of entrance pairs match. Keeping for ease of use for further name changes later +void EntranceTracker_LoadFromPreset(nlohmann::json info) { + presetLoaded = true; + presetPos = { info["pos"]["x"], info["pos"]["y"] }; + presetSize = { info["size"]["width"], info["size"]["height"] }; +} + +// Used for verifying the names on both sides of entrance pairs match. Keeping for ease of use for further name changes +// later // TODO: Figure out how to remove the need for duplicate entrance names so this is no longer necessary void CheckEntranceNames() { - SPDLOG_ERROR("Checking entrance names:"); + SPDLOG_ERROR("Checking entrance names:"); for (size_t i = 0; i < ARRAY_COUNT(entranceData); i++) { auto entrance = &entranceData[i]; auto reverse = GetEntranceData(entrance->reverseIndex); if (entrance != nullptr && reverse != nullptr) { if (entrance->source != reverse->destination) { - SPDLOG_ERROR("{}({}) -> {}({})", entrance->source, entrance->index, reverse->destination, reverse->reverseIndex); + SPDLOG_ERROR("{}({}) -> {}({})", entrance->source, entrance->index, reverse->destination, + reverse->reverseIndex); } } } @@ -587,12 +600,12 @@ void ClearEntranceTrackingData() { currentGrottoId = -1; lastEntranceIndex = -1; lastSceneOrEntranceDetected = -1; - gEntranceTrackingData = {0}; + gEntranceTrackingData = { 0 }; } void InitEntranceTrackingData() { auto entranceCtx = Rando::Context::GetInstance()->GetEntranceShuffler(); - gEntranceTrackingData = {0}; + gEntranceTrackingData = { 0 }; // Check if entrance randomization is disabled if (!OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ENTRANCES)) { @@ -659,77 +672,89 @@ void InitEntranceTrackingData() { } void EntranceTrackerSettingsWindow::DrawElement() { - if (ImGui::BeginTable("entranceTrackerSettings", 1, ImGuiTableFlags_BordersInnerH)) { + + ImGui::TextWrapped("The entrance tracker will only track shuffled entrances"); + UIWidgets::Spacer(0); + + ImGui::TableNextColumn(); + + if (ImGui::BeginTable("entranceTrackerSubSettings", 2, + ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_SizingStretchProp)) { + ImGui::TableSetupColumn("column 1", ImGuiTableColumnFlags_WidthStretch, 150.0f); + ImGui::TableSetupColumn("column 2", ImGuiTableColumnFlags_WidthStretch, 150.0f); ImGui::TableNextColumn(); - UIWidgets::Spacer(0); - ImGui::TextWrapped("The entrance tracker will only track shuffled entrances"); - UIWidgets::Spacer(0); + ImGui::Text("Sort By"); + UIWidgets::CVarRadioButton("To", CVAR_TRACKER_ENTRANCE("SortBy"), 0, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("Sort entrances by the original source entrance")); + UIWidgets::CVarRadioButton( + "From", CVAR_TRACKER_ENTRANCE("SortBy"), 1, + UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("Sort entrances by the overrided destination")); + + ImGui::Text("List Items"); + UIWidgets::CVarCheckbox( + "Auto scroll", CVAR_TRACKER_ENTRANCE("AutoScroll"), + UIWidgets::CheckboxOptions() + .Tooltip("Automatically scroll to the first available entrance in the current scene") + .Color(THEME_COLOR)); + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + UIWidgets::CVarCheckbox("Highlight previous", CVAR_TRACKER_ENTRANCE("HighlightPrevious"), + UIWidgets::CheckboxOptions() + .Tooltip("Highlight the previous entrance that Link came from") + .Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Highlight available", CVAR_TRACKER_ENTRANCE("HighlightAvailable"), + UIWidgets::CheckboxOptions() + .Tooltip("Highlight available entrances in the current scene") + .Color(THEME_COLOR)); + ImGui::EndDisabled(); + UIWidgets::CVarCheckbox("Hide undiscovered", CVAR_TRACKER_ENTRANCE("CollapseUndiscovered"), + UIWidgets::CheckboxOptions() + .Tooltip("Collapse undiscovered entrances towards the bottom of each group") + .Color(THEME_COLOR)); + bool disableHideReverseEntrances = + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_ON; + static const char* disableHideReverseEntrancesText = + "This option is disabled because \"Decouple Entrances\" is enabled."; + UIWidgets::CVarCheckbox("Hide reverse", CVAR_TRACKER_ENTRANCE("HideReverseEntrances"), + UIWidgets::CheckboxOptions({ { .disabled = disableHideReverseEntrances, + .disabledTooltip = disableHideReverseEntrancesText } }) + .Tooltip("Hide reverse entrance transitions when Decouple Entrances is off") + .DefaultValue(true) + .Color(THEME_COLOR)); ImGui::TableNextColumn(); - if (ImGui::BeginTable("entranceTrackerSubSettings", 2, ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_SizingStretchProp)) { - - ImGui::TableNextColumn(); - - ImGui::Text("Sort By"); - UIWidgets::EnhancementRadioButton("To", CVAR_TRACKER_ENTRANCE("SortBy"), 0); - UIWidgets::Tooltip("Sort entrances by the original source entrance"); - UIWidgets::EnhancementRadioButton("From", CVAR_TRACKER_ENTRANCE("SortBy"), 1); - UIWidgets::Tooltip("Sort entrances by the overrided destination"); - - UIWidgets::Spacer(2.0f); - - ImGui::Text("List Items"); - UIWidgets::PaddedEnhancementCheckbox("Auto scroll", CVAR_TRACKER_ENTRANCE("AutoScroll"), true, false); - UIWidgets::Tooltip("Automatically scroll to the first aviable entrance in the current scene"); - UIWidgets::PaddedEnhancementCheckbox("Highlight previous", CVAR_TRACKER_ENTRANCE("HighlightPrevious"), true, false); - UIWidgets::Tooltip("Highlight the previous entrance that Link came from"); - UIWidgets::PaddedEnhancementCheckbox("Highlight available", CVAR_TRACKER_ENTRANCE("HighlightAvailable"), true, false); - UIWidgets::Tooltip("Highlight available entrances in the current scene"); - UIWidgets::PaddedEnhancementCheckbox("Hide undiscovered", CVAR_TRACKER_ENTRANCE("CollapseUndiscovered"), true, false); - UIWidgets::Tooltip("Collapse undiscovered entrances towards the bottom of each group"); - bool disableHideReverseEntrances = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_ON; - static const char* disableHideReverseEntrancesText = "This option is disabled because \"Decouple Entrances\" is enabled."; - UIWidgets::PaddedEnhancementCheckbox("Hide reverse", CVAR_TRACKER_ENTRANCE("HideReverseEntrances"), true, false, - disableHideReverseEntrances, disableHideReverseEntrancesText, UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Hide reverse entrance transitions when Decouple Entrances is off"); - UIWidgets::Spacer(0); - - ImGui::TableNextColumn(); - - ImGui::Text("Group By"); - UIWidgets::EnhancementRadioButton("Area", CVAR_TRACKER_ENTRANCE("GroupBy"), 0); - UIWidgets::Tooltip("Group entrances by their area"); - UIWidgets::EnhancementRadioButton("Type", CVAR_TRACKER_ENTRANCE("GroupBy"), 1); - UIWidgets::Tooltip("Group entrances by their entrance type"); - - UIWidgets::Spacer(2.0f); - - ImGui::Text("Spoiler Reveal"); - UIWidgets::PaddedEnhancementCheckbox("Show Source", CVAR_TRACKER_ENTRANCE("ShowFrom"), true, false); - UIWidgets::Tooltip("Reveal the sourcefor undiscovered entrances"); - UIWidgets::PaddedEnhancementCheckbox("Show Destination", CVAR_TRACKER_ENTRANCE("ShowTo"), true, false); - UIWidgets::Tooltip("Reveal the destination for undiscovered entrances"); - - ImGui::EndTable(); - } - - ImGui::TableNextColumn(); - - ImGui::SetNextItemOpen(false, ImGuiCond_Once); - if (ImGui::TreeNode("Legend")) { - ImGui::TextColored(ImColor(COLOR_ORANGE), "Last Entrance"); - ImGui::TextColored(ImColor(COLOR_GREEN), "Available Entrances"); - ImGui::TextColored(ImColor(COLOR_GRAY), "Undiscovered Entrances"); - ImGui::TreePop(); - } - - UIWidgets::Spacer(0); + ImGui::Text("Group By"); + UIWidgets::CVarRadioButton( + "Area", CVAR_TRACKER_ENTRANCE("GroupBy"), 0, + UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("Group entrances by their area")); + UIWidgets::CVarRadioButton( + "Type", CVAR_TRACKER_ENTRANCE("GroupBy"), 1, + UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("Group entrances by their entrance type")); + ImGui::Text("Spoiler Reveal"); + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + UIWidgets::CVarCheckbox( + "Show Source", CVAR_TRACKER_ENTRANCE("ShowFrom"), + UIWidgets::CheckboxOptions().Tooltip("Reveal the sourcefor undiscovered entrances").Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Show Destination", CVAR_TRACKER_ENTRANCE("ShowTo"), + UIWidgets::CheckboxOptions() + .Tooltip("Reveal the destination for undiscovered entrances") + .Color(THEME_COLOR)); + ImGui::EndDisabled(); ImGui::EndTable(); } + + ImGui::SetNextItemOpen(false, ImGuiCond_Once); + if (ImGui::TreeNode("Legend")) { + ImGui::TextColored(ImColor(COLOR_ORANGE), "Last Entrance"); + ImGui::TextColored(ImColor(COLOR_GREEN), "Available Entrances"); + ImGui::TextColored(ImColor(COLOR_GRAY), "Undiscovered Entrances"); + ImGui::TreePop(); + } } void EntranceTrackerWindow::Draw() { @@ -742,7 +767,13 @@ void EntranceTrackerWindow::Draw() { } void EntranceTrackerWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(600, 375), ImGuiCond_FirstUseEver); + if (presetLoaded) { + ImGui::SetNextWindowSize(presetSize); + ImGui::SetNextWindowPos(presetPos); + presetLoaded = false; + } else { + ImGui::SetNextWindowSize(ImVec2(600, 375), ImGuiCond_FirstUseEver); + } if (!ImGui::Begin("Entrance Tracker", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { ImGui::End(); @@ -752,24 +783,29 @@ void EntranceTrackerWindow::DrawElement() { static ImGuiTextFilter locationSearch; uint8_t nextTreeState = 0; - if (ImGui::Button("Collapse All")) { + if (UIWidgets::Button("Collapse All", UIWidgets::ButtonOptions({ { .tooltip = "Collapse all entrance groups" } }) + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline))) { nextTreeState = 1; } - UIWidgets::Tooltip("Collapse all entrance groups"); ImGui::SameLine(); - if (ImGui::Button("Expand All")) { + if (UIWidgets::Button("Expand All", UIWidgets::ButtonOptions({ { .tooltip = "Expand all entrance groups" } }) + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline))) { nextTreeState = 2; } - UIWidgets::Tooltip("Expand all entrance groups"); ImGui::SameLine(); - if (ImGui::Button("Clear")) { + if (UIWidgets::Button("Clear", UIWidgets::ButtonOptions({ { .tooltip = "Clear the search field" } }) + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline))) { locationSearch.Clear(); } - UIWidgets::Tooltip("Clear the search field"); + UIWidgets::PushStyleCombobox(THEME_COLOR); if (locationSearch.Draw()) { nextTreeState = 2; } + UIWidgets::PopStyleCombobox(); uint8_t destToggle = CVarGetInteger(CVAR_TRACKER_ENTRANCE("SortBy"), 0); uint8_t groupToggle = CVarGetInteger(CVAR_TRACKER_ENTRANCE("GroupBy"), 0); @@ -779,7 +815,7 @@ void EntranceTrackerWindow::DrawElement() { size_t groupCount = groupToggle ? ENTRANCE_TYPE_COUNT : SPOILER_ENTRANCE_GROUP_COUNT; auto groupNames = groupToggle ? groupTypeNames : spoilerEntranceGroupNames; - EntranceOverride *entranceList; + EntranceOverride* entranceList; switch (groupType) { case ENTRANCE_SOURCE_AREA: @@ -824,14 +860,17 @@ void EntranceTrackerWindow::DrawElement() { const EntranceData* original = GetEntranceData(entrance.index); const EntranceData* override = GetEntranceData(entrance.override); - // If entrance is a dungeon, grotto, or interior entrance, the transition into that area has oneExit set, which means we can filter the return transitions as redundant - // if entrances are not decoupled, as this is redundant information. Also checks a setting, enabled by default, for hiding them. - // If all of these conditions are met, we skip adding this entrance to any lists. - // However, if entrances are decoupled, then all transitions need to be displayed, so we proceed with the filtering - if ((original->type == ENTRANCE_TYPE_DUNGEON || original->type == ENTRANCE_TYPE_GROTTO || original->type == ENTRANCE_TYPE_INTERIOR) && - (original->oneExit != 1 && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_OFF) && + // If entrance is a dungeon, grotto, or interior entrance, the transition into that area has oneExit set, + // which means we can filter the return transitions as redundant if entrances are not decoupled, as this is + // redundant information. Also checks a setting, enabled by default, for hiding them. If all of these + // conditions are met, we skip adding this entrance to any lists. However, if entrances are decoupled, then + // all transitions need to be displayed, so we proceed with the filtering + if ((original->type == ENTRANCE_TYPE_DUNGEON || original->type == ENTRANCE_TYPE_GROTTO || + original->type == ENTRANCE_TYPE_INTERIOR) && + (original->oneExit != 1 && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_OFF) && hideReverse == 1) { - continue; + continue; } // RANDOTODO: Only show blue warps if bluewarp shuffle is on @@ -849,18 +888,21 @@ void EntranceTrackerWindow::DrawElement() { const char* rplcSrcAreaName = spoilerEntranceGroupNames[override->srcGroup].c_str(); const char* rplcTypeName = groupTypeNames[override->type].c_str(); - const char* origSrcName = showOriginal ? original->source.c_str() : ""; + const char* origSrcName = showOriginal ? original->source.c_str() : ""; const char* rplcDstName = showOverride ? override->destination.c_str() : ""; // Filter for entrances by group name, type, source/destination names, and meta tags if ((!locationSearch.IsActive() && (showOriginal || showOverride || !collapsUndiscovered)) || - ((showOriginal && (locationSearch.PassFilter(origSrcName) || locationSearch.PassFilter(origSrcAreaName) || - locationSearch.PassFilter(origTypeName) || locationSearch.PassFilter(original->metaTag.c_str()))) || - (showOverride && (locationSearch.PassFilter(rplcDstName) || locationSearch.PassFilter(rplcSrcAreaName) || - locationSearch.PassFilter(rplcTypeName) || locationSearch.PassFilter(override->metaTag.c_str()))))) { + ((showOriginal && + (locationSearch.PassFilter(origSrcName) || locationSearch.PassFilter(origSrcAreaName) || + locationSearch.PassFilter(origTypeName) || locationSearch.PassFilter(original->metaTag.c_str()))) || + (showOverride && + (locationSearch.PassFilter(rplcDstName) || locationSearch.PassFilter(rplcSrcAreaName) || + locationSearch.PassFilter(rplcTypeName) || locationSearch.PassFilter(override->metaTag.c_str()))))) { // Detect if a scroll should happen and remember the scene for that scroll - if (!doAreaScroll && (lastSceneOrEntranceDetected != LinkIsInArea(original) && LinkIsInArea(original) != -1)) { + if (!doAreaScroll && + (lastSceneOrEntranceDetected != LinkIsInArea(original) && LinkIsInArea(original) != -1)) { lastSceneOrEntranceDetected = LinkIsInArea(original); doAreaScroll = true; } @@ -894,16 +936,18 @@ void EntranceTrackerWindow::DrawElement() { const char* unknown = "???"; - const char* origSrcName = showOriginal ? original->source.c_str() : unknown; + const char* origSrcName = showOriginal ? original->source.c_str() : unknown; const char* rplcDstName = showOverride ? override->destination.c_str() : unknown; uint32_t color = isDiscovered ? IM_COL32_WHITE : COLOR_GRAY; // Handle highlighting and auto scroll if ((original->index == lastEntranceIndex || - (override->reverseIndex == lastEntranceIndex && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_OFF)) && - highlightPrevious) { - color = COLOR_ORANGE; + (override->reverseIndex == lastEntranceIndex && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == + RO_GENERIC_OFF)) && + highlightPrevious) { + color = COLOR_ORANGE; } else if (LinkIsInArea(original) != -1) { if (highlightAvailable) { color = COLOR_GREEN; @@ -940,16 +984,13 @@ void EntranceTrackerWindow::DrawElement() { } } ImGui::EndChild(); - ImGui::End(); } void EntranceTrackerWindow::InitElement() { // Setup hooks for loading and clearing the entrance tracker data - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { - InitEntranceTrackingData(); - }); - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { - ClearEntranceTrackingData(); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t fileNum) { InitEntranceTrackingData(); }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t fileNum) { ClearEntranceTrackingData(); }); } diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h index ef217b7f09..2d2f7143cb 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h @@ -76,8 +76,12 @@ typedef struct { extern EntranceTrackingData gEntranceTrackingData; -#define SINGLE_SCENE_INFO(scene) {{ scene, -1 }} -#define SCENE_NO_SPAWN(scene) { scene, -1 } +#define SINGLE_SCENE_INFO(scene) \ + { \ + { scene, -1 } \ + } +#define SCENE_NO_SPAWN(scene) \ + { scene, -1 } void SetCurrentGrottoIDForTracker(int16_t entranceIndex); void SetLastEntranceOverrideForTracker(int16_t entranceIndex); @@ -86,23 +90,24 @@ void InitEntranceTrackingData(); s16 GetLastEntranceOverride(); s16 GetCurrentGrottoId(); const EntranceData* GetEntranceData(s16); +void EntranceTracker_LoadFromPreset(nlohmann::json info); -class EntranceTrackerSettingsWindow : public Ship::GuiWindow { +class EntranceTrackerSettingsWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; protected: - void InitElement() override {}; + void InitElement() override{}; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; -class EntranceTrackerWindow : public Ship::GuiWindow { +class EntranceTrackerWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; - void Draw() override; + void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.c b/soh/soh/Enhancements/randomizer/randomizer_grotto.c index 50cb093c85..042efadf43 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.c +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.c @@ -12,6 +12,7 @@ extern PlayState* gPlayState; // Information necessary for entering each grotto static const GrottoLoadInfo grottoLoadTable[NUM_GROTTOS] = { + // clang-format off {.entranceIndex = ENTR_GROTTOS_10, .content = 0xFD, .scene = SCENE_DESERT_COLOSSUS}, // Desert Colossus -> Colossus Grotto {.entranceIndex = ENTR_GROTTOS_4, .content = 0xEF, .scene = SCENE_LAKE_HYLIA}, // Lake Hylia -> LH Grotto {.entranceIndex = ENTR_GROTTOS_10, .content = 0xEB, .scene = SCENE_ZORAS_RIVER}, // Zora River -> ZR Storms Grotto @@ -45,10 +46,13 @@ static const GrottoLoadInfo grottoLoadTable[NUM_GROTTOS] = { {.entranceIndex = ENTR_GROTTOS_10, .content = 0xF0, .scene = SCENE_GERUDO_VALLEY}, // GV Fortress Side -> GV Storms Grotto {.entranceIndex = ENTR_GROTTOS_6, .content = 0xF2, .scene = SCENE_GERUDO_VALLEY}, // GV Grotto Ledge -> GV Octorok Grotto {.entranceIndex = ENTR_GROTTOS_12, .content = 0xF3, .scene = SCENE_LOST_WOODS}, // LW Beyond Mido -> Deku Theater + + // clang-format on }; // Information necessary for setting up returning from a grotto static const GrottoReturnInfo grottoReturnTable[NUM_GROTTOS] = { + // clang-format off {.entranceIndex = ENTR_DESERT_COLOSSUS_EAST_EXIT, .room = 0x00, .angle = 0xA71C, .pos = {.x = 62.5078f, .y = -32.0f, .z = -1296.2f}}, // Colossus Grotto -> Desert Colossus {.entranceIndex = ENTR_LAKE_HYLIA_NORTH_EXIT, .room = 0x00, .angle = 0x0000, .pos = {.x = -3039.34f, .y = -1033.0f, .z = 6080.74f}}, // LH Grotto -> Lake Hylia {.entranceIndex = ENTR_ZORAS_RIVER_WEST_EXIT, .room = 0x00, .angle = 0x0000, .pos = {.x = -1630.05f, .y = 100.0f, .z = -132.104f}}, // ZR Storms Grotto -> Zora River @@ -82,10 +86,12 @@ static const GrottoReturnInfo grottoReturnTable[NUM_GROTTOS] = { {.entranceIndex = ENTR_GERUDO_VALLEY_WEST_EXIT, .room = 0x00, .angle = 0x9555, .pos = {.x = -1326.34f, .y = 15.0f, .z = -983.994f}}, // GV Storms Grotto -> GV Fortress Side {.entranceIndex = ENTR_GERUDO_VALLEY_EAST_EXIT, .room = 0x00, .angle = 0x8000, .pos = {.x = 291.513f, .y = -555.0f, .z = 1478.39f}}, // GV Octorok Grotto -> GV Grotto Ledge {.entranceIndex = ENTR_LOST_WOODS_NORTH_EXIT, .room = 0x06, .angle = 0x4000, .pos = {.x = 109.281f, .y = -20.0f, .z = -1601.42f}}, // Deku Theater -> LW Beyond Mido + + // clang-format on }; -static s16 grottoExitList[NUM_GROTTOS] = {0}; -static s16 grottoLoadList[NUM_GROTTOS] = {0}; +static s16 grottoExitList[NUM_GROTTOS] = { 0 }; +static s16 grottoLoadList[NUM_GROTTOS] = { 0 }; static s8 grottoId = 0xFF; static s8 lastEntranceType = NOT_GROTTO; static u8 overridingNextEntrance = false; @@ -137,7 +143,9 @@ static void Grotto_SetupReturnInfo(GrottoReturnInfo grotto, RespawnMode respawnM // This method doesn't change player respawn data, so only use this if you are querying an entrance index. s16 Grotto_GetEntranceValueHandlingGrottoRando(s16 nextEntranceIndex) { // Don't change anything unless grotto shuffle has been enabled - if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { + if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { return nextEntranceIndex; } @@ -151,7 +159,8 @@ s16 Grotto_GetEntranceValueHandlingGrottoRando(s16 nextEntranceIndex) { s8 tempGrottoId = nextEntranceIndex & 0x00FF; // Grotto Returns - if (nextEntranceIndex >= ENTRANCE_GROTTO_EXIT_START && nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START + NUM_GROTTOS) { + if (nextEntranceIndex >= ENTRANCE_GROTTO_EXIT_START && + nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START + NUM_GROTTOS) { GrottoReturnInfo grotto = grottoReturnTable[tempGrottoId]; // When the nextEntranceIndex is determined by a dynamic exit, @@ -161,11 +170,11 @@ s16 Grotto_GetEntranceValueHandlingGrottoRando(s16 nextEntranceIndex) { nextEntranceIndex = grotto.entranceIndex; } else if (gPlayState == NULL) { // Handle spawn position when loading from a save file nextEntranceIndex = grotto.entranceIndex; - // Otherwise return 0x7FFF (ENTR_RETURN_GROTTO) and let the game handle it + // Otherwise return 0x7FFF (ENTR_RETURN_GROTTO) and let the game handle it } else { nextEntranceIndex = ENTR_RETURN_GROTTO; } - // Grotto Loads + // Grotto Loads } else if (nextEntranceIndex >= ENTRANCE_GROTTO_LOAD_START && nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START) { GrottoLoadInfo grotto = grottoLoadTable[tempGrottoId]; nextEntranceIndex = grotto.entranceIndex; @@ -179,7 +188,9 @@ s16 Grotto_GetEntranceValueHandlingGrottoRando(s16 nextEntranceIndex) { s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { // Don't change anything unless grotto shuffle has been enabled - if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { + if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { return nextEntranceIndex; } @@ -195,7 +206,8 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { grottoId = nextEntranceIndex & 0x00FF; // Grotto Returns - if (nextEntranceIndex >= ENTRANCE_GROTTO_EXIT_START && nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START + NUM_GROTTOS) { + if (nextEntranceIndex >= ENTRANCE_GROTTO_EXIT_START && + nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START + NUM_GROTTOS) { GrottoReturnInfo grotto = grottoReturnTable[grottoId]; Grotto_SetupReturnInfo(grotto, RESPAWN_MODE_RETURN); @@ -213,13 +225,13 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { gSaveContext.respawnFlag = 2; nextEntranceIndex = grotto.entranceIndex; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; - // Otherwise return 0x7FFF (ENTR_RETURN_GROTTO) and let the game handle it + // Otherwise return 0x7FFF (ENTR_RETURN_GROTTO) and let the game handle it } else { nextEntranceIndex = ENTR_RETURN_GROTTO; } lastEntranceType = GROTTO_RETURN; - // Grotto Loads + // Grotto Loads } else if (nextEntranceIndex >= ENTRANCE_GROTTO_LOAD_START && nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START) { // Set the respawn data to load the correct grotto @@ -230,7 +242,7 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { EntranceTracker_SetCurrentGrottoID(grottoId); lastEntranceType = NOT_GROTTO; - // Otherwise just unset the current grotto ID + // Otherwise just unset the current grotto ID } else { grottoId = 0xFF; lastEntranceType = NOT_GROTTO; @@ -245,7 +257,9 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { void Grotto_OverrideActorEntrance(Actor* thisx) { // Vanilla Behavior if there's no possibility of ending up in a grotto randomly - if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { + if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { return; } @@ -271,7 +285,9 @@ void Grotto_OverrideActorEntrance(Actor* thisx) { // Set necessary flags for when warp songs/overworld spawns are shuffled to grotto return points void Grotto_ForceGrottoReturnOnSpecialEntrance(void) { - if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { + if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || + Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || + Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { gSaveContext.respawnFlag = 2; gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams = 0x04FF; gSaveContext.respawn[RESPAWN_MODE_RETURN].pos = grottoReturnTable[grottoId].pos; @@ -284,11 +300,13 @@ void Grotto_ForceGrottoReturnOnSpecialEntrance(void) { // Set the respawn flag for when we want to return from a grotto entrance // Used for Sun's Song and Game Over, which usually don't restore saved position data void Grotto_ForceGrottoReturn(void) { - if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { + if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || + Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || + Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { gSaveContext.respawnFlag = 2; gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams = 0x0DFF; gSaveContext.respawn[RESPAWN_MODE_RETURN].pos = grottoReturnTable[grottoId].pos; - //Save the current temp flags in the grotto return point, so they'll properly keep their values. + // Save the current temp flags in the grotto return point, so they'll properly keep their values. gSaveContext.respawn[RESPAWN_MODE_RETURN].tempSwchFlags = gPlayState->actorCtx.flags.tempSwch; gSaveContext.respawn[RESPAWN_MODE_RETURN].tempCollectFlags = gPlayState->actorCtx.flags.tempCollect; } @@ -296,7 +314,9 @@ void Grotto_ForceGrottoReturn(void) { // Used for the DMT special voids, which usually don't restore saved position data void Grotto_ForceRegularVoidOut(void) { - if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { + if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || + Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || + Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { gSaveContext.respawn[RESPAWN_MODE_DOWN] = gSaveContext.respawn[RESPAWN_MODE_RETURN]; gSaveContext.respawn[RESPAWN_MODE_DOWN].playerParams = 0x0DFF; gSaveContext.respawn[RESPAWN_MODE_DOWN].pos = grottoReturnTable[grottoId].pos; @@ -307,8 +327,9 @@ void Grotto_ForceRegularVoidOut(void) { // If returning to a FW point saved at a grotto exit, copy the FW data to the Grotto Return Point // so that Sun's Song and Game Over will behave correctly void Grotto_SetupReturnInfoOnFWReturn(void) { - if (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS) && - gSaveContext.fw.playerParams == 0x04FF) { + if (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || + Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || + Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS) && gSaveContext.fw.playerParams == 0x04FF) { gSaveContext.respawn[RESPAWN_MODE_RETURN] = gSaveContext.respawn[RESPAWN_MODE_TOP]; gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams = 0x0DFF; lastEntranceType = GROTTO_RETURN; @@ -339,7 +360,9 @@ s16 Grotto_GetRenamedGrottoIndexFromOriginal(s8 content, s8 scene) { } s8 Grotto_CurrentGrotto() { - if (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { + if (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || + Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || + Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { return grottoId; } else { s16 entrance = gSaveContext.respawn[RESPAWN_MODE_RETURN].entranceIndex; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 8c4d05a4f6..cf2f83d3ad 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -1,1355 +1,1954 @@ -#pragma once +DEFINE_RAND_INF(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE) +DEFINE_RAND_INF(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE) -typedef enum { - RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE, - RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE, +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_GV_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW) - RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW, - RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW, - RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW, - RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW, - RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW, - RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW, - RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW, - RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW, - RAND_INF_COWS_MILKED_GV_COW, - RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW, +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT) - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, - RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT, - RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO, - RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR, - RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT, - RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR, - RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT, - RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT, - RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT, - RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER, - RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR, - RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT, - RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR, - RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT, - RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT, - RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT, - RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER, - RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT, - RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT, - RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER, - RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT, - RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT, - RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER, - RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, - RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, - RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, - RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, - RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE, - RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB, - RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8) - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8, +DEFINE_RAND_INF(RAND_INF_MERCHANTS_CARPET_SALESMAN) +DEFINE_RAND_INF(RAND_INF_MERCHANTS_MEDIGORON) +DEFINE_RAND_INF(RAND_INF_MERCHANTS_GRANNYS_SHOP) +DEFINE_RAND_INF(RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN) - RAND_INF_MERCHANTS_CARPET_SALESMAN, - RAND_INF_MERCHANTS_MEDIGORON, - RAND_INF_MERCHANTS_GRANNYS_SHOP, - RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN, +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_GV_TRADE_SAW) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_ZD_TRADE_PRESCRIPTION) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_LH_TRADE_FROG) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_DMT_TRADE_CLAIM_CHECK) - RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO, - RAND_INF_ADULT_TRADES_GV_TRADE_SAW, - RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD, - RAND_INF_ADULT_TRADES_ZD_TRADE_PRESCRIPTION, - RAND_INF_ADULT_TRADES_LH_TRADE_FROG, - RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS, - RAND_INF_ADULT_TRADES_DMT_TRADE_CLAIM_CHECK, +DEFINE_RAND_INF(RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD) - RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD, +DEFINE_RAND_INF(RAND_INF_GREG_FOUND) - RAND_INF_GREG_FOUND, +DEFINE_RAND_INF(RAND_INF_TOT_MASTER_SWORD) +DEFINE_RAND_INF(RAND_INF_CHILD_FISHING) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_1) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_2) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_3) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_4) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_5) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_6) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_7) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_8) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_9) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_10) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_11) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_12) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_13) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_14) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_15) +DEFINE_RAND_INF(RAND_INF_CHILD_LOACH_1) +DEFINE_RAND_INF(RAND_INF_CHILD_LOACH_2) +DEFINE_RAND_INF(RAND_INF_ADULT_FISHING) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_1) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_2) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_3) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_4) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_5) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_6) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_7) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_8) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_9) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_10) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_11) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_12) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_13) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_14) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_15) +DEFINE_RAND_INF(RAND_INF_ADULT_LOACH) - RAND_INF_TOT_MASTER_SWORD, +DEFINE_RAND_INF(RAND_INF_10_BIG_POES) +DEFINE_RAND_INF(RAND_INF_GRANT_GANONS_BOSSKEY) - RAND_INF_CHILD_FISHING, - RAND_INF_CHILD_FISH_1, - RAND_INF_CHILD_FISH_2, - RAND_INF_CHILD_FISH_3, - RAND_INF_CHILD_FISH_4, - RAND_INF_CHILD_FISH_5, - RAND_INF_CHILD_FISH_6, - RAND_INF_CHILD_FISH_7, - RAND_INF_CHILD_FISH_8, - RAND_INF_CHILD_FISH_9, - RAND_INF_CHILD_FISH_10, - RAND_INF_CHILD_FISH_11, - RAND_INF_CHILD_FISH_12, - RAND_INF_CHILD_FISH_13, - RAND_INF_CHILD_FISH_14, - RAND_INF_CHILD_FISH_15, - RAND_INF_CHILD_LOACH_1, - RAND_INF_CHILD_LOACH_2, - RAND_INF_ADULT_FISHING, - RAND_INF_ADULT_FISH_1, - RAND_INF_ADULT_FISH_2, - RAND_INF_ADULT_FISH_3, - RAND_INF_ADULT_FISH_4, - RAND_INF_ADULT_FISH_5, - RAND_INF_ADULT_FISH_6, - RAND_INF_ADULT_FISH_7, - RAND_INF_ADULT_FISH_8, - RAND_INF_ADULT_FISH_9, - RAND_INF_ADULT_FISH_10, - RAND_INF_ADULT_FISH_11, - RAND_INF_ADULT_FISH_12, - RAND_INF_ADULT_FISH_13, - RAND_INF_ADULT_FISH_14, - RAND_INF_ADULT_FISH_15, - RAND_INF_ADULT_LOACH, +DEFINE_RAND_INF(RAND_INF_GOHMA_SOUL) +DEFINE_RAND_INF(RAND_INF_KING_DODONGO_SOUL) +DEFINE_RAND_INF(RAND_INF_BARINADE_SOUL) +DEFINE_RAND_INF(RAND_INF_PHANTOM_GANON_SOUL) +DEFINE_RAND_INF(RAND_INF_VOLVAGIA_SOUL) +DEFINE_RAND_INF(RAND_INF_MORPHA_SOUL) +DEFINE_RAND_INF(RAND_INF_BONGO_BONGO_SOUL) +DEFINE_RAND_INF(RAND_INF_TWINROVA_SOUL) +DEFINE_RAND_INF(RAND_INF_GANON_SOUL) - RAND_INF_10_BIG_POES, - RAND_INF_GRANT_GANONS_BOSSKEY, +DEFINE_RAND_INF(RAND_INF_HAS_OCARINA_A) +DEFINE_RAND_INF(RAND_INF_HAS_OCARINA_C_UP) +DEFINE_RAND_INF(RAND_INF_HAS_OCARINA_C_DOWN) +DEFINE_RAND_INF(RAND_INF_HAS_OCARINA_C_LEFT) +DEFINE_RAND_INF(RAND_INF_HAS_OCARINA_C_RIGHT) - RAND_INF_GOHMA_SOUL, - RAND_INF_KING_DODONGO_SOUL, - RAND_INF_BARINADE_SOUL, - RAND_INF_PHANTOM_GANON_SOUL, - RAND_INF_VOLVAGIA_SOUL, - RAND_INF_MORPHA_SOUL, - RAND_INF_BONGO_BONGO_SOUL, - RAND_INF_TWINROVA_SOUL, - RAND_INF_GANON_SOUL, +DEFINE_RAND_INF(RAND_INF_KF_LINKS_HOUSE_POT) +DEFINE_RAND_INF(RAND_INF_KF_TWINS_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_KF_TWINS_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_KF_BROTHERS_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_KF_BROTHERS_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_ROOM_FRONT_POT) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_ROOM_BACK_POT) +DEFINE_RAND_INF(RAND_INF_TH_KITCHEN_POT_1) +DEFINE_RAND_INF(RAND_INF_TH_KITCHEN_POT_2) +DEFINE_RAND_INF(RAND_INF_TH_1_TORCH_CELL_RIGHT_POT) +DEFINE_RAND_INF(RAND_INF_TH_1_TORCH_CELL_MID_POT) +DEFINE_RAND_INF(RAND_INF_TH_1_TORCH_CELL_LEFT_POT) +DEFINE_RAND_INF(RAND_INF_TH_STEEP_SLOPE_RIGHT_POT) +DEFINE_RAND_INF(RAND_INF_TH_STEEP_SLOPE_LEFT_POT) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_DOUBLE_CELL_RIGHT_POT) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_DOUBLE_CELL_MID_POT) +DEFINE_RAND_INF(RAND_INF_NEAR_DOUBLE_CELL_LEFT_POT) +DEFINE_RAND_INF(RAND_INF_TH_RIGHTMOST_JAILED_POT) +DEFINE_RAND_INF(RAND_INF_TH_RIGHT_MIDDLE_JAILED_POT) +DEFINE_RAND_INF(RAND_INF_TH_LEFT_MIDDLE_JAILED_POT) +DEFINE_RAND_INF(RAND_INF_TH_LEFTMOST_JAILED_POT) +DEFINE_RAND_INF(RAND_INF_WASTELAND_NEAR_GS_POT_1) +DEFINE_RAND_INF(RAND_INF_WASTELAND_NEAR_GS_POT_2) +DEFINE_RAND_INF(RAND_INF_WASTELAND_NEAR_GS_POT_3) +DEFINE_RAND_INF(RAND_INF_WASTELAND_NEAR_GS_POT_4) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11) +DEFINE_RAND_INF(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_POTION_SHOP_POT_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_POTION_SHOP_POT_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_POTION_SHOP_POT_3) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_1) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_2) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_3) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_4) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_5) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_6) +DEFINE_RAND_INF(RAND_INF_GC_LOWER_STAIRCASE_POT_1) +DEFINE_RAND_INF(RAND_INF_GC_LOWER_STAIRCASE_POT_2) +DEFINE_RAND_INF(RAND_INF_GC_UPPER_STAIRCASE_POT_1) +DEFINE_RAND_INF(RAND_INF_GC_UPPER_STAIRCASE_POT_2) +DEFINE_RAND_INF(RAND_INF_GC_UPPER_STAIRCASE_POT_3) +DEFINE_RAND_INF(RAND_INF_GC_MEDIGORON_POT_1) +DEFINE_RAND_INF(RAND_INF_GC_DARUNIA_POT_1) +DEFINE_RAND_INF(RAND_INF_GC_DARUNIA_POT_2) +DEFINE_RAND_INF(RAND_INF_GC_DARUNIA_POT_3) +DEFINE_RAND_INF(RAND_INF_DMC_NEAR_GC_POT_1) +DEFINE_RAND_INF(RAND_INF_DMC_NEAR_GC_POT_2) +DEFINE_RAND_INF(RAND_INF_DMC_NEAR_GC_POT_3) +DEFINE_RAND_INF(RAND_INF_DMC_NEAR_GC_POT_4) +DEFINE_RAND_INF(RAND_INF_ZD_NEAR_SHOP_POT_1) +DEFINE_RAND_INF(RAND_INF_ZD_NEAR_SHOP_POT_2) +DEFINE_RAND_INF(RAND_INF_ZD_NEAR_SHOP_POT_3) +DEFINE_RAND_INF(RAND_INF_ZD_NEAR_SHOP_POT_4) +DEFINE_RAND_INF(RAND_INF_ZD_NEAR_SHOP_POT_5) +DEFINE_RAND_INF(RAND_INF_ZF_HIDDEN_CAVE_POT_1) +DEFINE_RAND_INF(RAND_INF_ZF_HIDDEN_CAVE_POT_2) +DEFINE_RAND_INF(RAND_INF_ZF_HIDDEN_CAVE_POT_3) +DEFINE_RAND_INF(RAND_INF_ZF_NEAR_JABU_POT_1) +DEFINE_RAND_INF(RAND_INF_ZF_NEAR_JABU_POT_2) +DEFINE_RAND_INF(RAND_INF_ZF_NEAR_JABU_POT_3) +DEFINE_RAND_INF(RAND_INF_ZF_NEAR_JABU_POT_4) +DEFINE_RAND_INF(RAND_INF_LLR_FRONT_POT_1) +DEFINE_RAND_INF(RAND_INF_LLR_FRONT_POT_2) +DEFINE_RAND_INF(RAND_INF_LLR_FRONT_POT_3) +DEFINE_RAND_INF(RAND_INF_LLR_FRONT_POT_4) +DEFINE_RAND_INF(RAND_INF_LLR_RAIN_SHED_POT_1) +DEFINE_RAND_INF(RAND_INF_LLR_RAIN_SHED_POT_2) +DEFINE_RAND_INF(RAND_INF_LLR_RAIN_SHED_POT_3) +DEFINE_RAND_INF(RAND_INF_LLR_TALONS_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_LLR_TALONS_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_LLR_TALONS_HOUSE_POT_3) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_POT_1) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_POT_2) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_POT_1) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_POT_2) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_POT_3) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_POT_4) - RAND_INF_HAS_OCARINA_A, - RAND_INF_HAS_OCARINA_C_UP, - RAND_INF_HAS_OCARINA_C_DOWN, - RAND_INF_HAS_OCARINA_C_LEFT, - RAND_INF_HAS_OCARINA_C_RIGHT, +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BLADE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BLADE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_4) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_5) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_6) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_TORCH_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_TORCH_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_HALL_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_HALL_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_NEAR_END_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_NEAR_END_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_FROZEN_POT_1) - RAND_INF_KF_LINKS_HOUSE_POT, - RAND_INF_KF_TWINS_HOUSE_POT_1, - RAND_INF_KF_TWINS_HOUSE_POT_2, - RAND_INF_KF_BROTHERS_HOUSE_POT_1, - RAND_INF_KF_BROTHERS_HOUSE_POT_2, - RAND_INF_GF_BREAK_ROOM_POT_1, - RAND_INF_GF_BREAK_ROOM_POT_2, - RAND_INF_GF_KITCHEN_POT_1, - RAND_INF_GF_KITCHEN_POT_2, - RAND_INF_GF_NORTH_F1_CARPENTER_POT_1, - RAND_INF_GF_NORTH_F1_CARPENTER_POT_2, - RAND_INF_GF_NORTH_F1_CARPENTER_POT_3, - RAND_INF_GF_NORTH_F2_CARPENTER_POT_1, - RAND_INF_GF_NORTH_F2_CARPENTER_POT_2, - RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1, - RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2, - RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3, - RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1, - RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2, - RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3, - RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4, - RAND_INF_WASTELAND_NEAR_GS_POT_1, - RAND_INF_WASTELAND_NEAR_GS_POT_2, - RAND_INF_WASTELAND_NEAR_GS_POT_3, - RAND_INF_WASTELAND_NEAR_GS_POT_4, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11, - RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1, - RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2, - RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3, - RAND_INF_KAK_NEAR_POTION_SHOP_POT_1, - RAND_INF_KAK_NEAR_POTION_SHOP_POT_2, - RAND_INF_KAK_NEAR_POTION_SHOP_POT_3, - RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1, - RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2, - RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3, - RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1, - RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2, - RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3, - RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1, - RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2, - RAND_INF_GY_DAMPES_GRAVE_POT_1, - RAND_INF_GY_DAMPES_GRAVE_POT_2, - RAND_INF_GY_DAMPES_GRAVE_POT_3, - RAND_INF_GY_DAMPES_GRAVE_POT_4, - RAND_INF_GY_DAMPES_GRAVE_POT_5, - RAND_INF_GY_DAMPES_GRAVE_POT_6, - RAND_INF_GC_LOWER_STAIRCASE_POT_1, - RAND_INF_GC_LOWER_STAIRCASE_POT_2, - RAND_INF_GC_UPPER_STAIRCASE_POT_1, - RAND_INF_GC_UPPER_STAIRCASE_POT_2, - RAND_INF_GC_UPPER_STAIRCASE_POT_3, - RAND_INF_GC_MEDIGORON_POT_1, - RAND_INF_GC_DARUNIA_POT_1, - RAND_INF_GC_DARUNIA_POT_2, - RAND_INF_GC_DARUNIA_POT_3, - RAND_INF_DMC_NEAR_GC_POT_1, - RAND_INF_DMC_NEAR_GC_POT_2, - RAND_INF_DMC_NEAR_GC_POT_3, - RAND_INF_DMC_NEAR_GC_POT_4, - RAND_INF_ZD_NEAR_SHOP_POT_1, - RAND_INF_ZD_NEAR_SHOP_POT_2, - RAND_INF_ZD_NEAR_SHOP_POT_3, - RAND_INF_ZD_NEAR_SHOP_POT_4, - RAND_INF_ZD_NEAR_SHOP_POT_5, - RAND_INF_ZF_HIDDEN_CAVE_POT_1, - RAND_INF_ZF_HIDDEN_CAVE_POT_2, - RAND_INF_ZF_HIDDEN_CAVE_POT_3, - RAND_INF_ZF_NEAR_JABU_POT_1, - RAND_INF_ZF_NEAR_JABU_POT_2, - RAND_INF_ZF_NEAR_JABU_POT_3, - RAND_INF_ZF_NEAR_JABU_POT_4, - RAND_INF_LLR_FRONT_POT_1, - RAND_INF_LLR_FRONT_POT_2, - RAND_INF_LLR_FRONT_POT_3, - RAND_INF_LLR_FRONT_POT_4, - RAND_INF_LLR_RAIN_SHED_POT_1, - RAND_INF_LLR_RAIN_SHED_POT_2, - RAND_INF_LLR_RAIN_SHED_POT_3, - RAND_INF_LLR_TALONS_HOUSE_POT_1, - RAND_INF_LLR_TALONS_HOUSE_POT_2, - RAND_INF_LLR_TALONS_HOUSE_POT_3, - RAND_INF_HF_COW_GROTTO_POT_1, - RAND_INF_HF_COW_GROTTO_POT_2, - RAND_INF_HC_STORMS_GROTTO_POT_1, - RAND_INF_HC_STORMS_GROTTO_POT_2, - RAND_INF_HC_STORMS_GROTTO_POT_3, - RAND_INF_HC_STORMS_GROTTO_POT_4, +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2) - RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1, - RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2, - RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3, - RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6, - RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2, - RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3, - RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4, - RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1, - RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2, - RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3, - RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4, - RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1, - RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2, - RAND_INF_DODONGOS_CAVERN_BLADE_POT_1, - RAND_INF_DODONGOS_CAVERN_BLADE_POT_2, - RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, - RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, - RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2, - RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3, - RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4, - RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, - RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, - RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6, - RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1, - RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2, - RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3, - RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, - RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, - RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, - RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, - RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_1, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_2, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_3, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_4, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_5, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_6, - RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1, - RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2, - RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1, - RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2, - RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1, - RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2, - RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3, - RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4, - RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1, - RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2, - RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3, - RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1, - RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2, - RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1, - RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2, - RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3, - RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4, - RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1, - RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2, - RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, - RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, - RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, - RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, - RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, - RAND_INF_WATER_TEMPLE_TORCH_POT_1, - RAND_INF_WATER_TEMPLE_TORCH_POT_2, - RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1, - RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2, - RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3, - RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1, - RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2, - RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1, - RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2, - RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3, - RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4, - RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, - RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, - RAND_INF_WATER_TEMPLE_RIVER_POT_1, - RAND_INF_WATER_TEMPLE_RIVER_POT_2, - RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1, - RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2, - RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1, - RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2, - RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, - RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, - RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, - RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, - RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, - RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, - RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1, - RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2, - RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, - RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, - RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, - RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, - RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1, - RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2, - RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, - RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1, - RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2, - RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1, - RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2, - RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3, - RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4, - RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1, - RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2, - RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1, - RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2, - RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3, - RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4, - RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, - RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, - RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, - RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, - RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4, - RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, - RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, - RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, - RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT, - RAND_INF_ICE_CAVERN_HALL_POT_1, - RAND_INF_ICE_CAVERN_HALL_POT_2, - RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1, - RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2, - RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3, - RAND_INF_ICE_CAVERN_NEAR_END_POT_1, - RAND_INF_ICE_CAVERN_NEAR_END_POT_2, - RAND_INF_ICE_CAVERN_FROZEN_POT_1, +DEFINE_RAND_INF(RAND_INF_GV_FREESTANDING_POH_CRATE) +DEFINE_RAND_INF(RAND_INF_GV_NEAR_COW_CRATE) +DEFINE_RAND_INF(RAND_INF_GV_CRATE_BRIDGE_1) +DEFINE_RAND_INF(RAND_INF_GV_CRATE_BRIDGE_2) +DEFINE_RAND_INF(RAND_INF_GV_CRATE_BRIDGE_3) +DEFINE_RAND_INF(RAND_INF_GV_CRATE_BRIDGE_4) +DEFINE_RAND_INF(RAND_INF_GF_ABOVE_JAIL_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_SOUTHMOST_CENTER_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_MID_SOUTH_CENTER_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_MID_NORTH_CENTER_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_NORTHMOST_CENTER_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_OUTSKIRTS_NE_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_OUTSKIRTS_NW_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_3) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_4) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_5) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_6) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_7) +DEFINE_RAND_INF(RAND_INF_GF_HBA_CANOPY_EAST_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_HBA_CANOPY_WEST_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_TARGET_EAST_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_TARGET_WEST_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_TARGET_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_TARGET_EAST_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_TARGET_WEST_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_KITCHEN_LEFTMOST_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_KITCHEN_MID_LEFT_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_KITCHEN_MID_RIGHT_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_KITCHEN_RIGHTMOST_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_KITCHEN_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_HALLWAY_OUTER_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_HALLWAY_INNER_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_ROOM_RIGHT_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_ROOM_LEFT_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_1_TORCH_CELL_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_DEAD_END_CELL_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_DOUBLE_CELL_LEFT_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_DOUBLE_CELL_RIGHT_CRATE) +DEFINE_RAND_INF(RAND_INF_HW_BEFORE_QUICKSAND_CRATE) +DEFINE_RAND_INF(RAND_INF_HW_AFTER_QUICKSAND_CRATE_1) +DEFINE_RAND_INF(RAND_INF_HW_AFTER_QUICKSAND_CRATE_2) +DEFINE_RAND_INF(RAND_INF_HW_AFTER_QUICKSAND_CRATE_3) +DEFINE_RAND_INF(RAND_INF_HW_NEAR_COLOSSUS_CRATE) +DEFINE_RAND_INF(RAND_INF_MK_NEAR_BAZAAR_CRATE_1) +DEFINE_RAND_INF(RAND_INF_MK_NEAR_BAZAAR_CRATE_2) +DEFINE_RAND_INF(RAND_INF_MK_SHOOTING_GALLERY_CRATE_1) +DEFINE_RAND_INF(RAND_INF_MK_SHOOTING_GALLERY_CRATE_2) +DEFINE_RAND_INF(RAND_INF_MK_LOST_DOG_HOUSE_CRATE) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CRATE_3) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CRATE_4) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CRATE_5) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_GY_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_CRATE) +DEFINE_RAND_INF(RAND_INF_GC_MAZE_CRATE) +DEFINE_RAND_INF(RAND_INF_DMC_CRATE) +DEFINE_RAND_INF(RAND_INF_LLR_NEAR_TREE_CRATE) +DEFINE_RAND_INF(RAND_INF_LH_LAB_CRATE) - RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, - RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, - RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, - RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, - RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, - RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, - RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, - RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, - RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6, - RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, - RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, - RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, - RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3, - RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, - RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, - RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3, - RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, - RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3, - RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4, - RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4, - RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, - RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3, - RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, - RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, - RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT, - RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, - RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, - RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, - RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, - RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, - RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, - RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, - RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, - RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1, - RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, - RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, - RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3, - RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4, - RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5, - RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, - RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, - RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, - RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, - RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3, - RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4, - RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5, - RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, - RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, - RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1, - RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2, - RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, - RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, - RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, - RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, - RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, - RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, - RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, - RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, - RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT, - RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, - RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, - RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, - RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE) - - RAND_INF_CAUGHT_LOACH, +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2) - RAND_INF_CAN_SWIM, +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE) - RAND_INF_HAS_WALLET, +DEFINE_RAND_INF(RAND_INF_CAUGHT_LOACH) - RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT, - RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT, - RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT, - RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT, - RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO, - RAND_INF_BEEHIVE_SFM_STORMS_GROTTO, - RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT, - RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT, - RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT, - RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT, - RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT, - RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT, - RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO, - RAND_INF_BEEHIVE_LLR_GROTTO, - RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT, - RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT, - RAND_INF_BEEHIVE_DMT_COW_GROTTO, - RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT, - RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT, - RAND_INF_BEEHIVE_GC_GROTTO, - RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT, - RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT, - RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO, - RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT, - RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT, - RAND_INF_BEEHIVE_ZR_STORMS_GROTTO, - RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT, - RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT, - RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA, - RAND_INF_BEEHIVE_LH_GROTTO, - RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO, - RAND_INF_BEEHIVE_COLOSSUS_GROTTO, +DEFINE_RAND_INF(RAND_INF_CAN_SWIM) - RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO, - RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO, - RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO, - RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO, - RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO, - RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO, - RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO, - RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO, - RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO, +DEFINE_RAND_INF(RAND_INF_HAS_WALLET) - RAND_INF_FISHING_POLE_FOUND, +DEFINE_RAND_INF(RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_SFM_STORMS_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_LLR_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMT_COW_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_GC_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZR_STORMS_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_LH_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_COLOSSUS_GROTTO) - RAND_INF_ZD_FISH_1, - RAND_INF_ZD_FISH_2, - RAND_INF_ZD_FISH_3, - RAND_INF_ZD_FISH_4, - RAND_INF_ZD_FISH_5, +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO) - RAND_INF_HAS_INFINITE_QUIVER, - RAND_INF_HAS_INFINITE_BOMB_BAG, - RAND_INF_HAS_INFINITE_BULLET_BAG, - RAND_INF_HAS_INFINITE_STICK_UPGRADE, - RAND_INF_HAS_INFINITE_NUT_UPGRADE, - RAND_INF_HAS_INFINITE_MAGIC_METER, - RAND_INF_HAS_INFINITE_BOMBCHUS, - RAND_INF_HAS_INFINITE_MONEY, +DEFINE_RAND_INF(RAND_INF_FISHING_POLE_FOUND) - RAND_INF_HAS_SKELETON_KEY, +DEFINE_RAND_INF(RAND_INF_ZD_FISH_1) +DEFINE_RAND_INF(RAND_INF_ZD_FISH_2) +DEFINE_RAND_INF(RAND_INF_ZD_FISH_3) +DEFINE_RAND_INF(RAND_INF_ZD_FISH_4) +DEFINE_RAND_INF(RAND_INF_ZD_FISH_5) - RAND_INF_LINKS_POCKET, - RAND_INF_LEARNED_EPONA_SONG, - RAND_INF_DARUNIAS_JOY, - RAND_INF_KING_ZORA_THAWED, +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_QUIVER) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_BOMB_BAG) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_BULLET_BAG) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_STICK_UPGRADE) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_NUT_UPGRADE) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_MAGIC_METER) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_BOMBCHUS) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_MONEY) - RAND_INF_HC_GREAT_FAIRY_REWARD, - RAND_INF_DMT_GREAT_FAIRY_REWARD, - RAND_INF_DMC_GREAT_FAIRY_REWARD, - RAND_INF_ZF_GREAT_FAIRY_REWARD, - RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD, - RAND_INF_OGC_GREAT_FAIRY_REWARD, +DEFINE_RAND_INF(RAND_INF_HAS_SKELETON_KEY) - RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_1, - RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_2, - RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_3, - RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_4, - RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_5, - RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_1, - RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_2, - RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_3, - RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_4, - RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_5, +DEFINE_RAND_INF(RAND_INF_LINKS_POCKET) +DEFINE_RAND_INF(RAND_INF_LEARNED_EPONA_SONG) +DEFINE_RAND_INF(RAND_INF_DARUNIAS_JOY) +DEFINE_RAND_INF(RAND_INF_KING_ZORA_THAWED) - RAND_INF_GF_ITEM_FROM_LEADER_OF_FORTRESS, - RAND_INF_GF_GTG_GATE_PERMANENTLY_OPEN, +DEFINE_RAND_INF(RAND_INF_HC_GREAT_FAIRY_REWARD) +DEFINE_RAND_INF(RAND_INF_DMT_GREAT_FAIRY_REWARD) +DEFINE_RAND_INF(RAND_INF_DMC_GREAT_FAIRY_REWARD) +DEFINE_RAND_INF(RAND_INF_ZF_GREAT_FAIRY_REWARD) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD) +DEFINE_RAND_INF(RAND_INF_OGC_GREAT_FAIRY_REWARD) - RAND_INF_ZELDAS_LETTER, - RAND_INF_WEIRD_EGG, - RAND_INF_CHILD_TRADES_MASK_KEATON, - RAND_INF_CHILD_TRADES_MASK_SKULL, - RAND_INF_CHILD_TRADES_MASK_SPOOKY, - RAND_INF_CHILD_TRADES_MASK_BUNNY, - RAND_INF_CHILD_TRADES_MASK_GORON, - RAND_INF_CHILD_TRADES_MASK_ZORA, - RAND_INF_CHILD_TRADES_MASK_GERUDO, - RAND_INF_CHILD_TRADES_MASK_TRUTH, +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_1) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_2) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_3) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_4) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_5) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_1) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_2) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_3) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_4) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_5) - RAND_INF_KF_BOULDER_RUPEE_2, - RAND_INF_KF_BOULDER_RUPEE_1, - RAND_INF_KF_BRIDGE_RUPEE, - RAND_INF_KF_BEHIND_MIDOS_RUPEE, - RAND_INF_KF_SARIAS_ROOF_WEST_HEART, - RAND_INF_KF_SARIAS_ROOF_EAST_HEART, - RAND_INF_KF_SARIAS_ROOF_NORTH_HEART, - RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE, - RAND_INF_KF_NORTH_GRASS_WEST_RUPEE, - RAND_INF_KF_NORTH_GRASS_EAST_RUPEE, - RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE, - RAND_INF_KF_SARIAS_TOP_LEFT_HEART, - RAND_INF_KF_SARIAS_TOP_RIGHT_HEART, - RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART, - RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART, - RAND_INF_KF_BEAN_RUPEE_1, - RAND_INF_KF_BEAN_RUPEE_2, - RAND_INF_KF_BEAN_RUPEE_3, - RAND_INF_KF_BEAN_RUPEE_4, - RAND_INF_KF_BEAN_RUPEE_5, - RAND_INF_KF_BEAN_RUPEE_6, - RAND_INF_KF_BEAN_RED_RUPEE, - RAND_INF_LW_BOULDER_RUPEE, - RAND_INF_LW_SHORTCUT_RUPEE_1, - RAND_INF_LW_SHORTCUT_RUPEE_2, - RAND_INF_LW_SHORTCUT_RUPEE_3, - RAND_INF_LW_SHORTCUT_RUPEE_4, - RAND_INF_LW_SHORTCUT_RUPEE_5, - RAND_INF_LW_SHORTCUT_RUPEE_6, - RAND_INF_LW_SHORTCUT_RUPEE_7, - RAND_INF_LW_SHORTCUT_RUPEE_8, - RAND_INF_LH_FRONT_RUPEE, - RAND_INF_LH_MIDDLE_RUPEE, - RAND_INF_LH_BACK_RUPEE, - RAND_INF_LH_LAB_FRONT_RUPEE, - RAND_INF_LH_LAB_LEFT_RUPEE, - RAND_INF_LH_LAB_RIGHT_RUPEE, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8, +DEFINE_RAND_INF(RAND_INF_TH_ITEM_FROM_LEADER_OF_FORTRESS) +DEFINE_RAND_INF(RAND_INF_GF_GTG_GATE_PERMANENTLY_OPEN) - RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE, +DEFINE_RAND_INF(RAND_INF_ZELDAS_LETTER) +DEFINE_RAND_INF(RAND_INF_WEIRD_EGG) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_KEATON) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_SKULL) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_SPOOKY) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_BUNNY) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_GORON) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_ZORA) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_GERUDO) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_TRUTH) - RAND_INF_DMT_RED_RUPEE, - RAND_INF_DMT_BLUE_RUPEE, - RAND_INF_DMT_COW_GROTTO_LEFT_HEART, - RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, - RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, - RAND_INF_DMT_COW_GROTTO_RIGHT_HEART, - RAND_INF_DMT_COW_GROTTO_RUPEE_1, - RAND_INF_DMT_COW_GROTTO_RUPEE_2, - RAND_INF_DMT_COW_GROTTO_RUPEE_3, - RAND_INF_DMT_COW_GROTTO_RUPEE_4, - RAND_INF_DMT_COW_GROTTO_RUPEE_5, - RAND_INF_DMT_COW_GROTTO_RUPEE_6, - RAND_INF_DMT_COW_GROTTO_RED_RUPEE, +DEFINE_RAND_INF(RAND_INF_KF_BOULDER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_KF_BOULDER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_KF_BRIDGE_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_BEHIND_MIDOS_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_ROOF_WEST_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_ROOF_EAST_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_ROOF_NORTH_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_NORTH_GRASS_WEST_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_NORTH_GRASS_EAST_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_TOP_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_TOP_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RED_RUPEE) +DEFINE_RAND_INF(RAND_INF_LW_BOULDER_RUPEE) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_7) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_8) +DEFINE_RAND_INF(RAND_INF_LH_FRONT_RUPEE) +DEFINE_RAND_INF(RAND_INF_LH_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_LH_BACK_RUPEE) +DEFINE_RAND_INF(RAND_INF_LH_LAB_FRONT_RUPEE) +DEFINE_RAND_INF(RAND_INF_LH_LAB_LEFT_RUPEE) +DEFINE_RAND_INF(RAND_INF_LH_LAB_RIGHT_RUPEE) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8) - RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE, - RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6, - RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE, +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE) - RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE, - RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, - RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, - RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, - RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, +DEFINE_RAND_INF(RAND_INF_DMT_RED_RUPEE) +DEFINE_RAND_INF(RAND_INF_DMT_BLUE_RUPEE) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RED_RUPEE) - RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART, - RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART, - RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, - RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, - RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, - RAND_INF_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, - RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART, - RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, - RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, - RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, - RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART, - RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART, - RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, - RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, - RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, - RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, - RAND_INF_WATER_TEMPLE_RIVER_HEART_1, - RAND_INF_WATER_TEMPLE_RIVER_HEART_2, - RAND_INF_WATER_TEMPLE_RIVER_HEART_3, - RAND_INF_WATER_TEMPLE_RIVER_HEART_4, - RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, - RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, - RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, - RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, - RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, - RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, - RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, - RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, - RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, - RAND_INF_ICE_CAVERN_LOBBY_RUPEE, - RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, - RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, - RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, - RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, - RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, - RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, - RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, - RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, - RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, - RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART, - RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART, +DEFINE_RAND_INF(RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE) - RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, - RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, - RAND_INF_DEKU_TREE_MQ_LOBBY_HEART, - RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, - RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, - RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, - RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, - RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, - RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, - RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, - RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, - RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, - RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, - RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, - RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, - RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, - RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, - RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART, - RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART, - RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, - RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, - RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, - RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, +DEFINE_RAND_INF(RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE) - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_1, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_2, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_3, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_4, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_5, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_6, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_7, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_8, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_1, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_2, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_3, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_4, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_5, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_6, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, - RAND_INF_COLOSSUS_OASIS_FAIRY_1, - RAND_INF_COLOSSUS_OASIS_FAIRY_2, - RAND_INF_COLOSSUS_OASIS_FAIRY_3, - RAND_INF_COLOSSUS_OASIS_FAIRY_4, - RAND_INF_COLOSSUS_OASIS_FAIRY_5, - RAND_INF_COLOSSUS_OASIS_FAIRY_6, - RAND_INF_COLOSSUS_OASIS_FAIRY_7, - RAND_INF_COLOSSUS_OASIS_FAIRY_8, +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_HEART_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_HEART_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_HEART_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_HEART_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_LOBBY_RUPEE) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART) - RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, - RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, - RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, - RAND_INF_KF_BEAN_SPROUT_FAIRY_1, - RAND_INF_KF_BEAN_SPROUT_FAIRY_2, - RAND_INF_KF_BEAN_SPROUT_FAIRY_3, - RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, - RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, - RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, - RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, - RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, - RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, - RAND_INF_LH_BEAN_SPROUT_FAIRY_1, - RAND_INF_LH_BEAN_SPROUT_FAIRY_2, - RAND_INF_LH_BEAN_SPROUT_FAIRY_3, - RAND_INF_GV_BEAN_SPROUT_FAIRY_1, - RAND_INF_GV_BEAN_SPROUT_FAIRY_2, - RAND_INF_GV_BEAN_SPROUT_FAIRY_3, - RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1, - RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2, - RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3, - RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1, - RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2, - RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3, - RAND_INF_DMC_BEAN_SPROUT_FAIRY_1, - RAND_INF_DMC_BEAN_SPROUT_FAIRY_2, - RAND_INF_DMC_BEAN_SPROUT_FAIRY_3, - RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, - RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, - RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART) - RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, - RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, - RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, - RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, - RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DMC_GOSSIP_STONE_FAIRY, - RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DMT_GOSSIP_STONE_FAIRY, - RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY, - RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, - RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, - RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_GV_GOSSIP_STONE_FAIRY, - RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY, - RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY, - RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY, - RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY, - RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, - RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, - RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, - RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_KF_GOSSIP_STONE_FAIRY, - RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY, - RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, - RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, - RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_LW_GOSSIP_STONE_FAIRY, - RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, - RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, - RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY, - RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZD_GOSSIP_STONE_FAIRY, - RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY, - RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY, - RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, - RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, - RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_8) - RAND_INF_LH_ISLAND_SUN_FAIRY, - RAND_INF_HF_POND_STORMS_FAIRY, - RAND_INF_DMT_FLAG_SUN_FAIRY, - RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY, - RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY, - RAND_INF_LW_SHORTCUT_STORMS_FAIRY, - RAND_INF_GF_KITCHEN_SUN_FAIRY, - RAND_INF_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, - RAND_INF_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, - RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, - RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, - RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, - RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY, - RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, - RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, - RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, - RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, - RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, - RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, - RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, - RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, - RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, - RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, - RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, - RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, - RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, +DEFINE_RAND_INF(RAND_INF_ZR_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_ZR_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_ZR_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_LH_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_LH_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_LH_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GV_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GV_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GV_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_DMC_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_DMC_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_DMC_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_DMT_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_DMT_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_DMT_BEAN_SPROUT_FAIRY_3) - RAND_INF_GUARD_HOUSE_UNLOCKED, - RAND_INF_GUARD_HOUSE_KEY_OBTAINED, - RAND_INF_MARKET_BAZAAR_UNLOCKED, - RAND_INF_MARKET_BAZAAR_KEY_OBTAINED, - RAND_INF_MARKET_POTION_SHOP_UNLOCKED, - RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED, - RAND_INF_MASK_SHOP_UNLOCKED, - RAND_INF_MASK_SHOP_KEY_OBTAINED, - RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED, - RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED, - RAND_INF_BOMBCHU_BOWLING_UNLOCKED, - RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED, - RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED, - RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED, - RAND_INF_BOMBCHU_SHOP_UNLOCKED, - RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED, - RAND_INF_RICHARDS_HOUSE_UNLOCKED, - RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED, - RAND_INF_ALLEY_HOUSE_UNLOCKED, - RAND_INF_ALLEY_HOUSE_KEY_OBTAINED, - RAND_INF_KAK_BAZAAR_UNLOCKED, - RAND_INF_KAK_BAZAAR_KEY_OBTAINED, - RAND_INF_KAK_POTION_SHOP_UNLOCKED, - RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED, - RAND_INF_BOSS_HOUSE_UNLOCKED, - RAND_INF_BOSS_HOUSE_KEY_OBTAINED, - RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED, - RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED, - RAND_INF_SKULLTULA_HOUSE_UNLOCKED, - RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED, - RAND_INF_IMPAS_HOUSE_UNLOCKED, - RAND_INF_IMPAS_HOUSE_KEY_OBTAINED, - RAND_INF_WINDMILL_UNLOCKED, - RAND_INF_WINDMILL_KEY_OBTAINED, - RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED, - RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED, - RAND_INF_DAMPES_HUT_UNLOCKED, - RAND_INF_DAMPES_HUT_KEY_OBTAINED, - RAND_INF_TALONS_HOUSE_UNLOCKED, - RAND_INF_TALONS_HOUSE_KEY_OBTAINED, - RAND_INF_STABLES_UNLOCKED, - RAND_INF_STABLES_KEY_OBTAINED, - RAND_INF_BACK_TOWER_UNLOCKED, - RAND_INF_BACK_TOWER_KEY_OBTAINED, - RAND_INF_HYLIA_LAB_UNLOCKED, - RAND_INF_HYLIA_LAB_KEY_OBTAINED, - RAND_INF_FISHING_HOLE_UNLOCKED, - RAND_INF_FISHING_HOLE_KEY_OBTAINED, +DEFINE_RAND_INF(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DMC_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DMT_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_GV_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_KF_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_LW_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZD_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG) - RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG, - RAND_INF_CHILD_TRADES_HAS_CHICKEN, - RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA, - RAND_INF_CHILD_TRADES_HAS_MASK_KEATON, - RAND_INF_CHILD_TRADES_HAS_MASK_SKULL, - RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY, - RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY, - RAND_INF_CHILD_TRADES_HAS_MASK_GORON, - RAND_INF_CHILD_TRADES_HAS_MASK_ZORA, - RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO, - RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH, +DEFINE_RAND_INF(RAND_INF_LH_ISLAND_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_POND_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMT_FLAG_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_TH_KITCHEN_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY) - RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, - RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO, - RAND_INF_ADULT_TRADES_HAS_COJIRO, - RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM, - RAND_INF_ADULT_TRADES_HAS_ODD_POTION, - RAND_INF_ADULT_TRADES_HAS_SAW, - RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN, - RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION, - RAND_INF_ADULT_TRADES_HAS_FROG, - RAND_INF_ADULT_TRADES_HAS_EYEDROPS, - RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, +DEFINE_RAND_INF(RAND_INF_GUARD_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_GUARD_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_MARKET_BAZAAR_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_MARKET_BAZAAR_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_MARKET_POTION_SHOP_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_MASK_SHOP_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_MASK_SHOP_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_BOMBCHU_BOWLING_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_BOMBCHU_SHOP_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_RICHARDS_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_ALLEY_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_ALLEY_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_KAK_BAZAAR_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_KAK_BAZAAR_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_KAK_POTION_SHOP_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_BOSS_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_BOSS_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_SKULLTULA_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_IMPAS_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_IMPAS_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_WINDMILL_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_WINDMILL_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_DAMPES_HUT_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_DAMPES_HUT_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_TALONS_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_TALONS_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_STABLES_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_STABLES_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_BACK_TOWER_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_BACK_TOWER_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_HYLIA_LAB_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_HYLIA_LAB_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_FISHING_HOLE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_FISHING_HOLE_KEY_OBTAINED) - // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_CHICKEN) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_KEATON) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_SKULL) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_GORON) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_ZORA) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH) - RAND_INF_MAX, -} RandomizerInf; +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_COJIRO) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_ODD_POTION) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_SAW) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_FROG) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_EYEDROPS) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK) + +// Overworld Grass +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_1) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_3) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_4) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_5) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_6) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_7) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_8) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_9) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_10) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_11) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_12) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_MAZE_1) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_MAZE_2) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_MAZE_3) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_3) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_4) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_5) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_6) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_7) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_8) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_9) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_10) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_11) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_12) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_13) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_14) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_15) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_16) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_17) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_18) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_19) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_20) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_1) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_2) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_3) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_4) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_5) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_6) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_7) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_8) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_9) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_1) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_2) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_3) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_4) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_5) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_6) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_7) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_8) +DEFINE_RAND_INF(RAND_INF_HC_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HC_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_1) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_3) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_4) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_5) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_6) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_7) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_8) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_1) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_2) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_3) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_4) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_5) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_6) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_7) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_8) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_9) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_10) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_11) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_12) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_1) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_2) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_3) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_4) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_5) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_6) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_7) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_8) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_9) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_10) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_11) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_12) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_13) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_14) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_15) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_16) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_17) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_18) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_19) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_20) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_21) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_22) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_23) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_24) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_25) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_26) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_27) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_28) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_29) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_30) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_31) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_32) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_33) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_34) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_35) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_36) +DEFINE_RAND_INF(RAND_INF_LH_CHILD_GRASS_1) +DEFINE_RAND_INF(RAND_INF_LH_CHILD_GRASS_2) +DEFINE_RAND_INF(RAND_INF_LH_CHILD_GRASS_3) +DEFINE_RAND_INF(RAND_INF_LH_CHILD_GRASS_4) +DEFINE_RAND_INF(RAND_INF_LH_WARP_PAD_GRASS_1) +DEFINE_RAND_INF(RAND_INF_LH_WARP_PAD_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_5) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_6) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_7) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_8) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_9) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_10) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_11) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_12) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_5) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_6) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_7) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_8) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_9) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_10) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_11) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_12) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_5) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_6) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_7) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_8) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_9) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_10) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_11) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_12) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_5) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_6) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_7) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_8) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_9) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_10) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_11) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_12) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_1) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_2) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_3) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_4) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_5) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_6) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_7) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_8) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_9) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_10) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_11) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_12) +DEFINE_RAND_INF(RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS) +// Grotto Grass +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GRASS_4) +// Dungeon Grass +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_GRASS_5) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_COMPASS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_COMPASS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BLADE_GRASS) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3) +// MQ Dungeon Grass +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_GRASS) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4) +// Shared Dungeon Grass +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8) +// End Grass +DEFINE_RAND_INF(RAND_INF_OBTAINED_RUTOS_LETTER) \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index b2343b0001..6284d7121d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -5,6 +5,7 @@ #include "soh/SaveManager.h" #include "soh/ResourceManagerHelpers.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "randomizerTypes.h" #include @@ -35,50 +36,72 @@ void DrawSong(ItemTrackerItem item); int itemTrackerSectionId; +using namespace UIWidgets; + bool shouldUpdateVectors = true; std::vector mainWindowItems = {}; std::vector inventoryItems = { - ITEM_TRACKER_ITEM(ITEM_STICK, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NUT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOMB, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_BOW, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_FIRE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_DINS_FIRE, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_SLINGSHOT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOMBCHU, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_ICE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_FARORES_WIND, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_BOOMERANG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_LENS, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BEAN, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_HAMMER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_LIGHT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NAYRUS_LOVE, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 1, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 2, DrawBottle), - ITEM_TRACKER_ITEM(ITEM_BOTTLE, 3, DrawBottle), ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_STICK, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NUT, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOMB, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOW, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_ARROW_FIRE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_DINS_FIRE, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_SLINGSHOT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOMBCHU, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_ARROW_ICE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_FARORES_WIND, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOOMERANG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_LENS, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BEAN, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_HAMMER, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_ARROW_LIGHT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NAYRUS_LOVE, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 1, DrawBottle), + ITEM_TRACKER_ITEM(ITEM_BOTTLE, 2, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 3, DrawBottle), + ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem), }; std::vector equipmentItems = { - ITEM_TRACKER_ITEM(ITEM_SWORD_KOKIRI, 1 << 0, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SWORD_MASTER, 1 << 1, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SWORD_BGS, 1 << 2, DrawEquip), - ITEM_TRACKER_ITEM(ITEM_TUNIC_KOKIRI, 1 << 8, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_GORON, 1 << 9, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_ZORA, 1 << 10, DrawEquip), - ITEM_TRACKER_ITEM(ITEM_SHIELD_DEKU, 1 << 4, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SHIELD_HYLIAN, 1 << 5, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SHIELD_MIRROR, 1 << 6, DrawEquip), - ITEM_TRACKER_ITEM(ITEM_BOOTS_KOKIRI, 1 << 12, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_IRON, 1 << 13, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_HOVER, 1 << 14, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_SWORD_KOKIRI, 1 << 0, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SWORD_MASTER, 1 << 1, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_SWORD_BGS, 1 << 2, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_KOKIRI, 1 << 8, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_TUNIC_GORON, 1 << 9, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_ZORA, 1 << 10, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_SHIELD_DEKU, 1 << 4, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SHIELD_HYLIAN, 1 << 5, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_SHIELD_MIRROR, 1 << 6, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_KOKIRI, 1 << 12, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_BOOTS_IRON, 1 << 13, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_HOVER, 1 << 14, DrawEquip), }; std::vector miscItems = { - ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_HEART_CONTAINER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_HEART_PIECE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM(QUEST_GERUDO_CARD, 1 << 22, DrawQuest), ITEM_TRACKER_ITEM(QUEST_SKULL_TOKEN, 1 << 23, DrawQuest), ITEM_TRACKER_ITEM(QUEST_STONE_OF_AGONY, 1 << 21, DrawQuest), + ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_HEART_CONTAINER, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_HEART_PIECE, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM(QUEST_GERUDO_CARD, 1 << 22, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_SKULL_TOKEN, 1 << 23, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_STONE_OF_AGONY, 1 << 21, DrawQuest), }; std::vector dungeonRewardStones = { - ITEM_TRACKER_ITEM(QUEST_KOKIRI_EMERALD, 1 << 18, DrawQuest), ITEM_TRACKER_ITEM(QUEST_GORON_RUBY, 1 << 19, DrawQuest), ITEM_TRACKER_ITEM(QUEST_ZORA_SAPPHIRE, 1 << 20, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_KOKIRI_EMERALD, 1 << 18, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_GORON_RUBY, 1 << 19, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_ZORA_SAPPHIRE, 1 << 20, DrawQuest), }; std::vector dungeonRewardMedallions = { - ITEM_TRACKER_ITEM(QUEST_MEDALLION_FOREST, 1 << 0, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_FIRE, 1 << 1, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_WATER, 1 << 2, DrawQuest), - ITEM_TRACKER_ITEM(QUEST_MEDALLION_SPIRIT, 1 << 3, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_SHADOW, 1 << 4, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_LIGHT, 1 << 5, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_FOREST, 1 << 0, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_FIRE, 1 << 1, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_WATER, 1 << 2, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_SPIRIT, 1 << 3, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_SHADOW, 1 << 4, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_LIGHT, 1 << 5, DrawQuest), }; std::vector dungeonRewards = {}; std::vector songItems = { - ITEM_TRACKER_ITEM(QUEST_SONG_LULLABY, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_EPONA, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SARIA, 0, DrawSong), - ITEM_TRACKER_ITEM(QUEST_SONG_SUN, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_TIME, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_STORMS, 0, DrawSong), - ITEM_TRACKER_ITEM(QUEST_SONG_MINUET, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_BOLERO, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SERENADE, 0, DrawSong), - ITEM_TRACKER_ITEM(QUEST_SONG_REQUIEM, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_NOCTURNE, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_PRELUDE, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_LULLABY, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_EPONA, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_SARIA, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SUN, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_TIME, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_STORMS, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_MINUET, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_BOLERO, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_SERENADE, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_REQUIEM, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_NOCTURNE, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_PRELUDE, 0, DrawSong), }; std::vector gregItems = { @@ -90,31 +113,54 @@ std::vector triforcePieces = { }; std::vector bossSoulItems = { - ITEM_TRACKER_ITEM(RG_GOHMA_SOUL, 0, DrawItem), - ITEM_TRACKER_ITEM(RG_KING_DODONGO_SOUL, 0, DrawItem ), - ITEM_TRACKER_ITEM(RG_BARINADE_SOUL, 0, DrawItem ), - ITEM_TRACKER_ITEM(RG_PHANTOM_GANON_SOUL, 0, DrawItem ), - ITEM_TRACKER_ITEM(RG_VOLVAGIA_SOUL, 0, DrawItem ), - ITEM_TRACKER_ITEM(RG_MORPHA_SOUL, 0, DrawItem ), - ITEM_TRACKER_ITEM(RG_BONGO_BONGO_SOUL, 0, DrawItem ), - ITEM_TRACKER_ITEM(RG_TWINROVA_SOUL, 0, DrawItem ), - ITEM_TRACKER_ITEM(RG_GANON_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_GOHMA_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_KING_DODONGO_SOUL, 0, DrawItem), + ITEM_TRACKER_ITEM(RG_BARINADE_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_PHANTOM_GANON_SOUL, 0, DrawItem), + ITEM_TRACKER_ITEM(RG_VOLVAGIA_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_MORPHA_SOUL, 0, DrawItem), + ITEM_TRACKER_ITEM(RG_BONGO_BONGO_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_TWINROVA_SOUL, 0, DrawItem), + ITEM_TRACKER_ITEM(RG_GANON_SOUL, 0, DrawItem), }; std::vector ocarinaButtonItems = { - //Hack for right now, just gonna draw ocarina buttons as ocarinas. - //Will replace with other macro once we have a custom texture - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_UP_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_DOWN_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_LEFT_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_RIGHT_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem ), + // Hack for right now, just gonna draw ocarina buttons as ocarinas. + // Will replace with other macro once we have a custom texture + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_UP_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_DOWN_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_LEFT_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_RIGHT_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), }; -std::vector fishingPoleItems = { - ITEM_TRACKER_ITEM(ITEM_FISHING_POLE, 0, DrawItem) +std::vector overworldKeyItems = { + // Hack for right now, just gonna overworld keys as dungeon keys. + // Will replace with other macro once we have a custom texture + ITEM_TRACKER_ITEM_CUSTOM(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_TREASURE_CHEST_GAME_BUILDING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_WINDMILL_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_STABLES_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), }; +std::vector fishingPoleItems = { ITEM_TRACKER_ITEM(ITEM_FISHING_POLE, 0, DrawItem) }; + std::vector itemTrackerDungeonsWithMapsHorizontal = { { SCENE_DEKU_TREE, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_DODONGOS_CAVERN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, @@ -141,7 +187,6 @@ std::vector itemTrackerDungeonsHorizontal = { { SCENE_GERUDO_TRAINING_GROUND, { ITEM_KEY_SMALL } }, }; - std::vector itemTrackerDungeonsWithMapsCompact = { { SCENE_FOREST_TEMPLE, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_FIRE_TEMPLE, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, @@ -170,143 +215,141 @@ std::vector itemTrackerDungeonsCompact = { }; std::map itemTrackerDungeonShortNames = { - { SCENE_FOREST_TEMPLE, "FRST" }, - { SCENE_FIRE_TEMPLE, "FIRE" }, - { SCENE_WATER_TEMPLE, "WATR" }, - { SCENE_SPIRIT_TEMPLE, "SPRT" }, - { SCENE_SHADOW_TEMPLE, "SHDW" }, - { SCENE_BOTTOM_OF_THE_WELL, "BOTW" }, - { SCENE_DEKU_TREE, "DEKU" }, - { SCENE_DODONGOS_CAVERN, "DCVN" }, - { SCENE_JABU_JABU, "JABU" }, - { SCENE_ICE_CAVERN, "ICE" }, - { SCENE_INSIDE_GANONS_CASTLE, "GANON" }, - { SCENE_GERUDO_TRAINING_GROUND, "GTG" }, + { SCENE_FOREST_TEMPLE, "FRST" }, { SCENE_FIRE_TEMPLE, "FIRE" }, { SCENE_WATER_TEMPLE, "WATR" }, + { SCENE_SPIRIT_TEMPLE, "SPRT" }, { SCENE_SHADOW_TEMPLE, "SHDW" }, { SCENE_BOTTOM_OF_THE_WELL, "BOTW" }, + { SCENE_DEKU_TREE, "DEKU" }, { SCENE_DODONGOS_CAVERN, "DCVN" }, { SCENE_JABU_JABU, "JABU" }, + { SCENE_ICE_CAVERN, "ICE" }, { SCENE_INSIDE_GANONS_CASTLE, "GANON" }, { SCENE_GERUDO_TRAINING_GROUND, "GTG" }, { SCENE_THIEVES_HIDEOUT, "HIDE" }, }; std::map itemTrackerBossShortNames = { - { RG_GOHMA_SOUL, "GOHMA" }, - { RG_KING_DODONGO_SOUL, "KD" }, - { RG_BARINADE_SOUL, "BARI" }, - { RG_PHANTOM_GANON_SOUL, "PG"}, - { RG_VOLVAGIA_SOUL, "VOLV"}, - { RG_MORPHA_SOUL, "MORPH"}, - { RG_BONGO_BONGO_SOUL, "BONGO"}, - { RG_TWINROVA_SOUL, "TWIN"}, - { RG_GANON_SOUL, "GANON"}, + { RG_GOHMA_SOUL, "GOHMA" }, { RG_KING_DODONGO_SOUL, "KD" }, { RG_BARINADE_SOUL, "BARI" }, + { RG_PHANTOM_GANON_SOUL, "PG" }, { RG_VOLVAGIA_SOUL, "VOLV" }, { RG_MORPHA_SOUL, "MORPH" }, + { RG_BONGO_BONGO_SOUL, "BONGO" }, { RG_TWINROVA_SOUL, "TWIN" }, { RG_GANON_SOUL, "GANON" }, }; std::map itemTrackerOcarinaButtonShortNames = { - { RG_OCARINA_A_BUTTON, "A" }, - { RG_OCARINA_C_UP_BUTTON, "C-U" }, - { RG_OCARINA_C_DOWN_BUTTON, "C-D" }, - { RG_OCARINA_C_LEFT_BUTTON, "C-L"}, - { RG_OCARINA_C_RIGHT_BUTTON, "C-R"}, + { RG_OCARINA_A_BUTTON, "A" }, { RG_OCARINA_C_UP_BUTTON, "C-U" }, { RG_OCARINA_C_DOWN_BUTTON, "C-D" }, + { RG_OCARINA_C_LEFT_BUTTON, "C-L" }, { RG_OCARINA_C_RIGHT_BUTTON, "C-R" }, +}; + +std::map itemTrackerOverworldKeyShortNames = { + { RG_GUARD_HOUSE_KEY, "GUARD" }, + { RG_MARKET_BAZAAR_KEY, "MKBAZ" }, + { RG_MARKET_POTION_SHOP_KEY, "MKPOT" }, + { RG_MASK_SHOP_KEY, "MASK" }, + { RG_MARKET_SHOOTING_GALLERY_KEY, "MKSHO" }, + { RG_BOMBCHU_BOWLING_KEY, "BOWL" }, + { RG_TREASURE_CHEST_GAME_BUILDING_KEY, "TREASU" }, + { RG_BOMBCHU_SHOP_KEY, "CHUSHO" }, + { RG_RICHARDS_HOUSE_KEY, "RICH" }, + { RG_ALLEY_HOUSE_KEY, "ALLEY" }, + { RG_KAK_BAZAAR_KEY, "KAKBAZ" }, + { RG_KAK_POTION_SHOP_KEY, "KAKPO" }, + { RG_BOSS_HOUSE_KEY, "BOSS" }, + { RG_GRANNYS_POTION_SHOP_KEY, "GRANNY" }, + { RG_SKULLTULA_HOUSE_KEY, "SKULL" }, + { RG_IMPAS_HOUSE_KEY, "IMPAS" }, + { RG_WINDMILL_KEY, "WIND" }, + { RG_KAK_SHOOTING_GALLERY_KEY, "KAKSHO" }, + { RG_DAMPES_HUT_KEY, "DAMPES" }, + { RG_TALONS_HOUSE_KEY, "TALONS" }, + { RG_STABLES_KEY, "STABLE" }, + { RG_BACK_TOWER_KEY, "TOWER" }, + { RG_HYLIA_LAB_KEY, "LAB" }, + { RG_FISHING_HOLE_KEY, "FISH" }, }; std::vector dungeonItems = {}; std::unordered_map actualItemTrackerItemMap = { - { ITEM_BOTTLE, ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawItem) }, - { ITEM_BIG_POE, ITEM_TRACKER_ITEM(ITEM_BIG_POE, 0, DrawItem) }, - { ITEM_BLUE_FIRE, ITEM_TRACKER_ITEM(ITEM_BLUE_FIRE, 0, DrawItem) }, - { ITEM_BUG, ITEM_TRACKER_ITEM(ITEM_BUG, 0, DrawItem) }, - { ITEM_FAIRY, ITEM_TRACKER_ITEM(ITEM_FAIRY, 0, DrawItem) }, - { ITEM_FISH, ITEM_TRACKER_ITEM(ITEM_FISH, 0, DrawItem) }, - { ITEM_POTION_GREEN, ITEM_TRACKER_ITEM(ITEM_POTION_GREEN, 0, DrawItem) }, - { ITEM_POE, ITEM_TRACKER_ITEM(ITEM_POE, 0, DrawItem) }, - { ITEM_POTION_RED, ITEM_TRACKER_ITEM(ITEM_POTION_RED, 0, DrawItem) }, - { ITEM_POTION_BLUE, ITEM_TRACKER_ITEM(ITEM_POTION_BLUE, 0, DrawItem) }, - { ITEM_MILK_BOTTLE, ITEM_TRACKER_ITEM(ITEM_MILK_BOTTLE, 0, DrawItem) }, - { ITEM_MILK_HALF, ITEM_TRACKER_ITEM(ITEM_MILK_HALF, 0, DrawItem) }, - { ITEM_LETTER_RUTO, ITEM_TRACKER_ITEM(ITEM_LETTER_RUTO, 0, DrawItem) }, + { ITEM_BOTTLE, ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawItem) }, + { ITEM_BIG_POE, ITEM_TRACKER_ITEM(ITEM_BIG_POE, 0, DrawItem) }, + { ITEM_BLUE_FIRE, ITEM_TRACKER_ITEM(ITEM_BLUE_FIRE, 0, DrawItem) }, + { ITEM_BUG, ITEM_TRACKER_ITEM(ITEM_BUG, 0, DrawItem) }, + { ITEM_FAIRY, ITEM_TRACKER_ITEM(ITEM_FAIRY, 0, DrawItem) }, + { ITEM_FISH, ITEM_TRACKER_ITEM(ITEM_FISH, 0, DrawItem) }, + { ITEM_POTION_GREEN, ITEM_TRACKER_ITEM(ITEM_POTION_GREEN, 0, DrawItem) }, + { ITEM_POE, ITEM_TRACKER_ITEM(ITEM_POE, 0, DrawItem) }, + { ITEM_POTION_RED, ITEM_TRACKER_ITEM(ITEM_POTION_RED, 0, DrawItem) }, + { ITEM_POTION_BLUE, ITEM_TRACKER_ITEM(ITEM_POTION_BLUE, 0, DrawItem) }, + { ITEM_MILK_BOTTLE, ITEM_TRACKER_ITEM(ITEM_MILK_BOTTLE, 0, DrawItem) }, + { ITEM_MILK_HALF, ITEM_TRACKER_ITEM(ITEM_MILK_HALF, 0, DrawItem) }, + { ITEM_LETTER_RUTO, ITEM_TRACKER_ITEM(ITEM_LETTER_RUTO, 0, DrawItem) }, - { ITEM_HOOKSHOT, ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem) }, - { ITEM_LONGSHOT, ITEM_TRACKER_ITEM(ITEM_LONGSHOT, 0, DrawItem) }, + { ITEM_HOOKSHOT, ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem) }, + { ITEM_LONGSHOT, ITEM_TRACKER_ITEM(ITEM_LONGSHOT, 0, DrawItem) }, - { ITEM_OCARINA_FAIRY, ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem) }, - { ITEM_OCARINA_TIME, ITEM_TRACKER_ITEM(ITEM_OCARINA_TIME, 0, DrawItem) }, + { ITEM_OCARINA_FAIRY, ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem) }, + { ITEM_OCARINA_TIME, ITEM_TRACKER_ITEM(ITEM_OCARINA_TIME, 0, DrawItem) }, - { ITEM_MAGIC_SMALL, ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem) }, - { ITEM_MAGIC_LARGE, ITEM_TRACKER_ITEM(ITEM_MAGIC_LARGE, 0, DrawItem) }, + { ITEM_MAGIC_SMALL, ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem) }, + { ITEM_MAGIC_LARGE, ITEM_TRACKER_ITEM(ITEM_MAGIC_LARGE, 0, DrawItem) }, - { ITEM_WALLET_ADULT, ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem) }, - { ITEM_WALLET_GIANT, ITEM_TRACKER_ITEM(ITEM_WALLET_GIANT, 0, DrawItem) }, + { ITEM_WALLET_ADULT, ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem) }, + { ITEM_WALLET_GIANT, ITEM_TRACKER_ITEM(ITEM_WALLET_GIANT, 0, DrawItem) }, - { ITEM_BRACELET, ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem) }, + { ITEM_BRACELET, ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem) }, { ITEM_GAUNTLETS_SILVER, ITEM_TRACKER_ITEM(ITEM_GAUNTLETS_SILVER, 0, DrawItem) }, - { ITEM_GAUNTLETS_GOLD, ITEM_TRACKER_ITEM(ITEM_GAUNTLETS_GOLD, 0, DrawItem) }, + { ITEM_GAUNTLETS_GOLD, ITEM_TRACKER_ITEM(ITEM_GAUNTLETS_GOLD, 0, DrawItem) }, - { ITEM_SCALE_SILVER, ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem) }, - { ITEM_SCALE_GOLDEN, ITEM_TRACKER_ITEM(ITEM_SCALE_GOLDEN, 0, DrawItem) }, + { ITEM_SCALE_SILVER, ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem) }, + { ITEM_SCALE_GOLDEN, ITEM_TRACKER_ITEM(ITEM_SCALE_GOLDEN, 0, DrawItem) }, - { ITEM_WEIRD_EGG, ITEM_TRACKER_ITEM(ITEM_WEIRD_EGG, 0, DrawItem) }, - { ITEM_CHICKEN, ITEM_TRACKER_ITEM(ITEM_CHICKEN, 0, DrawItem) }, - { ITEM_LETTER_ZELDA, ITEM_TRACKER_ITEM(ITEM_LETTER_ZELDA, 0, DrawItem) }, - { ITEM_MASK_KEATON, ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem) }, - { ITEM_MASK_SKULL, ITEM_TRACKER_ITEM(ITEM_MASK_SKULL, 0, DrawItem) }, - { ITEM_MASK_SPOOKY, ITEM_TRACKER_ITEM(ITEM_MASK_SPOOKY, 0, DrawItem) }, - { ITEM_MASK_BUNNY, ITEM_TRACKER_ITEM(ITEM_MASK_BUNNY, 0, DrawItem) }, - { ITEM_MASK_GORON, ITEM_TRACKER_ITEM(ITEM_MASK_GORON, 0, DrawItem) }, - { ITEM_MASK_ZORA, ITEM_TRACKER_ITEM(ITEM_MASK_ZORA, 0, DrawItem) }, - { ITEM_MASK_GERUDO, ITEM_TRACKER_ITEM(ITEM_MASK_GERUDO, 0, DrawItem) }, - { ITEM_MASK_TRUTH, ITEM_TRACKER_ITEM(ITEM_MASK_TRUTH, 0, DrawItem) }, - { ITEM_SOLD_OUT, ITEM_TRACKER_ITEM(ITEM_SOLD_OUT, 0, DrawItem) }, + { ITEM_WEIRD_EGG, ITEM_TRACKER_ITEM(ITEM_WEIRD_EGG, 0, DrawItem) }, + { ITEM_CHICKEN, ITEM_TRACKER_ITEM(ITEM_CHICKEN, 0, DrawItem) }, + { ITEM_LETTER_ZELDA, ITEM_TRACKER_ITEM(ITEM_LETTER_ZELDA, 0, DrawItem) }, + { ITEM_MASK_KEATON, ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem) }, + { ITEM_MASK_SKULL, ITEM_TRACKER_ITEM(ITEM_MASK_SKULL, 0, DrawItem) }, + { ITEM_MASK_SPOOKY, ITEM_TRACKER_ITEM(ITEM_MASK_SPOOKY, 0, DrawItem) }, + { ITEM_MASK_BUNNY, ITEM_TRACKER_ITEM(ITEM_MASK_BUNNY, 0, DrawItem) }, + { ITEM_MASK_GORON, ITEM_TRACKER_ITEM(ITEM_MASK_GORON, 0, DrawItem) }, + { ITEM_MASK_ZORA, ITEM_TRACKER_ITEM(ITEM_MASK_ZORA, 0, DrawItem) }, + { ITEM_MASK_GERUDO, ITEM_TRACKER_ITEM(ITEM_MASK_GERUDO, 0, DrawItem) }, + { ITEM_MASK_TRUTH, ITEM_TRACKER_ITEM(ITEM_MASK_TRUTH, 0, DrawItem) }, + { ITEM_SOLD_OUT, ITEM_TRACKER_ITEM(ITEM_SOLD_OUT, 0, DrawItem) }, - { ITEM_POCKET_EGG, ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem) }, - { ITEM_POCKET_CUCCO, ITEM_TRACKER_ITEM(ITEM_POCKET_CUCCO, 0, DrawItem) }, - { ITEM_COJIRO, ITEM_TRACKER_ITEM(ITEM_COJIRO, 0, DrawItem) }, - { ITEM_ODD_MUSHROOM, ITEM_TRACKER_ITEM(ITEM_ODD_MUSHROOM, 0, DrawItem) }, - { ITEM_ODD_POTION, ITEM_TRACKER_ITEM(ITEM_ODD_POTION, 0, DrawItem) }, - { ITEM_SAW, ITEM_TRACKER_ITEM(ITEM_SAW, 0, DrawItem) }, - { ITEM_SWORD_BROKEN, ITEM_TRACKER_ITEM(ITEM_SWORD_BROKEN, 0, DrawItem) }, - { ITEM_PRESCRIPTION, ITEM_TRACKER_ITEM(ITEM_PRESCRIPTION, 0, DrawItem) }, - { ITEM_FROG, ITEM_TRACKER_ITEM(ITEM_FROG, 0, DrawItem) }, - { ITEM_EYEDROPS, ITEM_TRACKER_ITEM(ITEM_EYEDROPS, 0, DrawItem) }, - { ITEM_CLAIM_CHECK, ITEM_TRACKER_ITEM(ITEM_CLAIM_CHECK, 0, DrawItem) }, + { ITEM_POCKET_EGG, ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem) }, + { ITEM_POCKET_CUCCO, ITEM_TRACKER_ITEM(ITEM_POCKET_CUCCO, 0, DrawItem) }, + { ITEM_COJIRO, ITEM_TRACKER_ITEM(ITEM_COJIRO, 0, DrawItem) }, + { ITEM_ODD_MUSHROOM, ITEM_TRACKER_ITEM(ITEM_ODD_MUSHROOM, 0, DrawItem) }, + { ITEM_ODD_POTION, ITEM_TRACKER_ITEM(ITEM_ODD_POTION, 0, DrawItem) }, + { ITEM_SAW, ITEM_TRACKER_ITEM(ITEM_SAW, 0, DrawItem) }, + { ITEM_SWORD_BROKEN, ITEM_TRACKER_ITEM(ITEM_SWORD_BROKEN, 0, DrawItem) }, + { ITEM_PRESCRIPTION, ITEM_TRACKER_ITEM(ITEM_PRESCRIPTION, 0, DrawItem) }, + { ITEM_FROG, ITEM_TRACKER_ITEM(ITEM_FROG, 0, DrawItem) }, + { ITEM_EYEDROPS, ITEM_TRACKER_ITEM(ITEM_EYEDROPS, 0, DrawItem) }, + { ITEM_CLAIM_CHECK, ITEM_TRACKER_ITEM(ITEM_CLAIM_CHECK, 0, DrawItem) }, }; std::vector buttonMap = { - BTN_A, - BTN_B, - BTN_CUP, - BTN_CDOWN, - BTN_CLEFT, - BTN_CRIGHT, - BTN_L, - BTN_Z, - BTN_R, - BTN_START, - BTN_DUP, - BTN_DDOWN, - BTN_DLEFT, - BTN_DRIGHT + BTN_A, BTN_B, BTN_CUP, BTN_CDOWN, BTN_CLEFT, BTN_CRIGHT, BTN_L, + BTN_Z, BTN_R, BTN_START, BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT, }; typedef enum { - ITEM_TRACKER_NUMBER_NONE, - ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY, - ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY, - ITEM_TRACKER_NUMBER_CAPACITY, - ITEM_TRACKER_NUMBER_AMMO, + ITEM_TRACKER_NUMBER_NONE, + ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY, + ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY, + ITEM_TRACKER_NUMBER_CAPACITY, + ITEM_TRACKER_NUMBER_AMMO, } ItemTrackerNumberOption; typedef enum { KEYS_COLLECTED_MAX, KEYS_CURRENT_COLLECTED_MAX, - KEYS_CURRENT_MAX + KEYS_CURRENT_MAX, } ItemTrackerKeysNumberOption; typedef enum { TRIFORCE_PIECE_COLLECTED_REQUIRED, - TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX + TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX, } ItemTrackerTriforcePieceNumberOption; typedef enum { SECTION_DISPLAY_HIDDEN, SECTION_DISPLAY_MAIN_WINDOW, - SECTION_DISPLAY_SEPARATE + SECTION_DISPLAY_SEPARATE, } ItemTrackerDisplayType; typedef enum { @@ -318,13 +361,13 @@ typedef enum { typedef enum { SECTION_DISPLAY_MINIMAL_HIDDEN, - SECTION_DISPLAY_MINIMAL_SEPARATE + SECTION_DISPLAY_MINIMAL_SEPARATE, } ItemTrackerMinimalDisplayType; struct ItemTrackerNumbers { - int currentCapacity; - int maxCapacity; - int currentAmmo; + int currentCapacity; + int maxCapacity; + int currentAmmo; }; static ImVector itemTrackerNotes; @@ -332,6 +375,10 @@ uint32_t notesIdleFrames = 0; bool notesNeedSave = false; const uint32_t notesMaxIdleFrames = 40; // two seconds of game time, since OnGameFrameUpdate is used to tick +static bool presetLoaded = false; +static std::unordered_map presetPos; +static std::unordered_map presetSize; + void ItemTrackerOnFrame() { if (notesNeedSave && notesIdleFrames <= notesMaxIdleFrames) { notesIdleFrames++; @@ -355,6 +402,16 @@ bool HasEquipment(ItemTrackerItem item) { return GameInteractor::IsSaveLoaded() ? (item.data & gSaveContext.inventory.equipment) : false; } +void ItemTracker_LoadFromPreset(nlohmann::json trackerInfo) { + presetLoaded = true; + for (auto window : itemTrackerWindowIDs) { + if (trackerInfo.contains(window)) { + presetPos[window] = { trackerInfo[window]["pos"]["x"], trackerInfo[window]["pos"]["y"] }; + presetSize[window] = { trackerInfo[window]["size"]["width"], trackerInfo[window]["size"]["height"] }; + } + } +} + ItemTrackerNumbers GetItemCurrentAndMax(ItemTrackerItem item) { ItemTrackerNumbers result; result.currentCapacity = 0; @@ -389,8 +446,10 @@ ItemTrackerNumbers GetItemCurrentAndMax(ItemTrackerItem item) { break; case ITEM_WALLET_ADULT: case ITEM_WALLET_GIANT: - result.currentCapacity = IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET) ? 0 : CUR_CAPACITY(UPG_WALLET); - result.maxCapacity = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_INCLUDE_TYCOON_WALLET) ? 999 : 500; + result.currentCapacity = + IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET) ? 0 : CUR_CAPACITY(UPG_WALLET); + result.maxCapacity = + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_INCLUDE_TYCOON_WALLET) ? 999 : 500; result.currentAmmo = gSaveContext.rupees; break; case ITEM_BOMBCHU: @@ -470,7 +529,8 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { int textSize = CVarGetInteger(CVAR_TRACKER_ITEM("TextSize"), 13); ItemTrackerNumbers currentAndMax = GetItemCurrentAndMax(item); ImVec2 p = ImGui::GetCursorScreenPos(); - int32_t trackerNumberDisplayMode = CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY); + int32_t trackerNumberDisplayMode = + CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY); int32_t trackerKeyNumberDisplayMode = CVarGetInteger(CVAR_TRACKER_ITEM("KeyCounts"), KEYS_COLLECTED_MAX); float textScalingFactor = static_cast(iconSize) / 36.0f; uint32_t actualItemId = INV_CONTENT(item.id); @@ -480,8 +540,11 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { if ((actualItemId == ITEM_HOOKSHOT || actualItemId == ITEM_LONGSHOT) && hasItem) { // Calculate the scaled position for the text - ImVec2 textPos = ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(item.id == ITEM_HOOKSHOT ? "H" : "L").x * - textScalingFactor / 2) + 8 * textScalingFactor, p.y - 22 * textScalingFactor); + ImVec2 textPos = + ImVec2(p.x + (iconSize / 2) - + (ImGui::CalcTextSize(item.id == ITEM_HOOKSHOT ? "H" : "L").x * textScalingFactor / 2) + + 8 * textScalingFactor, + p.y - 22 * textScalingFactor); ImGui::SetCursorScreenPos(textPos); ImGui::SetWindowFontScale(textScalingFactor); @@ -499,16 +562,19 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { ImU32 currentColor = IM_COL_WHITE; ImU32 maxColor = IM_COL_GREEN; // "Collected / Max", "Current / Collected / Max", "Current / Max" - if (trackerKeyNumberDisplayMode == KEYS_CURRENT_COLLECTED_MAX || trackerKeyNumberDisplayMode == KEYS_CURRENT_MAX) { - currentString+= std::to_string(currentAndMax.currentAmmo); - currentString+= "/"; + if (trackerKeyNumberDisplayMode == KEYS_CURRENT_COLLECTED_MAX || + trackerKeyNumberDisplayMode == KEYS_CURRENT_MAX) { + currentString += std::to_string(currentAndMax.currentAmmo); + currentString += "/"; } - if (trackerKeyNumberDisplayMode == KEYS_COLLECTED_MAX || trackerKeyNumberDisplayMode == KEYS_CURRENT_COLLECTED_MAX) { - currentString+= std::to_string(currentAndMax.currentCapacity); - currentString+= "/"; + if (trackerKeyNumberDisplayMode == KEYS_COLLECTED_MAX || + trackerKeyNumberDisplayMode == KEYS_CURRENT_COLLECTED_MAX) { + currentString += std::to_string(currentAndMax.currentCapacity); + currentString += "/"; } - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize((currentString + maxString).c_str()).x / 2), p.y - 14)); + ImGui::SetCursorScreenPos( + ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize((currentString + maxString).c_str()).x / 2), p.y - 14)); ImGui::PushStyleColor(ImGuiCol_Text, currentColor); ImGui::Text("%s", currentString.c_str()); ImGui::PopStyleColor(); @@ -516,26 +582,25 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { ImGui::PushStyleColor(ImGuiCol_Text, maxColor); ImGui::Text("%s", maxString.c_str()); ImGui::PopStyleColor(); - } else if (currentAndMax.currentCapacity > 0 && trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_NONE && IsValidSaveFile()) { + } else if (currentAndMax.currentCapacity > 0 && trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_NONE && + IsValidSaveFile()) { std::string currentString = ""; std::string maxString = ""; ImU32 currentColor = IM_COL_WHITE; ImU32 maxColor = item.id == QUEST_SKULL_TOKEN ? IM_COL_RED : IM_COL_GREEN; bool shouldAlignToLeft = CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountAlignLeft"), 0) && - trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_CAPACITY && - trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_AMMO; + trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_CAPACITY && + trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_AMMO; bool shouldDisplayAmmo = trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_AMMO || - trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY || - // These items have a static capacity, so display ammo instead - item.id == ITEM_BOMBCHU || - item.id == ITEM_BEAN || - item.id == QUEST_SKULL_TOKEN || - item.id == ITEM_HEART_CONTAINER || - item.id == ITEM_HEART_PIECE; + trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY || + // These items have a static capacity, so display ammo instead + item.id == ITEM_BOMBCHU || item.id == ITEM_BEAN || item.id == QUEST_SKULL_TOKEN || + item.id == ITEM_HEART_CONTAINER || item.id == ITEM_HEART_PIECE; - bool shouldDisplayMax = !(trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY); + bool shouldDisplayMax = !(trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || + trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY); if (shouldDisplayAmmo) { currentString = std::to_string(currentAndMax.currentAmmo); @@ -563,7 +628,9 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { } } - float x = shouldAlignToLeft ? p.x : p.x + (iconSize / 2) - (ImGui::CalcTextSize((currentString + maxString).c_str()).x / 2); + float x = shouldAlignToLeft + ? p.x + : p.x + (iconSize / 2) - (ImGui::CalcTextSize((currentString + maxString).c_str()).x / 2); ImGui::SetCursorScreenPos(ImVec2(x, p.y - 14)); ImGui::PushStyleColor(ImGuiCol_Text, currentColor); @@ -578,11 +645,16 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { std::string currentString = ""; std::string requiredString = ""; std::string maxString = ""; - uint8_t piecesRequired = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1); - uint8_t piecesTotal = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_TOTAL) + 1); - ImU32 currentColor = gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected >= piecesRequired ? IM_COL_GREEN : IM_COL_WHITE; + uint8_t piecesRequired = + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1); + uint8_t piecesTotal = + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_TOTAL) + 1); + ImU32 currentColor = gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected >= piecesRequired + ? IM_COL_GREEN + : IM_COL_WHITE; ImU32 maxColor = IM_COL_GREEN; - int32_t trackerTriforcePieceNumberDisplayMode = CVarGetInteger(CVAR_TRACKER_ITEM("TriforcePieceCounts"), TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX); + int32_t trackerTriforcePieceNumberDisplayMode = + CVarGetInteger(CVAR_TRACKER_ITEM("TriforcePieceCounts"), TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX); currentString += std::to_string(gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); currentString += "/"; @@ -612,18 +684,20 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { void DrawEquip(ItemTrackerItem item) { bool hasEquip = HasEquipment(item); - int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasEquip && IsValidSaveFile() ? item.name : item.nameFaded), - ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); + float iconSize = static_cast(CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36)); + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasEquip && IsValidSaveFile() ? item.name : item.nameFaded), + ImVec2(iconSize, iconSize), ImVec2(0.0f, 0.0f), ImVec2(1, 1)); - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(item.id)); + Tooltip(SohUtils::GetItemName(item.id).c_str()); } void DrawQuest(ItemTrackerItem item) { bool hasQuestItem = HasQuestItem(item); - int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); + float iconSize = static_cast(CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36)); ImGui::BeginGroup(); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasQuestItem && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasQuestItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); if (item.id == QUEST_SKULL_TOKEN) { @@ -632,17 +706,19 @@ void DrawQuest(ItemTrackerItem item) { ImGui::EndGroup(); - UIWidgets::SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); + Tooltip(SohUtils::GetQuestItemName(item.id).c_str()); }; void DrawItem(ItemTrackerItem item) { uint32_t actualItemId = GameInteractor::IsSaveLoaded() ? INV_CONTENT(item.id) : ITEM_NONE; - int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); + float iconSize = static_cast(CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36)); bool hasItem = actualItemId != ITEM_NONE; std::string itemName = ""; - if (item.id == ITEM_NONE) { + // Hack fix as RG_MARKET_SHOOTING_GALLERY_KEY is RandomizerGet #255 which collides + // with ITEM_NONE (ItemId #255) due to the lack of a modid to separate them + if (item.name != "ITEM_KEY_SMALL" && item.id == ITEM_NONE) { return; } @@ -668,7 +744,9 @@ void DrawItem(ItemTrackerItem item) { case ITEM_BRACELET: case ITEM_GAUNTLETS_SILVER: case ITEM_GAUNTLETS_GOLD: - actualItemId = CUR_UPG_VALUE(UPG_STRENGTH) == 3 ? ITEM_GAUNTLETS_GOLD : CUR_UPG_VALUE(UPG_STRENGTH) == 2 ? ITEM_GAUNTLETS_SILVER : ITEM_BRACELET; + actualItemId = CUR_UPG_VALUE(UPG_STRENGTH) == 3 ? ITEM_GAUNTLETS_GOLD + : CUR_UPG_VALUE(UPG_STRENGTH) == 2 ? ITEM_GAUNTLETS_SILVER + : ITEM_BRACELET; hasItem = CUR_UPG_VALUE(UPG_STRENGTH) > 0; break; case ITEM_SCALE_SILVER: @@ -727,9 +805,10 @@ void DrawItem(ItemTrackerItem item) { break; case RG_GANON_SOUL: actualItemId = item.id; - hasItem = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BOSS_SOULS) == RO_BOSS_SOULS_ON_PLUS_GANON ? - Flags_GetRandomizerInf(RAND_INF_GANON_SOUL) : true; - + hasItem = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BOSS_SOULS) == + RO_BOSS_SOULS_ON_PLUS_GANON + ? Flags_GetRandomizerInf(RAND_INF_GANON_SOUL) + : true; itemName = "Ganon's Soul"; break; @@ -763,23 +842,148 @@ void DrawItem(ItemTrackerItem item) { hasItem = IS_RANDO && Flags_GetRandomizerInf(RAND_INF_FISHING_POLE_FOUND); itemName = "Fishing Pole"; break; + + case RG_GUARD_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_GUARD_HOUSE_KEY_OBTAINED); + itemName = "Guard House Key"; + break; + case RG_MARKET_BAZAAR_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_MARKET_BAZAAR_KEY_OBTAINED); + itemName = "Market Bazaar Key"; + break; + case RG_MARKET_POTION_SHOP_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED); + itemName = "Market Potion Shop Key"; + break; + case RG_MASK_SHOP_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_MASK_SHOP_KEY_OBTAINED); + itemName = "Mask Shop Key"; + break; + case RG_MARKET_SHOOTING_GALLERY_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED); + itemName = "Market Shooting Gallery Key"; + break; + case RG_BOMBCHU_BOWLING_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED); + itemName = "Bombchu Bowling Key"; + break; + case RG_TREASURE_CHEST_GAME_BUILDING_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED); + itemName = "Treasure Chest Game Building Key"; + break; + case RG_BOMBCHU_SHOP_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED); + itemName = "Bombchu Shop Key"; + break; + case RG_RICHARDS_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED); + itemName = "Richards House Key"; + break; + case RG_ALLEY_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_ALLEY_HOUSE_KEY_OBTAINED); + itemName = "Alley House Key"; + break; + case RG_KAK_BAZAAR_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_KAK_BAZAAR_KEY_OBTAINED); + itemName = "Kak Bazaar Key"; + break; + case RG_KAK_POTION_SHOP_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED); + itemName = "Kak Potion Shop Key"; + break; + case RG_BOSS_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_BOSS_HOUSE_KEY_OBTAINED); + itemName = "Boss House Key"; + break; + case RG_GRANNYS_POTION_SHOP_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED); + itemName = "Granny's Potion Shop Key"; + break; + case RG_SKULLTULA_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED); + itemName = "Skulltula House Key"; + break; + case RG_IMPAS_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_IMPAS_HOUSE_KEY_OBTAINED); + itemName = "Impa's House Key"; + break; + case RG_WINDMILL_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_WINDMILL_KEY_OBTAINED); + itemName = "Windmill Key"; + break; + case RG_KAK_SHOOTING_GALLERY_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED); + itemName = "Kak Shooting Gallery Key"; + break; + case RG_DAMPES_HUT_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_DAMPES_HUT_KEY_OBTAINED); + itemName = "Dampé's Hut Key"; + break; + case RG_TALONS_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_TALONS_HOUSE_KEY_OBTAINED); + itemName = "Talon's House Key"; + break; + case RG_STABLES_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_STABLES_KEY_OBTAINED); + itemName = "Stables Key"; + break; + case RG_BACK_TOWER_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_BACK_TOWER_KEY_OBTAINED); + itemName = "Back Tower Key"; + break; + case RG_HYLIA_LAB_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_HYLIA_LAB_KEY_OBTAINED); + itemName = "Hylia Lab Key"; + break; + case RG_FISHING_HOLE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_FISHING_HOLE_KEY_OBTAINED); + itemName = "Fishing Hole Key"; + break; } - if (GameInteractor::IsSaveLoaded() && (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) { + if (GameInteractor::IsSaveLoaded() && + (hasItem && item.id != actualItemId && + actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) { item = actualItemTrackerItemMap[actualItemId]; } - + ImGui::BeginGroup(); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - + DrawItemCount(item, false); if (item.id >= RG_GOHMA_SOUL && item.id <= RG_GANON_SOUL) { ImVec2 p = ImGui::GetCursorScreenPos(); std::string bossName = itemTrackerBossShortNames[item.id]; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(bossName.c_str()).x / 2), p.y - (iconSize + 13))); + ImGui::SetCursorScreenPos( + ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(bossName.c_str()).x / 2), p.y - (iconSize + 13))); ImGui::PushStyleColor(ImGuiCol_Text, IM_COL_WHITE); ImGui::Text("%s", bossName.c_str()); ImGui::PopStyleColor(); @@ -788,98 +992,119 @@ void DrawItem(ItemTrackerItem item) { if (item.id >= RG_OCARINA_A_BUTTON && item.id <= RG_OCARINA_C_RIGHT_BUTTON) { ImVec2 p = ImGui::GetCursorScreenPos(); std::string ocarinaButtonName = itemTrackerOcarinaButtonShortNames[item.id]; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(ocarinaButtonName.c_str()).x / 2), p.y - (iconSize + 13))); + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(ocarinaButtonName.c_str()).x / 2), + p.y - (iconSize + 13))); ImGui::PushStyleColor(ImGuiCol_Text, IM_COL_WHITE); ImGui::Text("%s", ocarinaButtonName.c_str()); ImGui::PopStyleColor(); } + if (item.id >= RG_GUARD_HOUSE_KEY && item.id <= RG_FISHING_HOLE_KEY) { + ImVec2 p = ImGui::GetCursorScreenPos(); + std::string overworldKeyName = itemTrackerOverworldKeyShortNames[item.id]; + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(overworldKeyName.c_str()).x / 2), + p.y - (iconSize + 13))); + ImGui::PushStyleColor(ImGuiCol_Text, IM_COL_WHITE); + ImGui::Text("%s", overworldKeyName.c_str()); + ImGui::PopStyleColor(); + } + ImGui::EndGroup(); if (itemName == "") { itemName = SohUtils::GetItemName(item.id); } - UIWidgets::SetLastItemHoverText(itemName); + Tooltip(itemName.c_str()); } void DrawBottle(ItemTrackerItem item) { - uint32_t actualItemId = GameInteractor::IsSaveLoaded() ? (gSaveContext.inventory.items[SLOT(item.id) + item.data]) : false; + uint32_t actualItemId = + GameInteractor::IsSaveLoaded() ? (gSaveContext.inventory.items[SLOT(item.id) + item.data]) : false; bool hasItem = actualItemId != ITEM_NONE; - if (GameInteractor::IsSaveLoaded() && (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) { + if (GameInteractor::IsSaveLoaded() && + (hasItem && item.id != actualItemId && + actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) { item = actualItemTrackerItemMap[actualItemId]; } - int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), + float iconSize = static_cast(CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36)); + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(item.id)); + Tooltip(SohUtils::GetItemName(item.id).c_str()); }; void DrawDungeonItem(ItemTrackerItem item) { uint32_t itemId = item.id; ImU32 dungeonColor = IM_COL_WHITE; uint32_t bitMask = 1 << (item.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential - int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); + float iconSize = static_cast(CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36)); bool hasItem = GameInteractor::IsSaveLoaded() ? (bitMask & gSaveContext.inventory.dungeonItems[item.data]) : false; - bool hasSmallKey = GameInteractor::IsSaveLoaded() ? ((gSaveContext.inventory.dungeonKeys[item.data]) >= 0) : false; + bool hasSmallKey = GameInteractor::IsSaveLoaded() ? ((gSaveContext.inventory.dungeonKeys[item.data]) >= 0) : false; ImGui::BeginGroup(); if (itemId == ITEM_KEY_SMALL) { - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasSmallKey && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasSmallKey && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - } - else { - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), + } else { + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); } - if (CheckTracker::IsAreaSpoiled(RandomizerCheckObjects::GetRCAreaBySceneID(static_cast(item.data))) && GameInteractor::IsSaveLoaded()) { + if (CheckTracker::IsAreaSpoiled(RandomizerCheckObjects::GetRCAreaBySceneID(static_cast(item.data))) && + GameInteractor::IsSaveLoaded()) { dungeonColor = (ResourceMgr_IsSceneMasterQuest(item.data) ? IM_COL_PURPLE : IM_COL_LIGHT_YELLOW); } if (itemId == ITEM_KEY_SMALL) { - DrawItemCount(item, !CheckTracker::IsAreaSpoiled(RandomizerCheckObjects::GetRCAreaBySceneID(static_cast(item.data)))); + DrawItemCount(item, !CheckTracker::IsAreaSpoiled( + RandomizerCheckObjects::GetRCAreaBySceneID(static_cast(item.data)))); ImVec2 p = ImGui::GetCursorScreenPos(); - // offset puts the text at the correct level. for some reason, if the save is loaded, the margin is 3 pixels higher only for small keys, so we use 16 then. Otherwise, 13 is where everything else is + // offset puts the text at the correct level. for some reason, if the save is loaded, the margin is 3 pixels + // higher only for small keys, so we use 16 then. Otherwise, 13 is where everything else is int offset = GameInteractor::IsSaveLoaded() ? 16 : 13; std::string dungeonName = itemTrackerDungeonShortNames[item.data]; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + offset))); + ImGui::SetCursorScreenPos( + ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + offset))); ImGui::PushStyleColor(ImGuiCol_Text, dungeonColor); ImGui::Text("%s", dungeonName.c_str()); ImGui::PopStyleColor(); } - if (itemId == ITEM_DUNGEON_MAP && - (item.data == SCENE_DEKU_TREE || item.data == SCENE_DODONGOS_CAVERN || item.data == SCENE_JABU_JABU || item.data == SCENE_ICE_CAVERN) - ) { + if (itemId == ITEM_DUNGEON_MAP && (item.data == SCENE_DEKU_TREE || item.data == SCENE_DODONGOS_CAVERN || + item.data == SCENE_JABU_JABU || item.data == SCENE_ICE_CAVERN)) { ImVec2 p = ImGui::GetCursorScreenPos(); std::string dungeonName = itemTrackerDungeonShortNames[item.data]; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + 13))); + ImGui::SetCursorScreenPos( + ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + 13))); ImGui::PushStyleColor(ImGuiCol_Text, dungeonColor); ImGui::Text("%s", dungeonName.c_str()); ImGui::PopStyleColor(); } ImGui::EndGroup(); - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(item.id)); + Tooltip(SohUtils::GetItemName(item.id).c_str()); } void DrawSong(ItemTrackerItem item) { - int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); + float iconSize = static_cast(CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36)); ImVec2 p = ImGui::GetCursorScreenPos(); bool hasSong = HasSong(item); ImGui::SetCursorScreenPos(ImVec2(p.x + 6, p.y)); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasSong && IsValidSaveFile() ? item.name : item.nameFaded), - ImVec2(iconSize / 1.5, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - UIWidgets::SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasSong && IsValidSaveFile() ? item.name : item.nameFaded), + ImVec2(iconSize / 1.5f, iconSize), ImVec2(0, 0), ImVec2(1, 1)); + Tooltip(SohUtils::GetQuestItemName(item.id).c_str()); } void DrawNotes(bool resizeable = false) { ImGui::BeginGroup(); - int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); + float iconSize = static_cast(CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36)); int iconSpacing = CVarGetInteger(CVAR_TRACKER_ITEM("IconSpacing"), 12); struct ItemTrackerNotes { @@ -893,22 +1118,24 @@ void DrawNotes(bool resizeable = false) { } return 0; } - static bool TrackerNotesInputTextMultiline(const char* label, ImVector* itemTrackerNotes, const ImVec2& size = ImVec2(0, 0), - ImGuiInputTextFlags flags = 0) { + static bool TrackerNotesInputTextMultiline(const char* label, ImVector* itemTrackerNotes, + const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0) { IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); - return ImGui::InputTextMultiline(label, itemTrackerNotes->begin(), (size_t)itemTrackerNotes->size(), - size, flags | ImGuiInputTextFlags_CallbackResize, - ItemTrackerNotes::TrackerNotesResizeCallback, - (void*)itemTrackerNotes); + return ImGui::InputTextMultiline(label, itemTrackerNotes->begin(), (size_t)itemTrackerNotes->size(), size, + flags | ImGuiInputTextFlags_CallbackResize, + ItemTrackerNotes::TrackerNotesResizeCallback, (void*)itemTrackerNotes); } }; - ImVec2 size = resizeable ? ImVec2(-FLT_MIN, ImGui::GetContentRegionAvail().y) : ImVec2(((iconSize + iconSpacing) * 6) - 8, 200); + ImVec2 size = resizeable ? ImVec2(-FLT_MIN, ImGui::GetContentRegionAvail().y) + : ImVec2(((iconSize + iconSpacing) * 6) - 8.0f, 200.0f); if (GameInteractor::IsSaveLoaded()) { - if (ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, size, ImGuiInputTextFlags_AllowTabInput)) { + if (ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, size, + ImGuiInputTextFlags_AllowTabInput)) { notesNeedSave = true; notesIdleFrames = 0; } - if ((ImGui::IsItemDeactivatedAfterEdit() || (notesNeedSave && notesIdleFrames > notesMaxIdleFrames)) && IsValidSaveFile()) { + if ((ImGui::IsItemDeactivatedAfterEdit() || (notesNeedSave && notesIdleFrames > notesMaxIdleFrames)) && + IsValidSaveFile()) { notesNeedSave = false; SaveManager::Instance->SaveSection(gSaveContext.fileNum, itemTrackerSectionId, true); } @@ -931,25 +1158,39 @@ void DrawTotalChecks() { } // Windowing stuff -ImVec4 ChromaKeyBackground = { 0, 0, 0, 0 }; // Float value, 1 = 255 in rgb value. void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { ImGuiWindowFlags windowFlags = flags; if (windowFlags == 0) { - windowFlags |= ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize; + windowFlags |= + ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize; } if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING) { ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID); - windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; + windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; if (!CVarGetInteger(CVAR_TRACKER_ITEM("Draggable"), 0)) { windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; } } - ImGui::PushStyleColor(ImGuiCol_WindowBg, ChromaKeyBackground); + auto color = VecFromRGBA8(CVarGetColor(CVAR_TRACKER_ITEM("BgColor.Value"), { 0, 0, 0, 0 })); + auto maybeParent = ImGui::GetCurrentWindow(); + ImGuiWindow* window = ImGui::FindWindowByName(UniqueName.c_str()); + if (window != NULL && window->DockTabIsVisible && window->ParentWindow != NULL && + std::string(window->ParentWindow->Name).compare(0, strlen("Main - Deck"), "Main - Deck") == 0) { + color.w = 1.0f; + } + ImGui::PushStyleColor(ImGuiCol_WindowBg, color); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); + if (presetLoaded && presetPos.contains(UniqueName)) { + ImGui::SetNextWindowSize(presetSize[UniqueName]); + ImGui::SetNextWindowPos(presetPos[UniqueName]); + presetSize.erase(UniqueName); + presetPos.erase(UniqueName); + } ImGui::Begin(UniqueName.c_str(), nullptr, windowFlags); } void EndFloatingWindows() { @@ -964,14 +1205,16 @@ void EndFloatingWindows() { * Takes in a vector of ItemTrackerItem and draws them in rows of N items */ void DrawItemsInRows(std::vector items, int columns = 6) { - int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); + float iconSize = static_cast(CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36)); int iconSpacing = CVarGetInteger(CVAR_TRACKER_ITEM("IconSpacing"), 12); - int topPadding = (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW) ? 20 : 0; + int topPadding = + (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW) ? 20 : 0; for (int i = 0; i < items.size(); i++) { int row = i / columns; int column = i % columns; - ImGui::SetCursorPos(ImVec2((column * (iconSize + iconSpacing) + 8), (row * (iconSize + iconSpacing)) + 8 + topPadding)); + ImGui::SetCursorPos( + ImVec2((column * (iconSize + iconSpacing) + 8.0f), (row * (iconSize + iconSpacing)) + 8.0f + topPadding)); items[i].drawFunc(items[i]); } } @@ -985,10 +1228,10 @@ void DrawItemsInACircle(std::vector items) { int iconSpacing = CVarGetInteger(CVAR_TRACKER_ITEM("IconSpacing"), 12); ImVec2 max = ImGui::GetWindowContentRegionMax(); - float radius = (iconSize + iconSpacing) * 2; + float radius = (iconSize + iconSpacing) * 2.0f; for (int i = 0; i < items.size(); i++) { - float angle = (float)i / items.size() * 2.0f * M_PI; + float angle = static_cast(i / items.size() * 2.0f * M_PI); float x = (radius / 2.0f) * cos(angle) + max.x / 2.0f; float y = (radius / 2.0f) * sin(angle) + max.y / 2.0f; ImGui::SetCursorPos(ImVec2(x - (CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36) - 8) / 2.0f, y + 4)); @@ -998,17 +1241,16 @@ void DrawItemsInACircle(std::vector items) { /** * GetDungeonItemsVector - * Loops over dungeons and creates vectors of items in the correct order + * Loops over dungeons and creates vectors of items in the correct order * to then call DrawItemsInRows */ std::vector GetDungeonItemsVector(std::vector dungeons, int columns = 6) { - int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); - int iconSpacing = CVarGetInteger(CVAR_TRACKER_ITEM("IconSpacing"), 12); std::vector dungeonItems = {}; int rowCount = 0; for (int i = 0; i < dungeons.size(); i++) { - if (dungeons[i].items.size() > rowCount) rowCount = dungeons[i].items.size(); + if (dungeons[i].items.size() > rowCount) + rowCount = static_cast(dungeons[i].items.size()); } for (int i = 0; i < rowCount; i++) { @@ -1021,7 +1263,8 @@ std::vector GetDungeonItemsVector(std::vector GetDungeonItemsVector(std::vector columns) { - std::vector nextDungeonItems = GetDungeonItemsVector(std::vector(dungeons.begin() + columns, dungeons.end()), columns); + std::vector nextDungeonItems = + GetDungeonItemsVector(std::vector(dungeons.begin() + columns, dungeons.end()), columns); dungeonItems.insert(dungeonItems.end(), nextDungeonItems.begin(), nextDungeonItems.end()); } @@ -1049,7 +1293,7 @@ std::vector GetDungeonItemsVector(std::vectorSaveData("personalNotes", std::string(std::begin(itemTrackerNotes), std::end(itemTrackerNotes)).c_str()); + SaveManager::Instance->SaveData("personalNotes", + std::string(std::begin(itemTrackerNotes), std::end(itemTrackerNotes)).c_str()); } void ItemTrackerLoadFile() { std::string initialTrackerNotes = ""; SaveManager::Instance->LoadData("personalNotes", initialTrackerNotes); - itemTrackerNotes.resize(initialTrackerNotes.length() + 1); + itemTrackerNotes.resize(static_cast(initialTrackerNotes.length() + 1)); if (initialTrackerNotes != "") { SohUtils::CopyStringToCharArray(itemTrackerNotes.Data, initialTrackerNotes.c_str(), itemTrackerNotes.size()); } else { @@ -1214,9 +1499,11 @@ void ItemTrackerWindow::Draw() { if (!IsVisible()) { return; } + ImGui::PushFont(OTRGlobals::Instance->fontMono); DrawElement(); // Sync up the IsVisible flag if it was changed by ImGui SyncVisibilityConsoleVariable(); + ImGui::PopFont(); } void ItemTrackerWindow::DrawElement() { @@ -1226,51 +1513,74 @@ void ItemTrackerWindow::DrawElement() { int iconSpacing = CVarGetInteger(CVAR_TRACKER_ITEM("IconSpacing"), 12); int comboButton1Mask = buttonMap[CVarGetInteger(CVAR_TRACKER_ITEM("ComboButton1"), TRACKER_COMBO_BUTTON_L)]; int comboButton2Mask = buttonMap[CVarGetInteger(CVAR_TRACKER_ITEM("ComboButton2"), TRACKER_COMBO_BUTTON_R)]; - OSContPad* buttonsPressed = std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); - bool comboButtonsHeld = buttonsPressed != nullptr && buttonsPressed[0].button & comboButton1Mask && buttonsPressed[0].button & comboButton2Mask; - bool isPaused = CVarGetInteger(CVAR_TRACKER_ITEM("ShowOnlyPaused"), 0) == 0 || gPlayState != nullptr && gPlayState->pauseCtx.state > 0; + OSContPad* buttonsPressed = + std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); + bool comboButtonsHeld = buttonsPressed != nullptr && buttonsPressed[0].button & comboButton1Mask && + buttonsPressed[0].button & comboButton2Mask; + bool isPaused = CVarGetInteger(CVAR_TRACKER_ITEM("ShowOnlyPaused"), 0) == 0 || + gPlayState != nullptr && gPlayState->pauseCtx.state > 0; - if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW || isPaused && (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS ? CVarGetInteger(CVAR_WINDOW("ItemTracker"), 0) : comboButtonsHeld)) { - if ( - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Inventory"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Equipment"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Misc"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Songs"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Greg"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.FishingPole"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW) - ) { - BeginFloatingWindows("Item Tracker##main window"); + if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW || + isPaused && + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS + ? CVarGetInteger(CVAR_WINDOW("ItemTracker"), 0) + : comboButtonsHeld)) { + if ((CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Inventory"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Equipment"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Misc"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Songs"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Greg"), SECTION_DISPLAY_EXTENDED_HIDDEN) == + SECTION_DISPLAY_EXTENDED_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.FishingPole"), SECTION_DISPLAY_EXTENDED_HIDDEN) == + SECTION_DISPLAY_EXTENDED_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_MAIN_WINDOW)) { + BeginFloatingWindows("Item Tracker"); DrawItemsInRows(mainWindowItems, 6); - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW && CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_MAIN_WINDOW && + (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING && + CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == + TRACKER_DISPLAY_ALWAYS)) { DrawNotes(); } EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Inventory"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Inventory"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Inventory Items Tracker"); DrawItemsInRows(inventoryItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Equipment"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Equipment"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Equipment Items Tracker"); DrawItemsInRows(equipmentItems, 3); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Misc"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Misc"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Misc Items Tracker"); DrawItemsInRows(miscItems, 4); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Dungeon Rewards Tracker"); if (CVarGetInteger(CVAR_TRACKER_ITEM("DungeonRewardsLayout"), 0)) { ImGui::BeginGroup(); @@ -1285,13 +1595,15 @@ void ItemTrackerWindow::DrawElement() { EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Songs"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Songs"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Songs Tracker"); DrawItemsInRows(songItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Dungeon Items Tracker"); if (CVarGetInteger(CVAR_TRACKER_ITEM("DungeonItems.Layout"), 1)) { if (CVarGetInteger(CVAR_TRACKER_ITEM("DungeonItems.DisplayMaps"), 1)) { @@ -1305,38 +1617,55 @@ void ItemTrackerWindow::DrawElement() { EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Greg"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Greg"), SECTION_DISPLAY_EXTENDED_HIDDEN) == + SECTION_DISPLAY_EXTENDED_SEPARATE) { BeginFloatingWindows("Greg Tracker"); DrawItemsInRows(gregItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Triforce Piece Tracker"); DrawItemsInRows(triforcePieces); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.BossSouls"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.BossSouls"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Boss Soul Tracker"); DrawItemsInRows(bossSoulItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Ocarina Button Tracker"); DrawItemsInRows(ocarinaButtonItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.FishingPole"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { + BeginFloatingWindows("Overworld Key Tracker"); + DrawItemsInRows(overworldKeyItems); + EndFloatingWindows(); + } + + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.FishingPole"), SECTION_DISPLAY_EXTENDED_HIDDEN) == + SECTION_DISPLAY_EXTENDED_SEPARATE) { BeginFloatingWindows("Fishing Pole Tracker"); DrawItemsInRows(fishingPoleItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE && CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { - ImGui::SetNextWindowSize(ImVec2(400,300), ImGuiCond_FirstUseEver); + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE && + (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW || + (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING && + CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) != + TRACKER_DISPLAY_COMBO_BUTTON))) { + ImGui::SetNextWindowSize(ImVec2(400, 300), ImGuiCond_FirstUseEver); BeginFloatingWindows("Personal Notes", ImGuiWindowFlags_NoFocusOnAppearing); DrawNotes(true); EndFloatingWindows(); @@ -1350,17 +1679,59 @@ void ItemTrackerWindow::DrawElement() { EndFloatingWindows(); } } + if (presetLoaded) { + shouldUpdateVectors = true; + presetLoaded = false; + } } -static const char* itemTrackerCapacityTrackOptions[5] = { "No Numbers", "Current Capacity", "Current Ammo", "Current Capacity / Max Capacity", "Current Ammo / Current Capacity" }; -static const char* itemTrackerKeyTrackOptions[3] = { "Collected / Max", "Current / Collected / Max", "Current / Max" }; -static const char* itemTrackerTriforcePieceTrackOptions[2] = { "Collected / Required", "Collected / Required / Max" }; -static const char* windowTypes[2] = { "Floating", "Window" }; -static const char* displayModes[2] = { "Always", "Combo Button Hold" }; -static const char* buttons[14] = { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }; -static const char* displayTypes[3] = { "Hidden", "Main Window", "Separate" }; -static const char* extendedDisplayTypes[4] = { "Hidden", "Main Window", "Misc Window", "Separate" }; -static const char* minimalDisplayTypes[2] = { "Hidden", "Separate" }; +static std::unordered_map itemTrackerCapacityTrackOptions = { + { ITEM_TRACKER_NUMBER_NONE, "No Numbers" }, + { ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY, "Current Capacity" }, + { ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY, "Current Ammo" }, + { ITEM_TRACKER_NUMBER_CAPACITY, "Current Capacity / Max Capacity" }, + { ITEM_TRACKER_NUMBER_AMMO, "Current Ammo / Current Capacity" }, +}; +static std::unordered_map itemTrackerKeyTrackOptions = { + { KEYS_COLLECTED_MAX, "Collected / Max" }, + { KEYS_CURRENT_COLLECTED_MAX, "Current / Collected / Max" }, + { KEYS_CURRENT_MAX, "Current / Max" }, +}; +static std::unordered_map itemTrackerTriforcePieceTrackOptions = { + { TRIFORCE_PIECE_COLLECTED_REQUIRED, "Collected / Required" }, + { TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX, "Collected / Required / Max" }, +}; +static std::unordered_map windowTypes = { + { TRACKER_WINDOW_FLOATING, "Floating" }, + { TRACKER_WINDOW_WINDOW, "Window" }, +}; +static std::unordered_map displayModes = { + { TRACKER_DISPLAY_ALWAYS, "Always" }, + { TRACKER_DISPLAY_COMBO_BUTTON, "Combo Button Hold" }, +}; +static std::unordered_map buttons = { + { TRACKER_COMBO_BUTTON_A, "A" }, { TRACKER_COMBO_BUTTON_B, "B" }, + { TRACKER_COMBO_BUTTON_C_UP, "C-Up" }, { TRACKER_COMBO_BUTTON_C_DOWN, "C-Down" }, + { TRACKER_COMBO_BUTTON_C_LEFT, "C-Left" }, { TRACKER_COMBO_BUTTON_C_RIGHT, "C-Right" }, + { TRACKER_COMBO_BUTTON_L, "L" }, { TRACKER_COMBO_BUTTON_Z, "Z" }, + { TRACKER_COMBO_BUTTON_R, "R" }, { TRACKER_COMBO_BUTTON_START, "Start" }, + { TRACKER_COMBO_BUTTON_D_UP, "D-Up" }, { TRACKER_COMBO_BUTTON_D_DOWN, "D-Down" }, + { TRACKER_COMBO_BUTTON_D_LEFT, "D-Left" }, { TRACKER_COMBO_BUTTON_D_RIGHT, "D-Right" }, +}; +static std::unordered_map displayTypes = { + { SECTION_DISPLAY_HIDDEN, "Hidden" }, + { SECTION_DISPLAY_MAIN_WINDOW, "Main Window" }, + { SECTION_DISPLAY_SEPARATE, "Separate" }, +}; +static std::unordered_map extendedDisplayTypes = { + { SECTION_DISPLAY_EXTENDED_HIDDEN, "Hidden" }, + { SECTION_DISPLAY_EXTENDED_MAIN_WINDOW, "Main Window" }, + { SECTION_DISPLAY_EXTENDED_MISC_WINDOW, "Misc Window" }, + { SECTION_DISPLAY_EXTENDED_SEPARATE, "Separate" }, +}; +static std::unordered_map minimalDisplayTypes = { + { SECTION_DISPLAY_MINIMAL_HIDDEN, "Hidden" }, { SECTION_DISPLAY_MINIMAL_SEPARATE, "Separate" } +}; void ItemTrackerSettingsWindow::DrawElement() { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); @@ -1370,154 +1741,257 @@ void ItemTrackerSettingsWindow::DrawElement() { ImGui::TableHeadersRow(); ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::Text("BG Color"); - ImGui::SameLine(); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - if (ImGui::ColorEdit4("BG Color##gItemTrackerBgColor", (float*)&ChromaKeyBackground, ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_NoLabel)) { - CVarSetFloat(CVAR_TRACKER_ITEM("BgColorR"), ChromaKeyBackground.x); - CVarSetFloat(CVAR_TRACKER_ITEM("BgColorG"), ChromaKeyBackground.y); - CVarSetFloat(CVAR_TRACKER_ITEM("BgColorB"), ChromaKeyBackground.z); - CVarSetFloat(CVAR_TRACKER_ITEM("BgColorA"), ChromaKeyBackground.w); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - ImGui::PopItemWidth(); + CVarColorPicker("Background Color##gItemTrackerBgColor", CVAR_TRACKER_ITEM("BgColor"), { 0, 0, 0, 0 }, true, + ColorPickerRandomButton | ColorPickerResetButton, THEME_COLOR); - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Window Type", CVAR_TRACKER_ITEM("WindowType"), windowTypes, TRACKER_WINDOW_FLOATING)) { + ImGui::PopItemWidth(); + if (CVarCombobox("Window Type", CVAR_TRACKER_ITEM("WindowType"), windowTypes, + ComboboxOptions() + .DefaultIndex(TRACKER_WINDOW_FLOATING) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING) { - if (UIWidgets::PaddedEnhancementCheckbox("Enable Dragging", CVAR_TRACKER_ITEM("Draggable"))) { + if (CVarCheckbox("Enable Dragging", CVAR_TRACKER_ITEM("Draggable"), CheckboxOptions().Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::PaddedEnhancementCheckbox("Only enable while paused", CVAR_TRACKER_ITEM("ShowOnlyPaused"))) { + if (CVarCheckbox("Only enable while paused", CVAR_TRACKER_ITEM("ShowOnlyPaused"), + CheckboxOptions().Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Display Mode", CVAR_TRACKER_ITEM("DisplayType.Main"), displayModes, TRACKER_DISPLAY_ALWAYS)) { + if (CVarCombobox("Display Mode", CVAR_TRACKER_ITEM("DisplayType.Main"), displayModes, + ComboboxOptions() + .DefaultIndex(TRACKER_DISPLAY_ALWAYS) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) { - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 1", CVAR_TRACKER_ITEM("ComboButton1"), buttons, TRACKER_COMBO_BUTTON_L)) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == + TRACKER_DISPLAY_COMBO_BUTTON) { + if (CVarCombobox("Combo Button 1", CVAR_TRACKER_ITEM("ComboButton1"), buttons, + ComboboxOptions() + .DefaultIndex(TRACKER_COMBO_BUTTON_L) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 2", CVAR_TRACKER_ITEM("ComboButton2"), buttons, TRACKER_COMBO_BUTTON_R)) { + if (CVarCombobox("Combo Button 2", CVAR_TRACKER_ITEM("ComboButton2"), buttons, + ComboboxOptions() + .DefaultIndex(TRACKER_COMBO_BUTTON_R) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } } } - UIWidgets::PaddedSeparator(); - UIWidgets::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", CVAR_TRACKER_ITEM("IconSize"), 25, 128, "", 36); - UIWidgets::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", CVAR_TRACKER_ITEM("IconSpacing"), -5, 50, "", 12); - UIWidgets::EnhancementSliderInt("Text size : %dpx", "##ITEMTRACKERTEXTSIZE", CVAR_TRACKER_ITEM("TextSize"), 1, 30, "", 13); - - UIWidgets::Spacer(0); + ImGui::Separator(); + CVarSliderInt("Icon size : %dpx", CVAR_TRACKER_ITEM("IconSize"), + IntSliderOptions().Min(25).Max(128).DefaultValue(36).Color(THEME_COLOR)); + CVarSliderInt("Icon margins : %dpx", CVAR_TRACKER_ITEM("IconSpacing"), + IntSliderOptions().Min(-5).Max(50).DefaultValue(12).Color(THEME_COLOR)); + CVarSliderInt("Text size : %dpx", CVAR_TRACKER_ITEM("TextSize"), + IntSliderOptions().Min(1).Max(30).DefaultValue(13).Color(THEME_COLOR)); - ImGui::Text("Ammo/Capacity Tracking"); - UIWidgets::EnhancementCombobox(CVAR_TRACKER_ITEM("ItemCountType"), itemTrackerCapacityTrackOptions, ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY); - UIWidgets::InsertHelpHoverText("Customize what the numbers under each item are tracking." - "\n\nNote: items without capacity upgrades will track ammo even in capacity mode"); - if (CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY) { - if (UIWidgets::PaddedEnhancementCheckbox("Align count to left side", CVAR_TRACKER_ITEM("ItemCountAlignLeft"))) { + ImGui::NewLine(); + CVarCombobox("Ammo/Capacity Tracking", CVAR_TRACKER_ITEM("ItemCountType"), itemTrackerCapacityTrackOptions, + ComboboxOptions() + .DefaultIndex(ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) + .ComponentAlignment(ComponentAlignments::Left) + .LabelPosition(LabelPositions::Above) + .Color(THEME_COLOR) + .Tooltip("Customize what the numbers under each item are tracking." + "\n\nNote: items without capacity upgrades will track ammo even in capacity mode")); + if (CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == + ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || + CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == + ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY) { + if (CVarCheckbox("Align count to left side", CVAR_TRACKER_ITEM("ItemCountAlignLeft"), + CheckboxOptions().Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - UIWidgets::Spacer(0); + CVarCombobox("Key Count Tracking", CVAR_TRACKER_ITEM("KeyCounts"), itemTrackerKeyTrackOptions, + ComboboxOptions() + .DefaultIndex(KEYS_COLLECTED_MAX) + .ComponentAlignment(ComponentAlignments::Left) + .LabelPosition(LabelPositions::Above) + .Color(THEME_COLOR) + .Tooltip("Customize what numbers are shown for key tracking.")); - ImGui::Text("Key Count Tracking"); - UIWidgets::EnhancementCombobox(CVAR_TRACKER_ITEM("KeyCounts"), itemTrackerKeyTrackOptions, KEYS_COLLECTED_MAX); - UIWidgets::InsertHelpHoverText("Customize what numbers are shown for key tracking."); - - UIWidgets::Spacer(0); - - ImGui::Text("Triforce Piece Count Tracking"); - UIWidgets::EnhancementCombobox(CVAR_TRACKER_ITEM("TriforcePieceCounts"), itemTrackerTriforcePieceTrackOptions, TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX); - UIWidgets::InsertHelpHoverText("Customize what numbers are shown for triforce piece tracking."); + CVarCombobox("Triforce Piece Count Tracking", CVAR_TRACKER_ITEM("TriforcePieceCounts"), + itemTrackerTriforcePieceTrackOptions, + ComboboxOptions() + .DefaultIndex(TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX) + .ComponentAlignment(ComponentAlignments::Left) + .LabelPosition(LabelPositions::Above) + .Color(THEME_COLOR) + .Tooltip("Customize what numbers are shown for triforce piece tracking.")); ImGui::TableNextColumn(); - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Inventory", CVAR_TRACKER_ITEM("DisplayType.Inventory"), displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) { + if (CVarCombobox("Inventory", CVAR_TRACKER_ITEM("DisplayType.Inventory"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Equipment", CVAR_TRACKER_ITEM("DisplayType.Equipment"), displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) { + if (CVarCombobox("Equipment", CVAR_TRACKER_ITEM("DisplayType.Equipment"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Misc", CVAR_TRACKER_ITEM("DisplayType.Misc"), displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) { + if (CVarCombobox("Misc", CVAR_TRACKER_ITEM("DisplayType.Misc"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Dungeon Rewards", CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) { + if (CVarCombobox("Dungeon Rewards", CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { - if (UIWidgets::PaddedEnhancementCheckbox("Circle display", CVAR_TRACKER_ITEM("DungeonRewardsLayout"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, false)) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { + if (CVarCheckbox("Circle display", CVAR_TRACKER_ITEM("DungeonRewardsLayout"), + CheckboxOptions().DefaultValue(false).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Songs", CVAR_TRACKER_ITEM("DisplayType.Songs"), displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) { + if (CVarCombobox("Songs", CVAR_TRACKER_ITEM("DisplayType.Songs"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Dungeon Items", CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), displayTypes, SECTION_DISPLAY_HIDDEN)) { + if (CVarCombobox("Dungeon Items", CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) != SECTION_DISPLAY_HIDDEN) { - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { - if (UIWidgets::PaddedEnhancementCheckbox("Horizontal display", CVAR_TRACKER_ITEM("DungeonItems.Layout"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true)) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) != + SECTION_DISPLAY_HIDDEN) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { + if (CVarCheckbox("Horizontal display", CVAR_TRACKER_ITEM("DungeonItems.Layout"), + CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - if (UIWidgets::PaddedEnhancementCheckbox("Maps and compasses", CVAR_TRACKER_ITEM("DungeonItems.DisplayMaps"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true)) { + if (CVarCheckbox("Maps and compasses", CVAR_TRACKER_ITEM("DungeonItems.DisplayMaps"), + CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Greg", CVAR_TRACKER_ITEM("DisplayType.Greg"), extendedDisplayTypes, SECTION_DISPLAY_EXTENDED_HIDDEN)) { + if (CVarCombobox("Greg", CVAR_TRACKER_ITEM("DisplayType.Greg"), extendedDisplayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Triforce Pieces", CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), displayTypes, SECTION_DISPLAY_HIDDEN)) { + if (CVarCombobox("Triforce Pieces", CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Boss Souls", CVAR_TRACKER_ITEM("DisplayType.BossSouls"), displayTypes, SECTION_DISPLAY_HIDDEN)) { + if (CVarCombobox("Boss Souls", CVAR_TRACKER_ITEM("DisplayType.BossSouls"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Ocarina Buttons", CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), displayTypes, SECTION_DISPLAY_HIDDEN)) { + if (CVarCombobox("Ocarina Buttons", CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Fishing Pole", CVAR_TRACKER_ITEM("DisplayType.FishingPole"), extendedDisplayTypes, SECTION_DISPLAY_EXTENDED_HIDDEN)) { + if (CVarCombobox("Overworld Keys", CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Total Checks", "gTrackers.ItemTracker.TotalChecks.DisplayType", minimalDisplayTypes, SECTION_DISPLAY_MINIMAL_HIDDEN)) { + if (CVarCombobox("Fishing Pole", CVAR_TRACKER_ITEM("DisplayType.FishingPole"), extendedDisplayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Personal notes", CVAR_TRACKER_ITEM("DisplayType.Notes"), displayTypes, SECTION_DISPLAY_HIDDEN)) { + if (CVarCombobox("Total Checks", "gTrackers.ItemTracker.TotalChecks.DisplayType", minimalDisplayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MINIMAL_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { + shouldUpdateVectors = true; + } + + if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW || + (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING && + CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) != + TRACKER_DISPLAY_COMBO_BUTTON)) { + if (CVarCombobox("Personal notes", CVAR_TRACKER_ITEM("DisplayType.Notes"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - UIWidgets::EnhancementCheckbox("Show Hookshot Identifiers", CVAR_TRACKER_ITEM("HookshotIdentifier")); - UIWidgets::InsertHelpHoverText("Shows an 'H' or an 'L' to more easiely distinguish between Hookshot and Longshot."); - - UIWidgets::Spacer(0); + CVarCheckbox("Show Hookshot Identifiers", CVAR_TRACKER_ITEM("HookshotIdentifier"), + CheckboxOptions() + .Tooltip("Shows an 'H' or an 'L' to more easiely distinguish between Hookshot and Longshot.") + .Color(THEME_COLOR)); ImGui::PopStyleVar(1); ImGui::EndTable(); } void ItemTrackerWindow::InitElement() { - float trackerBgR = CVarGetFloat(CVAR_TRACKER_ITEM("BgColorR"), 0); - float trackerBgG = CVarGetFloat(CVAR_TRACKER_ITEM("BgColorG"), 0); - float trackerBgB = CVarGetFloat(CVAR_TRACKER_ITEM("BgColorB"), 0); - float trackerBgA = CVarGetFloat(CVAR_TRACKER_ITEM("BgColorA"), 1); - ChromaKeyBackground = { - trackerBgR, - trackerBgG, - trackerBgB, - trackerBgA - }; // Float value, 1 = 255 in rgb value. // Crashes when the itemTrackerNotes is empty, so add an empty character to it if (itemTrackerNotes.empty()) { itemTrackerNotes.push_back(0); diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h index 5405b1ea2a..85a2b63a03 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h @@ -19,38 +19,51 @@ bool HasSong(ItemTrackerItem); bool HasQuestItem(ItemTrackerItem); bool HasEquipment(ItemTrackerItem); -#define ITEM_TRACKER_ITEM(id, data, drawFunc) \ - { \ - id, #id, #id "_Faded", data, drawFunc \ - } +#define ITEM_TRACKER_ITEM(id, data, drawFunc) \ + { id, #id, #id "_Faded", data, drawFunc } -#define ITEM_TRACKER_ITEM_CUSTOM(id, name, nameFaded, data, drawFunc)\ - { \ - id, #name, #nameFaded "_Faded", data, drawFunc \ - } +#define ITEM_TRACKER_ITEM_CUSTOM(id, name, nameFaded, data, drawFunc) \ + { id, #name, #nameFaded "_Faded", data, drawFunc } + +static std::vector itemTrackerWindowIDs = { "Item Tracker", + "Inventory Items Tracker", + "Equipment Items Tracker", + "Misc Items Tracker", + "Dungeon Rewards Tracker", + "Songs Tracker", + "Dungeon Items Tracker", + "Greg Tracker", + "Triforce Piece Tracker", + "Boss Soul Tracker", + "Ocarina Button Tracker", + "Overworld Key Tracker", + "Fishing Pole Tracker", + "Personal Notes", + "Total Checks" }; +void ItemTracker_LoadFromPreset(nlohmann::json trackerInfo); typedef struct ItemTrackerDungeon { uint32_t id; std::vector items; } ItemTrackerDungeon; -class ItemTrackerSettingsWindow : public Ship::GuiWindow { +class ItemTrackerSettingsWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; protected: - void InitElement() override {}; + void InitElement() override{}; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; -class ItemTrackerWindow : public Ship::GuiWindow { +class ItemTrackerWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void Draw() override; -protected: + protected: void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/randomizer_settings_window.h b/soh/soh/Enhancements/randomizer/randomizer_settings_window.h index 9f297c29db..87d830e387 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_settings_window.h +++ b/soh/soh/Enhancements/randomizer/randomizer_settings_window.h @@ -1,16 +1,19 @@ +#pragma once + #include namespace Rando { class Settings; } -class RandomizerSettingsWindow : public Ship::GuiWindow { +class RandomizerSettingsWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void InitElement() override; void DrawElement() override; void UpdateElement() override; + void SetNeedsUpdate(); private: bool mNeedsUpdate = false; diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index fba7c688b4..05a10a2b35 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -22,7 +22,7 @@ void StartingItemGive(GetItemEntry getItemEntry, RandomizerCheck randomizerCheck if (getItemEntry.getItemId == GI_SWORD_BGS) { gSaveContext.bgsFlag = true; } - Item_Give(NULL, getItemEntry.itemId); + Item_Give(NULL, static_cast(getItemEntry.itemId)); } else if (getItemEntry.modIndex == MOD_RANDOMIZER) { if (getItemEntry.getItemId == RG_ICE_TRAP) { gSaveContext.ship.pendingIceTrapCount++; @@ -32,9 +32,9 @@ void StartingItemGive(GetItemEntry getItemEntry, RandomizerCheck randomizerCheck } } -// RANDOTODO replace most of these GiveLink functions with calls to +// RANDOTODO: Replace most of these GiveLink functions with calls to // Item_Give in z_parameter, we'll need to update Item_Give to ensure -// nothing breaks when calling it without a valid play first +// nothing breaks when calling it without a valid play first. void GiveLinkRupees(int numOfRupees) { int maxRupeeCount = 0; if (CUR_UPG_VALUE(UPG_WALLET) == 0) { @@ -101,13 +101,13 @@ void GiveLinksPocketItem() { if (Randomizer_GetSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LINKS_POCKET, (GetItemID)RG_NONE); StartingItemGive(getItemEntry, RC_LINKS_POCKET); - // If we re-add the above, we'll get the item on save creation, now it's given on first load + // If we re-add the above, we'll get the item on save creation, now it's given on first load. Flags_SetRandomizerInf(RAND_INF_LINKS_POCKET); } } - void SetStartingItems() { + int startingAge = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SELECTED_STARTING_AGE).Get(); if (Randomizer_GetSettingValue(RSK_STARTING_KOKIRI_SWORD)) Item_Give(NULL, ITEM_SWORD_KOKIRI); if (Randomizer_GetSettingValue(RSK_STARTING_DEKU_SHIELD)) @@ -159,6 +159,13 @@ void SetStartingItems() { if (Randomizer_GetSettingValue(RSK_STARTING_NUTS) && !Randomizer_GetSettingValue(RSK_SHUFFLE_DEKU_NUT_BAG)) { GiveLinkDekuNuts(20); } + if (Randomizer_GetSettingValue(RSK_STARTING_MASTER_SWORD)) { + if (startingAge == RO_AGE_ADULT) { + Item_Give(NULL, ITEM_SWORD_MASTER); + } else { + gSaveContext.inventory.equipment |= 1 << 1; + } + } if (Randomizer_GetSettingValue(RSK_FULL_WALLETS)) { GiveLinkRupees(9001); @@ -174,40 +181,40 @@ void SetStartingItems() { } if (Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_STARTWITH) { - gSaveContext.inventory.dungeonKeys[SCENE_FOREST_TEMPLE] = FOREST_TEMPLE_SMALL_KEY_MAX; // Forest - gSaveContext.ship.stats.dungeonKeys[SCENE_FOREST_TEMPLE] = FOREST_TEMPLE_SMALL_KEY_MAX; // Forest - gSaveContext.inventory.dungeonKeys[SCENE_FIRE_TEMPLE] = FIRE_TEMPLE_SMALL_KEY_MAX; // Fire - gSaveContext.ship.stats.dungeonKeys[SCENE_FIRE_TEMPLE] = FIRE_TEMPLE_SMALL_KEY_MAX; // Fire - gSaveContext.inventory.dungeonKeys[SCENE_WATER_TEMPLE] = WATER_TEMPLE_SMALL_KEY_MAX; // Water - gSaveContext.ship.stats.dungeonKeys[SCENE_WATER_TEMPLE] = WATER_TEMPLE_SMALL_KEY_MAX; // Water - gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] = SPIRIT_TEMPLE_SMALL_KEY_MAX; // Spirit - gSaveContext.ship.stats.dungeonKeys[SCENE_SPIRIT_TEMPLE] = SPIRIT_TEMPLE_SMALL_KEY_MAX; // Spirit - gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] = SHADOW_TEMPLE_SMALL_KEY_MAX; // Shadow - gSaveContext.ship.stats.dungeonKeys[SCENE_SHADOW_TEMPLE] = SHADOW_TEMPLE_SMALL_KEY_MAX; // Shadow - gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] = BOTTOM_OF_THE_WELL_SMALL_KEY_MAX; // BotW - gSaveContext.ship.stats.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] = BOTTOM_OF_THE_WELL_SMALL_KEY_MAX; // BotW + gSaveContext.inventory.dungeonKeys[SCENE_FOREST_TEMPLE] = FOREST_TEMPLE_SMALL_KEY_MAX; // Forest + gSaveContext.ship.stats.dungeonKeys[SCENE_FOREST_TEMPLE] = FOREST_TEMPLE_SMALL_KEY_MAX; // Forest + gSaveContext.inventory.dungeonKeys[SCENE_FIRE_TEMPLE] = FIRE_TEMPLE_SMALL_KEY_MAX; // Fire + gSaveContext.ship.stats.dungeonKeys[SCENE_FIRE_TEMPLE] = FIRE_TEMPLE_SMALL_KEY_MAX; // Fire + gSaveContext.inventory.dungeonKeys[SCENE_WATER_TEMPLE] = WATER_TEMPLE_SMALL_KEY_MAX; // Water + gSaveContext.ship.stats.dungeonKeys[SCENE_WATER_TEMPLE] = WATER_TEMPLE_SMALL_KEY_MAX; // Water + gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] = SPIRIT_TEMPLE_SMALL_KEY_MAX; // Spirit + gSaveContext.ship.stats.dungeonKeys[SCENE_SPIRIT_TEMPLE] = SPIRIT_TEMPLE_SMALL_KEY_MAX; // Spirit + gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] = SHADOW_TEMPLE_SMALL_KEY_MAX; // Shadow + gSaveContext.ship.stats.dungeonKeys[SCENE_SHADOW_TEMPLE] = SHADOW_TEMPLE_SMALL_KEY_MAX; // Shadow + gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] = BOTTOM_OF_THE_WELL_SMALL_KEY_MAX; // BotW + gSaveContext.ship.stats.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] = BOTTOM_OF_THE_WELL_SMALL_KEY_MAX; // BotW gSaveContext.inventory.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] = GERUDO_TRAINING_GROUND_SMALL_KEY_MAX; // GTG gSaveContext.ship.stats.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] = GERUDO_TRAINING_GROUND_SMALL_KEY_MAX; // GTG - gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] = GANONS_CASTLE_SMALL_KEY_MAX; // Ganon - gSaveContext.ship.stats.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] = GANONS_CASTLE_SMALL_KEY_MAX; // Ganon + gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] = GANONS_CASTLE_SMALL_KEY_MAX; // Ganon + gSaveContext.ship.stats.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] = GANONS_CASTLE_SMALL_KEY_MAX; // Ganon } else if (Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_VANILLA) { // Logic cannot handle vanilla key layout in some dungeons // this is because vanilla expects the dungeon major item to be // locked behind the keys, which is not always true in rando. - // We can resolve this by starting with some extra keys + // We can resolve this by starting with some extra keys. if (ResourceMgr_IsSceneMasterQuest(SCENE_SPIRIT_TEMPLE)) { - // MQ Spirit needs 3 keys + // MQ Spirit needs 3 keys. gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] = 3; gSaveContext.ship.stats.dungeonKeys[SCENE_SPIRIT_TEMPLE] = 3; } } if (Randomizer_GetSettingValue(RSK_BOSS_KEYSANITY) == RO_DUNGEON_ITEM_LOC_STARTWITH) { - gSaveContext.inventory.dungeonItems[SCENE_FOREST_TEMPLE] |= 1; // Forest - gSaveContext.inventory.dungeonItems[SCENE_FIRE_TEMPLE] |= 1; // Fire - gSaveContext.inventory.dungeonItems[SCENE_WATER_TEMPLE] |= 1; // Water + gSaveContext.inventory.dungeonItems[SCENE_FOREST_TEMPLE] |= 1; // Forest + gSaveContext.inventory.dungeonItems[SCENE_FIRE_TEMPLE] |= 1; // Fire + gSaveContext.inventory.dungeonItems[SCENE_WATER_TEMPLE] |= 1; // Water gSaveContext.inventory.dungeonItems[SCENE_SPIRIT_TEMPLE] |= 1; // Spirit - gSaveContext.inventory.dungeonItems[SCENE_SHADOW_TEMPLE] |= 1; // Shadow + gSaveContext.inventory.dungeonItems[SCENE_SHADOW_TEMPLE] |= 1; // Shadow } if (Randomizer_GetSettingValue(RSK_GANONS_BOSS_KEY) == RO_GANON_BOSS_KEY_STARTWITH) { @@ -222,10 +229,12 @@ extern "C" void Randomizer_InitSaveFile() { // Starts pending ice traps out at 0 before potentially incrementing them down the line. gSaveContext.ship.pendingIceTrapCount = 0; - // Reset triforce pieces collected + // Reset triforce pieces collected. gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected = 0; - // Set Cutscene flags and texts to skip them + SetStartingItems(); + + // Set Cutscene flags and texts to skip them. Flags_SetEventChkInf(EVENTCHKINF_FIRST_SPOKE_TO_MIDO); Flags_SetInfTable(INFTABLE_SPOKE_TO_KAEPORA_IN_LAKE_HYLIA); Flags_SetEventChkInf(EVENTCHKINF_SHEIK_SPAWNED_AT_MASTER_SWORD_PEDESTAL); @@ -234,7 +243,7 @@ extern "C" void Randomizer_InitSaveFile() { Flags_SetEventChkInf(EVENTCHKINF_WATCHED_GANONS_CASTLE_COLLAPSE_CAUGHT_BY_GERUDO); Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_NABOORU_IN_SPIRIT_TEMPLE); - // Go away ruto (water temple first cutscene) + // Go away Ruto (Water Temple first cutscene). gSaveContext.sceneFlags[SCENE_WATER_TEMPLE].swch |= (1 << 0x10); if (Randomizer_GetSettingValue(RSK_SHUFFLE_OCARINA_BUTTONS) == RO_GENERIC_OFF) { @@ -260,11 +269,11 @@ extern "C" void Randomizer_InitSaveFile() { // Give Link's pocket item GiveLinksPocketItem(); - // remove One Time scrubs with scrubsanity off + // Remove One Time Scrubs with Scrubsanity off if (Randomizer_GetSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_OFF) { - Flags_SetRandomizerInf(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE); - Flags_SetRandomizerInf(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT); - Flags_SetRandomizerInf(RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO); + Flags_SetItemGetInf(ITEMGETINF_DEKU_SCRUB_HEART_PIECE); + Flags_SetInfTable(INFTABLE_BOUGHT_STICK_UPGRADE); + Flags_SetInfTable(INFTABLE_BOUGHT_NUT_UPGRADE); } int startingAge = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SELECTED_STARTING_AGE).Get(); @@ -272,7 +281,7 @@ extern "C" void Randomizer_InitSaveFile() { case RO_AGE_ADULT: // Adult gSaveContext.linkAge = LINK_AGE_ADULT; gSaveContext.entranceIndex = ENTR_TEMPLE_OF_TIME_WARP_PAD; - gSaveContext.savedSceneNum = SCENE_LON_LON_RANCH; // Set scene num manually to ToT + gSaveContext.savedSceneNum = SCENE_LON_LON_RANCH; // Set scene num manually to ToT. break; case RO_AGE_CHILD: // Child gSaveContext.linkAge = LINK_AGE_CHILD; @@ -284,17 +293,13 @@ extern "C" void Randomizer_InitSaveFile() { if (Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS)) { // Override the spawn entrance so entrance rando can take control, - // and to prevent remember save location from breaking inital spawn + // and to prevent remember save location from breaking initial spawn. gSaveContext.entranceIndex = -1; } - for (auto trialFlag : { EVENTCHKINF_COMPLETED_LIGHT_TRIAL, - EVENTCHKINF_COMPLETED_FOREST_TRIAL, - EVENTCHKINF_COMPLETED_FIRE_TRIAL, - EVENTCHKINF_COMPLETED_WATER_TRIAL, - EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, - EVENTCHKINF_COMPLETED_SHADOW_TRIAL } - ) { + for (auto trialFlag : { EVENTCHKINF_COMPLETED_LIGHT_TRIAL, EVENTCHKINF_COMPLETED_FOREST_TRIAL, + EVENTCHKINF_COMPLETED_FIRE_TRIAL, EVENTCHKINF_COMPLETED_WATER_TRIAL, + EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, EVENTCHKINF_COMPLETED_SHADOW_TRIAL }) { if (!OTRGlobals::Instance->gRandomizer->IsTrialRequired(trialFlag)) { Flags_SetEventChkInf(trialFlag); } @@ -304,24 +309,25 @@ extern "C" void Randomizer_InitSaveFile() { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_SONG_FROM_IMPA, (GetItemID)RG_ZELDAS_LULLABY); StartingItemGive(getItemEntry, RC_SONG_FROM_IMPA); - // malon/talon back at ranch + // Malon/Talon back at ranch. Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_POCKET_EGG); + Flags_SetRandomizerInf(RAND_INF_WEIRD_EGG); Flags_SetEventChkInf(EVENTCHKINF_TALON_WOKEN_IN_CASTLE); Flags_SetEventChkInf(EVENTCHKINF_TALON_RETURNED_FROM_CASTLE); // Set "Got Zelda's Letter" flag. Also ensures Saria is back at SFM. Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER); + Flags_SetRandomizerInf(RAND_INF_ZELDAS_LETTER); Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); - // Got item from impa + // Got item from Impa. Flags_SetEventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY); - gSaveContext.sceneFlags[SCENE_HYRULE_CASTLE].swch |= (1 << 0x4); // move milk crates in hyrule castle to moat + gSaveContext.sceneFlags[SCENE_HYRULE_CASTLE].swch |= (1 << 0x4); // Move milk crates in Hyrule Castle to moat. - // set this at the end to ensure we always start with the letter - // this is for the off chance we got the weird egg from impa (which should never happen) + // Set this at the end to ensure we always start with the letter. + // This is for the off chance, we got the Weird Egg from Impa (which should never happen). INV_CONTENT(ITEM_LETTER_ZELDA) = ITEM_LETTER_ZELDA; - Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); } if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && startingAge == RO_AGE_ADULT) { @@ -330,14 +336,14 @@ extern "C" void Randomizer_InitSaveFile() { Flags_SetRandomizerInf(RAND_INF_TOT_MASTER_SWORD); } - HIGH_SCORE(HS_POE_POINTS) = 1000 - (100 * (Randomizer_GetSettingValue(RSK_BIG_POE_COUNT) + 1)); + HIGH_SCORE(HS_POE_POINTS) = 1000 - (100 * Randomizer_GetSettingValue(RSK_BIG_POE_COUNT)); if (Randomizer_GetSettingValue(RSK_SKIP_EPONA_RACE)) { Flags_SetEventChkInf(EVENTCHKINF_EPONA_OBTAINED); } - // Open lowest Vanilla Fire Temple locked door (to prevent key logic lockouts) - // Not done on keysanity since this lockout is a non issue when Fire keys can be found outside the temple + // Open lowest Vanilla Fire Temple locked door (to prevent key logic lockouts). + // Not done on Keysanity since this lockout is a non-issue when Fire Keys can be found outside the temple. u8 keysanity = Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_ANYWHERE || Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_OVERWORLD || Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_ANY_DUNGEON; @@ -345,14 +351,14 @@ extern "C" void Randomizer_InitSaveFile() { gSaveContext.sceneFlags[SCENE_FIRE_TEMPLE].swch |= (1 << 0x17); } - // Opens locked Water Temple door in vanilla to prevent softlocks - // West door on the middle level that leads to the water raising thing - // Happens in 3DS rando and N64 rando as well + // Opens locked Water Temple door in vanilla to prevent softlocks. + // West door on the middle level that leads to the water raising thing. + // Happens in 3DS rando and N64 rando as well. if (!ResourceMgr_IsSceneMasterQuest(SCENE_WATER_TEMPLE)) { gSaveContext.sceneFlags[SCENE_WATER_TEMPLE].swch |= (1 << 0x15); } - // Now handled on the fly + // Now handled on the fly. // int openForest = Randomizer_GetSettingValue(RSK_FOREST); // switch (openForest) { // case RO_CLOSED_FOREST_OFF: @@ -423,9 +429,7 @@ extern "C" void Randomizer_InitSaveFile() { gSaveContext.itemGetInf[3] |= 0x100; // Sold Keaton Mask gSaveContext.itemGetInf[3] |= 0x200; // Sold Skull Mask gSaveContext.itemGetInf[3] |= 0x400; // Sold Spooky Mask - gSaveContext.itemGetInf[3] |= 0x800; // bunny hood related + gSaveContext.itemGetInf[3] |= 0x800; // Bunny Hood related gSaveContext.itemGetInf[3] |= 0x8000; // Obtained Mask of Truth } - - SetStartingItems(); } diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index cf1acdd7fa..52add036e9 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -13,7 +13,8 @@ namespace Rando { std::shared_ptr Settings::mInstance; -std::vector NumOpts(const int min, const int max, const int step = 1, const std::string& textBefore = {}, const std::string& textAfter = {}) { +std::vector NumOpts(const int min, const int max, const int step = 1, const std::string& textBefore = {}, + const std::string& textAfter = {}) { std::vector options; options.reserve((max - min) / step + 1); for (int i = min; i <= max; i += step) { @@ -23,8 +24,8 @@ std::vector NumOpts(const int min, const int max, const int step = } std::vector MultiVecOpts(const std::vector>& optionsVector) { - uint32_t totalSize = 0; - for (const auto& vector: optionsVector) { + size_t totalSize = 0; + for (const auto& vector : optionsVector) { totalSize += vector.size(); } std::vector options; @@ -37,11 +38,11 @@ std::vector MultiVecOpts(const std::vector return options; } -void Settings::HandleShopsanityPriceUI(){ +void Settings::HandleShopsanityPriceUI() { bool isTycoon = CVarGetInteger(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), RO_GENERIC_OFF); mOptions[RSK_SHOPSANITY].RemoveFlag(IMFLAG_SEPARATOR_BOTTOM); mOptions[RSK_SHOPSANITY_PRICES].Unhide(); - switch (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_VANILLA)){ + switch (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_VANILLA)) { case RO_PRICE_FIXED: mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].Unhide(); mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].Hide(); @@ -51,7 +52,8 @@ void Settings::HandleShopsanityPriceUI(){ mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT].Hide(); mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT].Hide(); mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT].Hide(); - if (isTycoon ? mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].GetOptionCount() == 501 : mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].GetOptionCount() == 1000) { + if (isTycoon ? mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].GetOptionCount() == 501 + : mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].GetOptionCount() == 1000) { mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].ChangeOptions(isTycoon ? NumOpts(0, 999) : NumOpts(0, 500)); } mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE].Hide(); @@ -65,9 +67,12 @@ void Settings::HandleShopsanityPriceUI(){ mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT].Hide(); mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT].Hide(); mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT].Hide(); - if (isTycoon ? mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].GetOptionCount() == 101 : mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].GetOptionCount() == 200) { - mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].ChangeOptions(isTycoon ? NumOpts(0, 995, 5) : NumOpts(0, 500, 5)); - mOptions[RSK_SHOPSANITY_PRICES_RANGE_2].ChangeOptions(isTycoon ? NumOpts(0, 995, 5) : NumOpts(0, 500, 5)); + if (isTycoon ? mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].GetOptionCount() == 101 + : mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].GetOptionCount() == 200) { + mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].ChangeOptions(isTycoon ? NumOpts(0, 995, 5) + : NumOpts(0, 500, 5)); + mOptions[RSK_SHOPSANITY_PRICES_RANGE_2].ChangeOptions(isTycoon ? NumOpts(0, 995, 5) + : NumOpts(0, 500, 5)); } mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE].Unhide(); break; @@ -79,7 +84,7 @@ void Settings::HandleShopsanityPriceUI(){ mOptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT].Unhide(); mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT].Unhide(); mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT].Unhide(); - if (isTycoon){ + if (isTycoon) { mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT].Unhide(); } else { mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT].Hide(); @@ -172,7 +177,7 @@ void Settings::CreateOptions() { OPT_U8(RSK_MQ_GANONS_CASTLE, "Ganon's Castle Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsGanonsCastle"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA); OPT_U8(RSK_SHUFFLE_DUNGEON_REWARDS, "Shuffle Dungeon Rewards", {"Vanilla", "End of Dungeons", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleDungeonReward"), mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS], WidgetType::Combobox, RO_DUNGEON_REWARDS_END_OF_DUNGEON); OPT_U8(RSK_LINKS_POCKET, "Link's Pocket", {"Dungeon Reward", "Advancement", "Anything", "Nothing"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LinksPocket"), "", WidgetType::Combobox, RO_LINKS_POCKET_DUNGEON_REWARD); - OPT_U8(RSK_SHUFFLE_SONGS, "Shuffle Songs", {"Song Locations", "Dungeon Rewards", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleSongs"), mOptionDescriptions[RSK_SHUFFLE_SONGS], WidgetType::Combobox, RO_SONG_SHUFFLE_SONG_LOCATIONS); + OPT_U8(RSK_SHUFFLE_SONGS, "Shuffle Songs", {"Off", "Song Locations", "Dungeon Rewards", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleSongs"), mOptionDescriptions[RSK_SHUFFLE_SONGS], WidgetType::Combobox, RO_SONG_SHUFFLE_SONG_LOCATIONS); OPT_U8(RSK_SHOPSANITY, "Shop Shuffle", {"Off", "Specific Count", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Shopsanity"), mOptionDescriptions[RSK_SHOPSANITY], WidgetType::Combobox, RO_SHOPSANITY_OFF); OPT_U8(RSK_SHOPSANITY_COUNT, "Shops Item Count", {NumOpts(0, 7/*8*/)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityCount"), mOptionDescriptions[RSK_SHOPSANITY_COUNT], WidgetType::Slider, 0, false, IMFLAG_NONE); OPT_U8(RSK_SHOPSANITY_PRICES, "Shops Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), mOptionDescriptions[RSK_SHOPSANITY_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); @@ -209,6 +214,8 @@ void Settings::CreateOptions() { OPT_BOOL(RSK_SHUFFLE_WEIRD_EGG, "Shuffle Weird Egg", CVAR_RANDOMIZER_SETTING("ShuffleWeirdEgg"), mOptionDescriptions[RSK_SHUFFLE_WEIRD_EGG]); OPT_BOOL(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD, "Shuffle Gerudo Membership Card", CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), mOptionDescriptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD]); OPT_U8(RSK_SHUFFLE_POTS, "Shuffle Pots", {"Off", "Dungeons", "Overworld", "All Pots"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShufflePots"), mOptionDescriptions[RSK_SHUFFLE_POTS], WidgetType::Combobox, RO_SHUFFLE_POTS_OFF); + OPT_U8(RSK_SHUFFLE_GRASS, "Shuffle Grass", {"Off", "Dungeons", "Overworld", "All Grass/Bushes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGrass"), mOptionDescriptions[RSK_SHUFFLE_GRASS], WidgetType::Combobox, RO_SHUFFLE_GRASS_OFF); + OPT_U8(RSK_SHUFFLE_CRATES, "Shuffle Crates", {"Off", "Dungeons", "Overworld", "All Crates"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleCrates"), mOptionDescriptions[RSK_SHUFFLE_CRATES], WidgetType::Combobox, RO_SHUFFLE_CRATES_OFF); OPT_BOOL(RSK_SHUFFLE_FISHING_POLE, "Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]); OPT_U8(RSK_SHUFFLE_MERCHANTS, "Shuffle Merchants", {"Off", "Bean Merchant Only", "All But Beans", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), mOptionDescriptions[RSK_SHUFFLE_MERCHANTS], WidgetType::Combobox, RO_SHUFFLE_MERCHANTS_OFF, IMFLAG_NONE); OPT_U8(RSK_MERCHANT_PRICES, "Merchant Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPrices"), mOptionDescriptions[RSK_MERCHANT_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); @@ -237,32 +244,31 @@ void Settings::CreateOptions() { OPT_U8(RSK_KEYSANITY, "Small Key Shuffle", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Keysanity"), mOptionDescriptions[RSK_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); OPT_U8(RSK_GERUDO_KEYS, "Gerudo Fortress Keys", {"Vanilla", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GerudoKeys"), mOptionDescriptions[RSK_GERUDO_KEYS], WidgetType::Combobox, RO_GERUDO_KEYS_VANILLA); OPT_U8(RSK_BOSS_KEYSANITY, "Boss Key Shuffle", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BossKeysanity"), mOptionDescriptions[RSK_BOSS_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); - OPT_U8(RSK_GANONS_BOSS_KEY, "Ganon's Boss Key", {"Vanilla", "Own Dungeon", "Start With", "Any Dungeon", "Overworld", "Anywhere", "LACS-Vanilla", "LACS-Stones", "LACS-Medallions", "LACS-Rewards", "LACS-Dungeons", "LACS-Tokens", "100 GS Reward", "Triforce Hunt"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), mOptionDescriptions[RSK_GANONS_BOSS_KEY], WidgetType::Combobox, RO_GANON_BOSS_KEY_VANILLA); + OPT_U8(RSK_GANONS_BOSS_KEY, "Ganon's Boss Key", {"Vanilla", "Own Dungeon", "Start With", "Any Dungeon", "Overworld", "Anywhere", "LACS-Vanilla", "LACS-Stones", "LACS-Medallions", "LACS-Rewards", "LACS-Dungeons", "LACS-Tokens", "100 GS Reward"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), mOptionDescriptions[RSK_GANONS_BOSS_KEY], WidgetType::Combobox, RO_GANON_BOSS_KEY_VANILLA); OPT_U8(RSK_LACS_STONE_COUNT, "GCBK Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsStoneCount"), "", WidgetType::Slider, 3, true); OPT_U8(RSK_LACS_MEDALLION_COUNT, "GCBK Medallion Count", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsMedallionCount"), "", WidgetType::Slider, 6, true); OPT_U8(RSK_LACS_REWARD_COUNT, "GCBK Reward Count", {NumOpts(0, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsRewardCount"), "", WidgetType::Slider, 9, true); OPT_U8(RSK_LACS_DUNGEON_COUNT, "GCBK Dungeon Count", {NumOpts(0, 9)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsDungeonCount"), "", WidgetType::Slider, 8, true); OPT_U8(RSK_LACS_TOKEN_COUNT, "GCBK Token Count", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsTokenCount"), "", WidgetType::Slider, 100, true); - OPT_U8(RSK_LACS_OPTIONS, "GCBK LACS Reward Options", {"Standard Reward", "Greg as Reward", "Greg as Wildcard"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsRewardOptions"), "", WidgetType::Combobox, RO_LACS_STANDARD_REWARD); + OPT_U8(RSK_LACS_OPTIONS, "GCBK LACS Reward Options", {"Standard Reward", "Greg as Reward", "Greg as Wildcard"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsRewardOptions"), mOptionDescriptions[RSK_LACS_OPTIONS], WidgetType::Combobox, RO_LACS_STANDARD_REWARD); OPT_U8(RSK_KEYRINGS, "Key Rings", {"Off", "Random", "Count", "Selection"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), mOptionDescriptions[RSK_KEYRINGS], WidgetType::Combobox, RO_KEYRINGS_OFF); OPT_U8(RSK_KEYRINGS_RANDOM_COUNT, "Keyring Dungeon Count", {NumOpts(0, 9)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsRandomCount"), "", WidgetType::Slider, 8); - OPT_U8(RSK_KEYRINGS_GERUDO_FORTRESS, "Gerudo Fortress Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGerudoFortress"), "", WidgetType::TristateCheckbox, 0); - OPT_U8(RSK_KEYRINGS_FOREST_TEMPLE, "Forest Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsForestTemple"), "", WidgetType::TristateCheckbox, 0); - OPT_U8(RSK_KEYRINGS_FIRE_TEMPLE, "Fire Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsFireTemple"), "", WidgetType::TristateCheckbox, 0); - OPT_U8(RSK_KEYRINGS_WATER_TEMPLE, "Water Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsWaterTemple"), "", WidgetType::TristateCheckbox, 0); - OPT_U8(RSK_KEYRINGS_SPIRIT_TEMPLE, "Spirit Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsSpiritTemple"), "", WidgetType::TristateCheckbox, 0); - OPT_U8(RSK_KEYRINGS_SHADOW_TEMPLE, "Shadow Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsShadowTemple"), "", WidgetType::TristateCheckbox, 0); - OPT_U8(RSK_KEYRINGS_BOTTOM_OF_THE_WELL, "Bottom of the Well Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsBottomOfTheWell"), "", WidgetType::TristateCheckbox, 0); - OPT_U8(RSK_KEYRINGS_GTG, "Gerudo Training Ground Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGTG"), "", WidgetType::TristateCheckbox, 0); - OPT_U8(RSK_KEYRINGS_GANONS_CASTLE, "Ganon's Castle Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGanonsCastle"), "", WidgetType::TristateCheckbox, 0); + OPT_U8(RSK_KEYRINGS_GERUDO_FORTRESS, "Gerudo Fortress Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGerudoFortress"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_FOREST_TEMPLE, "Forest Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsForestTemple"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_FIRE_TEMPLE, "Fire Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsFireTemple"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_WATER_TEMPLE, "Water Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsWaterTemple"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_SPIRIT_TEMPLE, "Spirit Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsSpiritTemple"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_SHADOW_TEMPLE, "Shadow Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsShadowTemple"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_BOTTOM_OF_THE_WELL, "Bottom of the Well Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsBottomOfTheWell"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_GTG, "Gerudo Training Ground Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGTG"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_GANONS_CASTLE, "Ganon's Castle Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGanonsCastle"), "", WidgetType::Combobox, 0); //Dummied out due to redundancy with TimeSavers.SkipChildStealth until such a time that logic needs to consider child stealth e.g. because it's freestanding checks are added to freestanding shuffle. //To undo this dummying, readd this setting to an OptionGroup so it appears in the UI, then edit the timesaver check hooks to look at this, and the timesaver setting to lock itself as needed. OPT_BOOL(RSK_SKIP_CHILD_STEALTH, "Skip Child Stealth", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildStealth"), mOptionDescriptions[RSK_SKIP_CHILD_STEALTH], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); OPT_BOOL(RSK_SKIP_CHILD_ZELDA, "Skip Child Zelda", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildZelda"), mOptionDescriptions[RSK_SKIP_CHILD_ZELDA], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); OPT_BOOL(RSK_SKIP_EPONA_RACE, "Skip Epona Race", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipEponaRace"), mOptionDescriptions[RSK_SKIP_EPONA_RACE], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); OPT_BOOL(RSK_SKIP_SCARECROWS_SONG, "Skip Scarecrow's Song", CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), mOptionDescriptions[RSK_SKIP_SCARECROWS_SONG]); - OPT_U8(RSK_BIG_POE_COUNT, "Big Poe Target Count", {NumOpts(1, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), mOptionDescriptions[RSK_BIG_POE_COUNT], WidgetType::Slider, 9); - OPT_U8(RSK_CUCCO_COUNT, "Cuccos to return", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("CuccosToReturn"), mOptionDescriptions[RSK_CUCCO_COUNT], WidgetType::Slider, 7); + OPT_U8(RSK_BIG_POE_COUNT, "Big Poe Target Count", {NumOpts(0, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), mOptionDescriptions[RSK_BIG_POE_COUNT], WidgetType::Slider, 10); OPT_BOOL(RSK_COMPLETE_MASK_QUEST, "Complete Mask Quest", CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), mOptionDescriptions[RSK_COMPLETE_MASK_QUEST]); OPT_U8(RSK_GOSSIP_STONE_HINTS, "Gossip Stone Hints", {"No Hints", "Need Nothing", "Mask of Truth", "Stone of Agony"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GossipStoneHints"), mOptionDescriptions[RSK_GOSSIP_STONE_HINTS], WidgetType::Combobox, RO_GOSSIP_STONES_NEED_NOTHING, false, IMFLAG_NONE); OPT_U8(RSK_HINT_CLARITY, "Hint Clarity", {"Obscure", "Ambiguous", "Clear"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintClarity"), mOptionDescriptions[RSK_HINT_CLARITY], WidgetType::Combobox, RO_HINT_CLARITY_CLEAR, true, IMFLAG_INDENT); @@ -333,211 +339,819 @@ void Settings::CreateOptions() { mExcludeLocationsOptionsAreas.reserve(RCAREA_INVALID); // the following are glitches and are currently disabled - // OPT_TRICK(RT_ACUTE_ANGLE_CLIP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Acute angle clip", "Enables locations requiring jumpslash clips through walls which meet at an acute angle."); - // OPT_TRICK(RT_ADVANCED_CLIPS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Advanced clips", "Enables locations requiring clips through walls and objects requiring precise jumps or other tricks."); - // OPT_TRICK(RT_BLANK_A, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Blank A", "Enables locations requiring blank A button; NOTE: this requires the 'Quick Putaway' restoration."); - // OPT_TRICK(RT_DOOM_JUMP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Doom Jump", "Enables locations requiring doom jumps."); - // OPT_TRICK(RT_EPG, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "EPG", "Enables locations requiring use of the Entrance Point Glitch."); - // OPT_TRICK(RT_EQUIP_SWAP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Equip Swap", "Enables locations requiring use of equip swap; NOTE: this may expect the 'Allow cursor to be over any slot' enhancement to be turned off."); - // OPT_TRICK(RT_EQUIP_SWAP_EXPECTS_DINS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Equip Swap Require's Din's Fire", "Enables locations requiring use of equip swap once Din's Fire is found."); - // OPT_TRICK(RT_FLAME_STORAGE, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Flame Storage", "Enables locations requiring flame storage."); - // OPT_TRICK(RT_GROUND_CLIP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Ground Clip", "Enables locations requiring ground clips."); - // OPT_TRICK(RT_GROUND_JUMP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Ground Jump", "Enables locations requiring ground jumps."); - // OPT_TRICK(RT_HESS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "HESS", "Enables locations requiring a Hyper Extended Super Slide."); - // OPT_TRICK(RT_HOOKSHOT_CLIP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Hookshot Clip", "Enables locations requiring hookshot clips."); - // OPT_TRICK(RT_HOOKSHOT_JUMP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Hookshot Jump", "Enables locations requiring hookshot jumps."); - // OPT_TRICK(RT_ISG, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "ISG", "Enables locations requiring use of the infinite sword glitch."); + // OPT_TRICK(RT_ACUTE_ANGLE_CLIP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, + // Tricks::Tag::GLITCH}, "Acute angle clip", "Enables locations requiring jumpslash clips through walls which meet + // at an acute angle."); OPT_TRICK(RT_ADVANCED_CLIPS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, + // Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Advanced clips", "Enables locations requiring clips through + // walls and objects requiring precise jumps or other tricks."); OPT_TRICK(RT_BLANK_A, RCQUEST_BOTH, RA_NONE, + // {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Blank A", "Enables locations requiring + // blank A button; NOTE: this requires the 'Quick Putaway' restoration."); OPT_TRICK(RT_DOOM_JUMP, RCQUEST_BOTH, + // RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Doom Jump", "Enables locations + // requiring doom jumps."); OPT_TRICK(RT_EPG, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, + // Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "EPG", "Enables locations requiring use of the Entrance Point + // Glitch."); OPT_TRICK(RT_EQUIP_SWAP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, + // Tricks::Tag::GLITCH}, "Equip Swap", "Enables locations requiring use of equip swap; NOTE: this may expect the + // 'Allow cursor to be over any slot' enhancement to be turned off."); OPT_TRICK(RT_EQUIP_SWAP_EXPECTS_DINS, + // RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Equip Swap + // Require's Din's Fire", "Enables locations requiring use of equip swap once Din's Fire is found."); + // OPT_TRICK(RT_FLAME_STORAGE, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, + // Tricks::Tag::GLITCH}, "Flame Storage", "Enables locations requiring flame storage."); OPT_TRICK(RT_GROUND_CLIP, + // RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Ground Clip", + // "Enables locations requiring ground clips."); OPT_TRICK(RT_GROUND_JUMP, RCQUEST_BOTH, RA_NONE, + // {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Ground Jump", "Enables locations + // requiring ground jumps."); OPT_TRICK(RT_HESS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, + // Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "HESS", "Enables locations requiring a Hyper Extended Super + // Slide."); OPT_TRICK(RT_HOOKSHOT_CLIP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, + // Tricks::Tag::GLITCH}, "Hookshot Clip", "Enables locations requiring Hookshot clips."); + // OPT_TRICK(RT_HOOKSHOT_JUMP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, + // Tricks::Tag::GLITCH}, "Hookshot Jump", "Enables locations requiring Hookshot jumps."); OPT_TRICK(RT_ISG, + // RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "ISG", "Enables + // locations requiring use of the infinite sword glitch."); - OPT_TRICK(RT_VISIBLE_COLLISION, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Pass Through Visible One-Way Collision", "Allows climbing through the platform to reach Impa's House Back as adult with no items and going through the Kakariko Village Gate as child when coming from the Mountain Trail side."); - OPT_TRICK(RT_GROTTOS_WITHOUT_AGONY, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Hidden Grottos without Stone of Agony", "Allows entering hidden grottos without the Stone of Agony."); - OPT_TRICK(RT_FEWER_TUNIC_REQUIREMENTS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::INTERMEDIATE}, "Fewer Tunic Requirements", "Allows the following possible without Tunics:\n- Enter Water Temple. The area below the center pillar still requires Zora Tunic. Applies to MQ also.\n- Enter Fire Temple. Volvagia still requires Goron tunic. Applies to MQ also, and includes child access to first floor with dungeon shuffle."); - OPT_TRICK(RT_RUSTED_SWITCHES, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Hammer Rusted Switches Through Walls", "Applies to:\n- Fire Temple Highest Goron Chest.\n- MQ Fire Temple Lizalfos Maze.\n- MQ Spirit Trial."); - OPT_TRICK(RT_FLAMING_CHESTS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::INTERMEDIATE}, "Flaming Chests", "The chests encircled in flames in Gerudo Training Ground and in Spirit Temple can be opened by running into the flames while Link is invincible after taking damage."); - // disabled for now, can't check for being able to use bunny hood & bunny hood speedup is currently completely decoupled from rando - // OPT_TRICK(RT_BUNNY_HOOD_JUMPS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED}, "Bunny Hood Jumps", "Allows reaching locations using Bunny Hood's extended jumps."); - OPT_TRICK(RT_DAMAGE_BOOST_SIMPLE, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL}, "Simple damage boosts", "Allows damage boosts in order to reach further locations. Can be combined with \"Simple hover boosts\" for reaching far distances."); - OPT_TRICK(RT_HOVER_BOOST_SIMPLE, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL}, "Simple hover boosts", "Allows equipping of hover boots when link is moving at high speeds to extend distance covered. Can be combined with \"Simple damage boosts\" for greater uses."); - OPT_TRICK(RT_BOMBCHU_BEEHIVES, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Bombchu Beehives", "Allows exploding beehives with bombchus."); - OPT_TRICK(RT_BLUE_FIRE_MUD_WALLS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Break Mud Walls with Blue Fire", "Use Blue Fire to break mud walls."); - OPT_TRICK(RT_KF_ADULT_GS, RCQUEST_BOTH, RA_KOKIRI_FOREST, {Tricks::Tag::NOVICE}, "Adult Kokiri Forest GS with Hover Boots", "Can be obtained without Hookshot by using the Hover Boots off of one of the roots."); - OPT_TRICK(RT_LW_BRIDGE, RCQUEST_BOTH, RA_THE_LOST_WOODS, {Tricks::Tag::EXPERT}, "Jump onto the Lost Woods Bridge as Adult with Nothing", "With very precise movement it's possible for adult to jump onto the bridge without needing Longshot, Hover Boots, or Bean."); - OPT_TRICK(RT_LW_MIDO_BACKFLIP, RCQUEST_BOTH, RA_THE_LOST_WOODS, {Tricks::Tag::NOVICE}, "Backflip over Mido as Adult", "With a specific position and angle, you can backflip over Mido."); - OPT_TRICK(RT_LW_GS_BEAN, RCQUEST_BOTH, RA_THE_LOST_WOODS, {Tricks::Tag::INTERMEDIATE}, "Lost Woods Adult GS without Bean", "You can collect the token with a precise Hookshot use, as long as you can kill the Skulltula somehow first. It can be killed using Longshot, Bow, Bombchus or Din's Fire."); - OPT_TRICK(RT_HC_STORMS_GS, RCQUEST_BOTH, RA_HYRULE_CASTLE, {Tricks::Tag::INTERMEDIATE}, "Hyrule Castle Storms Grotto GS with Just Boomerang", "With precise throws, the Boomerang alone can kill the Skulltula and collect the token, without first needing to blow up the wall."); - OPT_TRICK(RT_KAK_MAN_ON_ROOF, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::NOVICE}, "Man on Roof without Hookshot", "Can be reached by side-hopping off the watchtower as either age, or by jumping onto the potion shop's roof from the ledge as adult."); - OPT_TRICK(RT_KAK_TOWER_GS, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::INTERMEDIATE}, "Kakariko Tower GS with Jump Slash", "Climb the tower as high as you can without touching the Gold Skulltula, then let go and jump slash immediately. By jump-slashing from as low on the ladder as possible to still hit the Skulltula, this trick can be done without taking fall damage."); - OPT_TRICK(RT_KAK_ADULT_WINDMILL_POH, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::NOVICE}, "Windmill PoH as Adult with Nothing", "Can jump up to the spinning platform from below as adult."); - OPT_TRICK(RT_KAK_CHILD_WINDMILL_POH, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::EXTREME}, "Windmill PoH as Child with Precise Jump Slash", "Can jump up to the spinning platform from below as child with a precise jumpslash timed with the platforms rotation."); - OPT_TRICK(RT_KAK_ROOFTOP_GS, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::ADVANCED}, "Kakariko Rooftop GS with Hover Boots", "Take the Hover Boots from the entrance to Impa's House over to the rooftop of Skulltula House. From there, a precise Hover Boots backwalk with backflip can be used to get onto a hill above the side of the village. And then from there you can Hover onto Impa's rooftop to kill the Skulltula and backflip into the token."); - OPT_TRICK(RT_GY_POH, RCQUEST_BOTH, RA_THE_GRAVEYARD, {Tricks::Tag::INTERMEDIATE}, "Graveyard Freestanding PoH with Boomerang", "Using a precise moving setup you can obtain the Piece of Heart by having the Boomerang interact with it along the return path."); - OPT_TRICK(RT_GY_CHILD_DAMPE_RACE_POH, RCQUEST_BOTH, RA_THE_GRAVEYARD, {Tricks::Tag::NOVICE}, "Second Dampe Race as Child", "It is possible to complete the second dampe race as child in under a minute, but it is a strict time limit."); - OPT_TRICK(RT_GY_SHADOW_FIRE_ARROWS, RCQUEST_BOTH, RA_THE_GRAVEYARD, {Tricks::Tag::EXPERT}, "Shadow Temple Entry with Fire Arrows", "It is possible to light all of the torches to open the Shadow Temple entrance with just Fire Arrows, but you must be very quick, precise, and strategic with how you take your shots."); - OPT_TRICK(RT_DMT_SOIL_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Soil GS without Destroying Boulder", "Bugs will go into the soft soil even while the boulder is still blocking the entrance. Then, using a precise moving setup you can kill the Gold Skulltula and obtain the token by having the Boomerang interact with it along the return path."); - OPT_TRICK(RT_DMT_BOMBABLE, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Chest with Strength", "Child Link can blow up the wall using a nearby bomb flower. You must backwalk with the flower and then quickly throw it toward the wall."); - OPT_TRICK(RT_DMT_HOOKSHOT_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Lower Red Rock GS with Hookshot", "After killing the Skulltula, the token can be fished out of the rock without needing to destroy it, by using the Hookshot in the correct way."); - OPT_TRICK(RT_DMT_HOVERS_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::ADVANCED}, "Death Mountain Trail Lower Red Rock GS with Hover Boots", "After killing the Skulltula, the token can be collected without needing to destroy the rock by backflipping down onto it with the Hover Boots. First use the Hover Boots to stand on a nearby fence, and go for the Skulltula Token from there."); - OPT_TRICK(RT_DMT_BEAN_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::EXPERT}, "Death Mountain Trail Lower Red Rock GS with Magic Bean", "After killing the Skulltula, the token can be collected without needing to destroy the rock by jumping down onto it from the bean plant, midflight, with precise timing and positioning."); - OPT_TRICK(RT_DMT_JS_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Lower Red Rock GS with Jump Slash", "After killing the Skulltula, the token can be collected without needing to destroy the rock by jump slashing from a precise angle."); - OPT_TRICK(RT_DMT_CLIMB_HOVERS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::ADVANCED}, "Death Mountain Trail Climb with Hover Boots", "It is possible to use the Hover Boots to bypass needing to destroy the boulders blocking the path to the top of Death Mountain."); - OPT_TRICK(RT_DMT_UPPER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::NOVICE}, "Death Mountain Trail Upper Red Rock GS without Hammer", "After killing the Skulltula, the token can be collected by backflipping into the rock at the correct angle."); - // disabled for now, only applies when trade quest is not shuffled so there's a timer (currently not considered in logic) - // OPT_TRICK(RT_DMT_BOLERO_BIGGORON, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Deliver Eye Drops with Bolero of Fire", "Playing a warp song normally causes a trade item to spoil immediately, however, it is possible use Bolero to reach Biggoron and still deliver the Eye Drops before they spoil. If you do not wear the Goron Tunic, the heat timer inside the crater will override the trade item\'s timer. When you exit to Death Mountain Trail you will have one second to show the Eye Drops before they expire. You can get extra time to show the Eye Drops if you warp immediately upon receiving them. If you don't have many hearts, you may have to reset the heat timer by quickly dipping in and out of Darunia\'s chamber or quickly equipping and unequipping the Goron Tunic. This trick does not apply if \"Randomize Warp Song Destinations\" is enabled, or if the settings are such that trade items do not need to be delivered within a time limit."); - OPT_TRICK(RT_GC_POT, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Spinning Pot PoH with Bombchu", "A Bombchu can be used to stop the spinning pot, but it can be quite finicky to get it to work."); - OPT_TRICK(RT_GC_POT_STRENGTH, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::INTERMEDIATE}, "Goron City Spinning Pot PoH with Strength", "Allows for stopping the Goron City Spinning Pot using a bomb flower alone, requiring strength in lieu of inventory explosives."); - OPT_TRICK(RT_GC_ROLLING_STRENGTH, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::INTERMEDIATE}, "Rolling Goron (Hot Rodder Goron) as Child with Strength", "Use the bombflower on the stairs or near Medigoron. Timing is tight, especially without backwalking."); - OPT_TRICK(RT_GC_LEFTMOST, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Maze Left Chest with Hover Boots", "A precise backwalk starting from on top of the crate and ending with a precisely-timed backflip can reach this chest without needing either the Hammer or Silver Gauntlets."); - OPT_TRICK(RT_GC_GROTTO, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Grotto with Hookshot While Taking Damage", "It is possible to reach the Goron City Grotto by quickly using the Hookshot while in the midst of taking damage from the lava floor."); - OPT_TRICK(RT_GC_LINK_GORON_DINS, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::NOVICE}, "Stop Link the Goron with Din\'s Fire", "The timing is quite awkward."); - OPT_TRICK(RT_DMC_HOVER_BEAN_POH, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::NOVICE}, "Crater\'s Bean PoH with Hover Boots", "Hover from the base of the bridge near Goron City and walk up the very steep slope."); - OPT_TRICK(RT_DMC_BOLERO_JUMP, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::EXTREME}, "Death Mountain Crater Jump to Bolero", "As Adult, using a shield to drop a pot while you have the perfect speed and position, the pot can push you that little extra distance you need to jump across the gap in the bridge."); - OPT_TRICK(RT_DMC_BOULDER_JS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::NOVICE}, "Death Mountain Crater Upper to Lower with Hammer", "With the Hammer, you can jump slash the rock twice in the same jump in order to destroy it before you fall into the lava."); - OPT_TRICK(RT_DMC_BOULDER_SKIP, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Crater Upper to Lower Boulder Skip", "As adult, With careful positioning, you can jump to the ledge where the boulder is, then use repeated ledge grabs to shimmy to a climbable ledge. This trick supersedes \"Death Mountain Crater Upper to Lower with Hammer\"."); - OPT_TRICK(RT_ZR_LOWER, RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::INTERMEDIATE}, "Zora\'s River Lower Freestanding PoH as Adult with Nothing", "Adult can reach this PoH with a precise jump, no Hover Boots required."); - OPT_TRICK(RT_ZR_UPPER, RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::INTERMEDIATE}, "Zora\'s River Upper Freestanding PoH as Adult with Nothing", "Adult can reach this PoH with a precise jump, no Hover Boots required."); - OPT_TRICK(RT_ZR_HOVERS, RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::NOVICE}, "Zora\'s Domain Entry with Hover Boots", "Can hover behind the waterfall as adult."); - OPT_TRICK(RT_ZR_CUCCO, RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::NOVICE}, "Zora\'s Domain Entry with Cucco", "You can fly behind the waterfall with a Cucco as child."); - OPT_TRICK(RT_ZD_KING_ZORA_SKIP, RCQUEST_BOTH, RA_ZORAS_DOMAIN, {Tricks::Tag::INTERMEDIATE}, "Skip King Zora as Adult with Nothing", "With a precise jump as adult, it is possible to get on the fence next to King Zora from the front to access Zora's Fountain."); - OPT_TRICK(RT_ZD_GS, RCQUEST_BOTH, RA_ZORAS_DOMAIN, {Tricks::Tag::INTERMEDIATE}, "Zora\'s Domain GS with No Additional Items", "A precise jump slash can kill the Skulltula and recoil back onto the top of the frozen waterfall. To kill it, the logic normally guarantees one of Hookshot, Bow, or Magic."); - OPT_TRICK(RT_ZF_GREAT_FAIRY_WITHOUT_EXPLOSIVES, RCQUEST_BOTH, RA_ZORAS_FOUNTAIN, {Tricks::Tag::NOVICE}, "Zora\'s Fountain Great Fairy Without Explosives", "It's possible to use silver gauntlets to pick up the silver rock and hammer to break the rock below it, allowing you to ledge grab the edge of the hole and get past the breakable wall (hammer can't break the wall itself)."); - OPT_TRICK(RT_LH_LAB_WALL_GS, RCQUEST_BOTH, RA_LAKE_HYLIA, {Tricks::Tag::NOVICE}, "Lake Hylia Lab Wall GS with Jump Slash", "The jump slash to actually collect the token is somewhat precise."); - OPT_TRICK(RT_LH_LAB_DIVING, RCQUEST_BOTH, RA_LAKE_HYLIA, {Tricks::Tag::NOVICE}, "Lake Hylia Lab Dive without Gold Scale", "Remove the Iron Boots in the midst of Hookshotting the underwater crate."); - OPT_TRICK(RT_LH_WATER_HOOKSHOT, RCQUEST_BOTH, RA_LAKE_HYLIA, {Tricks::Tag::INTERMEDIATE}, "Water Temple Entry without Iron Boots using Hookshot", "When entering Water Temple using Gold Scale instead of Iron Boots, the Longshot is usually used to be able to hit the switch and open the gate. But, by standing in a particular spot, the switch can be hit with only the reach of the Hookshot."); - OPT_TRICK(RT_GV_CRATE_HOVERS, RCQUEST_BOTH, RA_GERUDO_VALLEY, {Tricks::Tag::INTERMEDIATE}, "Gerudo Valley Crate PoH as Adult with Hover Boots", "From the far side of Gerudo Valley, a precise Hover Boots movement and jump-slash recoil can allow adult to reach the ledge with the crate PoH without needing Longshot. You will take fall damage."); - OPT_TRICK(RT_GF_KITCHEN, RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Thieves\' Hideout \"Kitchen\" with No Additional Items", "Allows passing through the kitchen by avoiding being seen by the guards. The logic normally guarantees Bow or Hookshot to stun them from a distance, or Hover Boots to cross the room without needing to deal with the guards."); - OPT_TRICK(RT_GF_JUMP, RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Gerudo\'s Fortress Ledge Jumps", "Adult can jump onto the top roof of the fortress without going through the interior of the hideout."); - OPT_TRICK(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON, RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Gerudo\'s Fortress Warriors with Difficult Weapons", "Warriors can be defeated with slingshot or bombchus."); - // disabled for now, can't check for being able to use bunny hood & bunny hood speedup is currently completely decoupled from rando - // OPT_TRICK(RT_HW_BUNNY_CROSSING, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::NOVICE}, "Wasteland Crossing with Bunny Hood", "You can beat the quicksand by using the increased speed of the Bunny Hood. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash."); - OPT_TRICK(RT_HW_CROSSING, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Wasteland Crossing without Hover Boots or Longshot", "You can beat the quicksand by backwalking across it in a specific way. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash."); - OPT_TRICK(RT_LENS_HW, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Lensless Wasteland", "By memorizing the path, you can travel through the Wasteland without using the Lens of Truth to see the Poe. The equivalent trick for going in reverse through the Wasteland is \"Reverse Wasteland\"."); - OPT_TRICK(RT_HW_REVERSE, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Reverse Wasteland", "By memorizing the path, you can travel through the Wasteland in reverse. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash. The equivalent trick for going forward through the Wasteland is \"Lensless Wasteland\". To cross the river of sand with no additional items, be sure to also enable \"Wasteland Crossing without Hover Boots or Longshot\". Unless all overworld entrances are randomized, child Link will not be expected to do anything at Gerudo's Fortress."); - OPT_TRICK(RT_COLOSSUS_GS, RCQUEST_BOTH, RA_DESERT_COLOSSUS, {Tricks::Tag::NOVICE}, "Colossus Hill GS with Hookshot", "Somewhat precise. If you kill enough Leevers you can get enough of a break to take some time to aim more carefully."); - OPT_TRICK(RT_DEKU_BASEMENT_GS, RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Vines GS with Jump Slash", "Can be defeated by doing a precise jump slash."); - OPT_TRICK(RT_DEKU_B1_SKIP, RCQUEST_BOTH, RA_DEKU_TREE, {Tricks::Tag::INTERMEDIATE}, "Deku Tree Basement without Slingshot", "A precise jump can be used to skip needing to use the Slingshot to go around B1 of the Deku Tree. If used with the \"Closed Forest\" setting, a Slingshot will not be guaranteed to exist somewhere inside the Forest. This trick applies to both Vanilla and Master Quest."); - OPT_TRICK(RT_DEKU_B1_BOW_WEBS, RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Web to Gohma with Bow", "All spider web walls in the Deku Tree basement can be burnt as adult with just a bow by shooting through torches. This trick only applies to the circular web leading to Gohma; the two vertical webs are always in logic. Backflip onto the chest near the torch at the bottom of the vine wall. With precise positioning you can shoot through the torch to the right edge of the circular web. This allows completion of adult Deku Tree with no fire source."); - OPT_TRICK(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG, RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Backflip over Spiked Log", "Allows backflipping over the spiked log in the Deku Tree basement in vanilla. Only relevant if \"Shuffle Swim\" is enabled."); - OPT_TRICK(RT_DEKU_MQ_COMPASS_GS, RCQUEST_MQ, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree MQ Compass Room GS Boulders with Just Hammer", "Climb to the top of the vines, then let go and jump slash immediately to destroy the boulders using the Hammer, without needing to spawn a Song of Time block."); - OPT_TRICK(RT_DEKU_MQ_LOG, RCQUEST_MQ, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree MQ Roll Under the Spiked Log", "You can get past the spiked log by rolling to briefly shrink your hitbox. As adult, the timing is a bit more precise."); - OPT_TRICK(RT_DC_SCARECROW_GS, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Scarecrow GS with Armos Statue", "You can jump off an Armos Statue to reach the alcove with the Gold Skulltula. It takes quite a long time to pull the statue the entire way. The jump to the alcove can be a bit picky when done as child."); - OPT_TRICK(RT_DC_VINES_GS, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Vines GS from Below with Longshot", "The vines upon which this Skulltula rests are one-sided collision. You can use the Longshot to get it from below, by shooting it through the vines, bypassing the need to lower the staircase."); - OPT_TRICK(RT_DC_STAIRCASE, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Staircase with Bow", "The Bow can be used to knock down the stairs with two well-timed shots."); - OPT_TRICK(RT_DC_SLINGSHOT_SKIP, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::EXPERT}, "Dodongo\'s Cavern Child Slingshot Skips", "With precise platforming, child can cross the platforms while the flame circles are there. When enabling this trick, it's recommended that you also enable the Adult variant: \"Dodongo's Cavern Spike Trap Room Jump without Hover Boots\"."); - OPT_TRICK(RT_DC_SCRUB_ROOM, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Two Scrub Room with Strength", "With help from a conveniently-positioned block, Adult can quickly carry a bomb flower over to destroy the mud wall blocking the room with two Deku Scrubs."); - OPT_TRICK(RT_DC_JUMP, RCQUEST_BOTH, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Spike Trap Room Jump without Hover Boots", "The jump is adult Link only. Applies to both Vanilla and MQ."); - OPT_TRICK(RT_DC_HAMMER_FLOOR, RCQUEST_BOTH, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Smash the Boss Lobby Floor", "The bombable floor before King Dodongo can be destroyed with Hammer if hit in the very center. This is only relevant with Shuffle Boss Entrances or if Dodongo's Cavern is MQ and either variant of \"Dodongo's Cavern MQ Light the Eyes with Strength\" is on."); - OPT_TRICK(RT_DC_MQ_CHILD_BOMBS, RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::ADVANCED}, "Dodongo\'s Cavern MQ Early Bomb Bag Area as Child", "With a precise jump slash from above, you can reach the Bomb Bag area as only child without needing a Slingshot. You will take fall damage."); - OPT_TRICK(RT_DC_MQ_CHILD_EYES, RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::EXPERT}, "Dodongo\'s Cavern MQ Light the Eyes with Strength as Child", "If you move very quickly, it is possible to use the bomb flower at the top of the room to light the eyes. To perform this trick as child is significantly more difficult than adult. The player is also expected to complete the DC back area without explosives, including getting past the Armos wall to the switch for the boss door."); - OPT_TRICK(RT_DC_MQ_ADULT_EYES, RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::ADVANCED}, "Dodongo\'s Cavern MQ Light the Eyes with Strength as Adult", "If you move very quickly, it is possible to use the bomb flower at the top of the room to light the eyes."); - OPT_TRICK(RT_JABU_ALCOVE_JUMP_DIVE, RCQUEST_BOTH, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu Underwater Alcove as Adult with Jump Dive", "Standing above the underwater tunnel leading to the scrub, jump down and swim through the tunnel. This allows adult to access the alcove with no Scale or Iron Boots. In vanilla Jabu, this alcove has a business scrub. In MQ Jabu, it has the compass chest and a door switch for the main floor."); - OPT_TRICK(RT_JABU_BOSS_HOVER, RCQUEST_VANILLA, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu Near Boss Room with Hover Boots", "A box for the blue switch can be carried over by backwalking with one while the elevator is at its peak. Alternatively, you can skip transporting a box by quickly rolling from the switch and opening the door before it closes. However, the timing for this is very tight."); - OPT_TRICK(RT_JABU_NEAR_BOSS_RANGED, RCQUEST_BOTH, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu Near Boss Ceiling Switch/GS without Boomerang or Explosives", "Vanilla Jabu: From near the entrance into the room, you can hit the switch that opens the door to the boss room using a precisely-aimed use of the Slingshot, Bow, or Longshot. As well, if you climb to the top of the vines you can stand on the right edge of the platform and shoot around the glass. From this distance, even the Hookshot can reach the switch. This trick is only relevant if \"Shuffle Boss Entrances\" is enabled. MQ Jabu: A Gold Skulltula Token can be collected with the Hookshot or Longshot using the same methods as hitting the switch in vanilla. This MQ trick is not currently relevant in logic."); - OPT_TRICK(RT_JABU_NEAR_BOSS_EXPLOSIVES, RCQUEST_VANILLA, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu Near Boss Ceiling Switch with Explosives", "You can hit the switch that opens the door to the boss room using a precisely-aimed Bombchu. Also, using the Hover Boots, adult can throw a Bomb at the switch. This trick is only relevant if \"Shuffle Boss Entrances\" is enabled."); - OPT_TRICK(RT_LENS_JABU_MQ, RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Jabu MQ."); - OPT_TRICK(RT_JABU_MQ_RANG_JUMP, RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::ADVANCED}, "Jabu MQ Compass Chest with Boomerang", "Boomerang can reach the cow switch to spawn the chest by targeting the cow, jumping off of the ledge where the chest spawns, and throwing the Boomerang in midair."); - OPT_TRICK(RT_JABU_MQ_SOT_GS, RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu MQ Song of Time Block GS with Boomerang", "Allow the Boomerang to return to you through the Song of Time block to grab the token."); - OPT_TRICK(RT_LENS_BOTW, RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well without Lens of Truth", "Removes the requirements for the Lens of Truth in Bottom of the Well."); - OPT_TRICK(RT_BOTW_CHILD_DEADHAND, RCQUEST_BOTH, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Child Dead Hand without Kokiri Sword", "Requires 9 sticks or 5 jump slashes."); - OPT_TRICK(RT_BOTW_BASEMENT, RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well Map Chest with Strength & Sticks", "The chest in the basement can be reached with strength by doing a jump slash with a lit stick to access the bomb flowers."); - OPT_TRICK(RT_BOTW_MQ_PITS, RCQUEST_MQ, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well MQ Jump Over the Pits", "While the pits in Bottom of the Well don't allow you to jump just by running straight at them, you can still get over them by side-hopping or backflipping across. With explosives, this allows you to access the central areas without Zelda's Lullaby. With Zelda's Lullaby, it allows you to access the west inner room without explosives."); - OPT_TRICK(RT_BOTW_MQ_DEADHAND_KEY, RCQUEST_MQ, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well MQ Dead Hand Freestanding Key with Boomerang", "Boomerang can fish the item out of the rubble without needing explosives to blow it up."); - OPT_TRICK(RT_FOREST_FIRST_GS, RCQUEST_VANILLA, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple First Room GS with Difficult-to-Use Weapons", "Allows killing this Skulltula with Sword or Sticks by jump slashing it as you let go from the vines. You can avoid taking fall damage by recoiling onto the tree. Also allows killing it as Child with a Bomb throw. It's much more difficult to use a Bomb as child due to Child Link's shorter height."); - OPT_TRICK(RT_FOREST_OUTDOORS_EAST_GS, RCQUEST_VANILLA, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple East Courtyard GS with Boomerang", "Precise Boomerang throws can allow child to kill the Skulltula and collect the token."); - OPT_TRICK(RT_FOREST_VINES, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple East Courtyard Vines with Hookshot", "The vines in Forest Temple leading to where the well drain switch is in the standard form can be barely reached with just the Hookshot. Applies to MQ also."); - OPT_TRICK(RT_FOREST_OUTDOORS_LEDGE, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple NE Outdoors Ledge with Hover Boots", "With precise Hover Boots movement you can fall down to this ledge from upper balconies. If done precisely enough, it is not necessary to take fall damage. In MQ, this skips a Longshot requirement. In Vanilla, this can skip a Hookshot requirement in entrance randomizer."); - OPT_TRICK(RT_FOREST_DOORFRAME, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Forest Temple East Courtyard Door Frame with Hover Boots", "A precise Hover Boots movement from the upper balconies in this courtyard can be used to get on top of the door frame. Applies to both Vanilla and Master Quest. In Vanilla, from on top the door frame you can summon Pierre, allowing you to access the falling ceiling room early. In Master Quest, this allows you to obtain the GS on the door frame as adult without Hookshot or Song of Time."); - OPT_TRICK(RT_FOREST_OUTSIDE_BACKDOOR, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Forest Temple Outside Backdoor with Jump Slash", "A jump slash recoil can be used to reach the ledge in the block puzzle room that leads to the west courtyard. This skips a potential Hover Boots requirement in vanilla, and it can sometimes apply in MQ as well. This trick can be performed as both ages."); - OPT_TRICK(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple Outside Hearts with Boomerang", "A well aimed boomerang from the water's edge can reach the hearts from ground level. If unable to swim, you can back away from the water while the boomerang is returning so the hearts land on the ground."); - OPT_TRICK(RT_FOREST_MQ_WELL_SWIM, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Swim Through Forest Temple MQ Well with Hookshot", "Shoot the vines in the well as low and as far to the right as possible, and then immediately swim under the ceiling to the right. This can only be required if Forest Temple is in its Master Quest form."); - OPT_TRICK(RT_FOREST_MQ_BLOCK_PUZZLE, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Skip Forest Temple MQ Block Puzzle with Bombchu", "Send the Bombchu straight up the center of the wall directly to the left upon entering the room."); - //Child with hovers cannot do this from the lower floor, and most go to the upper floor which needs goron bracelet. Adult can do this with hammer and KSword, But child cannot. - OPT_TRICK(RT_FOREST_MQ_JS_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple MQ Twisted Hallway Switch with Jump Slash", "The switch to twist the hallway can be hit with a jump slash through the glass block. To get in front of the switch, either use the Hover Boots or hit the shortcut switch at the top of the room and jump from the glass blocks that spawn. Sticks can be used as child, but the Kokiri Sword is too short to reach through the glass."); - OPT_TRICK(RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Forest Temple MQ Twisted Hallway Switch with Hookshot", "There's a very small gap between the glass block and the wall. Through that gap you can hookshot the target on the ceiling."); - OPT_TRICK(RT_FOREST_MQ_RANG_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Forest Temple MQ Twisted Hallway Switch with Boomerang", "The Boomerang can return to Link through walls, allowing child to hit the hallway switch. This can be used to allow adult to pass through later, or in conjuction with \"Forest Temple Outside Backdoor with Jump Slash\"."); - OPT_TRICK(RT_FIRE_BOSS_DOOR_JUMP, RCQUEST_BOTH, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple Boss Door without Hover Boots or Pillar", "The Fire Temple Boss Door can be reached as adult with a precise jump. You must be touching the side wall of the room so that Link will grab the ledge from farther away than is normally possible."); - //Is also used in MQ logic, but has no practical effect there as of now - OPT_TRICK(RT_FIRE_SOT, RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple Song of Time Room GS without Song of Time", "A precise jump can be used to reach this room."); - OPT_TRICK(RT_FIRE_STRENGTH, RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple Climb without Strength", "A precise jump can be used to skip pushing the block."); - OPT_TRICK(RT_FIRE_SCARECROW, RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::EXPERT}, "Fire Temple East Tower without Scarecrow\'s Song", "Also known as \"Pixelshot\". The Longshot can reach the target on the elevator itself, allowing you to skip needing to spawn the scarecrow."); - OPT_TRICK(RT_FIRE_FLAME_MAZE, RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple Flame Wall Maze Skip", "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do it without taking damage is more precise. Allows you to progress without needing either a Small Key or Hover Boots."); - OPT_TRICK(RT_FIRE_MQ_NEAR_BOSS, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Chest Near Boss without Breaking Crate", "The hitbox for the torch extends a bit outside of the crate. Shoot a flaming arrow at the side of the crate to light the torch without needing to get over there and break the crate."); - OPT_TRICK(RT_FIRE_MQ_BLOCKED_CHEST, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Big Lava Room Blocked Door without Hookshot", "There is a gap between the hitboxes of the flame wall in the big lava room. If you know where this gap is located, you can jump through it and skip needing to use the Hookshot. To do this without taking damage is more precise."); - OPT_TRICK(RT_FIRE_MQ_BK_CHEST, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Boss Key Chest without Bow", "It is possible to light both of the timed torches to unbar the door to the boss key chest's room with just Din's Fire if you move very quickly between the two torches. It is also possible to unbar the door with just Din's by abusing an oversight in the way the game counts how many torches have been lit."); - OPT_TRICK(RT_FIRE_MQ_CLIMB, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Climb without Fire Source", "You can use the Hover Boots to hover around to the climbable wall, skipping the need to use a fire source and spawn a Hookshot target."); - OPT_TRICK(RT_FIRE_MQ_MAZE_SIDE_ROOM, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Lizalfos Maze Side Room without Box", "You can walk from the blue switch to the door and quickly open the door before the bars reclose. This skips needing to reach the upper sections of the maze to get a box to place on the switch."); - OPT_TRICK(RT_FIRE_MQ_MAZE_HOVERS, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots", "Use the Hover Boots off of a crate to climb to the upper maze without needing to spawn and use the Hookshot targets."); - OPT_TRICK(RT_FIRE_MQ_MAZE_JUMP, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Lower to Upper Lizalfos Maze with Precise Jump", "A precise jump off of a crate can be used to climb to the upper maze without needing to spawn and use the Hookshot targets. This trick supersedes both \"Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots\" and \"Fire Temple MQ Lizalfos Maze Side Room without Box\"."); - OPT_TRICK(RT_FIRE_MQ_ABOVE_MAZE_GS, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Above Flame Wall Maze GS from Below with Longshot", "The floor of the room that contains this Skulltula is only solid from above. From the maze below, the Longshot can be shot through the ceiling to obtain the token with two fewer small keys than normal."); - OPT_TRICK(RT_FIRE_MQ_FLAME_MAZE, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Flame Wall Maze Skip", "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do it without taking damage is more precise. Allows you to reach the side room GS without needing Song of Time or Hover Boots. If either of \"Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots\" or \"with Precise Jump\" are enabled, this also allows you to progress deeper into the dungeon without Hookshot."); - OPT_TRICK(RT_WATER_LONGSHOT_TORCH, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Torch Longshot", "Stand on the eastern side of the central pillar and longshot the torches on the bottom level. Swim through the corridor and float up to the top level. This allows access to this area and lower water levels without Iron Boots. The majority of the tricks that allow you to skip Iron Boots in the Water Temple are not going to be relevant unless this trick is first enabled."); - OPT_TRICK(RT_WATER_CRACKED_WALL_HOVERS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Cracked Wall with Hover Boots", "With a midair side-hop while wearing the Hover Boots, you can reach the cracked wall without needing to raise the water up to the middle level."); - OPT_TRICK(RT_WATER_CRACKED_WALL, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Cracked Wall with No Additional Items", "A precise jump slash (among other methods) will get you to the cracked wall without needing the Hover Boots or to raise the water to the middle level. This trick supersedes \"Water Temple Cracked Wall with Hover Boots\"."); - OPT_TRICK(RT_WATER_BK_REGION, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Boss Key Region with Hover Boots", "With precise Hover Boots movement it is possible to reach the boss key chest's region without needing the Longshot. It is not necessary to take damage from the spikes. The Gold Skulltula Token in the following room can also be obtained with just the Hover Boots."); - OPT_TRICK(RT_WATER_NORTH_BASEMENT_LEDGE_JUMP, RCQUEST_BOTH, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple North Basement Ledge with Precise Jump", "In the northern basement there's a ledge from where, in vanilla Water Temple, boulders roll out into the room. Normally to jump directly to this ledge logically requires the Hover Boots, but with precise jump, it can be done without them. This trick applies to both Vanilla and Master Quest."); - OPT_TRICK(RT_WATER_BK_JUMP_DIVE, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Boss Key Jump Dive", "Stand on the very edge of the raised corridor leading from the push block room to the rolling boulder corridor. Face the Gold Skulltula on the waterfall and jump over the boulder corridor floor into the pool of water, swimming right once underwater. This allows access to the boss key room without Iron boots."); - //Also used in MQ logic, but won't be relevent unless a way to enter tower without irons exists (likely a clip + swim) - OPT_TRICK(RT_WATER_FW_CENTRAL_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Central Pillar GS with Farore\'s Wind", "If you set Farore's Wind inside the central pillar and then return to that warp point after raising the water to the highest level, you can obtain this Skulltula Token with Hookshot or Boomerang."); - OPT_TRICK(RT_WATER_IRONS_CENTRAL_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Central Pillar GS with Iron Boots", "After opening the middle water level door into the central pillar, the door will stay unbarred so long as you do not leave the room -- even if you were to raise the water up to the highest level. With the Iron Boots to go through the door after the water has been raised, you can obtain the Skulltula Token with the Hookshot."); - OPT_TRICK(RT_WATER_CENTRAL_BOW, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::ADVANCED}, "Water Temple Central Bow Target without Longshot or Hover Boots", "A very precise Bow shot can hit the eye switch from the floor above. Then, you can jump down into the hallway and make through it before the gate closes. It can also be done as child, using the Slingshot instead of the Bow."); - OPT_TRICK(RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Falling Platform Room GS with Hookshot", "If you stand on the very edge of the platform, this Gold Skulltula can be obtained with only the Hookshot."); - OPT_TRICK(RT_WATER_RANG_FALLING_PLATFORM_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Falling Platform Room GS with Boomerang", "If you stand on the very edge of the platform, this Gold Skulltula can be obtained with only the Boomerang."); - OPT_TRICK(RT_WATER_RIVER_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple River GS without Iron Boots", "Standing on the exposed ground toward the end of the river, a precise Longshot use can obtain the token. The Longshot cannot normally reach far enough to kill the Skulltula, however. You'll first have to find some other way of killing it."); - OPT_TRICK(RT_WATER_DRAGON_JUMP_DIVE, RCQUEST_BOTH, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Dragon Statue Jump Dive", "If you come into the dragon statue room from the serpent river, you can jump down from above and get into the tunnel without needing either Iron Boots or a Scale. This trick applies to both Vanilla and Master Quest. In Vanilla, you must shoot the switch from above with the Bow, and then quickly get through the tunnel before the gate closes."); - OPT_TRICK(RT_WATER_ADULT_DRAGON, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Dragon Statue Switch from Above the Water as Adult", "Normally you need both Hookshot and Iron Boots to hit the switch and swim through the tunnel to get to the chest. But by hitting the switch from dry land, using one of Bombchus, Hookshot, or Bow, it is possible to skip one or both of those requirements. After the gate has been opened, besides just using the Iron Boots, a well-timed dive with at least the Silver Scale could be used to swim through the tunnel. If coming from the serpent river, a jump dive can also be used to get into the tunnel."); - OPT_TRICK(RT_WATER_CHILD_DRAGON, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::ADVANCED}, "Water Temple Dragon Statue Switch from Above the Water as Child", "It is possible for child to hit the switch from dry land using one of Bombchus, Slingshot or Boomerang. Then, to get to the chest, child can dive through the tunnel using at least the Silver Scale. The timing and positioning of this dive needs to be perfect to actually make it under the gate, and it all needs to be done very quickly to be able to get through before the gate closes. Be sure to enable \"Water Temple Dragon Statue Switch from Above the Water as Adult\" for adult's variant of this trick."); - OPT_TRICK(RT_WATER_MQ_CENTRAL_PILLAR, RCQUEST_MQ, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple MQ Central Pillar with Fire Arrows", "Slanted torches have misleading hitboxes. Whenever you see a slanted torch jutting out of the wall, you can expect most or all of its hitbox is actually on the other side that wall. This can make slanted torches very finicky to light when using arrows. The torches in the central pillar of MQ Water Temple are a particularly egregious example. Logic normally expects Din's Fire and Song of Time."); - OPT_TRICK(RT_WATER_MQ_LOCKED_GS, RCQUEST_MQ, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple MQ North Basement GS without Small Key", "There is an invisible Hookshot target that can be used to get over the gate that blocks you from going to this Skulltula early, skipping a small key as well as needing Hovers or Scarecrow to reach the locked door."); - OPT_TRICK(RT_LENS_SHADOW, RCQUEST_VANILLA, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Stationary Objects without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple for most areas in the dungeon except for crossing the moving platform in the huge pit room and for fighting Bongo Bongo."); - OPT_TRICK(RT_LENS_SHADOW_PLATFORM, RCQUEST_VANILLA, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Invisible Moving Platform without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple to cross the invisible moving platform in the huge pit room in either direction."); - OPT_TRICK(RT_LENS_BONGO, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Bongo Bongo without Lens of Truth", "Bongo Bongo can be defeated without the use of Lens of Truth, as the hands give a pretty good idea of where the eye is."); - OPT_TRICK(RT_SHADOW_UMBRELLA, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::EXPERT}, "Shadow Temple Stone Umbrella Skip", "A very precise Hover Boots movement from off of the lower chest can get you on top of the crushing spikes without needing to pull the block. Applies to both Vanilla and Master Quest."); - OPT_TRICK(RT_SHADOW_UMBRELLA_GS, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::EXPERT}, "Shadow Temple Falling Spikes GS with Hover Boots", "After killing the Skulltula, a very precise Hover Boots movement from off of the lower chest can get you on top of the crushing spikes without needing to pull the block. From there, another very precise Hover Boots movement can be used to obtain the token without needing the Hookshot. Applies to both Vanilla and Master Quest. For obtaining the chests in this room with just Hover Boots, be sure to enable \"Shadow Temple Stone Umbrella Skip\"."); - OPT_TRICK(RT_SHADOW_FREESTANDING_KEY, RCQUEST_VANILLA, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Freestanding Key with Bombchu", "Release the Bombchu with good timing so that it explodes near the bottom of the pot."); - OPT_TRICK(RT_SHADOW_STATUE, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple River Statue with Bombchu", "By sending a Bombchu around the edge of the gorge, you can knock down the statue without needing a Bow. Applies in both vanilla and MQ Shadow."); - OPT_TRICK(RT_SHADOW_BONGO, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple Bongo Bongo without projectiles", "Using precise sword slashes, Bongo Bongo can be defeated without using projectiles. This is only relevant in conjunction with Shadow Temple dungeon shortcuts or shuffled boss entrances."); - OPT_TRICK(RT_LENS_SHADOW_MQ, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Stationary Objects without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple MQ for most areas in the dungeon. See \"Shadow Temple MQ Invisible Moving Platform without Lens of Truth\", \"Shadow Temple MQ Invisible Blades Silver Rupees without Lens of Truth\", \"Shadow Temple MQ 2nd Dead Hand without Lens of Truth\", and \"Shadow Temple Bongo Bongo without Lens of Truth\" for exceptions."); - OPT_TRICK(RT_LENS_SHADOW_MQ_INVISIBLE_BLADES, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Invisible Blades Silver Rupees without Lens of Truth", "Removes the requirement for the Lens of Truth or Nayru's Love in Shadow Temple MQ for the Invisible Blades room silver rupee collection."); - OPT_TRICK(RT_LENS_SHADOW_MQ_PLATFORM, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Invisible Moving Platform without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple MQ to cross the invisible moving platform in the huge pit room in either direction."); - OPT_TRICK(RT_LENS_SHADOW_MQ_DEADHAND, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ 2nd Dead Hand without Lens of Truth", "Dead Hand spawns in a random spot within the room. Having Lens removes the hassle of having to comb the room looking for his spawn location."); - OPT_TRICK(RT_SHADOW_MQ_GAP, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Truth Spinner Gap with Longshot", "You can Longshot a torch and jump-slash recoil onto the tongue. It works best if you Longshot the right torch from the left side of the room."); - OPT_TRICK(RT_SHADOW_MQ_INVISIBLE_BLADES, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Invisible Blades without Song of Time", "The Like Like can be used to boost you into the silver rupee or recovery hearts that normally require Song of Time. This cannot be performed on OHKO since the Like Like does not boost you high enough if you die."); - OPT_TRICK(RT_SHADOW_MQ_HUGE_PIT, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Lower Huge Pit without Fire Source", "Normally a frozen eye switch spawns some platforms that you can use to climb down, but there's actually a small piece of ground that you can stand on that you can just jump down to."); - OPT_TRICK(RT_SHADOW_MQ_WINDY_WALKWAY, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Windy Walkway Reverse without Hover Boots", "It is possible to jump from the alcove in the windy hallway to the middle platform. There are two methods: wait out the fan opposite the door and hold forward, or jump to the right to be pushed by the fan there towards the platform ledge. Note that jumps of this distance are inconsistent, but still possible."); - OPT_TRICK(RT_LENS_SPIRIT, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple without Lens of Truth", "Removes the requirements for the Lens of Truth in Spirit Temple."); - OPT_TRICK(RT_SPIRIT_CHILD_CHU, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Child Side Bridge with Bombchu", "A carefully-timed Bombchu can hit the switch."); - OPT_TRICK(RT_SPIRIT_LOBBY_GS, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Main Room GS with Boomerang", "Standing on the highest part of the arm of the statue, a precise Boomerang throw can kill and obtain this Gold Skulltula. You must throw the Boomerang slightly off to the side so that it curves into the Skulltula, as aiming directly at it will clank off of the wall in front."); - OPT_TRICK(RT_SPIRIT_LOWER_ADULT_SWITCH, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::ADVANCED}, "Spirit Temple Lower Adult Switch with Bombs", "A bomb can be used to hit the switch on the ceiling, but it must be thrown from a particular distance away and with precise timing."); - OPT_TRICK(RT_SPIRIT_LOBBY_JUMP, RCQUEST_BOTH, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Main Room Jump from Hands to Upper Ledges", "A precise jump to obtain the following as adult without needing one of Hover Boots, or Hookshot (in vanilla) or Song of Time (in MQ): - Spirit Temple Statue Room Northeast Chest - Spirit Temple GS Lobby - Spirit Temple MQ Central Chamber Top Left Pot (Left) - Spirit Temple MQ Central Chamber Top Left Pot (Right)"); - // disabled since "Spirit Temple boss shortcuts" (pre-lowers the platform where you break the statues face) isn't a setting in ship - // OPT_TRICK(RT_SPIRIT_PLATFORM_HOOKSHOT, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Main Room Hookshot to Boss Platform", "Precise hookshot aiming at the platform chains can be used to reach the boss platform from the middle landings. Using a jump slash immediately after reaching a chain makes aiming more lenient. Relevant only when Spirit Temple boss shortcuts are on."); - OPT_TRICK(RT_SPIRIT_MAP_CHEST, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Map Chest with Bow", "To get a line of sight from the upper torch to the map chest torches, you must pull an Armos statue all the way up the stairs."); - OPT_TRICK(RT_SPIRIT_SUN_CHEST, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::ADVANCED}, "Spirit Temple Sun Block Room Chest with Bow", "Using the blocks in the room as platforms you can get lines of sight to all three torches. The timer on the torches is quite short so you must move quickly in order to light all three."); - OPT_TRICK(RT_SPIRIT_WALL, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Shifting Wall with No Additional Items", "Logic normally guarantees a way of dealing with both the Beamos and the Walltula before climbing the wall."); - OPT_TRICK(RT_LENS_SPIRIT_MQ, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Spirit Temple MQ."); - OPT_TRICK(RT_SPIRIT_MQ_SUN_BLOCK_SOT, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Sun Block Room as Child without Song of Time", "While adult can easily jump directly to the switch that unbars the door to the sun block room, child Link cannot make the jump without spawning a Song of Time block to jump from. You can skip this by throwing the crate down onto the switch from above, which does unbar the door, however the crate immediately breaks, so you must move quickly to get through the door before it closes back up."); - OPT_TRICK(RT_SPIRIT_MQ_SUN_BLOCK_GS, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Sun Block Room GS with Boomerang", "Throw the Boomerang in such a way that it curves through the side of the glass block to hit the Gold Skulltula."); - OPT_TRICK(RT_SPIRIT_MQ_LOWER_ADULT, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Lower Adult without Fire Arrows", "By standing in a precise position it is possible to light two of the torches with a single use of Din\'s Fire. This saves enough time to be able to light all three torches with only Din\'s."); - OPT_TRICK(RT_SPIRIT_MQ_FROZEN_EYE, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple MQ Frozen Eye Switch without Fire", "You can melt the ice by shooting an arrow through a torch. The only way to find a line of sight for this shot is to first spawn a Song of Time block, and then stand on the very edge of it."); - OPT_TRICK(RT_ICE_BLOCK_GS, RCQUEST_VANILLA, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern Block Room GS with Hover Boots", "The Hover Boots can be used to get in front of the Skulltula to kill it with a jump slash. Then, the Hover Boots can again be used to obtain the Token, all without Hookshot or Boomerang."); - OPT_TRICK(RT_ICE_MQ_RED_ICE_GS, RCQUEST_MQ, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern MQ Red Ice GS without Song of Time", "If you side-hop into the perfect position, you can briefly stand on the platform with the red ice just long enough to dump some blue fire."); - OPT_TRICK(RT_ICE_MQ_SCARECROW, RCQUEST_MQ, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern MQ Scarecrow GS with No Additional Items", "As adult a precise jump can be used to reach this alcove."); - OPT_TRICK(RT_LENS_GTG, RCQUEST_VANILLA, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground without Lens of Truth", "Removes the requirements for the Lens of Truth in Gerudo Training Ground."); - OPT_TRICK(RT_GTG_WITHOUT_HOOKSHOT, RCQUEST_VANILLA, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::INTERMEDIATE}, "Gerudo Training Ground Left Side Silver Rupees without Hookshot", "After collecting the rest of the silver rupees in the room, you can reach the final silver rupee on the ceiling by being pulled up into it after getting grabbed by the Wallmaster. Then, you must also reach the exit of the room without the use of the Hookshot. If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do so without taking damage is more precise."); - OPT_TRICK(RT_GTG_FAKE_WALL, RCQUEST_BOTH, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Reach Gerudo Training Ground Fake Wall Ledge with Hover Boots", "A precise Hover Boots use from the top of the chest can allow you to grab the ledge without needing the usual requirements. In Master Quest, this always skips a Song of Time requirement. In Vanilla, this skips a Hookshot requirement, but is only relevant if \"Gerudo Training Ground Left Side Silver Rupees without Hookshot\" is enabled."); - OPT_TRICK(RT_LENS_GTG_MQ, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Gerudo Training Ground MQ."); - OPT_TRICK(RT_GTG_MQ_WITH_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot", "The highest silver rupee can be obtained by hookshotting the target and then immediately jump slashing toward the rupee."); - OPT_TRICK(RT_GTG_MQ_WIHTOUT_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::INTERMEDIATE}, "Gerudo Training Ground MQ Left Side Silver Rupees without Hookshot", "After collecting the rest of the silver rupees in the room, you can reach the final silver rupee on the ceiling by being pulled up into it after getting grabbed by the Wallmaster. The Wallmaster will not track you to directly underneath the rupee. You should take the last step to be under the rupee after the Wallmaster has begun its attempt to grab you. Also included with this trick is that fact that the switch that unbars the door to the final chest of GTG can be hit without a projectile, using a precise jump slash. This trick supersedes \"Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot\"."); - OPT_TRICK(RT_LENS_GANON, RCQUEST_VANILLA, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Ganon\'s Castle without Lens of Truth", "Removes the requirements for the Lens of Truth in Ganon's Castle."); - OPT_TRICK(RT_GANON_SPIRIT_TRIAL_HOOKSHOT, RCQUEST_VANILLA, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Spirit Trial without Hookshot", "The highest rupee can be obtained as either age by performing a precise jump and a well-timed jumpslash off of an Armos."); - OPT_TRICK(RT_LENS_GANON_MQ, RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Ganon\'s Castle MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Ganon's Castle MQ."); - OPT_TRICK(RT_GANON_MQ_FIRE_TRIAL, RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::ADVANCED}, "Fire Trial MQ with Hookshot", "It's possible to hook the target at the end of fire trial with just Hookshot, but it requires precise aim and perfect positioning. The main difficulty comes from getting on the very corner of the obelisk without falling into the lava."); - OPT_TRICK(RT_GANON_MQ_SHADOW_TRIAL, RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Shadow Trial MQ Torch with Bow", "You can light the torch in this room without a fire source by shooting an arrow through the lit torch at the beginning of the room. Because the room is so dark and the unlit torch is so far away, it can be difficult to aim the shot correctly."); - OPT_TRICK(RT_GANON_MQ_LIGHT_TRIAL, RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::INTERMEDIATE}, "Light Trial MQ without Hookshot", "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. In this case to do it without taking damage is especially precise."); + OPT_TRICK(RT_VISIBLE_COLLISION, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, + "Pass Through Visible One-Way Collision", + "Allows climbing through the platform to reach Impa's House Back as adult with no items and going " + "through the Kakariko Village Gate as child when coming from the Mountain Trail side."); + OPT_TRICK(RT_GROTTOS_WITHOUT_AGONY, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, + "Hidden Grottos without Stone of Agony", "Allows entering hidden grottos without the Stone of Agony."); + OPT_TRICK(RT_FEWER_TUNIC_REQUIREMENTS, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::INTERMEDIATE }, + "Fewer Tunic Requirements", + "Allows the following possible without Tunics:\n- Enter Water Temple. The area below the center pillar " + "still requires Zora Tunic. Applies to MQ also.\n- Enter Fire Temple. Volvagia still requires Goron " + "Tunic. Applies to MQ also, and includes child access to first floor with dungeon shuffle."); + OPT_TRICK(RT_RUSTED_SWITCHES, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, + "Hammer Rusted Switches Through Walls", + "Applies to:\n- Fire Temple Highest Goron Chest.\n- MQ Fire Temple Lizalfos Maze.\n- MQ Spirit Trial."); + OPT_TRICK(RT_FLAMING_CHESTS, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::INTERMEDIATE }, "Flaming Chests", + "The chests encircled in flames in Gerudo Training Ground and in Spirit Temple can be opened by running " + "into the flames while Link is invincible after taking damage."); + // disabled for now, can't check for being able to use bunny hood & bunny hood speedup is currently completely + // decoupled from rando OPT_TRICK(RT_BUNNY_HOOD_JUMPS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED}, "Bunny Hood + // Jumps", "Allows reaching locations using Bunny Hood's extended jumps."); + OPT_TRICK(RT_DAMAGE_BOOST_SIMPLE, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL }, + "Simple damage boosts", + "Allows damage boosts in order to reach further locations. Can be combined with \"Simple hover boosts\" " + "for reaching far distances."); + OPT_TRICK(RT_HOVER_BOOST_SIMPLE, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL }, + "Simple hover boosts", + "Allows equipping of hover boots when link is moving at high speeds to extend distance covered. Can be " + "combined with \"Simple damage boosts\" for greater uses."); + OPT_TRICK(RT_BOMBCHU_BEEHIVES, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, "Bombchu Beehives", + "Allows exploding beehives with Bombchus."); + OPT_TRICK(RT_BLUE_FIRE_MUD_WALLS, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, "Blue Fire Beyond Red Ice", + "Use Blue Fire to break mud walls, detonate bomb flowers, and break floor to King Dodongo.\nDoes not " + "apply to MQ Dead Hand bomb flowers.\nUsing blue fire on bombflower to stop rolling goron also requires " + "\"Stop Link the Goron with Din's Fire\".\nUsing blue fire arrows to break floor in King Dodongo's " + "chamber also requires \"Dodongo\'s Cavern Smash the Boss Lobby Floor\"."); + OPT_TRICK(RT_OPEN_UNDERWATER_CHEST, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE, Tricks::Tag::GLITCH }, + "Open Underwater Chests", + "Underwater chests can be opened by wearing iron boots and hookshotting the chest."); + OPT_TRICK(RT_KF_ADULT_GS, RCQUEST_BOTH, RA_KOKIRI_FOREST, { Tricks::Tag::NOVICE }, + "Adult Kokiri Forest GS with Hover Boots", + "Can be obtained without Hookshot by using the Hover Boots off of one of the roots."); + OPT_TRICK(RT_LW_BRIDGE, RCQUEST_BOTH, RA_THE_LOST_WOODS, { Tricks::Tag::EXPERT }, + "Jump onto the Lost Woods Bridge as Adult with Nothing", + "With very precise movement it's possible for adult to jump onto the bridge without needing Longshot, " + "Hover Boots, or Bean."); + OPT_TRICK(RT_LW_MIDO_BACKFLIP, RCQUEST_BOTH, RA_THE_LOST_WOODS, { Tricks::Tag::NOVICE }, + "Backflip over Mido as Adult", "With a specific position and angle, you can backflip over Mido."); + OPT_TRICK(RT_LOST_WOOD_NAVI_DIVE, RCQUEST_BOTH, RA_THE_LOST_WOODS, { Tricks::Tag::NOVICE, Tricks::Tag::GLITCH }, + "Lost Woods Navi dive", + "You need Deku Sticks or Kokiri Sword to dive with Navi for entering Zora's River."); + OPT_TRICK(RT_LW_GS_BEAN, RCQUEST_BOTH, RA_THE_LOST_WOODS, { Tricks::Tag::INTERMEDIATE }, + "Lost Woods Adult GS without Bean", + "You can collect the token with a precise Hookshot use, as long as you can kill the Skulltula somehow " + "first. It can be killed using Longshot, Bow, Bombchus or Din's Fire."); + OPT_TRICK(RT_HC_STORMS_GS, RCQUEST_BOTH, RA_HYRULE_CASTLE, { Tricks::Tag::INTERMEDIATE }, + "Hyrule Castle Storms Grotto GS with Just Boomerang", + "With precise throws, the Boomerang alone can kill the Skulltula and collect the token, without first " + "needing to blow up the wall."); + OPT_TRICK(RT_HF_BIG_POE_WITHOUT_EPONA, RCQUEST_BOTH, RA_HYRULE_FIELD, { Tricks::Tag::NOVICE }, + "Big Poe without Epona", + "Big Poes have a chance of appearing without Epona, you can shoot them quickly with only bow."); + OPT_TRICK(RT_KAK_MAN_ON_ROOF, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, { Tricks::Tag::NOVICE }, + "Man on Roof without Hookshot", + "Can be reached by side-hopping off the watchtower as either age, or by jumping onto the potion shop's " + "roof from the ledge as adult."); + OPT_TRICK(RT_KAK_TOWER_GS, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, { Tricks::Tag::INTERMEDIATE }, + "Kakariko Tower GS with Jump Slash", + "Climb the tower as high as you can without touching the Gold Skulltula, then let go and jump slash " + "immediately. By jump-slashing from as low on the ladder as possible to still hit the Skulltula, this " + "trick can be done without taking fall damage."); + OPT_TRICK(RT_KAK_ADULT_WINDMILL_POH, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, { Tricks::Tag::NOVICE }, + "Windmill PoH as Adult with Nothing", "Can jump up to the spinning platform from below as adult."); + OPT_TRICK(RT_KAK_CHILD_WINDMILL_POH, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, { Tricks::Tag::EXTREME }, + "Windmill PoH as Child with Precise Jump Slash", + "Can jump up to the spinning platform from below as child with a precise jumpslash timed with the " + "platforms rotation."); + OPT_TRICK( + RT_KAK_ROOFTOP_GS, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, { Tricks::Tag::ADVANCED }, + "Kakariko Rooftop GS with Hover Boots", + "Take the Hover Boots from the entrance to Impa's House over to the rooftop of Skulltula House. From there, a " + "precise Hover Boots backwalk with backflip can be used to get onto a hill above the side of the village. And " + "then from there you can Hover onto Impa's rooftop to kill the Skulltula and backflip into the token."); + OPT_TRICK(RT_GY_POH, RCQUEST_BOTH, RA_THE_GRAVEYARD, { Tricks::Tag::INTERMEDIATE }, + "Graveyard Freestanding PoH with Boomerang", + "Using a precise moving setup you can obtain the Piece of Heart by having the Boomerang interact with it " + "along the return path."); + OPT_TRICK( + RT_GY_CHILD_DAMPE_RACE_POH, RCQUEST_BOTH, RA_THE_GRAVEYARD, { Tricks::Tag::NOVICE }, + "Second Dampe Race as Child", + "It is possible to complete the second dampe race as child in under a minute, but it is a strict time limit."); + OPT_TRICK(RT_GY_SHADOW_FIRE_ARROWS, RCQUEST_BOTH, RA_THE_GRAVEYARD, { Tricks::Tag::EXPERT }, + "Shadow Temple Entry with Fire Arrows", + "It is possible to light all of the torches to open the Shadow Temple entrance with just Fire Arrows, " + "but you must be very quick, precise, and strategic with how you take your shots."); + OPT_TRICK(RT_DMT_SOIL_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, { Tricks::Tag::INTERMEDIATE }, + "Death Mountain Trail Soil GS without Destroying Boulder", + "Bugs will go into the soft soil even while the boulder is still blocking the entrance. Then, using a " + "precise moving setup you can kill the Gold Skulltula and obtain the token by having the Boomerang " + "interact with it along the return path."); + OPT_TRICK(RT_DMT_BOMBABLE, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, { Tricks::Tag::INTERMEDIATE }, + "Death Mountain Trail Chest with Strength", + "Child Link can blow up the wall using a nearby bomb flower. You must backwalk with the flower and then " + "quickly throw it toward the wall."); + OPT_TRICK(RT_DMT_HOOKSHOT_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, { Tricks::Tag::INTERMEDIATE }, + "Death Mountain Trail Lower Red Rock GS with Hookshot", + "After killing the Skulltula, the token can be fished out of the rock without needing to destroy it, by " + "using the Hookshot in the correct way."); + OPT_TRICK(RT_DMT_HOVERS_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, { Tricks::Tag::ADVANCED }, + "Death Mountain Trail Lower Red Rock GS with Hover Boots", + "After killing the Skulltula, the token can be collected without needing to destroy the rock by " + "backflipping down onto it with the Hover Boots. First use the Hover Boots to stand on a nearby fence, " + "and go for the Skulltula Token from there."); + OPT_TRICK(RT_DMT_BEAN_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, { Tricks::Tag::EXPERT }, + "Death Mountain Trail Lower Red Rock GS with Magic Bean", + "After killing the Skulltula, the token can be collected without needing to destroy the rock by jumping " + "down onto it from the bean plant, midflight, with precise timing and positioning."); + OPT_TRICK(RT_DMT_JS_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, { Tricks::Tag::INTERMEDIATE }, + "Death Mountain Trail Lower Red Rock GS with Jump Slash", + "After killing the Skulltula, the token can be collected without needing to destroy the rock by jump " + "slashing from a precise angle."); + OPT_TRICK(RT_DMT_CLIMB_HOVERS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, { Tricks::Tag::ADVANCED }, + "Death Mountain Trail Climb with Hover Boots", + "It is possible to use the Hover Boots to bypass needing to destroy the boulders blocking the path to " + "the top of Death Mountain."); + OPT_TRICK( + RT_DMT_UPPER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, { Tricks::Tag::NOVICE }, + "Death Mountain Trail Upper Red Rock GS without Hammer", + "After killing the Skulltula, the token can be collected by backflipping into the rock at the correct angle."); + // disabled for now, only applies when trade quest is not shuffled so there's a timer (currently not considered in + // logic) OPT_TRICK(RT_DMT_BOLERO_BIGGORON, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, + // "Deliver Eye Drops with Bolero of Fire", "Playing a warp song normally causes a trade item to spoil immediately, + // however, it is possible use Bolero to reach Biggoron and still deliver the Eye Drops before they spoil. If you do + // not wear the Goron Tunic, the heat timer inside the crater will override the trade item\'s timer. When you exit + // to Death Mountain Trail you will have one second to show the Eye Drops before they expire. You can get extra time + // to show the Eye Drops if you warp immediately upon receiving them. If you don't have many hearts, you may have to + // reset the heat timer by quickly dipping in and out of Darunia\'s chamber or quickly equipping and unequipping the + // Goron Tunic. This trick does not apply if \"Randomize Warp Song Destinations\" is enabled, or if the settings are + // such that trade items do not need to be delivered within a time limit."); + OPT_TRICK(RT_GC_POT, RCQUEST_BOTH, RA_GORON_CITY, { Tricks::Tag::ADVANCED }, + "Goron City Spinning Pot PoH with Bombchu", + "A Bombchu can be used to stop the spinning pot, but it can be quite finicky to get it to work."); + OPT_TRICK(RT_GC_POT_STRENGTH, RCQUEST_BOTH, RA_GORON_CITY, { Tricks::Tag::INTERMEDIATE }, + "Goron City Spinning Pot PoH with Strength", + "Allows for stopping the Goron City Spinning Pot using a Bomb Flower alone, requiring strength in lieu " + "of inventory explosives."); + OPT_TRICK(RT_GC_ROLLING_STRENGTH, RCQUEST_BOTH, RA_GORON_CITY, { Tricks::Tag::INTERMEDIATE }, + "Rolling Goron (Hot Rodder Goron) as Child with Strength", + "Use the Bomb Flower on the stairs or near Medigoron. Timing is tight, especially without backwalking."); + OPT_TRICK(RT_GC_LEFTMOST, RCQUEST_BOTH, RA_GORON_CITY, { Tricks::Tag::ADVANCED }, + "Goron City Maze Left Chest with Hover Boots", + "A precise backwalk starting from on top of the crate and ending with a precisely-timed backflip can " + "reach this chest without needing either the Hammer or Silver Gauntlets."); + OPT_TRICK(RT_GC_GROTTO, RCQUEST_BOTH, RA_GORON_CITY, { Tricks::Tag::ADVANCED }, + "Goron City Grotto with Hookshot While Taking Damage", + "It is possible to reach the Goron City Grotto by quickly using the Hookshot while in the midst of " + "taking damage from the lava floor."); + OPT_TRICK(RT_GC_LINK_GORON_DINS, RCQUEST_BOTH, RA_GORON_CITY, { Tricks::Tag::NOVICE }, + "Stop Link the Goron with Din\'s Fire", "The timing is quite awkward."); + OPT_TRICK(RT_DMC_HOVER_BEAN_POH, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, { Tricks::Tag::NOVICE }, + "Crater\'s Bean PoH with Hover Boots", + "Hover from the base of the bridge near Goron City and walk up the very steep slope."); + OPT_TRICK(RT_DMC_BOLERO_JUMP, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, { Tricks::Tag::EXTREME }, + "Death Mountain Crater Jump to Bolero", + "As Adult, using a shield to drop a pot while you have the perfect speed and position, the pot can push " + "you that little extra distance you need to jump across the gap in the bridge."); + OPT_TRICK(RT_DMC_BOULDER_JS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, { Tricks::Tag::NOVICE }, + "Death Mountain Crater Upper to Lower with Hammer", + "With the Hammer, you can jump slash the rock twice in the same jump in order to destroy it before you " + "fall into the lava."); + OPT_TRICK(RT_DMC_BOULDER_SKIP, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, { Tricks::Tag::INTERMEDIATE }, + "Death Mountain Crater Upper to Lower Boulder Skip", + "As adult, With careful positioning, you can jump to the ledge where the boulder is, then use repeated " + "ledge grabs to shimmy to a climbable ledge. This trick supersedes \"Death Mountain Crater Upper to " + "Lower with Hammer\"."); + OPT_TRICK(RT_ZR_LOWER, RCQUEST_BOTH, RA_ZORAS_RIVER, { Tricks::Tag::INTERMEDIATE }, + "Zora\'s River Lower Freestanding PoH as Adult with Nothing", + "Adult can reach this PoH with a precise jump, no Hover Boots required."); + OPT_TRICK(RT_ZR_UPPER, RCQUEST_BOTH, RA_ZORAS_RIVER, { Tricks::Tag::INTERMEDIATE }, + "Zora\'s River Upper Freestanding PoH as Adult with Nothing", + "Adult can reach this PoH with a precise jump, no Hover Boots required."); + OPT_TRICK(RT_ZR_HOVERS, RCQUEST_BOTH, RA_ZORAS_RIVER, { Tricks::Tag::NOVICE }, + "Zora\'s Domain Entry with Hover Boots", "Can hover behind the waterfall as adult."); + OPT_TRICK(RT_ZR_CUCCO, RCQUEST_BOTH, RA_ZORAS_RIVER, { Tricks::Tag::NOVICE }, "Zora\'s Domain Entry with Cucco", + "You can fly behind the waterfall with a Cucco as child."); + OPT_TRICK(RT_ZD_KING_ZORA_SKIP, RCQUEST_BOTH, RA_ZORAS_DOMAIN, { Tricks::Tag::INTERMEDIATE }, + "Skip King Zora as Adult with Nothing", + "With a precise jump as adult, it is possible to get on the fence next to King Zora from the front to " + "access Zora's Fountain."); + OPT_TRICK(RT_ZD_GS, RCQUEST_BOTH, RA_ZORAS_DOMAIN, { Tricks::Tag::INTERMEDIATE }, + "Zora\'s Domain GS with No Additional Items", + "A precise jump slash can kill the Skulltula and recoil back onto the top of the frozen waterfall. To " + "kill it, the logic normally guarantees one of Hookshot, Bow, or Magic."); + OPT_TRICK(RT_ZF_GREAT_FAIRY_WITHOUT_EXPLOSIVES, RCQUEST_BOTH, RA_ZORAS_FOUNTAIN, { Tricks::Tag::NOVICE }, + "Zora\'s Fountain Great Fairy without Explosives", + "It's possible to use silver gauntlets to pick up the silver rock and hammer to break the rock below it, " + "allowing you to ledge grab the edge of the hole and get past the breakable wall (hammer can't break the " + "wall itself)."); + OPT_TRICK(RT_LH_LAB_WALL_GS, RCQUEST_BOTH, RA_LAKE_HYLIA, { Tricks::Tag::NOVICE }, + "Lake Hylia Lab Wall GS with Jump Slash", + "The jump slash to actually collect the token is somewhat precise."); + OPT_TRICK(RT_LH_LAB_DIVING, RCQUEST_BOTH, RA_LAKE_HYLIA, { Tricks::Tag::NOVICE }, + "Lake Hylia Lab Dive without Gold Scale", + "Remove the Iron Boots in the midst of Hookshotting the underwater crate."); + OPT_TRICK(RT_LH_WATER_HOOKSHOT, RCQUEST_BOTH, RA_LAKE_HYLIA, { Tricks::Tag::INTERMEDIATE }, + "Water Temple Entry without Iron Boots using Hookshot", + "When entering Water Temple using Gold Scale instead of Iron Boots, the Longshot is usually used to be " + "able to hit the switch and open the gate. But, by standing in a particular spot, the switch can be hit " + "with only the reach of the Hookshot."); + OPT_TRICK(RT_GV_CRATE_HOVERS, RCQUEST_BOTH, RA_GERUDO_VALLEY, { Tricks::Tag::INTERMEDIATE }, + "Gerudo Valley Crate PoH as Adult with Hover Boots", + "From the far side of Gerudo Valley, a precise Hover Boots movement and jump-slash recoil can allow " + "adult to reach the ledge with the crate PoH without needing Longshot. You will take fall damage."); + OPT_TRICK(RT_PASS_GUARDS_WITH_NOTHING, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, + "Sneak Past Moving Gerudo Guards with No Items", + "The logic normally guarantees Bow or Hookshot to stun them from a distance," + "but every moving guard can be passed with basic movement and AI manipulation"); + OPT_TRICK(RT_GF_JUMP, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, "Gerudo\'s Fortress Ledge Jumps", + "It is possible to navigate the rooves of Fortress with unintuative jumps to reach additional areas " + "without going inside."); + OPT_TRICK(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, + "Gerudo\'s Fortress Warriors with Difficult Weapons", + "Warriors can be defeated with Slingshot or Bombchus."); + // disabled for now, can't check for being able to use bunny hood & bunny hood speedup is currently completely + // decoupled from rando OPT_TRICK(RT_HW_BUNNY_CROSSING, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::NOVICE}, + // "Wasteland Crossing with Bunny Hood", "You can beat the quicksand by using the increased speed of the Bunny Hood. + // Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash."); + OPT_TRICK(RT_HW_CROSSING, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, { Tricks::Tag::INTERMEDIATE }, + "Wasteland Crossing without Hover Boots or Longshot", + "You can beat the quicksand by backwalking across it in a specific way. Note that jumping to the carpet " + "merchant as child typically requires a fairly precise jump slash."); + OPT_TRICK(RT_LENS_HW, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, { Tricks::Tag::INTERMEDIATE }, "Lensless Wasteland", + "By memorizing the path, you can travel through the Wasteland without using the Lens of Truth to see the " + "Poe. The equivalent trick for going in reverse through the Wasteland is \"Reverse Wasteland\"."); + OPT_TRICK( + RT_HW_REVERSE, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, { Tricks::Tag::INTERMEDIATE }, "Reverse Wasteland", + "By memorizing the path, you can travel through the Wasteland in reverse. Note that jumping to the carpet " + "merchant as child typically requires a fairly precise jump slash. The equivalent trick for going forward " + "through the Wasteland is \"Lensless Wasteland\". To cross the river of sand with no additional items, be sure " + "to also enable \"Wasteland Crossing without Hover Boots or Longshot\". Unless all overworld entrances are " + "randomized, Child Link will not be expected to do anything at Gerudo's Fortress."); + OPT_TRICK(RT_COLOSSUS_GS, RCQUEST_BOTH, RA_DESERT_COLOSSUS, { Tricks::Tag::NOVICE }, + "Colossus Hill GS with Hookshot", + "Somewhat precise. If you kill enough Leevers you can get enough of a break to take some time to aim " + "more carefully."); + OPT_TRICK(RT_DEKU_BASEMENT_GS, RCQUEST_VANILLA, RA_DEKU_TREE, { Tricks::Tag::NOVICE }, + "Deku Tree Basement Vines GS with Jump Slash", "Can be defeated by doing a precise jump slash."); + OPT_TRICK(RT_DEKU_B1_SKIP, RCQUEST_BOTH, RA_DEKU_TREE, { Tricks::Tag::INTERMEDIATE }, + "Deku Tree Basement without Slingshot", + "A precise jump can be used to skip needing to use the Slingshot to go around B1 of the Deku Tree. If " + "used with the \"Closed Forest\" setting, a Slingshot will not be guaranteed to exist somewhere inside " + "the Forest. This trick applies to both Vanilla and Master Quest."); + OPT_TRICK(RT_DEKU_B1_BOW_WEBS, RCQUEST_VANILLA, RA_DEKU_TREE, { Tricks::Tag::NOVICE }, + "Deku Tree Basement Web to Gohma with Bow", + "All spider web walls in the Deku Tree basement can be burnt as adult with just a bow by shooting " + "through torches. This trick only applies to the circular web leading to Gohma; the two vertical webs " + "are always in logic. Backflip onto the chest near the torch at the bottom of the vine wall. With " + "precise positioning you can shoot through the torch to the right edge of the circular web. This allows " + "completion of adult Deku Tree with no fire source."); + OPT_TRICK(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG, RCQUEST_VANILLA, RA_DEKU_TREE, { Tricks::Tag::NOVICE }, + "Deku Tree Basement Backflip over Spiked Log", + "Allows backflipping over the spiked log in the Deku Tree basement in Vanilla. Only relevant if " + "\"Shuffle Swim\" is enabled."); + OPT_TRICK(RT_DEKU_MQ_COMPASS_GS, RCQUEST_MQ, RA_DEKU_TREE, { Tricks::Tag::NOVICE }, + "Deku Tree MQ Compass Room GS Boulders with Just Hammer", + "Climb to the top of the vines, then let go and jump slash immediately to destroy the boulders using the " + "Hammer, without needing to spawn a Song of Time block."); + OPT_TRICK(RT_DEKU_MQ_LOG, RCQUEST_MQ, RA_DEKU_TREE, { Tricks::Tag::NOVICE }, + "Deku Tree MQ Roll Under the Spiked Log", + "You can get past the spiked log by rolling to briefly shrink your hitbox. As adult, the timing is a bit " + "more precise."); + OPT_TRICK(RT_DC_SCARECROW_GS, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, { Tricks::Tag::NOVICE }, + "Dodongo\'s Cavern Scarecrow GS with Armos Statue", + "You can jump off an Armos Statue to reach the alcove with the Gold Skulltula. It takes quite a long " + "time to pull the statue the entire way. The jump to the alcove can be a bit picky when done as child."); + OPT_TRICK(RT_DC_VINES_GS, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, { Tricks::Tag::NOVICE }, + "Dodongo\'s Cavern Vines GS from Below with Longshot", + "The vines upon which this Skulltula rests are one-sided collision. You can use the Longshot to get it " + "from below, by shooting it through the vines, bypassing the need to lower the staircase."); + OPT_TRICK(RT_DC_STAIRS_WITH_BOW, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, { Tricks::Tag::NOVICE }, + "Dodongo\'s Cavern Stairs with Bow", + "The Bow can be used to knock down the stairs with two well-timed shots."); + OPT_TRICK(RT_DC_SLINGSHOT_SKIP, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, { Tricks::Tag::EXPERT }, + "Dodongo\'s Cavern Child Slingshot Skips", + "With precise platforming, child can cross the platforms while the flame circles are there. When " + "enabling this trick, it's recommended that you also enable the Adult variant: \"Dodongo's Cavern Spike " + "Trap Room Jump without Hover Boots\"."); + OPT_TRICK(RT_DC_SCRUB_ROOM, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, { Tricks::Tag::NOVICE }, + "Dodongo\'s Cavern Two Scrub Room with Strength", + "With help from a conveniently-positioned block, Adult can quickly carry a Bomb Flower over to destroy " + "the mud wall blocking the room with two Deku Scrubs."); + OPT_TRICK(RT_DC_JUMP, RCQUEST_BOTH, RA_DODONGOS_CAVERN, { Tricks::Tag::NOVICE }, + "Dodongo\'s Cavern Spike Trap Room Jump without Hover Boots", + "The jump is Adult Link only. Applies to both Vanilla and MQ."); + OPT_TRICK(RT_DC_HAMMER_FLOOR, RCQUEST_BOTH, RA_DODONGOS_CAVERN, { Tricks::Tag::NOVICE }, + "Dodongo\'s Cavern Smash the Boss Lobby Floor", + "The bombable floor before King Dodongo can be destroyed with Hammer if hit in the very center. This is " + "only relevant with Shuffle Boss Entrances or if Dodongo's Cavern is MQ and either variant of " + "\"Dodongo's Cavern MQ Light the Eyes with Strength\" is on."); + OPT_TRICK(RT_DC_DODONGO_CHU, RCQUEST_BOTH, RA_DODONGOS_CAVERN, { Tricks::Tag::ADVANCED }, + "Dodongo\'s Cavern Dodongo without Bombchus", + "With precise timing you can feed King Dodongo a bombchu during a backflip"); + OPT_TRICK(RT_DC_MQ_STAIRS_WITH_ONLY_STRENGTH, RCQUEST_MQ, RA_DODONGOS_CAVERN, { Tricks::Tag::NOVICE }, + "Dodongo\'s Cavern MQ Stairs With Only Strength", + "Taking a bomb from the back can be used to lower stairs without using stick to drop bomb from wall."); + OPT_TRICK(RT_DC_MQ_CHILD_BOMBS, RCQUEST_MQ, RA_DODONGOS_CAVERN, { Tricks::Tag::ADVANCED }, + "Dodongo\'s Cavern MQ Early Bomb Bag Area as Child", + "With a precise jump slash from above, you can reach the Bomb Bag area as only child without needing a " + "Slingshot. You will take fall damage."); + OPT_TRICK(RT_DC_MQ_CHILD_EYES, RCQUEST_MQ, RA_DODONGOS_CAVERN, { Tricks::Tag::EXPERT }, + "Dodongo\'s Cavern MQ Light the Eyes with Strength as Child", + "If you move very quickly, it is possible to use the bomb flower at the top of the room to light the " + "eyes. To perform this trick as child is significantly more difficult than adult. The player is also " + "expected to complete the DC back area without explosives, including getting past the Armos wall to the " + "switch for the boss door."); + OPT_TRICK( + RT_DC_MQ_ADULT_EYES, RCQUEST_MQ, RA_DODONGOS_CAVERN, { Tricks::Tag::ADVANCED }, + "Dodongo\'s Cavern MQ Light the Eyes with Strength as Adult", + "If you move very quickly, it is possible to use the bomb flower at the top of the room to light the eyes."); + OPT_TRICK(RT_JABU_ALCOVE_JUMP_DIVE, RCQUEST_BOTH, RA_JABU_JABUS_BELLY, { Tricks::Tag::NOVICE }, + "Jabu Underwater Alcove as Adult with Jump Dive", + "Standing above the underwater tunnel leading to the scrub, jump down and swim through the tunnel. This " + "allows adult to access the alcove with no Scale or Iron Boots. In Vanilla Jabu, this alcove has a " + "business scrub. In MQ Jabu, it has the compass chest and a door switch for the main floor."); + OPT_TRICK(RT_JABU_BOSS_HOVER, RCQUEST_VANILLA, RA_JABU_JABUS_BELLY, { Tricks::Tag::INTERMEDIATE }, + "Jabu Near Boss Room with Hover Boots", + "A box for the blue switch can be carried over by backwalking with one while the elevator is at its " + "peak. Alternatively, you can skip transporting a box by quickly rolling from the switch and opening the " + "door before it closes. However, the timing for this is very tight."); + OPT_TRICK( + RT_JABU_NEAR_BOSS_RANGED, RCQUEST_BOTH, RA_JABU_JABUS_BELLY, { Tricks::Tag::NOVICE }, + "Jabu Near Boss Ceiling Switch/GS without Boomerang or Explosives", + "Vanilla Jabu: From near the entrance into the room, you can hit the switch that opens the door to the boss " + "room using a precisely-aimed use of the Slingshot, Bow, or Longshot. As well, if you climb to the top of the " + "vines you can stand on the right edge of the platform and shoot around the glass. From this distance, even " + "the Hookshot can reach the switch. This trick is only relevant if \"Shuffle Boss Entrances\" is enabled. MQ " + "Jabu: A Gold Skulltula Token can be collected with the Hookshot or Longshot using the same methods as hitting " + "the switch in Vanilla. This MQ trick is not currently relevant in logic."); + OPT_TRICK(RT_JABU_NEAR_BOSS_EXPLOSIVES, RCQUEST_VANILLA, RA_JABU_JABUS_BELLY, { Tricks::Tag::INTERMEDIATE }, + "Jabu Near Boss Ceiling Switch with Explosives", + "You can hit the switch that opens the door to the boss room using a precisely-aimed Bombchu. Also, " + "using the Hover Boots, adult can throw a Bomb at the switch. This trick is only relevant if \"Shuffle " + "Boss Entrances\" is enabled."); + OPT_TRICK(RT_LENS_JABU_MQ, RCQUEST_MQ, RA_JABU_JABUS_BELLY, { Tricks::Tag::NOVICE }, + "Jabu MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Jabu MQ."); + OPT_TRICK(RT_JABU_MQ_RANG_JUMP, RCQUEST_MQ, RA_JABU_JABUS_BELLY, { Tricks::Tag::ADVANCED }, + "Jabu MQ Compass Chest with Boomerang", + "Boomerang can reach the cow switch to spawn the chest by targeting the cow, jumping off of the ledge " + "where the chest spawns, and throwing the Boomerang in midair."); + OPT_TRICK(RT_JABU_MQ_SOT_GS, RCQUEST_MQ, RA_JABU_JABUS_BELLY, { Tricks::Tag::INTERMEDIATE }, + "Jabu MQ Song of Time Block GS with Boomerang", + "Allow the Boomerang to return to you through the Song of Time block to grab the token."); + OPT_TRICK(RT_LENS_BOTW, RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, { Tricks::Tag::NOVICE }, + "Bottom of the Well without Lens of Truth", + "Removes the requirements for the Lens of Truth in Bottom of the Well."); + OPT_TRICK(RT_BOTTOM_OF_THE_WELL_NAVI_DIVE, RCQUEST_BOTH, RA_BOTTOM_OF_THE_WELL, + { Tricks::Tag::NOVICE, Tricks::Tag::GLITCH }, "Bottom of the Well Navi dive", + "You need Deku Sticks or Kokiri Sword to dive with Navi for entering Bottom of the Well."); + OPT_TRICK(RT_BOTW_CHILD_DEADHAND, RCQUEST_BOTH, RA_BOTTOM_OF_THE_WELL, { Tricks::Tag::NOVICE }, + "Child Dead Hand without Kokiri Sword", "Requires 9 sticks or 5 jump slashes."); + OPT_TRICK(RT_BOTW_BASEMENT, RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, { Tricks::Tag::NOVICE }, + "Bottom of the Well Map Chest with Strength & Sticks", + "The chest in the basement can be reached with strength by doing a jump slash with a lit stick to access " + "the Bomb Flowers."); + OPT_TRICK(RT_BOTW_MQ_PITS, RCQUEST_MQ, RA_BOTTOM_OF_THE_WELL, { Tricks::Tag::NOVICE }, + "Bottom of the Well MQ Jump Over the Pits", + "While the pits in Bottom of the Well don't allow you to jump just by running straight at them, you can " + "still get over them by side-hopping or backflipping across. With explosives, this allows you to access " + "the central areas without Zelda's Lullaby. With Zelda's Lullaby, it allows you to access the west inner " + "room without explosives."); + OPT_TRICK(RT_BOTW_MQ_DEADHAND_KEY, RCQUEST_MQ, RA_BOTTOM_OF_THE_WELL, { Tricks::Tag::NOVICE }, + "Bottom of the Well MQ Dead Hand Freestanding Key with Boomerang", + "Boomerang can fish the item out of the rubble without needing explosives to blow it up."); + OPT_TRICK(RT_FOREST_FIRST_GS, RCQUEST_VANILLA, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, + "Forest Temple First Room GS with Difficult-to-Use Weapons", + "Allows killing this Skulltula with Sword or Sticks by jump slashing it as you let go from the vines. " + "You can avoid taking fall damage by recoiling onto the tree. Also allows killing it as Child with a " + "Bomb throw. It's much more difficult to use a Bomb as child due to Child Link's shorter height."); + OPT_TRICK(RT_FOREST_OUTDOORS_EAST_GS, RCQUEST_VANILLA, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, + "Forest Temple East Courtyard GS with Boomerang", + "Precise Boomerang throws can allow child to kill the Skulltula and collect the token."); + OPT_TRICK(RT_FOREST_VINES, RCQUEST_BOTH, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, + "Forest Temple East Courtyard Vines with Hookshot", + "The vines in Forest Temple leading to where the well drain switch is in the standard form can be barely " + "reached with just the Hookshot. Applies to MQ also."); + OPT_TRICK(RT_FOREST_OUTDOORS_LEDGE, RCQUEST_BOTH, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, + "Forest Temple NE Outdoors Ledge with Hover Boots", + "With precise Hover Boots movement you can fall down to this ledge from upper balconies. If done " + "precisely enough, it is not necessary to take fall damage. In MQ, this skips a Longshot requirement. In " + "Vanilla, this can skip a Hookshot requirement in entrance randomizer."); + OPT_TRICK(RT_FOREST_DOORFRAME, RCQUEST_BOTH, RA_FOREST_TEMPLE, { Tricks::Tag::ADVANCED }, + "Forest Temple East Courtyard Door Frame with Hover Boots", + "A precise Hover Boots movement from the upper balconies in this courtyard can be used to get on top of " + "the door frame. Applies to both Vanilla and Master Quest. In Vanilla, from on top the door frame you " + "can summon Pierre, allowing you to access the falling ceiling room early. In Master Quest, this allows " + "you to obtain the GS on the door frame as adult without Hookshot or Song of Time."); + OPT_TRICK(RT_FOREST_OUTSIDE_BACKDOOR, RCQUEST_BOTH, RA_FOREST_TEMPLE, { Tricks::Tag::ADVANCED }, + "Forest Temple Outside Backdoor with Jump Slash", + "A jump slash recoil can be used to reach the ledge in the block puzzle room that leads to the west " + "courtyard. This skips a potential Hover Boots requirement in Vanilla, and it can sometimes apply in MQ " + "as well. This trick can be performed as both ages."); + OPT_TRICK(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG, RCQUEST_BOTH, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, + "Forest Temple Outside Hearts with Boomerang", + "A well aimed boomerang from the water's edge can reach the hearts from ground level. If unable to swim, " + "you can back away from the water while the boomerang is returning so the hearts land on the ground."); + OPT_TRICK(RT_FOREST_MQ_WELL_SWIM, RCQUEST_MQ, RA_FOREST_TEMPLE, { Tricks::Tag::ADVANCED }, + "Swim Through Forest Temple MQ Well with Hookshot", + "Shoot the vines in the well as low and as far to the right as possible, and then immediately swim under " + "the ceiling to the right. This can only be required if Forest Temple is in its Master Quest form."); + OPT_TRICK(RT_FOREST_MQ_BLOCK_PUZZLE, RCQUEST_MQ, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, + "Skip Forest Temple MQ Block Puzzle with Bombchu", + "Send the Bombchu straight up the center of the wall directly to the left upon entering the room."); + // Child with hovers cannot do this from the lower floor, and most go to the upper floor which needs goron bracelet. + // Adult can do this with hammer and KSword, But child cannot. + OPT_TRICK(RT_FOREST_MQ_JS_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, + "Forest Temple MQ Twisted Hallway Switch with Jump Slash", + "The switch to twist the hallway can be hit with a jump slash through the glass block. To get in front " + "of the switch, either use the Hover Boots or hit the shortcut switch at the top of the room and jump " + "from the glass blocks that spawn. Sticks can be used as child, but the Kokiri Sword is too short to " + "reach through the glass."); + OPT_TRICK(RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Forest Temple MQ Twisted Hallway Switch with Hookshot", + "There's a very small gap between the glass block and the wall. Through that gap you can hookshot the " + "target on the ceiling."); + OPT_TRICK(RT_FOREST_MQ_RANG_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Forest Temple MQ Twisted Hallway Switch with Boomerang", + "The Boomerang can return to Link through walls, allowing child to hit the hallway switch. This can be " + "used to allow adult to pass through later, or in conjunction with \"Forest Temple Outside Backdoor with " + "Jump Slash\"."); + OPT_TRICK(RT_FIRE_BOSS_DOOR_JUMP, RCQUEST_BOTH, RA_FIRE_TEMPLE, { Tricks::Tag::NOVICE }, + "Fire Temple Boss Door without Hover Boots or Pillar", + "The Fire Temple Boss Door can be reached as adult with a precise jump. You must be touching the side " + "wall of the room so that Link will grab the ledge from farther away than is normally possible."); + // Is also used in MQ logic, but has no practical effect there as of now + OPT_TRICK(RT_FIRE_SOT, RCQUEST_VANILLA, RA_FIRE_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Fire Temple Song of Time Room GS without Song of Time", + "A precise jump can be used to reach this room."); + OPT_TRICK(RT_FIRE_STRENGTH, RCQUEST_VANILLA, RA_FIRE_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Fire Temple Climb without Strength", "A precise jump can be used to skip pushing the block."); + OPT_TRICK(RT_FIRE_SCARECROW, RCQUEST_VANILLA, RA_FIRE_TEMPLE, { Tricks::Tag::EXPERT }, + "Fire Temple East Tower without Scarecrow\'s Song", + "Also known as \"Pixelshot\". The Longshot can reach the target on the elevator itself, allowing you to " + "skip needing to spawn the scarecrow."); + OPT_TRICK(RT_FIRE_FLAME_MAZE, RCQUEST_VANILLA, RA_FIRE_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Fire Temple Flame Wall Maze Skip", + "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To " + "do it without taking damage is more precise. Allows you to progress without needing either a Small Key " + "or Hover Boots."); + OPT_TRICK(RT_FIRE_MQ_NEAR_BOSS, RCQUEST_MQ, RA_FIRE_TEMPLE, { Tricks::Tag::NOVICE }, + "Fire Temple MQ Chest Near Boss without Breaking Crate", + "The hitbox for the torch extends a bit outside of the crate. Shoot a flaming arrow at the side of the " + "crate to light the torch without needing to get over there and break the crate."); + OPT_TRICK(RT_FIRE_MQ_BLOCKED_CHEST, RCQUEST_MQ, RA_FIRE_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Fire Temple MQ Big Lava Room Blocked Door without Hookshot", + "There is a gap between the hitboxes of the flame wall in the big lava room. If you know where this gap " + "is located, you can jump through it and skip needing to use the Hookshot. To do this without taking " + "damage is more precise."); + OPT_TRICK( + RT_FIRE_MQ_BK_CHEST, RCQUEST_MQ, RA_FIRE_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Fire Temple MQ Boss Key Chest without Bow", + "It is possible to light both of the timed torches to unbar the door to the boss key chest's room with just " + "Din's Fire if you move very quickly between the two torches. It is also possible to unbar the door with just " + "Din's Fire by abusing an oversight in the way the game counts how many torches have been lit."); + OPT_TRICK(RT_FIRE_MQ_CLIMB, RCQUEST_MQ, RA_FIRE_TEMPLE, { Tricks::Tag::NOVICE }, + "Fire Temple MQ Climb without Fire Source", + "You can use the Hover Boots to hover around to the climbable wall, skipping the need to use a fire " + "source and spawn a Hookshot target."); + OPT_TRICK(RT_FIRE_MQ_MAZE_SIDE_ROOM, RCQUEST_MQ, RA_FIRE_TEMPLE, { Tricks::Tag::NOVICE }, + "Fire Temple MQ Lizalfos Maze Side Room without Box", + "You can walk from the blue switch to the door and quickly open the door before the bars reclose. This " + "skips needing to reach the upper sections of the maze to get a box to place on the switch."); + OPT_TRICK(RT_FIRE_MQ_MAZE_HOVERS, RCQUEST_MQ, RA_FIRE_TEMPLE, { Tricks::Tag::NOVICE }, + "Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots", + "Use the Hover Boots off of a crate to climb to the upper maze without needing to spawn and use the " + "Hookshot targets."); + OPT_TRICK(RT_FIRE_MQ_MAZE_JUMP, RCQUEST_MQ, RA_FIRE_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Fire Temple MQ Lower to Upper Lizalfos Maze with Precise Jump", + "A precise jump off of a crate can be used to climb to the upper maze without needing to spawn and use " + "the Hookshot targets. This trick supersedes both \"Fire Temple MQ Lower to Upper Lizalfos Maze with " + "Hover Boots\" and \"Fire Temple MQ Lizalfos Maze Side Room without Box\"."); + OPT_TRICK(RT_FIRE_MQ_ABOVE_MAZE_GS, RCQUEST_MQ, RA_FIRE_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Fire Temple MQ Above Flame Wall Maze GS from Below with Longshot", + "The floor of the room that contains this Skulltula is only solid from above. From the maze below, the " + "Longshot can be shot through the ceiling to obtain the token with two fewer small keys than normal."); + OPT_TRICK( + RT_FIRE_MQ_FLAME_MAZE, RCQUEST_MQ, RA_FIRE_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Fire Temple MQ Flame Wall Maze Skip", + "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do it " + "without taking damage is more precise. Allows you to reach the side room GS without needing Song of Time or " + "Hover Boots. If either of \"Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots\" or \"with Precise " + "Jump\" are enabled, this also allows you to progress deeper into the dungeon without Hookshot."); + OPT_TRICK(RT_WATER_LONGSHOT_TORCH, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::NOVICE }, + "Water Temple Torch Longshot", + "Stand on the eastern side of the central pillar and longshot the torches on the bottom level. Swim " + "through the corridor and float up to the top level. This allows access to this area and lower water " + "levels without Iron Boots. The majority of the tricks that allow you to skip Iron Boots in the Water " + "Temple are not going to be relevant unless this trick is first enabled."); + OPT_TRICK(RT_WATER_CRACKED_WALL_HOVERS, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::NOVICE }, + "Water Temple Cracked Wall with Hover Boots", + "With a midair side-hop while wearing the Hover Boots, you can reach the cracked wall without needing to " + "raise the water up to the middle level."); + OPT_TRICK(RT_WATER_CRACKED_WALL, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Water Temple Cracked Wall with No Additional Items", + "A precise jump slash (among other methods) will get you to the cracked wall without needing the Hover " + "Boots or to raise the water to the middle level. This trick supersedes \"Water Temple Cracked Wall with " + "Hover Boots\"."); + OPT_TRICK(RT_WATER_BK_REGION, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Water Temple Boss Key Region with Hover Boots", + "With precise Hover Boots movement it is possible to reach the boss key chest's region without needing " + "the Longshot. It is not necessary to take damage from the spikes. The Gold Skulltula Token in the " + "following room can also be obtained with just the Hover Boots."); + OPT_TRICK(RT_WATER_NORTH_BASEMENT_LEDGE_JUMP, RCQUEST_BOTH, RA_WATER_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Water Temple North Basement Ledge with Precise Jump", + "In the northern basement there's a ledge from where, in Vanilla Water Temple, boulders roll out into " + "the room. Normally to jump directly to this ledge logically requires the Hover Boots, but with precise " + "jump, it can be done without them. This trick applies to both Vanilla and Master Quest."); + OPT_TRICK( + RT_WATER_BK_JUMP_DIVE, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::NOVICE }, + "Water Temple Boss Key Jump Dive", + "Stand on the very edge of the raised corridor leading from the push block room to the rolling boulder " + "corridor. Face the Gold Skulltula on the waterfall and jump over the boulder corridor floor into the pool of " + "water, swimming right once underwater. This allows access to the boss key room without Iron boots."); + // Also used in MQ logic, but won't be relevent unless a way to enter tower without irons exists (likely a clip + + // swim) + OPT_TRICK(RT_WATER_FW_CENTRAL_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::NOVICE }, + "Water Temple Central Pillar GS with Farore\'s Wind", + "If you set Farore's Wind inside the central pillar and then return to that warp point after raising the " + "water to the highest level, you can obtain this Skulltula Token with Hookshot or Boomerang."); + OPT_TRICK( + RT_WATER_IRONS_CENTRAL_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::NOVICE }, + "Water Temple Central Pillar GS with Iron Boots", + "After opening the middle water level door into the central pillar, the door will stay unbarred so long as you " + "do not leave the room, even if you were to raise the water up to the highest level. With the Iron Boots to go " + "through the door after the water has been raised, you can obtain the Skulltula Token with the Hookshot."); + OPT_TRICK(RT_WATER_CENTRAL_BOW, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::ADVANCED }, + "Water Temple Central Bow Target without Longshot or Hover Boots", + "A very precise Bow shot can hit the eye switch from the floor above. Then, you can jump down into the " + "hallway and make through it before the gate closes. It can also be done as child, using the Slingshot " + "instead of the Bow."); + OPT_TRICK( + RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::NOVICE }, + "Water Temple Falling Platform Room GS with Hookshot", + "If you stand on the very edge of the platform, this Gold Skulltula can be obtained with only the Hookshot."); + OPT_TRICK( + RT_WATER_RANG_FALLING_PLATFORM_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Water Temple Falling Platform Room GS with Boomerang", + "If you stand on the very edge of the platform, this Gold Skulltula can be obtained with only the Boomerang."); + OPT_TRICK(RT_WATER_RIVER_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Water Temple River GS without Iron Boots", + "Standing on the exposed ground toward the end of the river, a precise Longshot use can obtain the " + "token. The Longshot cannot normally reach far enough to kill the Skulltula, however. You'll first have " + "to find some other way of killing it."); + OPT_TRICK(RT_WATER_DRAGON_JUMP_DIVE, RCQUEST_BOTH, RA_WATER_TEMPLE, { Tricks::Tag::NOVICE }, + "Water Temple Dragon Statue Jump Dive", + "If you come into the dragon statue room from the serpent river, you can jump down from above and get " + "into the tunnel without needing either Iron Boots or a Scale. This trick applies to both Vanilla and " + "Master Quest. In Vanilla, you must shoot the switch from above with the Bow, and then quickly get " + "through the tunnel before the gate closes."); + OPT_TRICK(RT_WATER_ADULT_DRAGON, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::NOVICE }, + "Water Temple Dragon Statue Switch from Above the Water as Adult", + "Normally you need both Hookshot and Iron Boots to hit the switch and swim through the tunnel to get to " + "the chest. But by hitting the switch from dry land, using one of Bombchus, Hookshot, or Bow, it is " + "possible to skip one or both of those requirements. After the gate has been opened, besides just using " + "the Iron Boots, a well-timed dive with at least the Silver Scale could be used to swim through the " + "tunnel. If coming from the serpent river, a jump dive can also be used to get into the tunnel."); + OPT_TRICK(RT_WATER_CHILD_DRAGON, RCQUEST_VANILLA, RA_WATER_TEMPLE, { Tricks::Tag::ADVANCED }, + "Water Temple Dragon Statue Switch from Above the Water as Child", + "It is possible for child to hit the switch from dry land using one of Bombchus, Slingshot or Boomerang. " + "Then, to get to the chest, child can dive through the tunnel using at least the Silver Scale. The " + "timing and positioning of this dive needs to be perfect to actually make it under the gate, and it all " + "needs to be done very quickly to be able to get through before the gate closes. Be sure to enable " + "\"Water Temple Dragon Statue Switch from Above the Water as Adult\" for adult's variant of this trick."); + OPT_TRICK(RT_WATER_MQ_CENTRAL_PILLAR, RCQUEST_MQ, RA_WATER_TEMPLE, { Tricks::Tag::NOVICE }, + "Water Temple MQ Central Pillar with Fire Arrows", + "Slanted torches have misleading hitboxes. Whenever you see a slanted torch jutting out of the wall, you " + "can expect most or all of its hitbox is actually on the other side that wall. This can make slanted " + "torches very finicky to light when using arrows. The torches in the central pillar of MQ Water Temple " + "are a particularly egregious example. Logic normally expects Din's Fire and Song of Time."); + OPT_TRICK( + RT_WATER_MQ_LOCKED_GS, RCQUEST_MQ, RA_WATER_TEMPLE, { Tricks::Tag::NOVICE }, + "Water Temple MQ North Basement GS without Small Key", + "There is an invisible Hookshot target that can be used to get over the gate that blocks you from going to " + "this Skulltula early, skipping a small key as well as needing Hovers or Scarecrow to reach the locked door."); + OPT_TRICK(RT_WATER_MORPHA_WITHOUT_HOOKSHOT, RCQUEST_BOTH, RA_WATER_TEMPLE, { Tricks::Tag::EXTREME }, + "Water Temple Morpha without Hookshot", "It is possible to slash at Morpha without hookshot."); + OPT_TRICK(RT_LENS_SHADOW, RCQUEST_VANILLA, RA_SHADOW_TEMPLE, { Tricks::Tag::NOVICE }, + "Shadow Temple Stationary Objects without Lens of Truth", + "Removes the requirements for the Lens of Truth in Shadow Temple for most areas in the dungeon except " + "for crossing the moving platform in the huge pit room and for fighting Bongo Bongo."); + OPT_TRICK(RT_LENS_SHADOW_PLATFORM, RCQUEST_VANILLA, RA_SHADOW_TEMPLE, { Tricks::Tag::NOVICE }, + "Shadow Temple Invisible Moving Platform without Lens of Truth", + "Removes the requirements for the Lens of Truth in Shadow Temple to cross the invisible moving platform " + "in the huge pit room in either direction."); + OPT_TRICK(RT_LENS_BONGO, RCQUEST_BOTH, RA_SHADOW_TEMPLE, { Tricks::Tag::NOVICE }, + "Shadow Temple Bongo Bongo without Lens of Truth", + "Bongo Bongo can be defeated without the use of Lens of Truth, as the hands give a pretty good idea of " + "where the eye is."); + OPT_TRICK(RT_SHADOW_UMBRELLA, RCQUEST_BOTH, RA_SHADOW_TEMPLE, { Tricks::Tag::EXPERT }, + "Shadow Temple Stone Umbrella Skip", + "A very precise Hover Boots movement from off of the lower chest can get you on top of the crushing " + "spikes without needing to pull the block. Applies to both Vanilla and Master Quest."); + OPT_TRICK(RT_SHADOW_UMBRELLA_GS, RCQUEST_BOTH, RA_SHADOW_TEMPLE, { Tricks::Tag::EXPERT }, + "Shadow Temple Falling Spikes GS with Hover Boots", + "After killing the Skulltula, a very precise Hover Boots movement from off of the lower chest can get " + "you on top of the crushing spikes without needing to pull the block. From there, another very precise " + "Hover Boots movement can be used to obtain the token without needing the Hookshot. Applies to both " + "Vanilla and Master Quest. For obtaining the chests in this room with just Hover Boots, be sure to " + "enable \"Shadow Temple Stone Umbrella Skip\"."); + OPT_TRICK(RT_SHADOW_FREESTANDING_KEY, RCQUEST_VANILLA, RA_SHADOW_TEMPLE, { Tricks::Tag::NOVICE }, + "Shadow Temple Freestanding Key with Bombchu", + "Release the Bombchu with good timing so that it explodes near the bottom of the pot."); + OPT_TRICK(RT_SHADOW_STATUE, RCQUEST_BOTH, RA_SHADOW_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Shadow Temple River Statue with Bombchu", + "By sending a Bombchu around the edge of the gorge, you can knock down the statue without needing a Bow. " + "Applies in both Vanilla and MQ Shadow."); + OPT_TRICK(RT_SHADOW_BONGO, RCQUEST_BOTH, RA_SHADOW_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Shadow Temple Bongo Bongo without projectiles", + "Using precise sword slashes, Bongo Bongo can be defeated without using projectiles. This is only " + "relevant in conjunction with Shadow Temple dungeon shortcuts or shuffled boss entrances."); + OPT_TRICK(RT_LENS_SHADOW_MQ, RCQUEST_MQ, RA_SHADOW_TEMPLE, { Tricks::Tag::NOVICE }, + "Shadow Temple MQ Stationary Objects without Lens of Truth", + "Removes the requirements for the Lens of Truth in Shadow Temple MQ for most areas in the dungeon. See " + "\"Shadow Temple MQ Invisible Moving Platform without Lens of Truth\", \"Shadow Temple MQ Invisible " + "Blades Silver Rupees without Lens of Truth\", \"Shadow Temple MQ 2nd Dead Hand without Lens of Truth\", " + "and \"Shadow Temple Bongo Bongo without Lens of Truth\" for exceptions."); + OPT_TRICK(RT_LENS_SHADOW_MQ_INVISIBLE_BLADES, RCQUEST_MQ, RA_SHADOW_TEMPLE, { Tricks::Tag::NOVICE }, + "Shadow Temple MQ Invisible Blades Silver Rupees without Lens of Truth", + "Removes the requirement for the Lens of Truth or Nayru's Love in Shadow Temple MQ for the Invisible " + "Blades room Silver Rupee collection."); + OPT_TRICK(RT_LENS_SHADOW_MQ_PLATFORM, RCQUEST_MQ, RA_SHADOW_TEMPLE, { Tricks::Tag::NOVICE }, + "Shadow Temple MQ Invisible Moving Platform without Lens of Truth", + "Removes the requirements for the Lens of Truth in Shadow Temple MQ to cross the invisible moving " + "platform in the huge pit room in either direction."); + OPT_TRICK(RT_LENS_SHADOW_MQ_DEADHAND, RCQUEST_MQ, RA_SHADOW_TEMPLE, { Tricks::Tag::NOVICE }, + "Shadow Temple MQ 2nd Dead Hand without Lens of Truth", + "Dead Hand spawns in a random spot within the room. Having Lens removes the hassle of having to comb the " + "room looking for his spawn location."); + OPT_TRICK(RT_SHADOW_MQ_GAP, RCQUEST_MQ, RA_SHADOW_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Shadow Temple MQ Truth Spinner Gap with Longshot", + "You can Longshot a torch and jump-slash recoil onto the tongue. It works best if you Longshot the right " + "torch from the left side of the room."); + OPT_TRICK( + RT_SHADOW_MQ_INVISIBLE_BLADES, RCQUEST_MQ, RA_SHADOW_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Shadow Temple MQ Invisible Blades without Song of Time", + "The Like Like can be used to boost you into the Silver Rupee or Recovery Hearts that normally require Song of " + "Time. This cannot be performed on OHKO since the Like Like does not boost you high enough if you die."); + OPT_TRICK(RT_SHADOW_MQ_HUGE_PIT, RCQUEST_MQ, RA_SHADOW_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Shadow Temple MQ Lower Huge Pit without Fire Source", + "Normally a frozen eye switch spawns some platforms that you can use to climb down, but there's actually " + "a small piece of ground that you can stand on that you can just jump down to."); + OPT_TRICK( + RT_SHADOW_MQ_WINDY_WALKWAY, RCQUEST_MQ, RA_SHADOW_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Shadow Temple MQ Windy Walkway Reverse without Hover Boots", + "It is possible to jump from the alcove in the windy hallway to the middle platform. There are two methods: " + "wait out the fan opposite the door and hold forward, or jump to the right to be pushed by the fan there " + "towards the platform ledge. Note that jumps of this distance are inconsistent, but still possible."); + OPT_TRICK(RT_LENS_SPIRIT, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, { Tricks::Tag::NOVICE }, + "Spirit Temple without Lens of Truth", + "Removes the requirements for the Lens of Truth in Spirit Temple."); + OPT_TRICK(RT_SPIRIT_CHILD_CHU, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, { Tricks::Tag::NOVICE }, + "Spirit Temple Child Side Bridge with Bombchu", "A carefully-timed Bombchu can hit the switch."); + OPT_TRICK(RT_SPIRIT_LOBBY_GS, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, { Tricks::Tag::NOVICE }, + "Spirit Temple Main Room GS with Boomerang", + "Standing on the highest part of the arm of the statue, a precise Boomerang throw can kill and obtain " + "this Gold Skulltula. You must throw the Boomerang slightly off to the side so that it curves into the " + "Skulltula, as aiming directly at it will clank off of the wall in front."); + OPT_TRICK(RT_SPIRIT_LOWER_ADULT_SWITCH, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, { Tricks::Tag::ADVANCED }, + "Spirit Temple Lower Adult Switch with Bombs", + "A bomb can be used to hit the switch on the ceiling, but it must be thrown from a particular distance " + "away and with precise timing."); + OPT_TRICK( + RT_SPIRIT_LOBBY_JUMP, RCQUEST_BOTH, RA_SPIRIT_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Spirit Temple Main Room Jump from Hands to Upper Ledges", + "A precise jump to obtain the following as adult without needing one of Hover Boots, or Hookshot (in Vanilla) " + "or Song of Time (in MQ): - Spirit Temple Statue Room Northeast Chest - Spirit Temple GS Lobby - Spirit Temple " + "MQ Central Chamber Top Left Pot (Left) - Spirit Temple MQ Central Chamber Top Left Pot (Right)"); + // disabled since "Spirit Temple boss shortcuts" (pre-lowers the platform where you break the statues face) isn't a + // setting in ship OPT_TRICK(RT_SPIRIT_PLATFORM_HOOKSHOT, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, + // {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Main Room Hookshot to Boss Platform", "Precise hookshot aiming at the + // platform chains can be used to reach the boss platform from the middle landings. Using a jump slash immediately + // after reaching a chain makes aiming more lenient. Relevant only when Spirit Temple boss shortcuts are on."); + OPT_TRICK(RT_SPIRIT_MAP_CHEST, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, { Tricks::Tag::NOVICE }, + "Spirit Temple Map Chest with Bow", + "To get a line of sight from the upper torch to the map chest torches, you must pull an Armos statue all " + "the way up the stairs."); + OPT_TRICK(RT_SPIRIT_SUN_CHEST, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, { Tricks::Tag::ADVANCED }, + "Spirit Temple Sun Block Room Chest with Bow", + "Using the blocks in the room as platforms you can get lines of sight to all three torches. The timer on " + "the torches is quite short so you must move quickly in order to light all three."); + OPT_TRICK( + RT_SPIRIT_WALL, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Spirit Temple Shifting Wall with No Additional Items", + "Logic normally guarantees a way of dealing with both the Beamos and the Walltula before climbing the wall."); + OPT_TRICK(RT_LENS_SPIRIT_MQ, RCQUEST_MQ, RA_SPIRIT_TEMPLE, { Tricks::Tag::NOVICE }, + "Spirit Temple MQ without Lens of Truth", + "Removes the requirements for the Lens of Truth in Spirit Temple MQ."); + OPT_TRICK(RT_SPIRIT_MQ_SUN_BLOCK_SOT, RCQUEST_MQ, RA_SPIRIT_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Spirit Temple MQ Sun Block Room as Child without Song of Time", + "While adult can easily jump directly to the switch that unbars the door to the sun block room, child " + "Link cannot make the jump without spawning a Song of Time block to jump from. You can skip this by " + "throwing the crate down onto the switch from above, which does unbar the door, however the crate " + "immediately breaks, so you must move quickly to get through the door before it closes back up."); + OPT_TRICK(RT_SPIRIT_MQ_SUN_BLOCK_GS, RCQUEST_MQ, RA_SPIRIT_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Spirit Temple MQ Sun Block Room GS with Boomerang", + "Throw the Boomerang in such a way that it curves through the side of the glass block to hit the Gold " + "Skulltula."); + OPT_TRICK(RT_SPIRIT_MQ_LOWER_ADULT, RCQUEST_MQ, RA_SPIRIT_TEMPLE, { Tricks::Tag::INTERMEDIATE }, + "Spirit Temple MQ Lower Adult without Fire Arrows", + "By standing in a precise position it is possible to light two of the torches with a single use of " + "Din\'s Fire. This saves enough time to be able to light all three torches with only Din\'s Fire."); + OPT_TRICK(RT_SPIRIT_MQ_FROZEN_EYE, RCQUEST_MQ, RA_SPIRIT_TEMPLE, { Tricks::Tag::NOVICE }, + "Spirit Temple MQ Frozen Eye Switch without Fire", + "You can melt the ice by shooting an arrow through a torch. The only way to find a line of sight for " + "this shot is to first spawn a Song of Time block, and then stand on the very edge of it."); + OPT_TRICK(RT_ICE_BLOCK_GS, RCQUEST_VANILLA, RA_ICE_CAVERN, { Tricks::Tag::INTERMEDIATE }, + "Ice Cavern Block Room GS with Hover Boots", + "The Hover Boots can be used to get in front of the Skulltula to kill it with a jump slash. Then, the " + "Hover Boots can again be used to obtain the Token, all without Hookshot or Boomerang."); + OPT_TRICK(RT_ICE_MQ_RED_ICE_GS, RCQUEST_MQ, RA_ICE_CAVERN, { Tricks::Tag::INTERMEDIATE }, + "Ice Cavern MQ Red Ice GS without Song of Time", + "If you side-hop into the perfect position, you can briefly stand on the platform with the red ice just " + "long enough to dump some blue fire."); + OPT_TRICK(RT_ICE_MQ_SCARECROW, RCQUEST_MQ, RA_ICE_CAVERN, { Tricks::Tag::INTERMEDIATE }, + "Ice Cavern MQ Scarecrow GS with No Additional Items", + "As adult a precise jump can be used to reach this alcove."); + OPT_TRICK(RT_LENS_GTG, RCQUEST_VANILLA, RA_GERUDO_TRAINING_GROUND, { Tricks::Tag::NOVICE }, + "Gerudo Training Ground without Lens of Truth", + "Removes the requirements for the Lens of Truth in Gerudo Training Ground."); + OPT_TRICK(RT_GTG_WITHOUT_HOOKSHOT, RCQUEST_VANILLA, RA_GERUDO_TRAINING_GROUND, { Tricks::Tag::INTERMEDIATE }, + "Gerudo Training Ground Left Side Silver Rupees without Hookshot", + "After collecting the rest of the Silver Rupees in the room, you can reach the final Silver Rupee on the " + "ceiling by being pulled up into it after getting grabbed by the Wallmaster. Then, you must also reach " + "the exit of the room without the use of the Hookshot. If you move quickly you can sneak past the edge " + "of a flame wall before it can rise up to block you. To do so without taking damage is more precise."); + OPT_TRICK(RT_GTG_FAKE_WALL, RCQUEST_BOTH, RA_GERUDO_TRAINING_GROUND, { Tricks::Tag::NOVICE }, + "Reach Gerudo Training Ground Fake Wall Ledge with Hover Boots", + "A precise Hover Boots use from the top of the chest can allow you to grab the ledge without needing the " + "usual requirements. In Master Quest, this always skips a Song of Time requirement. In Vanilla, this " + "skips a Hookshot requirement, but is only relevant if \"Gerudo Training Ground Left Side Silver Rupees " + "without Hookshot\" is enabled."); + OPT_TRICK(RT_LENS_GTG_MQ, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, { Tricks::Tag::NOVICE }, + "Gerudo Training Ground MQ without Lens of Truth", + "Removes the requirements for the Lens of Truth in Gerudo Training Ground MQ."); + OPT_TRICK(RT_GTG_MQ_WITH_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, { Tricks::Tag::NOVICE }, + "Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot", + "The highest Silver Rupee can be obtained by hookshooting the target and then immediately jump slashing " + "toward the Rupee."); + OPT_TRICK(RT_GTG_MQ_WITHOUT_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, { Tricks::Tag::INTERMEDIATE }, + "Gerudo Training Ground MQ Left Side Silver Rupees without Hookshot", + "After collecting the rest of the Silver Rupees in the room, you can reach the final Silver Rupee on the " + "ceiling by being pulled up into it after getting grabbed by the Wallmaster. The Wallmaster will not " + "track you to directly underneath the rupee. You should take the last step to be under the rupee after " + "the Wallmaster has begun its attempt to grab you. Also included with this trick is that fact that the " + "switch that unbars the door to the final chest of GTG can be hit without a projectile, using a precise " + "jump slash. This trick supersedes \"Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot\"."); + OPT_TRICK(RT_LENS_GANON, RCQUEST_VANILLA, RA_GANONS_CASTLE, { Tricks::Tag::NOVICE }, + "Ganon\'s Castle without Lens of Truth", + "Removes the requirements for the Lens of Truth in Ganon's Castle."); + OPT_TRICK(RT_GANON_SPIRIT_TRIAL_HOOKSHOT, RCQUEST_VANILLA, RA_GANONS_CASTLE, { Tricks::Tag::NOVICE }, + "Spirit Trial without Hookshot", + "The highest rupee can be obtained as either age by performing a precise jump and a well-timed jumpslash " + "off of an Armos."); + OPT_TRICK(RT_LENS_GANON_MQ, RCQUEST_MQ, RA_GANONS_CASTLE, { Tricks::Tag::NOVICE }, + "Ganon\'s Castle MQ without Lens of Truth", + "Removes the requirements for the Lens of Truth in Ganon's Castle MQ."); + OPT_TRICK(RT_GANON_MQ_FIRE_TRIAL, RCQUEST_MQ, RA_GANONS_CASTLE, { Tricks::Tag::ADVANCED }, + "Fire Trial MQ with Hookshot", + "It's possible to hook the target at the end of fire trial with just Hookshot, but it requires precise " + "aim and perfect positioning. The main difficulty comes from getting on the very corner of the obelisk " + "without falling into the lava."); + OPT_TRICK(RT_GANON_MQ_SHADOW_TRIAL, RCQUEST_MQ, RA_GANONS_CASTLE, { Tricks::Tag::NOVICE }, + "Shadow Trial MQ Torch with Bow", + "You can light the torch in this room without a fire source by shooting an arrow through the lit torch " + "at the beginning of the room. Because the room is so dark and the unlit torch is so far away, it can be " + "difficult to aim the shot correctly."); + OPT_TRICK(RT_GANON_MQ_LIGHT_TRIAL, RCQUEST_MQ, RA_GANONS_CASTLE, { Tricks::Tag::INTERMEDIATE }, + "Light Trial MQ without Hookshot", + "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. In " + "this case to do it without taking damage is especially precise."); mOptionGroups[RSG_LOGIC] = OptionGroup::SubGroup("Logic Options", { - &mOptions[RSK_LOGIC_RULES], - &mOptions[RSK_ALL_LOCATIONS_REACHABLE], - &mOptions[RSK_SKULLS_SUNS_SONG], - }); + &mOptions[RSK_LOGIC_RULES], + &mOptions[RSK_ALL_LOCATIONS_REACHABLE], + &mOptions[RSK_SKULLS_SUNS_SONG], + }); // TODO: Exclude Locations Menus mTricksByArea.clear(); std::vector tricksOption; @@ -552,560 +1166,585 @@ void Settings::CreateOptions() { } mOptionGroups[RSG_TRICKS] = OptionGroup::SubGroup("Logical Tricks", tricksOption); // TODO: Glitches - mOptionGroups[RSG_AREA_ACCESS_IMGUI] = OptionGroup::SubGroup("Area Access", { - &mOptions[RSK_FOREST], - &mOptions[RSK_KAK_GATE], - &mOptions[RSK_DOOR_OF_TIME], - &mOptions[RSK_ZORAS_FOUNTAIN], - &mOptions[RSK_SLEEPING_WATERFALL], - &mOptions[RSK_LOCK_OVERWORLD_DOORS], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_WORLD_IMGUI] = OptionGroup::SubGroup("World Settings", { - &mOptions[RSK_STARTING_AGE], - &mOptions[RSK_GERUDO_FORTRESS], - &mOptions[RSK_RAINBOW_BRIDGE], - &mOptions[RSK_BRIDGE_OPTIONS], - &mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT], - &mOptions[RSK_GANONS_TRIALS], - &mOptions[RSK_TRIAL_COUNT], - &mOptions[RSK_MQ_DUNGEON_RANDOM], - &mOptions[RSK_MQ_DUNGEON_COUNT], - &mOptions[RSK_MQ_DUNGEON_SET], - &mOptions[RSK_MQ_DEKU_TREE], - &mOptions[RSK_MQ_DODONGOS_CAVERN], - &mOptions[RSK_MQ_JABU_JABU], - &mOptions[RSK_MQ_FOREST_TEMPLE], - &mOptions[RSK_MQ_FIRE_TEMPLE], - &mOptions[RSK_MQ_WATER_TEMPLE], - &mOptions[RSK_MQ_SPIRIT_TEMPLE], - &mOptions[RSK_MQ_SHADOW_TEMPLE], - &mOptions[RSK_MQ_BOTTOM_OF_THE_WELL], - &mOptions[RSK_MQ_ICE_CAVERN], - &mOptions[RSK_MQ_GTG], - &mOptions[RSK_MQ_GANONS_CASTLE], - &mOptions[RSK_TRIFORCE_HUNT], - &mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], - &mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED] - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_SHUFFLE_ENTRANCES_IMGUI] = OptionGroup::SubGroup("Shuffle Entrances", { - &mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES], - &mOptions[RSK_SHUFFLE_BOSS_ENTRANCES], - &mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES], - &mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES], - &mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES], - &mOptions[RSK_SHUFFLE_OWL_DROPS], - &mOptions[RSK_SHUFFLE_WARP_SONGS], - &mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS], - &mOptions[RSK_DECOUPLED_ENTRANCES], - &mOptions[RSK_MIXED_ENTRANCE_POOLS], - &mOptions[RSK_MIX_DUNGEON_ENTRANCES], - &mOptions[RSK_MIX_BOSS_ENTRANCES], - &mOptions[RSK_MIX_OVERWORLD_ENTRANCES], - &mOptions[RSK_MIX_INTERIOR_ENTRANCES], - &mOptions[RSK_MIX_GROTTO_ENTRANCES] - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_WORLD_IMGUI_TABLE] = OptionGroup::SubGroup("World", { - &mOptionGroups[RSG_AREA_ACCESS_IMGUI], - &mOptionGroups[RSG_WORLD_IMGUI], - &mOptionGroups[RSG_SHUFFLE_ENTRANCES_IMGUI], - }, WidgetContainerType::TABLE); - mOptionGroups[RSG_SHUFFLE_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Items", { - &mOptions[RSK_SHUFFLE_SONGS], - &mOptions[RSK_SHUFFLE_TOKENS], - &mOptions[RSK_SKULLS_SUNS_SONG], - &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], - &mOptions[RSK_SHUFFLE_MASTER_SWORD], - &mOptions[RSK_SHUFFLE_CHILD_WALLET], - &mOptions[RSK_INCLUDE_TYCOON_WALLET], - &mOptions[RSK_SHUFFLE_OCARINA], - &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], - &mOptions[RSK_SHUFFLE_SWIM], - &mOptions[RSK_SHUFFLE_WEIRD_EGG], - &mOptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD], - &mOptions[RSK_SHUFFLE_FISHING_POLE], - &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], - &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], - &mOptions[RSK_SHUFFLE_FREESTANDING], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI] = OptionGroup::SubGroup("Shuffle NPCs & Merchants", { - &mOptions[RSK_SHOPSANITY], - &mOptions[RSK_SHOPSANITY_COUNT], - &mOptions[RSK_SHOPSANITY_PRICES], - &mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE], - &mOptions[RSK_SHOPSANITY_PRICES_RANGE_1], - &mOptions[RSK_SHOPSANITY_PRICES_RANGE_2], - &mOptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE], - &mOptions[RSK_FISHSANITY], - &mOptions[RSK_FISHSANITY_POND_COUNT], - &mOptions[RSK_FISHSANITY_AGE_SPLIT], - &mOptions[RSK_SHUFFLE_SCRUBS], - &mOptions[RSK_SCRUBS_PRICES], - &mOptions[RSK_SCRUBS_PRICES_FIXED_PRICE], - &mOptions[RSK_SCRUBS_PRICES_RANGE_1], - &mOptions[RSK_SCRUBS_PRICES_RANGE_2], - &mOptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_AFFORDABLE], - &mOptions[RSK_SHUFFLE_BEEHIVES], - &mOptions[RSK_SHUFFLE_COWS], - &mOptions[RSK_SHUFFLE_POTS], - &mOptions[RSK_SHUFFLE_MERCHANTS], - &mOptions[RSK_MERCHANT_PRICES], - &mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE], - &mOptions[RSK_MERCHANT_PRICES_RANGE_1], - &mOptions[RSK_MERCHANT_PRICES_RANGE_2], - &mOptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_AFFORDABLE], - &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], - &mOptions[RSK_SHUFFLE_ADULT_TRADE], - &mOptions[RSK_SHUFFLE_100_GS_REWARD], - &mOptions[RSK_SHUFFLE_BOSS_SOULS], - &mOptions[RSK_SHUFFLE_FAIRIES], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Dungeon Items", { - &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], - &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], - &mOptions[RSK_KEYSANITY], - &mOptions[RSK_GERUDO_KEYS], - &mOptions[RSK_BOSS_KEYSANITY], - &mOptions[RSK_GANONS_BOSS_KEY], - &mOptions[RSK_LACS_STONE_COUNT], - &mOptions[RSK_LACS_MEDALLION_COUNT], - &mOptions[RSK_LACS_DUNGEON_COUNT], - &mOptions[RSK_LACS_REWARD_COUNT], - &mOptions[RSK_LACS_TOKEN_COUNT], - &mOptions[RSK_LACS_OPTIONS], - &mOptions[RSK_KEYRINGS], - &mOptions[RSK_KEYRINGS_RANDOM_COUNT], - &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], - &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], - &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], - &mOptions[RSK_KEYRINGS_WATER_TEMPLE], - &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], - &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], - &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], - &mOptions[RSK_KEYRINGS_GTG], - &mOptions[RSK_KEYRINGS_GANONS_CASTLE], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_ITEMS_IMGUI_TABLE] = OptionGroup::SubGroup("Items", { - &mOptionGroups[RSG_SHUFFLE_ITEMS_IMGUI], - &mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI], - &mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI], - }, WidgetContainerType::TABLE); - mOptionGroups[RSG_TIMESAVERS_IMGUI] = OptionGroup::SubGroup("Timesavers", { - &mOptions[RSK_CUCCO_COUNT], - &mOptions[RSK_BIG_POE_COUNT], - &mOptions[RSK_SKIP_CHILD_ZELDA], - &mOptions[RSK_SKIP_EPONA_RACE], - &mOptions[RSK_COMPLETE_MASK_QUEST], - &mOptions[RSK_SKIP_SCARECROWS_SONG] - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI] = OptionGroup::SubGroup("", { - &mOptions[RSK_ITEM_POOL], - &mOptions[RSK_ICE_TRAPS], - &mOptions[RSK_GOSSIP_STONE_HINTS], - &mOptions[RSK_HINT_CLARITY], - &mOptions[RSK_HINT_DISTRIBUTION], - }, WidgetContainerType::SECTION); - mOptionGroups[RSG_EXTRA_HINTS_IMGUI] = OptionGroup::SubGroup("Extra Hints", { - &mOptions[RSK_TOT_ALTAR_HINT], - &mOptions[RSK_GANONDORF_HINT], - &mOptions[RSK_SHEIK_LA_HINT], - &mOptions[RSK_DAMPES_DIARY_HINT], - &mOptions[RSK_GREG_HINT], - &mOptions[RSK_LOACH_HINT], - &mOptions[RSK_SARIA_HINT], - &mOptions[RSK_FROGS_HINT], - &mOptions[RSK_OOT_HINT], - &mOptions[RSK_BIGGORON_HINT], - &mOptions[RSK_BIG_POES_HINT], - &mOptions[RSK_CHICKENS_HINT], - &mOptions[RSK_MALON_HINT], - &mOptions[RSK_HBA_HINT], - &mOptions[RSK_FISHING_POLE_HINT], - &mOptions[RSK_WARP_SONG_HINTS], - &mOptions[RSK_SCRUB_TEXT_HINT], - &mOptions[RSK_MERCHANT_TEXT_HINT], - &mOptions[RSK_KAK_10_SKULLS_HINT], - &mOptions[RSK_KAK_20_SKULLS_HINT], - &mOptions[RSK_KAK_30_SKULLS_HINT], - &mOptions[RSK_KAK_40_SKULLS_HINT], - &mOptions[RSK_KAK_50_SKULLS_HINT], - &mOptions[RSK_KAK_100_SKULLS_HINT], - &mOptions[RSK_MASK_SHOP_HINT] - }, WidgetContainerType::SECTION, "This setting adds some hints at locations other than Gossip Stones."); - mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI_COLUMN] = OptionGroup::SubGroup("Item Pool & Hints", std::initializer_list{ - &mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI], - &mOptionGroups[RSG_EXTRA_HINTS_IMGUI], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_ADDITIONAL_FEATURES_IMGUI] = OptionGroup::SubGroup("Additional Features", { - &mOptions[RSK_FULL_WALLETS], - &mOptions[RSK_BOMBCHU_BAG], - &mOptions[RSK_ENABLE_BOMBCHU_DROPS], - &mOptions[RSK_BLUE_FIRE_ARROWS], - &mOptions[RSK_SUNLIGHT_ARROWS], - &mOptions[RSK_INFINITE_UPGRADES], - &mOptions[RSK_SKELETON_KEY], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_GAMEPLAY_IMGUI_TABLE] = OptionGroup::SubGroup("Gameplay", { - &mOptionGroups[RSG_TIMESAVERS_IMGUI], - &mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI_COLUMN], - &mOptionGroups[RSG_ADDITIONAL_FEATURES_IMGUI] - }, WidgetContainerType::TABLE); - mOptionGroups[RSG_STARTING_EQUIPMENT_IMGUI] = OptionGroup::SubGroup("Starting Equipment", { - &mOptions[RSK_LINKS_POCKET], - &mOptions[RSK_STARTING_KOKIRI_SWORD], - &mOptions[RSK_STARTING_MASTER_SWORD], - &mOptions[RSK_STARTING_DEKU_SHIELD] - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_STARTING_ITEMS_IMGUI] = OptionGroup::SubGroup("Starting Items", { - &mOptions[RSK_STARTING_OCARINA], - &mOptions[RSK_STARTING_STICKS], - &mOptions[RSK_STARTING_NUTS], - &mOptions[RSK_STARTING_SKULLTULA_TOKEN], - &mOptions[RSK_STARTING_HEARTS], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_STARTING_NORMAL_SONGS_IMGUI] = OptionGroup::SubGroup("Normal Songs", { - &mOptions[RSK_STARTING_ZELDAS_LULLABY], - &mOptions[RSK_STARTING_EPONAS_SONG], - &mOptions[RSK_STARTING_SARIAS_SONG], - &mOptions[RSK_STARTING_SUNS_SONG], - &mOptions[RSK_STARTING_SONG_OF_TIME], - &mOptions[RSK_STARTING_SONG_OF_STORMS], - }, WidgetContainerType::SECTION); - mOptionGroups[RSG_STARTING_WARP_SONGS_IMGUI] = OptionGroup::SubGroup("Warp Songs", { - &mOptions[RSK_STARTING_MINUET_OF_FOREST], - &mOptions[RSK_STARTING_BOLERO_OF_FIRE], - &mOptions[RSK_STARTING_SERENADE_OF_WATER], - &mOptions[RSK_STARTING_REQUIEM_OF_SPIRIT], - &mOptions[RSK_STARTING_NOCTURNE_OF_SHADOW], - &mOptions[RSK_STARTING_PRELUDE_OF_LIGHT] - }, WidgetContainerType::SECTION); - mOptionGroups[RSG_STARTING_SONGS_IMGUI] = OptionGroup::SubGroup("Starting Songs", std::initializer_list({ - &mOptionGroups[RSG_STARTING_NORMAL_SONGS_IMGUI], - &mOptionGroups[RSG_STARTING_WARP_SONGS_IMGUI], - }), WidgetContainerType::COLUMN); - mOptionGroups[RSG_STARTING_INVENTORY_IMGUI_TABLE] = OptionGroup::SubGroup("Starting Inventory", { - &mOptionGroups[RSG_STARTING_EQUIPMENT_IMGUI], - &mOptionGroups[RSG_STARTING_ITEMS_IMGUI], - &mOptionGroups[RSG_STARTING_SONGS_IMGUI] - }, WidgetContainerType::TABLE); + mOptionGroups[RSG_AREA_ACCESS_IMGUI] = OptionGroup::SubGroup("Area Access", + { + &mOptions[RSK_FOREST], + &mOptions[RSK_KAK_GATE], + &mOptions[RSK_DOOR_OF_TIME], + &mOptions[RSK_ZORAS_FOUNTAIN], + &mOptions[RSK_SLEEPING_WATERFALL], + &mOptions[RSK_LOCK_OVERWORLD_DOORS], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_WORLD_IMGUI] = OptionGroup::SubGroup("World Settings", + { &mOptions[RSK_STARTING_AGE], + &mOptions[RSK_GERUDO_FORTRESS], + &mOptions[RSK_RAINBOW_BRIDGE], + &mOptions[RSK_BRIDGE_OPTIONS], + &mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT], + &mOptions[RSK_GANONS_TRIALS], + &mOptions[RSK_TRIAL_COUNT], + &mOptions[RSK_MQ_DUNGEON_RANDOM], + &mOptions[RSK_MQ_DUNGEON_COUNT], + &mOptions[RSK_MQ_DUNGEON_SET], + &mOptions[RSK_MQ_DEKU_TREE], + &mOptions[RSK_MQ_DODONGOS_CAVERN], + &mOptions[RSK_MQ_JABU_JABU], + &mOptions[RSK_MQ_FOREST_TEMPLE], + &mOptions[RSK_MQ_FIRE_TEMPLE], + &mOptions[RSK_MQ_WATER_TEMPLE], + &mOptions[RSK_MQ_SPIRIT_TEMPLE], + &mOptions[RSK_MQ_SHADOW_TEMPLE], + &mOptions[RSK_MQ_BOTTOM_OF_THE_WELL], + &mOptions[RSK_MQ_ICE_CAVERN], + &mOptions[RSK_MQ_GTG], + &mOptions[RSK_MQ_GANONS_CASTLE], + &mOptions[RSK_TRIFORCE_HUNT], + &mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], + &mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED] }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_SHUFFLE_ENTRANCES_IMGUI] = OptionGroup::SubGroup( + "Shuffle Entrances", + { &mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES], &mOptions[RSK_SHUFFLE_BOSS_ENTRANCES], + &mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES], &mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES], + &mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES], &mOptions[RSK_SHUFFLE_OWL_DROPS], &mOptions[RSK_SHUFFLE_WARP_SONGS], + &mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS], &mOptions[RSK_DECOUPLED_ENTRANCES], + &mOptions[RSK_MIXED_ENTRANCE_POOLS], &mOptions[RSK_MIX_DUNGEON_ENTRANCES], &mOptions[RSK_MIX_BOSS_ENTRANCES], + &mOptions[RSK_MIX_OVERWORLD_ENTRANCES], &mOptions[RSK_MIX_INTERIOR_ENTRANCES], + &mOptions[RSK_MIX_GROTTO_ENTRANCES] }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_WORLD_IMGUI_TABLE] = OptionGroup::SubGroup("World", + { + &mOptionGroups[RSG_AREA_ACCESS_IMGUI], + &mOptionGroups[RSG_WORLD_IMGUI], + &mOptionGroups[RSG_SHUFFLE_ENTRANCES_IMGUI], + }, + WidgetContainerType::TABLE); + mOptionGroups[RSG_SHUFFLE_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Items", + { + &mOptions[RSK_SHUFFLE_SONGS], + &mOptions[RSK_SHUFFLE_TOKENS], + &mOptions[RSK_SKULLS_SUNS_SONG], + &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], + &mOptions[RSK_SHUFFLE_MASTER_SWORD], + &mOptions[RSK_SHUFFLE_CHILD_WALLET], + &mOptions[RSK_INCLUDE_TYCOON_WALLET], + &mOptions[RSK_SHUFFLE_OCARINA], + &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], + &mOptions[RSK_SHUFFLE_SWIM], + &mOptions[RSK_SHUFFLE_WEIRD_EGG], + &mOptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD], + &mOptions[RSK_SHUFFLE_FISHING_POLE], + &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], + &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], + &mOptions[RSK_SHUFFLE_FREESTANDING], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI] = + OptionGroup::SubGroup("Shuffle NPCs & Merchants", + { + &mOptions[RSK_SHOPSANITY], + &mOptions[RSK_SHOPSANITY_COUNT], + &mOptions[RSK_SHOPSANITY_PRICES], + &mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE], + &mOptions[RSK_SHOPSANITY_PRICES_RANGE_1], + &mOptions[RSK_SHOPSANITY_PRICES_RANGE_2], + &mOptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE], + &mOptions[RSK_FISHSANITY], + &mOptions[RSK_FISHSANITY_POND_COUNT], + &mOptions[RSK_FISHSANITY_AGE_SPLIT], + &mOptions[RSK_SHUFFLE_SCRUBS], + &mOptions[RSK_SCRUBS_PRICES], + &mOptions[RSK_SCRUBS_PRICES_FIXED_PRICE], + &mOptions[RSK_SCRUBS_PRICES_RANGE_1], + &mOptions[RSK_SCRUBS_PRICES_RANGE_2], + &mOptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_AFFORDABLE], + &mOptions[RSK_SHUFFLE_BEEHIVES], + &mOptions[RSK_SHUFFLE_COWS], + &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], + &mOptions[RSK_SHUFFLE_MERCHANTS], + &mOptions[RSK_MERCHANT_PRICES], + &mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE], + &mOptions[RSK_MERCHANT_PRICES_RANGE_1], + &mOptions[RSK_MERCHANT_PRICES_RANGE_2], + &mOptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_AFFORDABLE], + &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], + &mOptions[RSK_SHUFFLE_ADULT_TRADE], + &mOptions[RSK_SHUFFLE_100_GS_REWARD], + &mOptions[RSK_SHUFFLE_BOSS_SOULS], + &mOptions[RSK_SHUFFLE_FAIRIES], + &mOptions[RSK_SHUFFLE_GRASS], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI] = + OptionGroup::SubGroup("Shuffle Dungeon Items", + { + &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], + &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], + &mOptions[RSK_KEYSANITY], + &mOptions[RSK_GERUDO_KEYS], + &mOptions[RSK_BOSS_KEYSANITY], + &mOptions[RSK_GANONS_BOSS_KEY], + &mOptions[RSK_LACS_STONE_COUNT], + &mOptions[RSK_LACS_MEDALLION_COUNT], + &mOptions[RSK_LACS_DUNGEON_COUNT], + &mOptions[RSK_LACS_REWARD_COUNT], + &mOptions[RSK_LACS_TOKEN_COUNT], + &mOptions[RSK_LACS_OPTIONS], + &mOptions[RSK_KEYRINGS], + &mOptions[RSK_KEYRINGS_RANDOM_COUNT], + &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], + &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], + &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], + &mOptions[RSK_KEYRINGS_WATER_TEMPLE], + &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], + &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], + &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], + &mOptions[RSK_KEYRINGS_GTG], + &mOptions[RSK_KEYRINGS_GANONS_CASTLE], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_ITEMS_IMGUI_TABLE] = OptionGroup::SubGroup("Items", + { + &mOptionGroups[RSG_SHUFFLE_ITEMS_IMGUI], + &mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI], + &mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI], + }, + WidgetContainerType::TABLE); + mOptionGroups[RSG_TIMESAVERS_IMGUI] = OptionGroup::SubGroup( + "Timesavers", + { &mOptions[RSK_BIG_POE_COUNT], &mOptions[RSK_SKIP_CHILD_ZELDA], &mOptions[RSK_SKIP_EPONA_RACE], + &mOptions[RSK_COMPLETE_MASK_QUEST], &mOptions[RSK_SKIP_SCARECROWS_SONG] }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI] = OptionGroup::SubGroup("", + { + &mOptions[RSK_ITEM_POOL], + &mOptions[RSK_ICE_TRAPS], + &mOptions[RSK_GOSSIP_STONE_HINTS], + &mOptions[RSK_HINT_CLARITY], + &mOptions[RSK_HINT_DISTRIBUTION], + }, + WidgetContainerType::SECTION); + mOptionGroups[RSG_EXTRA_HINTS_IMGUI] = OptionGroup::SubGroup( + "Extra Hints", + { &mOptions[RSK_TOT_ALTAR_HINT], &mOptions[RSK_GANONDORF_HINT], &mOptions[RSK_SHEIK_LA_HINT], + &mOptions[RSK_DAMPES_DIARY_HINT], &mOptions[RSK_GREG_HINT], &mOptions[RSK_LOACH_HINT], + &mOptions[RSK_SARIA_HINT], &mOptions[RSK_FROGS_HINT], &mOptions[RSK_OOT_HINT], + &mOptions[RSK_BIGGORON_HINT], &mOptions[RSK_BIG_POES_HINT], &mOptions[RSK_CHICKENS_HINT], + &mOptions[RSK_MALON_HINT], &mOptions[RSK_HBA_HINT], &mOptions[RSK_FISHING_POLE_HINT], + &mOptions[RSK_WARP_SONG_HINTS], &mOptions[RSK_SCRUB_TEXT_HINT], &mOptions[RSK_MERCHANT_TEXT_HINT], + &mOptions[RSK_KAK_10_SKULLS_HINT], &mOptions[RSK_KAK_20_SKULLS_HINT], &mOptions[RSK_KAK_30_SKULLS_HINT], + &mOptions[RSK_KAK_40_SKULLS_HINT], &mOptions[RSK_KAK_50_SKULLS_HINT], &mOptions[RSK_KAK_100_SKULLS_HINT], + &mOptions[RSK_MASK_SHOP_HINT] }, + WidgetContainerType::SECTION, "This setting adds some hints at locations other than Gossip Stones."); + mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI_COLUMN] = + OptionGroup::SubGroup("Item Pool & Hints", + std::initializer_list{ + &mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI], + &mOptionGroups[RSG_EXTRA_HINTS_IMGUI], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_ADDITIONAL_FEATURES_IMGUI] = OptionGroup::SubGroup("Additional Features", + { + &mOptions[RSK_FULL_WALLETS], + &mOptions[RSK_BOMBCHU_BAG], + &mOptions[RSK_ENABLE_BOMBCHU_DROPS], + &mOptions[RSK_BLUE_FIRE_ARROWS], + &mOptions[RSK_SUNLIGHT_ARROWS], + &mOptions[RSK_INFINITE_UPGRADES], + &mOptions[RSK_SKELETON_KEY], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_GAMEPLAY_IMGUI_TABLE] = + OptionGroup::SubGroup("Gameplay", + { &mOptionGroups[RSG_TIMESAVERS_IMGUI], &mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI_COLUMN], + &mOptionGroups[RSG_ADDITIONAL_FEATURES_IMGUI] }, + WidgetContainerType::TABLE); + mOptionGroups[RSG_STARTING_EQUIPMENT_IMGUI] = + OptionGroup::SubGroup("Starting Equipment", + { &mOptions[RSK_LINKS_POCKET], &mOptions[RSK_STARTING_KOKIRI_SWORD], + &mOptions[RSK_STARTING_MASTER_SWORD], &mOptions[RSK_STARTING_DEKU_SHIELD] }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_STARTING_ITEMS_IMGUI] = OptionGroup::SubGroup("Starting Items", + { + &mOptions[RSK_STARTING_OCARINA], + &mOptions[RSK_STARTING_STICKS], + &mOptions[RSK_STARTING_NUTS], + &mOptions[RSK_STARTING_SKULLTULA_TOKEN], + &mOptions[RSK_STARTING_HEARTS], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_STARTING_NORMAL_SONGS_IMGUI] = OptionGroup::SubGroup("Normal Songs", + { + &mOptions[RSK_STARTING_ZELDAS_LULLABY], + &mOptions[RSK_STARTING_EPONAS_SONG], + &mOptions[RSK_STARTING_SARIAS_SONG], + &mOptions[RSK_STARTING_SUNS_SONG], + &mOptions[RSK_STARTING_SONG_OF_TIME], + &mOptions[RSK_STARTING_SONG_OF_STORMS], + }, + WidgetContainerType::SECTION); + mOptionGroups[RSG_STARTING_WARP_SONGS_IMGUI] = + OptionGroup::SubGroup("Warp Songs", + { &mOptions[RSK_STARTING_MINUET_OF_FOREST], &mOptions[RSK_STARTING_BOLERO_OF_FIRE], + &mOptions[RSK_STARTING_SERENADE_OF_WATER], &mOptions[RSK_STARTING_REQUIEM_OF_SPIRIT], + &mOptions[RSK_STARTING_NOCTURNE_OF_SHADOW], &mOptions[RSK_STARTING_PRELUDE_OF_LIGHT] }, + WidgetContainerType::SECTION); + mOptionGroups[RSG_STARTING_SONGS_IMGUI] = OptionGroup::SubGroup("Starting Songs", + std::initializer_list({ + &mOptionGroups[RSG_STARTING_NORMAL_SONGS_IMGUI], + &mOptionGroups[RSG_STARTING_WARP_SONGS_IMGUI], + }), + WidgetContainerType::COLUMN); + mOptionGroups[RSG_STARTING_INVENTORY_IMGUI_TABLE] = + OptionGroup::SubGroup("Starting Inventory", + { &mOptionGroups[RSG_STARTING_EQUIPMENT_IMGUI], &mOptionGroups[RSG_STARTING_ITEMS_IMGUI], + &mOptionGroups[RSG_STARTING_SONGS_IMGUI] }, + WidgetContainerType::TABLE); mOptionGroups[RSG_OPEN] = OptionGroup("Open Settings", { - &mOptions[RSK_FOREST], - &mOptions[RSK_KAK_GATE], - &mOptions[RSK_DOOR_OF_TIME], - &mOptions[RSK_ZORAS_FOUNTAIN], - &mOptions[RSK_SLEEPING_WATERFALL], - &mOptions[RSK_LOCK_OVERWORLD_DOORS], - &mOptions[RSK_GERUDO_FORTRESS], - &mOptions[RSK_RAINBOW_BRIDGE], - &mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT], - &mOptions[RSK_BRIDGE_OPTIONS], - &mOptions[RSK_GANONS_TRIALS], - &mOptions[RSK_TRIAL_COUNT], - }); + &mOptions[RSK_FOREST], + &mOptions[RSK_KAK_GATE], + &mOptions[RSK_DOOR_OF_TIME], + &mOptions[RSK_ZORAS_FOUNTAIN], + &mOptions[RSK_SLEEPING_WATERFALL], + &mOptions[RSK_LOCK_OVERWORLD_DOORS], + &mOptions[RSK_GERUDO_FORTRESS], + &mOptions[RSK_RAINBOW_BRIDGE], + &mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT], + &mOptions[RSK_BRIDGE_OPTIONS], + &mOptions[RSK_GANONS_TRIALS], + &mOptions[RSK_TRIAL_COUNT], + }); mOptionGroups[RSG_WORLD] = OptionGroup("World Settings", { - &mOptions[RSK_STARTING_AGE], - &mOptions[RSK_SHUFFLE_ENTRANCES], - &mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES], - &mOptions[RSK_SHUFFLE_BOSS_ENTRANCES], - &mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES], - &mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES], - &mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES], - &mOptions[RSK_SHUFFLE_OWL_DROPS], - &mOptions[RSK_SHUFFLE_WARP_SONGS], - &mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS], - &mOptions[RSK_MIXED_ENTRANCE_POOLS], - &mOptions[RSK_MIX_DUNGEON_ENTRANCES], - &mOptions[RSK_MIX_BOSS_ENTRANCES], - &mOptions[RSK_MIX_OVERWORLD_ENTRANCES], - &mOptions[RSK_MIX_INTERIOR_ENTRANCES], - &mOptions[RSK_MIX_GROTTO_ENTRANCES], - &mOptions[RSK_DECOUPLED_ENTRANCES], - &mOptions[RSK_BOMBCHU_BAG], - &mOptions[RSK_ENABLE_BOMBCHU_DROPS], - &mOptions[RSK_TRIFORCE_HUNT], - &mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], - &mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED], - &mOptions[RSK_MQ_DUNGEON_RANDOM], - &mOptions[RSK_MQ_DUNGEON_COUNT], - &mOptions[RSK_MQ_DUNGEON_SET], - }); - mOptionGroups[RSG_SHUFFLE_DUNGEON_QUESTS] = OptionGroup::SubGroup("Shuffle Dungeon Quest", { - &mOptions[RSK_MQ_DEKU_TREE], - &mOptions[RSK_MQ_DODONGOS_CAVERN], - &mOptions[RSK_MQ_JABU_JABU], - &mOptions[RSK_MQ_FOREST_TEMPLE], - &mOptions[RSK_MQ_FIRE_TEMPLE], - &mOptions[RSK_MQ_WATER_TEMPLE], - &mOptions[RSK_MQ_SPIRIT_TEMPLE], - &mOptions[RSK_MQ_SHADOW_TEMPLE], - &mOptions[RSK_MQ_BOTTOM_OF_THE_WELL], - &mOptions[RSK_MQ_ICE_CAVERN], - &mOptions[RSK_MQ_GTG], - &mOptions[RSK_MQ_GANONS_CASTLE] - }); - mOptionGroups[RSG_SHUFFLE] = OptionGroup("Shuffle Settings", { - &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], - &mOptions[RSK_LINKS_POCKET], - &mOptions[RSK_SHUFFLE_SONGS], - &mOptions[RSK_SHOPSANITY], - &mOptions[RSK_SHOPSANITY_COUNT], - &mOptions[RSK_SHOPSANITY_PRICES], - &mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE], - &mOptions[RSK_SHOPSANITY_PRICES_RANGE_1], - &mOptions[RSK_SHOPSANITY_PRICES_RANGE_2], - &mOptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE], - &mOptions[RSK_FISHSANITY], - &mOptions[RSK_FISHSANITY_POND_COUNT], - &mOptions[RSK_FISHSANITY_AGE_SPLIT], - &mOptions[RSK_SHUFFLE_FISHING_POLE], - &mOptions[RSK_SHUFFLE_TOKENS], - &mOptions[RSK_SHUFFLE_SCRUBS], - &mOptions[RSK_SCRUBS_PRICES], - &mOptions[RSK_SCRUBS_PRICES_FIXED_PRICE], - &mOptions[RSK_SCRUBS_PRICES_RANGE_1], - &mOptions[RSK_SCRUBS_PRICES_RANGE_2], - &mOptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_AFFORDABLE], - &mOptions[RSK_SHUFFLE_BEEHIVES], - &mOptions[RSK_SHUFFLE_COWS], - &mOptions[RSK_SHUFFLE_POTS], - &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], - &mOptions[RSK_SHUFFLE_OCARINA], - &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], - &mOptions[RSK_SHUFFLE_SWIM], - &mOptions[RSK_SHUFFLE_WEIRD_EGG], - &mOptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD], - &mOptions[RSK_SHUFFLE_MERCHANTS], - &mOptions[RSK_MERCHANT_PRICES], - &mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE], - &mOptions[RSK_MERCHANT_PRICES_RANGE_1], - &mOptions[RSK_MERCHANT_PRICES_RANGE_2], - &mOptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_AFFORDABLE], - &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], - &mOptions[RSK_SHUFFLE_ADULT_TRADE], - &mOptions[RSK_SHUFFLE_CHEST_MINIGAME], - &mOptions[RSK_SHUFFLE_100_GS_REWARD], - &mOptions[RSK_SHUFFLE_BOSS_SOULS], - &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], - &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], - &mOptions[RSK_SHUFFLE_FREESTANDING], - &mOptions[RSK_SHUFFLE_FAIRIES], - }); - mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS] = OptionGroup("Shuffle Dungeon Items", { - &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], - &mOptions[RSK_KEYSANITY], - &mOptions[RSK_GERUDO_KEYS], - &mOptions[RSK_BOSS_KEYSANITY], - &mOptions[RSK_GANONS_BOSS_KEY], - &mOptions[RSK_LACS_STONE_COUNT], - &mOptions[RSK_LACS_MEDALLION_COUNT], - &mOptions[RSK_LACS_DUNGEON_COUNT], - &mOptions[RSK_LACS_REWARD_COUNT], - &mOptions[RSK_LACS_TOKEN_COUNT], - &mOptions[RSK_LACS_OPTIONS], - &mOptions[RSK_KEYRINGS], - &mOptions[RSK_KEYRINGS_RANDOM_COUNT], - &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], - &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], - &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], - &mOptions[RSK_KEYRINGS_WATER_TEMPLE], - &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], - &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], - &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], - &mOptions[RSK_KEYRINGS_GTG], - &mOptions[RSK_KEYRINGS_GANONS_CASTLE], - }); - mOptionGroups[RSG_STARTING_ITEMS] = OptionGroup::SubGroup("Items", { - &mOptions[RSK_STARTING_OCARINA], - &mOptions[RSK_STARTING_KOKIRI_SWORD], - &mOptions[RSK_STARTING_DEKU_SHIELD] - }); - mOptionGroups[RSG_STARTING_SONGS] = OptionGroup::SubGroup("Ocarina Songs", { - &mOptions[RSK_STARTING_ZELDAS_LULLABY], - &mOptions[RSK_STARTING_EPONAS_SONG], - &mOptions[RSK_STARTING_SARIAS_SONG], - &mOptions[RSK_STARTING_SUNS_SONG], - &mOptions[RSK_STARTING_SONG_OF_TIME], - &mOptions[RSK_STARTING_SONG_OF_STORMS], - &mOptions[RSK_STARTING_SONG_OF_TIME], - &mOptions[RSK_STARTING_MINUET_OF_FOREST], - &mOptions[RSK_STARTING_BOLERO_OF_FIRE], - &mOptions[RSK_STARTING_SERENADE_OF_WATER], - &mOptions[RSK_STARTING_REQUIEM_OF_SPIRIT], - &mOptions[RSK_STARTING_NOCTURNE_OF_SHADOW], - &mOptions[RSK_STARTING_PRELUDE_OF_LIGHT], - }); + &mOptions[RSK_STARTING_AGE], + &mOptions[RSK_SHUFFLE_ENTRANCES], + &mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES], + &mOptions[RSK_SHUFFLE_BOSS_ENTRANCES], + &mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES], + &mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES], + &mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES], + &mOptions[RSK_SHUFFLE_OWL_DROPS], + &mOptions[RSK_SHUFFLE_WARP_SONGS], + &mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS], + &mOptions[RSK_MIXED_ENTRANCE_POOLS], + &mOptions[RSK_MIX_DUNGEON_ENTRANCES], + &mOptions[RSK_MIX_BOSS_ENTRANCES], + &mOptions[RSK_MIX_OVERWORLD_ENTRANCES], + &mOptions[RSK_MIX_INTERIOR_ENTRANCES], + &mOptions[RSK_MIX_GROTTO_ENTRANCES], + &mOptions[RSK_DECOUPLED_ENTRANCES], + &mOptions[RSK_BOMBCHU_BAG], + &mOptions[RSK_ENABLE_BOMBCHU_DROPS], + &mOptions[RSK_TRIFORCE_HUNT], + &mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], + &mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED], + &mOptions[RSK_MQ_DUNGEON_RANDOM], + &mOptions[RSK_MQ_DUNGEON_COUNT], + &mOptions[RSK_MQ_DUNGEON_SET], + }); + mOptionGroups[RSG_SHUFFLE_DUNGEON_QUESTS] = OptionGroup::SubGroup( + "Shuffle Dungeon Quest", + { &mOptions[RSK_MQ_DEKU_TREE], &mOptions[RSK_MQ_DODONGOS_CAVERN], &mOptions[RSK_MQ_JABU_JABU], + &mOptions[RSK_MQ_FOREST_TEMPLE], &mOptions[RSK_MQ_FIRE_TEMPLE], &mOptions[RSK_MQ_WATER_TEMPLE], + &mOptions[RSK_MQ_SPIRIT_TEMPLE], &mOptions[RSK_MQ_SHADOW_TEMPLE], &mOptions[RSK_MQ_BOTTOM_OF_THE_WELL], + &mOptions[RSK_MQ_ICE_CAVERN], &mOptions[RSK_MQ_GTG], &mOptions[RSK_MQ_GANONS_CASTLE] }); + mOptionGroups[RSG_SHUFFLE] = + OptionGroup("Shuffle Settings", { + &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], + &mOptions[RSK_LINKS_POCKET], + &mOptions[RSK_SHUFFLE_SONGS], + &mOptions[RSK_SHOPSANITY], + &mOptions[RSK_SHOPSANITY_COUNT], + &mOptions[RSK_SHOPSANITY_PRICES], + &mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE], + &mOptions[RSK_SHOPSANITY_PRICES_RANGE_1], + &mOptions[RSK_SHOPSANITY_PRICES_RANGE_2], + &mOptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE], + &mOptions[RSK_FISHSANITY], + &mOptions[RSK_FISHSANITY_POND_COUNT], + &mOptions[RSK_FISHSANITY_AGE_SPLIT], + &mOptions[RSK_SHUFFLE_FISHING_POLE], + &mOptions[RSK_SHUFFLE_TOKENS], + &mOptions[RSK_SHUFFLE_SCRUBS], + &mOptions[RSK_SCRUBS_PRICES], + &mOptions[RSK_SCRUBS_PRICES_FIXED_PRICE], + &mOptions[RSK_SCRUBS_PRICES_RANGE_1], + &mOptions[RSK_SCRUBS_PRICES_RANGE_2], + &mOptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_AFFORDABLE], + &mOptions[RSK_SHUFFLE_BEEHIVES], + &mOptions[RSK_SHUFFLE_COWS], + &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], + &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], + &mOptions[RSK_SHUFFLE_OCARINA], + &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], + &mOptions[RSK_SHUFFLE_SWIM], + &mOptions[RSK_SHUFFLE_WEIRD_EGG], + &mOptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD], + &mOptions[RSK_SHUFFLE_MERCHANTS], + &mOptions[RSK_MERCHANT_PRICES], + &mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE], + &mOptions[RSK_MERCHANT_PRICES_RANGE_1], + &mOptions[RSK_MERCHANT_PRICES_RANGE_2], + &mOptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_AFFORDABLE], + &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], + &mOptions[RSK_SHUFFLE_ADULT_TRADE], + &mOptions[RSK_SHUFFLE_CHEST_MINIGAME], + &mOptions[RSK_SHUFFLE_100_GS_REWARD], + &mOptions[RSK_SHUFFLE_BOSS_SOULS], + &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], + &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], + &mOptions[RSK_SHUFFLE_FREESTANDING], + &mOptions[RSK_SHUFFLE_FAIRIES], + }); + mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS] = + OptionGroup("Shuffle Dungeon Items", { + &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], + &mOptions[RSK_KEYSANITY], + &mOptions[RSK_GERUDO_KEYS], + &mOptions[RSK_BOSS_KEYSANITY], + &mOptions[RSK_GANONS_BOSS_KEY], + &mOptions[RSK_LACS_STONE_COUNT], + &mOptions[RSK_LACS_MEDALLION_COUNT], + &mOptions[RSK_LACS_DUNGEON_COUNT], + &mOptions[RSK_LACS_REWARD_COUNT], + &mOptions[RSK_LACS_TOKEN_COUNT], + &mOptions[RSK_LACS_OPTIONS], + &mOptions[RSK_KEYRINGS], + &mOptions[RSK_KEYRINGS_RANDOM_COUNT], + &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], + &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], + &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], + &mOptions[RSK_KEYRINGS_WATER_TEMPLE], + &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], + &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], + &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], + &mOptions[RSK_KEYRINGS_GTG], + &mOptions[RSK_KEYRINGS_GANONS_CASTLE], + }); + mOptionGroups[RSG_STARTING_ITEMS] = + OptionGroup::SubGroup("Items", { &mOptions[RSK_STARTING_OCARINA], &mOptions[RSK_STARTING_KOKIRI_SWORD], + &mOptions[RSK_STARTING_DEKU_SHIELD] }); + mOptionGroups[RSG_STARTING_SONGS] = + OptionGroup::SubGroup("Ocarina Songs", { + &mOptions[RSK_STARTING_ZELDAS_LULLABY], + &mOptions[RSK_STARTING_EPONAS_SONG], + &mOptions[RSK_STARTING_SARIAS_SONG], + &mOptions[RSK_STARTING_SUNS_SONG], + &mOptions[RSK_STARTING_SONG_OF_TIME], + &mOptions[RSK_STARTING_SONG_OF_STORMS], + &mOptions[RSK_STARTING_SONG_OF_TIME], + &mOptions[RSK_STARTING_MINUET_OF_FOREST], + &mOptions[RSK_STARTING_BOLERO_OF_FIRE], + &mOptions[RSK_STARTING_SERENADE_OF_WATER], + &mOptions[RSK_STARTING_REQUIEM_OF_SPIRIT], + &mOptions[RSK_STARTING_NOCTURNE_OF_SHADOW], + &mOptions[RSK_STARTING_PRELUDE_OF_LIGHT], + }); mOptionGroups[RSG_STARTING_OTHER] = OptionGroup::SubGroup("Other", { - &mOptions[RSK_STARTING_STICKS], - &mOptions[RSK_STARTING_NUTS], - &mOptions[RSK_FULL_WALLETS], - &mOptions[RSK_STARTING_SKULLTULA_TOKEN], - &mOptions[RSK_STARTING_HEARTS], - }); - mOptionGroups[RSG_STARTING_INVENTORY] = OptionGroup("Starting Inventory", { - &mOptionGroups[RSG_STARTING_ITEMS], - &mOptionGroups[RSG_STARTING_SONGS], - &mOptionGroups[RSG_STARTING_OTHER], - }, OptionGroupType::DEFAULT); + &mOptions[RSK_STARTING_STICKS], + &mOptions[RSK_STARTING_NUTS], + &mOptions[RSK_FULL_WALLETS], + &mOptions[RSK_STARTING_SKULLTULA_TOKEN], + &mOptions[RSK_STARTING_HEARTS], + }); + mOptionGroups[RSG_STARTING_INVENTORY] = OptionGroup("Starting Inventory", + { + &mOptionGroups[RSG_STARTING_ITEMS], + &mOptionGroups[RSG_STARTING_SONGS], + &mOptionGroups[RSG_STARTING_OTHER], + }, + OptionGroupType::DEFAULT); mOptionGroups[RSG_TIMESAVERS] = OptionGroup("Timesaver Settings", { - &mOptions[RSK_SKIP_CHILD_ZELDA], - &mOptions[RSK_SKIP_EPONA_RACE], - &mOptions[RSK_SKIP_SCARECROWS_SONG], - &mOptions[RSK_BIG_POE_COUNT], - &mOptions[RSK_CUCCO_COUNT], - &mOptions[RSK_COMPLETE_MASK_QUEST], - }); - mOptionGroups[RSG_MISC] = OptionGroup("Miscellaneous Settings", { - &mOptions[RSK_GOSSIP_STONE_HINTS], - &mOptions[RSK_HINT_CLARITY], - &mOptions[RSK_HINT_DISTRIBUTION], - &mOptions[RSK_TOT_ALTAR_HINT], - &mOptions[RSK_GANONDORF_HINT], - &mOptions[RSK_SHEIK_LA_HINT], - &mOptions[RSK_DAMPES_DIARY_HINT], - &mOptions[RSK_GREG_HINT], - &mOptions[RSK_LOACH_HINT], - &mOptions[RSK_SARIA_HINT], - &mOptions[RSK_FROGS_HINT], - &mOptions[RSK_OOT_HINT], - &mOptions[RSK_WARP_SONG_HINTS], - &mOptions[RSK_BIGGORON_HINT], - &mOptions[RSK_BIG_POES_HINT], - &mOptions[RSK_CHICKENS_HINT], - &mOptions[RSK_MALON_HINT], - &mOptions[RSK_HBA_HINT], - &mOptions[RSK_KAK_10_SKULLS_HINT], - &mOptions[RSK_KAK_20_SKULLS_HINT], - &mOptions[RSK_KAK_30_SKULLS_HINT], - &mOptions[RSK_KAK_40_SKULLS_HINT], - &mOptions[RSK_KAK_50_SKULLS_HINT], - &mOptions[RSK_KAK_100_SKULLS_HINT], - &mOptions[RSK_MASK_SHOP_HINT], - &mOptions[RSK_SCRUB_TEXT_HINT], - &mOptions[RSK_MERCHANT_TEXT_HINT], - &mOptions[RSK_FISHING_POLE_HINT], - // TODO: Compasses show Reward/WOTH, Maps show Dungeon Mode, Starting Time - &mOptions[RSK_DAMAGE_MULTIPLIER], - &mOptions[RSK_BLUE_FIRE_ARROWS], - &mOptions[RSK_SUNLIGHT_ARROWS], - &mOptions[RSK_INFINITE_UPGRADES], - &mOptions[RSK_SKELETON_KEY], - }); - mOptionGroups[RSG_ITEM_POOL] = OptionGroup("Item Pool Settings", std::initializer_list({ - &mOptions[RSK_ITEM_POOL], - &mOptions[RSK_ICE_TRAPS] - })); + &mOptions[RSK_SKIP_CHILD_ZELDA], + &mOptions[RSK_SKIP_EPONA_RACE], + &mOptions[RSK_SKIP_SCARECROWS_SONG], + &mOptions[RSK_BIG_POE_COUNT], + &mOptions[RSK_COMPLETE_MASK_QUEST], + }); + mOptionGroups[RSG_MISC] = OptionGroup("Miscellaneous Settings", + { + &mOptions[RSK_GOSSIP_STONE_HINTS], + &mOptions[RSK_HINT_CLARITY], + &mOptions[RSK_HINT_DISTRIBUTION], + &mOptions[RSK_TOT_ALTAR_HINT], + &mOptions[RSK_GANONDORF_HINT], + &mOptions[RSK_SHEIK_LA_HINT], + &mOptions[RSK_DAMPES_DIARY_HINT], + &mOptions[RSK_GREG_HINT], + &mOptions[RSK_LOACH_HINT], + &mOptions[RSK_SARIA_HINT], + &mOptions[RSK_FROGS_HINT], + &mOptions[RSK_OOT_HINT], + &mOptions[RSK_WARP_SONG_HINTS], + &mOptions[RSK_BIGGORON_HINT], + &mOptions[RSK_BIG_POES_HINT], + &mOptions[RSK_CHICKENS_HINT], + &mOptions[RSK_MALON_HINT], + &mOptions[RSK_HBA_HINT], + &mOptions[RSK_KAK_10_SKULLS_HINT], + &mOptions[RSK_KAK_20_SKULLS_HINT], + &mOptions[RSK_KAK_30_SKULLS_HINT], + &mOptions[RSK_KAK_40_SKULLS_HINT], + &mOptions[RSK_KAK_50_SKULLS_HINT], + &mOptions[RSK_KAK_100_SKULLS_HINT], + &mOptions[RSK_MASK_SHOP_HINT], + &mOptions[RSK_SCRUB_TEXT_HINT], + &mOptions[RSK_MERCHANT_TEXT_HINT], + &mOptions[RSK_FISHING_POLE_HINT], + // TODO: Compasses show Reward/WOTH, Maps show Dungeon Mode, Starting Time + &mOptions[RSK_DAMAGE_MULTIPLIER], + &mOptions[RSK_BLUE_FIRE_ARROWS], + &mOptions[RSK_SUNLIGHT_ARROWS], + &mOptions[RSK_INFINITE_UPGRADES], + &mOptions[RSK_SKELETON_KEY], + }); + mOptionGroups[RSG_ITEM_POOL] = OptionGroup( + "Item Pool Settings", std::initializer_list({ &mOptions[RSK_ITEM_POOL], &mOptions[RSK_ICE_TRAPS] })); // TODO: Progressive Goron Sword, Remove Double Defense - mOptionGroups[RSG_EXCLUDES_KOKIRI_FOREST] = OptionGroup::SubGroup("Kokiri Forest", mExcludeLocationsOptionsAreas[RCAREA_KOKIRI_FOREST]); - mOptionGroups[RSG_EXCLUDES_LOST_WOODS] = OptionGroup::SubGroup("Lost Woods", mExcludeLocationsOptionsAreas[RCAREA_LOST_WOODS]); - mOptionGroups[RSG_EXCLUDES_SACRED_FOREST_MEADOW] = OptionGroup::SubGroup("Sacred Forest Meadow", mExcludeLocationsOptionsAreas[RCAREA_SACRED_FOREST_MEADOW]); - mOptionGroups[RSG_EXCLUDES_DEKU_TREE] = OptionGroup::SubGroup("Deku Tree", mExcludeLocationsOptionsAreas[RCAREA_DEKU_TREE]); - mOptionGroups[RSG_EXCLUDES_FOREST_TEMPLE] = OptionGroup::SubGroup("Forest Temple", mExcludeLocationsOptionsAreas[RCAREA_FOREST_TEMPLE]); - mOptionGroups[RSG_EXCLUDES_KAKARIKO_VILLAGE] = OptionGroup::SubGroup("Kakariko Village", mExcludeLocationsOptionsAreas[RCAREA_KAKARIKO_VILLAGE]); - mOptionGroups[RSG_EXCLUDES_GRAVEYARD] = OptionGroup::SubGroup("Graveyard", mExcludeLocationsOptionsAreas[RCAREA_GRAVEYARD]); - mOptionGroups[RSG_EXCLUDES_BOTTOM_OF_THE_WELL] = OptionGroup::SubGroup("Bottom of the Well", mExcludeLocationsOptionsAreas[RCAREA_BOTTOM_OF_THE_WELL]); - mOptionGroups[RSG_EXCLUDES_SHADOW_TEMPLE] = OptionGroup::SubGroup("Shadow Temple", mExcludeLocationsOptionsAreas[RCAREA_SHADOW_TEMPLE]); - mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_TRAIL] = OptionGroup::SubGroup("Death Mountain Trail", mExcludeLocationsOptionsAreas[RCAREA_DEATH_MOUNTAIN_TRAIL]); - mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_CRATER] = OptionGroup::SubGroup("Death Mountain Crater", mExcludeLocationsOptionsAreas[RCAREA_DEATH_MOUNTAIN_CRATER]); - mOptionGroups[RSG_EXCLUDES_GORON_CITY] = OptionGroup::SubGroup("Goron City", mExcludeLocationsOptionsAreas[RCAREA_GORON_CITY]); - mOptionGroups[RSG_EXCLUDES_DODONGOS_CAVERN] = OptionGroup::SubGroup("Dodongo's Cavern", mExcludeLocationsOptionsAreas[RCAREA_DODONGOS_CAVERN]); - mOptionGroups[RSG_EXCLUDES_FIRE_TEMPLE] = OptionGroup::SubGroup("Fire Temple", mExcludeLocationsOptionsAreas[RCAREA_FIRE_TEMPLE]); - mOptionGroups[RSG_EXCLUDES_ZORAS_RIVER] = OptionGroup::SubGroup("Zora's River", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_RIVER]); - mOptionGroups[RSG_EXCLUDES_ZORAS_DOMAIN] = OptionGroup::SubGroup("Zora's Domain", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_DOMAIN]); - mOptionGroups[RSG_EXCLUDES_ZORAS_FOUNTAIN] = OptionGroup::SubGroup("Zora's Fountain", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_FOUNTAIN]); - mOptionGroups[RSG_EXCLUDES_JABU_JABU] = OptionGroup::SubGroup("Jabu Jabu's Belly", mExcludeLocationsOptionsAreas[RCAREA_JABU_JABUS_BELLY]); - mOptionGroups[RSG_EXCLUDES_ICE_CAVERN] = OptionGroup::SubGroup("Ice Cavern", mExcludeLocationsOptionsAreas[RCAREA_ICE_CAVERN]); - mOptionGroups[RSG_EXCLUDES_HYRULE_FIELD] = OptionGroup::SubGroup("Hyrule Field", mExcludeLocationsOptionsAreas[RCAREA_HYRULE_FIELD]); - mOptionGroups[RSG_EXCLUDES_LON_LON_RANCH] = OptionGroup::SubGroup("Lon Lon Ranch", mExcludeLocationsOptionsAreas[RCAREA_LON_LON_RANCH]); - mOptionGroups[RSG_EXCLUDES_LAKE_HYLIA] = OptionGroup::SubGroup("Lake Hylia", mExcludeLocationsOptionsAreas[RCAREA_LAKE_HYLIA]); - mOptionGroups[RSG_EXCLUDES_WATER_TEMPLE] = OptionGroup::SubGroup("Water Temple", mExcludeLocationsOptionsAreas[RCAREA_WATER_TEMPLE]); - mOptionGroups[RSG_EXCLUDES_GERUDO_VALLEY] = OptionGroup::SubGroup("Gerudo Valley", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_VALLEY]); - mOptionGroups[RSG_EXCLUDES_GERUDO_FORTRESS] = OptionGroup::SubGroup("Gerudo Fortress", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_FORTRESS]); - mOptionGroups[RSG_EXCLUDES_HAUNTED_WASTELAND] = OptionGroup::SubGroup("Haunted Wasteland", mExcludeLocationsOptionsAreas[RCAREA_WASTELAND]); - mOptionGroups[RSG_EXCLUDES_DESERT_COLOSSUS] = OptionGroup::SubGroup("Desert Colossus", mExcludeLocationsOptionsAreas[RCAREA_DESERT_COLOSSUS]); - mOptionGroups[RSG_EXCLUDES_GERUDO_TRAINING_GROUND] = OptionGroup::SubGroup("Gerudo Training Ground", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_TRAINING_GROUND]); - mOptionGroups[RSG_EXCLUDES_SPIRIT_TEMPLE] = OptionGroup::SubGroup("Spirit Temple", mExcludeLocationsOptionsAreas[RCAREA_SPIRIT_TEMPLE]); - mOptionGroups[RSG_EXCLUDES_HYRULE_CASTLE] = OptionGroup::SubGroup("Hyrule Castle", mExcludeLocationsOptionsAreas[RCAREA_HYRULE_CASTLE]); + mOptionGroups[RSG_EXCLUDES_KOKIRI_FOREST] = + OptionGroup::SubGroup("Kokiri Forest", mExcludeLocationsOptionsAreas[RCAREA_KOKIRI_FOREST]); + mOptionGroups[RSG_EXCLUDES_LOST_WOODS] = + OptionGroup::SubGroup("Lost Woods", mExcludeLocationsOptionsAreas[RCAREA_LOST_WOODS]); + mOptionGroups[RSG_EXCLUDES_SACRED_FOREST_MEADOW] = + OptionGroup::SubGroup("Sacred Forest Meadow", mExcludeLocationsOptionsAreas[RCAREA_SACRED_FOREST_MEADOW]); + mOptionGroups[RSG_EXCLUDES_DEKU_TREE] = + OptionGroup::SubGroup("Deku Tree", mExcludeLocationsOptionsAreas[RCAREA_DEKU_TREE]); + mOptionGroups[RSG_EXCLUDES_FOREST_TEMPLE] = + OptionGroup::SubGroup("Forest Temple", mExcludeLocationsOptionsAreas[RCAREA_FOREST_TEMPLE]); + mOptionGroups[RSG_EXCLUDES_KAKARIKO_VILLAGE] = + OptionGroup::SubGroup("Kakariko Village", mExcludeLocationsOptionsAreas[RCAREA_KAKARIKO_VILLAGE]); + mOptionGroups[RSG_EXCLUDES_GRAVEYARD] = + OptionGroup::SubGroup("Graveyard", mExcludeLocationsOptionsAreas[RCAREA_GRAVEYARD]); + mOptionGroups[RSG_EXCLUDES_BOTTOM_OF_THE_WELL] = + OptionGroup::SubGroup("Bottom of the Well", mExcludeLocationsOptionsAreas[RCAREA_BOTTOM_OF_THE_WELL]); + mOptionGroups[RSG_EXCLUDES_SHADOW_TEMPLE] = + OptionGroup::SubGroup("Shadow Temple", mExcludeLocationsOptionsAreas[RCAREA_SHADOW_TEMPLE]); + mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_TRAIL] = + OptionGroup::SubGroup("Death Mountain Trail", mExcludeLocationsOptionsAreas[RCAREA_DEATH_MOUNTAIN_TRAIL]); + mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_CRATER] = + OptionGroup::SubGroup("Death Mountain Crater", mExcludeLocationsOptionsAreas[RCAREA_DEATH_MOUNTAIN_CRATER]); + mOptionGroups[RSG_EXCLUDES_GORON_CITY] = + OptionGroup::SubGroup("Goron City", mExcludeLocationsOptionsAreas[RCAREA_GORON_CITY]); + mOptionGroups[RSG_EXCLUDES_DODONGOS_CAVERN] = + OptionGroup::SubGroup("Dodongo's Cavern", mExcludeLocationsOptionsAreas[RCAREA_DODONGOS_CAVERN]); + mOptionGroups[RSG_EXCLUDES_FIRE_TEMPLE] = + OptionGroup::SubGroup("Fire Temple", mExcludeLocationsOptionsAreas[RCAREA_FIRE_TEMPLE]); + mOptionGroups[RSG_EXCLUDES_ZORAS_RIVER] = + OptionGroup::SubGroup("Zora's River", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_RIVER]); + mOptionGroups[RSG_EXCLUDES_ZORAS_DOMAIN] = + OptionGroup::SubGroup("Zora's Domain", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_DOMAIN]); + mOptionGroups[RSG_EXCLUDES_ZORAS_FOUNTAIN] = + OptionGroup::SubGroup("Zora's Fountain", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_FOUNTAIN]); + mOptionGroups[RSG_EXCLUDES_JABU_JABU] = + OptionGroup::SubGroup("Jabu Jabu's Belly", mExcludeLocationsOptionsAreas[RCAREA_JABU_JABUS_BELLY]); + mOptionGroups[RSG_EXCLUDES_ICE_CAVERN] = + OptionGroup::SubGroup("Ice Cavern", mExcludeLocationsOptionsAreas[RCAREA_ICE_CAVERN]); + mOptionGroups[RSG_EXCLUDES_HYRULE_FIELD] = + OptionGroup::SubGroup("Hyrule Field", mExcludeLocationsOptionsAreas[RCAREA_HYRULE_FIELD]); + mOptionGroups[RSG_EXCLUDES_LON_LON_RANCH] = + OptionGroup::SubGroup("Lon Lon Ranch", mExcludeLocationsOptionsAreas[RCAREA_LON_LON_RANCH]); + mOptionGroups[RSG_EXCLUDES_LAKE_HYLIA] = + OptionGroup::SubGroup("Lake Hylia", mExcludeLocationsOptionsAreas[RCAREA_LAKE_HYLIA]); + mOptionGroups[RSG_EXCLUDES_WATER_TEMPLE] = + OptionGroup::SubGroup("Water Temple", mExcludeLocationsOptionsAreas[RCAREA_WATER_TEMPLE]); + mOptionGroups[RSG_EXCLUDES_GERUDO_VALLEY] = + OptionGroup::SubGroup("Gerudo Valley", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_VALLEY]); + mOptionGroups[RSG_EXCLUDES_GERUDO_FORTRESS] = + OptionGroup::SubGroup("Gerudo Fortress", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_FORTRESS]); + mOptionGroups[RSG_EXCLUDES_HAUNTED_WASTELAND] = + OptionGroup::SubGroup("Haunted Wasteland", mExcludeLocationsOptionsAreas[RCAREA_WASTELAND]); + mOptionGroups[RSG_EXCLUDES_DESERT_COLOSSUS] = + OptionGroup::SubGroup("Desert Colossus", mExcludeLocationsOptionsAreas[RCAREA_DESERT_COLOSSUS]); + mOptionGroups[RSG_EXCLUDES_GERUDO_TRAINING_GROUND] = + OptionGroup::SubGroup("Gerudo Training Ground", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_TRAINING_GROUND]); + mOptionGroups[RSG_EXCLUDES_SPIRIT_TEMPLE] = + OptionGroup::SubGroup("Spirit Temple", mExcludeLocationsOptionsAreas[RCAREA_SPIRIT_TEMPLE]); + mOptionGroups[RSG_EXCLUDES_HYRULE_CASTLE] = + OptionGroup::SubGroup("Hyrule Castle", mExcludeLocationsOptionsAreas[RCAREA_HYRULE_CASTLE]); mOptionGroups[RSG_EXCLUDES_MARKET] = OptionGroup::SubGroup("Market", mExcludeLocationsOptionsAreas[RCAREA_MARKET]); - mOptionGroups[RSG_EXCLUDES_GANONS_CASTLE] = OptionGroup::SubGroup("Ganon's Castle", mExcludeLocationsOptionsAreas[RCAREA_GANONS_CASTLE]); - mOptionGroups[RSG_EXCLUDES] = OptionGroup::SubGroup("Exclude Locations", { - &mOptionGroups[RSG_EXCLUDES_KOKIRI_FOREST], - &mOptionGroups[RSG_EXCLUDES_LOST_WOODS], - &mOptionGroups[RSG_EXCLUDES_SACRED_FOREST_MEADOW], - &mOptionGroups[RSG_EXCLUDES_DEKU_TREE], - &mOptionGroups[RSG_EXCLUDES_FOREST_TEMPLE], - &mOptionGroups[RSG_EXCLUDES_KAKARIKO_VILLAGE], - &mOptionGroups[RSG_EXCLUDES_GRAVEYARD], - &mOptionGroups[RSG_EXCLUDES_BOTTOM_OF_THE_WELL], - &mOptionGroups[RSG_EXCLUDES_SHADOW_TEMPLE], - &mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_TRAIL], - &mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_CRATER], - &mOptionGroups[RSG_EXCLUDES_GORON_CITY], - &mOptionGroups[RSG_EXCLUDES_DODONGOS_CAVERN], - &mOptionGroups[RSG_EXCLUDES_FIRE_TEMPLE], - &mOptionGroups[RSG_EXCLUDES_ZORAS_RIVER], - &mOptionGroups[RSG_EXCLUDES_ZORAS_DOMAIN], - &mOptionGroups[RSG_EXCLUDES_ZORAS_FOUNTAIN], - &mOptionGroups[RSG_EXCLUDES_JABU_JABU], - &mOptionGroups[RSG_EXCLUDES_ICE_CAVERN], - &mOptionGroups[RSG_EXCLUDES_HYRULE_FIELD], - &mOptionGroups[RSG_EXCLUDES_LON_LON_RANCH], - &mOptionGroups[RSG_EXCLUDES_LAKE_HYLIA], - &mOptionGroups[RSG_EXCLUDES_WATER_TEMPLE], - &mOptionGroups[RSG_EXCLUDES_GERUDO_VALLEY], - &mOptionGroups[RSG_EXCLUDES_GERUDO_FORTRESS], - &mOptionGroups[RSG_EXCLUDES_HAUNTED_WASTELAND], - &mOptionGroups[RSG_EXCLUDES_DESERT_COLOSSUS], - &mOptionGroups[RSG_EXCLUDES_GERUDO_TRAINING_GROUND], - &mOptionGroups[RSG_EXCLUDES_SPIRIT_TEMPLE], - &mOptionGroups[RSG_EXCLUDES_HYRULE_CASTLE], - &mOptionGroups[RSG_EXCLUDES_MARKET], - &mOptionGroups[RSG_EXCLUDES_GANONS_CASTLE], - }); - mOptionGroups[RSG_DETAILED_LOGIC] = OptionGroup("Detailed Logic Settings", { - &mOptionGroups[RSG_LOGIC], - &mOptionGroups[RSG_TRICKS], - &mOptionGroups[RSG_EXCLUDES] - }); + mOptionGroups[RSG_EXCLUDES_GANONS_CASTLE] = + OptionGroup::SubGroup("Ganon's Castle", mExcludeLocationsOptionsAreas[RCAREA_GANONS_CASTLE]); + mOptionGroups[RSG_EXCLUDES] = + OptionGroup::SubGroup("Exclude Locations", { + &mOptionGroups[RSG_EXCLUDES_KOKIRI_FOREST], + &mOptionGroups[RSG_EXCLUDES_LOST_WOODS], + &mOptionGroups[RSG_EXCLUDES_SACRED_FOREST_MEADOW], + &mOptionGroups[RSG_EXCLUDES_DEKU_TREE], + &mOptionGroups[RSG_EXCLUDES_FOREST_TEMPLE], + &mOptionGroups[RSG_EXCLUDES_KAKARIKO_VILLAGE], + &mOptionGroups[RSG_EXCLUDES_GRAVEYARD], + &mOptionGroups[RSG_EXCLUDES_BOTTOM_OF_THE_WELL], + &mOptionGroups[RSG_EXCLUDES_SHADOW_TEMPLE], + &mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_TRAIL], + &mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_CRATER], + &mOptionGroups[RSG_EXCLUDES_GORON_CITY], + &mOptionGroups[RSG_EXCLUDES_DODONGOS_CAVERN], + &mOptionGroups[RSG_EXCLUDES_FIRE_TEMPLE], + &mOptionGroups[RSG_EXCLUDES_ZORAS_RIVER], + &mOptionGroups[RSG_EXCLUDES_ZORAS_DOMAIN], + &mOptionGroups[RSG_EXCLUDES_ZORAS_FOUNTAIN], + &mOptionGroups[RSG_EXCLUDES_JABU_JABU], + &mOptionGroups[RSG_EXCLUDES_ICE_CAVERN], + &mOptionGroups[RSG_EXCLUDES_HYRULE_FIELD], + &mOptionGroups[RSG_EXCLUDES_LON_LON_RANCH], + &mOptionGroups[RSG_EXCLUDES_LAKE_HYLIA], + &mOptionGroups[RSG_EXCLUDES_WATER_TEMPLE], + &mOptionGroups[RSG_EXCLUDES_GERUDO_VALLEY], + &mOptionGroups[RSG_EXCLUDES_GERUDO_FORTRESS], + &mOptionGroups[RSG_EXCLUDES_HAUNTED_WASTELAND], + &mOptionGroups[RSG_EXCLUDES_DESERT_COLOSSUS], + &mOptionGroups[RSG_EXCLUDES_GERUDO_TRAINING_GROUND], + &mOptionGroups[RSG_EXCLUDES_SPIRIT_TEMPLE], + &mOptionGroups[RSG_EXCLUDES_HYRULE_CASTLE], + &mOptionGroups[RSG_EXCLUDES_MARKET], + &mOptionGroups[RSG_EXCLUDES_GANONS_CASTLE], + }); + mOptionGroups[RSG_DETAILED_LOGIC] = + OptionGroup("Detailed Logic Settings", + { &mOptionGroups[RSG_LOGIC], &mOptionGroups[RSG_TRICKS], &mOptionGroups[RSG_EXCLUDES] }); } -std::unordered_map Settings::PopulateOptionNameToEnum(){ +std::unordered_map Settings::PopulateOptionNameToEnum() { std::unordered_map output = {}; for (size_t count = 0; count < RSK_MAX; count++) { output[mOptions[count].GetName()] = static_cast(count); @@ -1121,9 +1760,17 @@ TrickOption& Settings::GetTrickOption(const RandomizerTrick key) { return mTrickOptions[key]; } +int Settings::GetRandomizerTrickByName(const std::string& name) { + const auto& it = mTrickNameToEnum.find(name); + if (it == mTrickNameToEnum.end()) { + return -1; + } + return it->second; +} + void Context::ResetTrickOptions() { - for (int count = 0; count < RT_MAX; count++){ - mTrickOptions[count].Set(0); //RANDOTODO this can probably be done better + for (int count = 0; count < RT_MAX; count++) { + mTrickOptions[count].Set(0); // RANDOTODO this can probably be done better }; } @@ -1131,11 +1778,11 @@ const std::array& Settings::GetAllOptions() const { return mOptions; } -std::vector